#include #include #include #include #include "nd-wfc/wfc.hpp" #include "nd-wfc/worlds.hpp" // Test world for demonstration struct TestWorld { using ValueType = int; std::vector data; TestWorld(size_t size) : data(size, 0) {} size_t size() const { return data.size(); } void setValue(size_t id, int value) { data[id] = value; } int getValue(size_t id) const { return data[id]; } }; // Test random selectors TEST(RandomSelectorTest, DefaultRandomSelector) { using namespace WFC; // Test default random selector with constexpr capabilities DefaultRandomSelector selector(12345); std::array testValues = {1, 2, 3}; std::span span(testValues.data(), testValues.size()); // Test that selector returns valid indices size_t index1 = selector(span); size_t index2 = selector(span); EXPECT_LT(index1, testValues.size()); EXPECT_LT(index2, testValues.size()); EXPECT_GE(index1, 0); EXPECT_GE(index2, 0); } TEST(RandomSelectorTest, AdvancedRandomSelector) { using namespace WFC; std::mt19937 rng(54321); AdvancedRandomSelector selector(rng); std::array testValues = {10, 20, 30, 40}; std::span span(testValues.data(), testValues.size()); // Test that selector returns valid indices size_t index = selector(span); EXPECT_LT(index, testValues.size()); EXPECT_GE(index, 0); // Verify the selected value matches EXPECT_EQ(testValues[index], span[index]); } TEST(RandomSelectorTest, CustomLambdaSelector) { using namespace WFC; // Custom selector that always picks the first element auto firstSelector = [](std::span values) -> size_t { return 0; }; std::array testValues = {100, 200, 300}; std::span span(testValues.data(), testValues.size()); size_t index = firstSelector(span); EXPECT_EQ(index, 0); EXPECT_EQ(span[index], 100); } TEST(RandomSelectorTest, StatefulLambdaSelector) { using namespace WFC; // Stateful selector that cycles through options uint32_t callCount = 0; auto cyclingSelector = [&callCount](std::span values) mutable -> size_t { return callCount++ % values.size(); }; std::array testValues = {1, 2, 3}; std::span span(testValues.data(), testValues.size()); // Test multiple calls EXPECT_EQ(cyclingSelector(span), 0); EXPECT_EQ(cyclingSelector(span), 1); EXPECT_EQ(cyclingSelector(span), 2); EXPECT_EQ(cyclingSelector(span), 0); // Should cycle back } TEST(RandomSelectorTest, WFCIntegration) { using namespace WFC; // Create a simple WFC setup with custom random selector using VariableMap = VariableIDMap; using CustomWFC = Builder ::SetRandomSelector> ::Build; TestWorld world(4); uint32_t seed = 12345; // This should compile and run without errors // (Note: This is a basic integration test - full WFC solving would require proper constraints) SUCCEED(); } TEST(RandomSelectorTest, ConstexprDefaultSelector) { using namespace WFC; // Test that default selector can be used in constexpr context constexpr DefaultRandomSelector selector(0xDEADBEEF); constexpr std::array testValues = {42, 84}; constexpr auto span = std::span(testValues.data(), testValues.size()); // This should compile in constexpr context constexpr size_t index = selector(span); EXPECT_LT(index, testValues.size()); EXPECT_GE(index, 0); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }