/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/GrTCluster.h" #include "tests/Test.h" #include "tools/ToolUtils.h" using ToolUtils::TopoTestNode; typedef void (*CreateGraphPF)(SkTArray>* graph, SkTArray>* expected); /* * In: A1 B1 A2 * Out: B1 A1 A2 */ static void create_graph0(SkTArray>* graph, SkTArray>* expected) { ToolUtils::TopoTestNode::AllocNodes(graph, 3); graph->at(0)->targets(0); graph->at(1)->targets(1); graph->at(2)->targets(0); graph->at(2)->dependsOn(graph->at(0).get()); expected->push_back(graph->at(1)); expected->push_back(graph->at(0)); expected->push_back(graph->at(2)); } /* * In: A1 B1 A2 C1 A3 * Out: B1 C1 A1 A2 A3 */ static void create_graph1(SkTArray>* graph, SkTArray>* expected) { ToolUtils::TopoTestNode::AllocNodes(graph, 5); graph->at(0)->targets(0); graph->at(1)->targets(1); graph->at(2)->targets(0); graph->at(3)->targets(2); graph->at(4)->targets(0); expected->push_back(graph->at(1)); expected->push_back(graph->at(3)); expected->push_back(graph->at(0)); expected->push_back(graph->at(2)); expected->push_back(graph->at(4)); } /* * In: A1 B1 A2. * Srcs: A1->B1, B1->A2. * Out: A1 B1 A2. Can't reorder. */ static void create_graph2(SkTArray>* graph, SkTArray>* expected) { ToolUtils::TopoTestNode::AllocNodes(graph, 3); graph->at(0)->targets(0); graph->at(1)->targets(1); graph->at(2)->targets(0); graph->at(1)->dependsOn(graph->at(0).get()); graph->at(2)->dependsOn(graph->at(1).get()); // expected is empty. Can't reorder. } DEF_TEST(GrTCluster, reporter) { CreateGraphPF tests[] = { create_graph0, create_graph1, create_graph2 }; for (size_t i = 0; i < SK_ARRAY_COUNT(tests); ++i) { SkTArray> graph; SkTArray> expectedOutput; (tests[i])(&graph, &expectedOutput); SkTInternalLList llist; bool actualResult = GrTCluster(graph, &llist); if (expectedOutput.empty()) { REPORTER_ASSERT(reporter, !actualResult); } else { REPORTER_ASSERT(reporter, actualResult); // SkTInternalLList::countEntries is debug-only and these tests run in release. int newCount = 0; for ([[maybe_unused]] TopoTestNode* t : llist) { newCount++; } REPORTER_ASSERT(reporter, newCount == expectedOutput.count()); int j = 0; for (TopoTestNode* n : llist) { REPORTER_ASSERT(reporter, n == expectedOutput[j++].get()); } } //SkDEBUGCODE(print(graph);) } }