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