/* * Copyright 2015 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkRandom.h" #include "SkTTopoSort.h" #include "Test.h" #include "sk_tool_utils.h" typedef void (*CreateGraphPF)(SkTDArray<sk_tool_utils::TopoTestNode*>* graph); /* Simple diamond * 3 * / \ * 1 2 * \ / * 0 */ static void create_graph0(SkTDArray<sk_tool_utils::TopoTestNode*>* graph) { sk_tool_utils::TopoTestNode::AllocNodes(graph, 4); (*graph)[0]->dependsOn((*graph)[1]); (*graph)[0]->dependsOn((*graph)[2]); (*graph)[1]->dependsOn((*graph)[3]); (*graph)[2]->dependsOn((*graph)[3]); } /* Simple chain * 3 * | * 2 * | * 1 * | * 0 */ static void create_graph1(SkTDArray<sk_tool_utils::TopoTestNode*>* graph) { sk_tool_utils::TopoTestNode::AllocNodes(graph, 4); (*graph)[0]->dependsOn((*graph)[1]); (*graph)[1]->dependsOn((*graph)[2]); (*graph)[2]->dependsOn((*graph)[3]); } /* Loop * 2 * / \ * 0 --- 1 */ static void create_graph2(SkTDArray<sk_tool_utils::TopoTestNode*>* graph) { sk_tool_utils::TopoTestNode::AllocNodes(graph, 3); (*graph)[0]->dependsOn((*graph)[1]); (*graph)[1]->dependsOn((*graph)[2]); (*graph)[2]->dependsOn((*graph)[0]); } /* Double diamond * 6 * / \ * 4 5 * \ / * 3 * / \ * 1 2 * \ / * 0 */ static void create_graph3(SkTDArray<sk_tool_utils::TopoTestNode*>* graph) { sk_tool_utils::TopoTestNode::AllocNodes(graph, 7); (*graph)[0]->dependsOn((*graph)[1]); (*graph)[0]->dependsOn((*graph)[2]); (*graph)[1]->dependsOn((*graph)[3]); (*graph)[2]->dependsOn((*graph)[3]); (*graph)[3]->dependsOn((*graph)[4]); (*graph)[3]->dependsOn((*graph)[5]); (*graph)[4]->dependsOn((*graph)[6]); (*graph)[5]->dependsOn((*graph)[6]); } /* Two independent diamonds * 3 7 * / \ / \ * 1 2 5 6 * \ / \ / * 0 4 */ static void create_graph4(SkTDArray<sk_tool_utils::TopoTestNode*>* graph) { sk_tool_utils::TopoTestNode::AllocNodes(graph, 8); (*graph)[0]->dependsOn((*graph)[1]); (*graph)[0]->dependsOn((*graph)[2]); (*graph)[1]->dependsOn((*graph)[3]); (*graph)[2]->dependsOn((*graph)[3]); (*graph)[4]->dependsOn((*graph)[5]); (*graph)[4]->dependsOn((*graph)[6]); (*graph)[5]->dependsOn((*graph)[7]); (*graph)[6]->dependsOn((*graph)[7]); } DEF_TEST(TopoSort, reporter) { SkRandom rand; struct { CreateGraphPF fCreate; bool fExpectedResult; } tests[] = { { create_graph0, true }, { create_graph1, true }, { create_graph2, false }, { create_graph3, true }, { create_graph4, true }, }; for (size_t i = 0; i < SK_ARRAY_COUNT(tests); ++i) { SkTDArray<sk_tool_utils::TopoTestNode*> graph; (tests[i].fCreate)(&graph); sk_tool_utils::TopoTestNode::Shuffle(&graph, &rand); bool actualResult = SkTTopoSort<sk_tool_utils::TopoTestNode>(&graph); REPORTER_ASSERT(reporter, actualResult == tests[i].fExpectedResult); if (tests[i].fExpectedResult) { for (int j = 0; j < graph.count(); ++j) { REPORTER_ASSERT(reporter, graph[j]->check()); } } //SkDEBUGCODE(print(graph);) sk_tool_utils::TopoTestNode::DeallocNodes(&graph); } }