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