xref: /llvm-project/llvm/unittests/ADT/DeltaAlgorithmTest.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
1ff53d469SDaniel Dunbar //===- llvm/unittest/ADT/DeltaAlgorithmTest.cpp ---------------------------===//
2ff53d469SDaniel Dunbar //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ff53d469SDaniel Dunbar //
7ff53d469SDaniel Dunbar //===----------------------------------------------------------------------===//
8ff53d469SDaniel Dunbar 
9ff53d469SDaniel Dunbar #include "llvm/ADT/DeltaAlgorithm.h"
109a67b073SChandler Carruth #include "gtest/gtest.h"
11ff53d469SDaniel Dunbar #include <algorithm>
12ff53d469SDaniel Dunbar #include <cstdarg>
13ff53d469SDaniel Dunbar using namespace llvm;
14ff53d469SDaniel Dunbar 
151f210009SDouglas Gregor namespace std {
161f210009SDouglas Gregor 
operator <<(std::ostream & OS,const std::set<unsigned> & S)17ff53d469SDaniel Dunbar std::ostream &operator<<(std::ostream &OS,
18ff53d469SDaniel Dunbar                          const std::set<unsigned> &S) {
19ff53d469SDaniel Dunbar   OS << "{";
20ff53d469SDaniel Dunbar   for (std::set<unsigned>::const_iterator it = S.begin(),
21ff53d469SDaniel Dunbar          ie = S.end(); it != ie; ++it) {
22ff53d469SDaniel Dunbar     if (it != S.begin())
23ff53d469SDaniel Dunbar       OS << ",";
24ff53d469SDaniel Dunbar     OS << *it;
25ff53d469SDaniel Dunbar   }
26ff53d469SDaniel Dunbar   OS << "}";
27ff53d469SDaniel Dunbar   return OS;
28ff53d469SDaniel Dunbar }
29ff53d469SDaniel Dunbar 
301f210009SDouglas Gregor }
311f210009SDouglas Gregor 
32ff53d469SDaniel Dunbar namespace {
33ff53d469SDaniel Dunbar 
34e4080e7fSDavid Blaikie class FixedDeltaAlgorithm final : public DeltaAlgorithm {
35ff53d469SDaniel Dunbar   changeset_ty FailingSet;
36ff53d469SDaniel Dunbar   unsigned NumTests;
37ff53d469SDaniel Dunbar 
38ff53d469SDaniel Dunbar protected:
ExecuteOneTest(const changeset_ty & Changes)39f817c1cbSAlexander Kornienko   bool ExecuteOneTest(const changeset_ty &Changes) override {
40ff53d469SDaniel Dunbar     ++NumTests;
41ff53d469SDaniel Dunbar     return std::includes(Changes.begin(), Changes.end(),
42ff53d469SDaniel Dunbar                          FailingSet.begin(), FailingSet.end());
43ff53d469SDaniel Dunbar   }
44ff53d469SDaniel Dunbar 
45ff53d469SDaniel Dunbar public:
FixedDeltaAlgorithm(const changeset_ty & _FailingSet)46ff53d469SDaniel Dunbar   FixedDeltaAlgorithm(const changeset_ty &_FailingSet)
47ff53d469SDaniel Dunbar     : FailingSet(_FailingSet),
48ff53d469SDaniel Dunbar       NumTests(0) {}
49ff53d469SDaniel Dunbar 
getNumTests() const50ff53d469SDaniel Dunbar   unsigned getNumTests() const { return NumTests; }
51ff53d469SDaniel Dunbar };
52ff53d469SDaniel Dunbar 
fixed_set(unsigned N,...)53ff53d469SDaniel Dunbar std::set<unsigned> fixed_set(unsigned N, ...) {
54ff53d469SDaniel Dunbar   std::set<unsigned> S;
55ff53d469SDaniel Dunbar   va_list ap;
56ff53d469SDaniel Dunbar   va_start(ap, N);
57ff53d469SDaniel Dunbar   for (unsigned i = 0; i != N; ++i)
58ff53d469SDaniel Dunbar     S.insert(va_arg(ap, unsigned));
59ff53d469SDaniel Dunbar   va_end(ap);
60ff53d469SDaniel Dunbar   return S;
61ff53d469SDaniel Dunbar }
62ff53d469SDaniel Dunbar 
range(unsigned Start,unsigned End)63ff53d469SDaniel Dunbar std::set<unsigned> range(unsigned Start, unsigned End) {
64ff53d469SDaniel Dunbar   std::set<unsigned> S;
65ff53d469SDaniel Dunbar   while (Start != End)
66ff53d469SDaniel Dunbar     S.insert(Start++);
67ff53d469SDaniel Dunbar   return S;
68ff53d469SDaniel Dunbar }
69ff53d469SDaniel Dunbar 
range(unsigned N)70ff53d469SDaniel Dunbar std::set<unsigned> range(unsigned N) {
71ff53d469SDaniel Dunbar   return range(0, N);
72ff53d469SDaniel Dunbar }
73ff53d469SDaniel Dunbar 
TEST(DeltaAlgorithmTest,Basic)74ff53d469SDaniel Dunbar TEST(DeltaAlgorithmTest, Basic) {
75ff53d469SDaniel Dunbar   // P = {3,5,7} \in S
76ff53d469SDaniel Dunbar   //   [0, 20) should minimize to {3,5,7} in a reasonable number of tests.
77ff53d469SDaniel Dunbar   std::set<unsigned> Fails = fixed_set(3, 3, 5, 7);
78ff53d469SDaniel Dunbar   FixedDeltaAlgorithm FDA(Fails);
79ff53d469SDaniel Dunbar   EXPECT_EQ(fixed_set(3, 3, 5, 7), FDA.Run(range(20)));
80ff53d469SDaniel Dunbar   EXPECT_GE(33U, FDA.getNumTests());
81ff53d469SDaniel Dunbar 
82ff53d469SDaniel Dunbar   // P = {3,5,7} \in S
83ff53d469SDaniel Dunbar   //   [10, 20) should minimize to [10,20)
84ff53d469SDaniel Dunbar   EXPECT_EQ(range(10,20), FDA.Run(range(10,20)));
85ff53d469SDaniel Dunbar 
86ff53d469SDaniel Dunbar   // P = [0,4) \in S
87ff53d469SDaniel Dunbar   //   [0, 4) should minimize to [0,4) in 11 tests.
88ff53d469SDaniel Dunbar   //
89ff53d469SDaniel Dunbar   // 11 = |{ {},
90ff53d469SDaniel Dunbar   //         {0}, {1}, {2}, {3},
91ff53d469SDaniel Dunbar   //         {1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2},
92ff53d469SDaniel Dunbar   //         {0, 1}, {2, 3} }|
93ff53d469SDaniel Dunbar   FDA = FixedDeltaAlgorithm(range(10));
94ff53d469SDaniel Dunbar   EXPECT_EQ(range(4), FDA.Run(range(4)));
95ff53d469SDaniel Dunbar   EXPECT_EQ(11U, FDA.getNumTests());
96ff53d469SDaniel Dunbar }
97ff53d469SDaniel Dunbar 
98ff53d469SDaniel Dunbar }
99ff53d469SDaniel Dunbar 
100