xref: /llvm-project/llvm/unittests/ADT/CombinationGeneratorTest.cpp (revision 3406a2bc5ff71b2e395a28d4f65d177bafb60b9b)
1*7a98761dSRoman Lebedev //===- llvm/unittest/ADT/CombinationGeneratorTest.cpp ---------------------===//
2*7a98761dSRoman Lebedev //
3*7a98761dSRoman Lebedev // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*7a98761dSRoman Lebedev // See https://llvm.org/LICENSE.txt for license information.
5*7a98761dSRoman Lebedev // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*7a98761dSRoman Lebedev //
7*7a98761dSRoman Lebedev //===----------------------------------------------------------------------===//
8*7a98761dSRoman Lebedev 
9*7a98761dSRoman Lebedev #include "llvm/ADT/CombinationGenerator.h"
10*7a98761dSRoman Lebedev #include "llvm/ADT/ArrayRef.h"
11*7a98761dSRoman Lebedev #include "llvm/ADT/STLExtras.h"
12*7a98761dSRoman Lebedev #include "llvm/Support/ErrorHandling.h"
13*7a98761dSRoman Lebedev #include "gmock/gmock.h"
14*7a98761dSRoman Lebedev #include "gtest/gtest.h"
15*7a98761dSRoman Lebedev #include <algorithm>
16*7a98761dSRoman Lebedev #include <cstddef>
17*7a98761dSRoman Lebedev #include <iterator>
18*7a98761dSRoman Lebedev #include <vector>
19*7a98761dSRoman Lebedev 
20*7a98761dSRoman Lebedev using namespace llvm;
21*7a98761dSRoman Lebedev 
22*7a98761dSRoman Lebedev namespace {
23*7a98761dSRoman Lebedev 
TEST(CombinationGenerator,Square)24*7a98761dSRoman Lebedev TEST(CombinationGenerator, Square) {
25*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> Choices{{0, 1}, {2, 3}};
26*7a98761dSRoman Lebedev 
27*7a98761dSRoman Lebedev   std::vector<std::vector<int>> Variants;
28*7a98761dSRoman Lebedev   CombinationGenerator<int, std::vector<int>, 4> G(Choices);
29*7a98761dSRoman Lebedev   const size_t NumVariants = G.numCombinations();
30*7a98761dSRoman Lebedev   G.generate([&](ArrayRef<int> State) -> bool {
31*7a98761dSRoman Lebedev     Variants.emplace_back(State);
32*7a98761dSRoman Lebedev     return false; // keep going
33*7a98761dSRoman Lebedev   });
34*7a98761dSRoman Lebedev 
35*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> ExpectedVariants{
36*7a98761dSRoman Lebedev       {0, 2},
37*7a98761dSRoman Lebedev       {0, 3},
38*7a98761dSRoman Lebedev       {1, 2},
39*7a98761dSRoman Lebedev       {1, 3},
40*7a98761dSRoman Lebedev   };
41*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::SizeIs(NumVariants));
42*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::ContainerEq(ExpectedVariants));
43*7a98761dSRoman Lebedev }
44*7a98761dSRoman Lebedev 
TEST(CombinationGenerator,MiddleColumn)45*7a98761dSRoman Lebedev TEST(CombinationGenerator, MiddleColumn) {
46*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> Choices{{0}, {1, 2}, {3}};
47*7a98761dSRoman Lebedev 
48*7a98761dSRoman Lebedev   std::vector<std::vector<int>> Variants;
49*7a98761dSRoman Lebedev   CombinationGenerator<int, std::vector<int>, 4> G(Choices);
50*7a98761dSRoman Lebedev   const size_t NumVariants = G.numCombinations();
51*7a98761dSRoman Lebedev   G.generate([&](ArrayRef<int> State) -> bool {
52*7a98761dSRoman Lebedev     Variants.emplace_back(State);
53*7a98761dSRoman Lebedev     return false; // keep going
54*7a98761dSRoman Lebedev   });
55*7a98761dSRoman Lebedev 
56*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> ExpectedVariants{
57*7a98761dSRoman Lebedev       {0, 1, 3},
58*7a98761dSRoman Lebedev       {0, 2, 3},
59*7a98761dSRoman Lebedev   };
60*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::SizeIs(NumVariants));
61*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::ContainerEq(ExpectedVariants));
62*7a98761dSRoman Lebedev }
63*7a98761dSRoman Lebedev 
TEST(CombinationGenerator,SideColumns)64*7a98761dSRoman Lebedev TEST(CombinationGenerator, SideColumns) {
65*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> Choices{{0, 1}, {2}, {3, 4}};
66*7a98761dSRoman Lebedev 
67*7a98761dSRoman Lebedev   std::vector<std::vector<int>> Variants;
68*7a98761dSRoman Lebedev   CombinationGenerator<int, std::vector<int>, 4> G(Choices);
69*7a98761dSRoman Lebedev   const size_t NumVariants = G.numCombinations();
70*7a98761dSRoman Lebedev   G.generate([&](ArrayRef<int> State) -> bool {
71*7a98761dSRoman Lebedev     Variants.emplace_back(State);
72*7a98761dSRoman Lebedev     return false; // keep going
73*7a98761dSRoman Lebedev   });
74*7a98761dSRoman Lebedev 
75*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> ExpectedVariants{
76*7a98761dSRoman Lebedev       {0, 2, 3},
77*7a98761dSRoman Lebedev       {0, 2, 4},
78*7a98761dSRoman Lebedev       {1, 2, 3},
79*7a98761dSRoman Lebedev       {1, 2, 4},
80*7a98761dSRoman Lebedev   };
81*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::SizeIs(NumVariants));
82*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::ContainerEq(ExpectedVariants));
83*7a98761dSRoman Lebedev }
84*7a98761dSRoman Lebedev 
TEST(CombinationGenerator,LeftColumn)85*7a98761dSRoman Lebedev TEST(CombinationGenerator, LeftColumn) {
86*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> Choices{{0, 1}, {2}};
87*7a98761dSRoman Lebedev 
88*7a98761dSRoman Lebedev   std::vector<std::vector<int>> Variants;
89*7a98761dSRoman Lebedev   CombinationGenerator<int, std::vector<int>, 4> G(Choices);
90*7a98761dSRoman Lebedev   const size_t NumVariants = G.numCombinations();
91*7a98761dSRoman Lebedev   G.generate([&](ArrayRef<int> State) -> bool {
92*7a98761dSRoman Lebedev     Variants.emplace_back(State);
93*7a98761dSRoman Lebedev     return false; // keep going
94*7a98761dSRoman Lebedev   });
95*7a98761dSRoman Lebedev 
96*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> ExpectedVariants{
97*7a98761dSRoman Lebedev       {0, 2},
98*7a98761dSRoman Lebedev       {1, 2},
99*7a98761dSRoman Lebedev   };
100*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::SizeIs(NumVariants));
101*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::ContainerEq(ExpectedVariants));
102*7a98761dSRoman Lebedev }
103*7a98761dSRoman Lebedev 
TEST(CombinationGenerator,RightColumn)104*7a98761dSRoman Lebedev TEST(CombinationGenerator, RightColumn) {
105*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> Choices{{0}, {1, 2}};
106*7a98761dSRoman Lebedev 
107*7a98761dSRoman Lebedev   std::vector<std::vector<int>> Variants;
108*7a98761dSRoman Lebedev   CombinationGenerator<int, std::vector<int>, 4> G(Choices);
109*7a98761dSRoman Lebedev   const size_t NumVariants = G.numCombinations();
110*7a98761dSRoman Lebedev   G.generate([&](ArrayRef<int> State) -> bool {
111*7a98761dSRoman Lebedev     Variants.emplace_back(State);
112*7a98761dSRoman Lebedev     return false; // keep going
113*7a98761dSRoman Lebedev   });
114*7a98761dSRoman Lebedev 
115*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> ExpectedVariants{
116*7a98761dSRoman Lebedev       {0, 1},
117*7a98761dSRoman Lebedev       {0, 2},
118*7a98761dSRoman Lebedev   };
119*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::SizeIs(NumVariants));
120*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::ContainerEq(ExpectedVariants));
121*7a98761dSRoman Lebedev }
122*7a98761dSRoman Lebedev 
TEST(CombinationGenerator,Column)123*7a98761dSRoman Lebedev TEST(CombinationGenerator, Column) {
124*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> Choices{{0, 1}};
125*7a98761dSRoman Lebedev 
126*7a98761dSRoman Lebedev   std::vector<std::vector<int>> Variants;
127*7a98761dSRoman Lebedev   CombinationGenerator<int, std::vector<int>, 4> G(Choices);
128*7a98761dSRoman Lebedev   const size_t NumVariants = G.numCombinations();
129*7a98761dSRoman Lebedev   G.generate([&](ArrayRef<int> State) -> bool {
130*7a98761dSRoman Lebedev     Variants.emplace_back(State);
131*7a98761dSRoman Lebedev     return false; // keep going
132*7a98761dSRoman Lebedev   });
133*7a98761dSRoman Lebedev 
134*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> ExpectedVariants{
135*7a98761dSRoman Lebedev       {0},
136*7a98761dSRoman Lebedev       {1},
137*7a98761dSRoman Lebedev   };
138*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::SizeIs(NumVariants));
139*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::ContainerEq(ExpectedVariants));
140*7a98761dSRoman Lebedev }
141*7a98761dSRoman Lebedev 
TEST(CombinationGenerator,Row)142*7a98761dSRoman Lebedev TEST(CombinationGenerator, Row) {
143*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> Choices{{0}, {1}};
144*7a98761dSRoman Lebedev 
145*7a98761dSRoman Lebedev   std::vector<std::vector<int>> Variants;
146*7a98761dSRoman Lebedev   CombinationGenerator<int, std::vector<int>, 4> G(Choices);
147*7a98761dSRoman Lebedev   const size_t NumVariants = G.numCombinations();
148*7a98761dSRoman Lebedev   G.generate([&](ArrayRef<int> State) -> bool {
149*7a98761dSRoman Lebedev     Variants.emplace_back(State);
150*7a98761dSRoman Lebedev     return false; // keep going
151*7a98761dSRoman Lebedev   });
152*7a98761dSRoman Lebedev 
153*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> ExpectedVariants{
154*7a98761dSRoman Lebedev       {0, 1},
155*7a98761dSRoman Lebedev   };
156*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::SizeIs(NumVariants));
157*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::ContainerEq(ExpectedVariants));
158*7a98761dSRoman Lebedev }
159*7a98761dSRoman Lebedev 
TEST(CombinationGenerator,Singleton)160*7a98761dSRoman Lebedev TEST(CombinationGenerator, Singleton) {
161*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> Choices{{0}};
162*7a98761dSRoman Lebedev 
163*7a98761dSRoman Lebedev   std::vector<std::vector<int>> Variants;
164*7a98761dSRoman Lebedev   CombinationGenerator<int, std::vector<int>, 4> G(Choices);
165*7a98761dSRoman Lebedev   const size_t NumVariants = G.numCombinations();
166*7a98761dSRoman Lebedev   G.generate([&](ArrayRef<int> State) -> bool {
167*7a98761dSRoman Lebedev     Variants.emplace_back(State);
168*7a98761dSRoman Lebedev     return false; // keep going
169*7a98761dSRoman Lebedev   });
170*7a98761dSRoman Lebedev 
171*7a98761dSRoman Lebedev   const std::vector<std::vector<int>> ExpectedVariants{
172*7a98761dSRoman Lebedev       {0},
173*7a98761dSRoman Lebedev   };
174*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::SizeIs(NumVariants));
175*7a98761dSRoman Lebedev   ASSERT_THAT(Variants, ::testing::ContainerEq(ExpectedVariants));
176*7a98761dSRoman Lebedev }
177*7a98761dSRoman Lebedev 
178*7a98761dSRoman Lebedev } // end anonymous namespace
179