1*9880d681SAndroid Build Coastguard Worker //===- llvm/unittest/ADT/DAGDeltaAlgorithmTest.cpp ------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DAGDeltaAlgorithm.h"
12*9880d681SAndroid Build Coastguard Worker #include <algorithm>
13*9880d681SAndroid Build Coastguard Worker #include <cstdarg>
14*9880d681SAndroid Build Coastguard Worker using namespace llvm;
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker namespace {
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker typedef DAGDeltaAlgorithm::edge_ty edge_ty;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker class FixedDAGDeltaAlgorithm : public DAGDeltaAlgorithm {
21*9880d681SAndroid Build Coastguard Worker changeset_ty FailingSet;
22*9880d681SAndroid Build Coastguard Worker unsigned NumTests;
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker protected:
ExecuteOneTest(const changeset_ty & Changes)25*9880d681SAndroid Build Coastguard Worker bool ExecuteOneTest(const changeset_ty &Changes) override {
26*9880d681SAndroid Build Coastguard Worker ++NumTests;
27*9880d681SAndroid Build Coastguard Worker return std::includes(Changes.begin(), Changes.end(),
28*9880d681SAndroid Build Coastguard Worker FailingSet.begin(), FailingSet.end());
29*9880d681SAndroid Build Coastguard Worker }
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker public:
FixedDAGDeltaAlgorithm(const changeset_ty & _FailingSet)32*9880d681SAndroid Build Coastguard Worker FixedDAGDeltaAlgorithm(const changeset_ty &_FailingSet)
33*9880d681SAndroid Build Coastguard Worker : FailingSet(_FailingSet),
34*9880d681SAndroid Build Coastguard Worker NumTests(0) {}
35*9880d681SAndroid Build Coastguard Worker
getNumTests() const36*9880d681SAndroid Build Coastguard Worker unsigned getNumTests() const { return NumTests; }
37*9880d681SAndroid Build Coastguard Worker };
38*9880d681SAndroid Build Coastguard Worker
fixed_set(unsigned N,...)39*9880d681SAndroid Build Coastguard Worker std::set<unsigned> fixed_set(unsigned N, ...) {
40*9880d681SAndroid Build Coastguard Worker std::set<unsigned> S;
41*9880d681SAndroid Build Coastguard Worker va_list ap;
42*9880d681SAndroid Build Coastguard Worker va_start(ap, N);
43*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i != N; ++i)
44*9880d681SAndroid Build Coastguard Worker S.insert(va_arg(ap, unsigned));
45*9880d681SAndroid Build Coastguard Worker va_end(ap);
46*9880d681SAndroid Build Coastguard Worker return S;
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker
range(unsigned Start,unsigned End)49*9880d681SAndroid Build Coastguard Worker std::set<unsigned> range(unsigned Start, unsigned End) {
50*9880d681SAndroid Build Coastguard Worker std::set<unsigned> S;
51*9880d681SAndroid Build Coastguard Worker while (Start != End)
52*9880d681SAndroid Build Coastguard Worker S.insert(Start++);
53*9880d681SAndroid Build Coastguard Worker return S;
54*9880d681SAndroid Build Coastguard Worker }
55*9880d681SAndroid Build Coastguard Worker
range(unsigned N)56*9880d681SAndroid Build Coastguard Worker std::set<unsigned> range(unsigned N) {
57*9880d681SAndroid Build Coastguard Worker return range(0, N);
58*9880d681SAndroid Build Coastguard Worker }
59*9880d681SAndroid Build Coastguard Worker
TEST(DAGDeltaAlgorithmTest,Basic)60*9880d681SAndroid Build Coastguard Worker TEST(DAGDeltaAlgorithmTest, Basic) {
61*9880d681SAndroid Build Coastguard Worker std::vector<edge_ty> Deps;
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker // Dependencies:
64*9880d681SAndroid Build Coastguard Worker // 1 - 3
65*9880d681SAndroid Build Coastguard Worker Deps.clear();
66*9880d681SAndroid Build Coastguard Worker Deps.push_back(std::make_pair(3, 1));
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker // P = {3,5,7} \in S,
69*9880d681SAndroid Build Coastguard Worker // [0, 20),
70*9880d681SAndroid Build Coastguard Worker // should minimize to {1,3,5,7} in a reasonable number of tests.
71*9880d681SAndroid Build Coastguard Worker FixedDAGDeltaAlgorithm FDA(fixed_set(3, 3, 5, 7));
72*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(fixed_set(4, 1, 3, 5, 7), FDA.Run(range(20), Deps));
73*9880d681SAndroid Build Coastguard Worker EXPECT_GE(46U, FDA.getNumTests());
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker // Dependencies:
76*9880d681SAndroid Build Coastguard Worker // 0 - 1
77*9880d681SAndroid Build Coastguard Worker // \- 2 - 3
78*9880d681SAndroid Build Coastguard Worker // \- 4
79*9880d681SAndroid Build Coastguard Worker Deps.clear();
80*9880d681SAndroid Build Coastguard Worker Deps.push_back(std::make_pair(1, 0));
81*9880d681SAndroid Build Coastguard Worker Deps.push_back(std::make_pair(2, 0));
82*9880d681SAndroid Build Coastguard Worker Deps.push_back(std::make_pair(4, 0));
83*9880d681SAndroid Build Coastguard Worker Deps.push_back(std::make_pair(3, 2));
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker // This is a case where we must hold required changes.
86*9880d681SAndroid Build Coastguard Worker //
87*9880d681SAndroid Build Coastguard Worker // P = {1,3} \in S,
88*9880d681SAndroid Build Coastguard Worker // [0, 5),
89*9880d681SAndroid Build Coastguard Worker // should minimize to {0,1,2,3} in a small number of tests.
90*9880d681SAndroid Build Coastguard Worker FixedDAGDeltaAlgorithm FDA2(fixed_set(2, 1, 3));
91*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(fixed_set(4, 0, 1, 2, 3), FDA2.Run(range(5), Deps));
92*9880d681SAndroid Build Coastguard Worker EXPECT_GE(9U, FDA2.getNumTests());
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker // This is a case where we should quickly prune part of the tree.
95*9880d681SAndroid Build Coastguard Worker //
96*9880d681SAndroid Build Coastguard Worker // P = {4} \in S,
97*9880d681SAndroid Build Coastguard Worker // [0, 5),
98*9880d681SAndroid Build Coastguard Worker // should minimize to {0,4} in a small number of tests.
99*9880d681SAndroid Build Coastguard Worker FixedDAGDeltaAlgorithm FDA3(fixed_set(1, 4));
100*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(fixed_set(2, 0, 4), FDA3.Run(range(5), Deps));
101*9880d681SAndroid Build Coastguard Worker EXPECT_GE(6U, FDA3.getNumTests());
102*9880d681SAndroid Build Coastguard Worker }
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker }
105*9880d681SAndroid Build Coastguard Worker
106