#include "fces/controller.hpp" #include using namespace fces; TEST(ControllerTest, Construction) { FuzzyController ctrl; EXPECT_GT(ctrl.id, 0u); EXPECT_EQ(ctrl.fitness, 0.0f); EXPECT_EQ(ctrl.origin, "random"); } TEST(ControllerTest, GenomeSize) { FuzzyController ctrl; EXPECT_EQ(ctrl.genome.weights.size(), static_cast(GENOME_SIZE)); } TEST(ControllerTest, Mutation) { FuzzyController parent; auto child = parent.mutate(1.0f); EXPECT_NE(child.id, parent.id); EXPECT_EQ(child.origin, "mutation"); // Child should differ from parent bool differs = false; for (size_t i = 0; i < parent.genome.weights.size(); ++i) { if (parent.genome.weights[i] != child.genome.weights[i]) { differs = true; break; } } EXPECT_TRUE(differs); } TEST(ControllerTest, Crossover) { FuzzyController a, b; auto child = a.crossover(b); EXPECT_EQ(child.origin, "crossover"); } TEST(ControllerTest, DecideUpdate) { FuzzyController ctrl; std::vector> stats = {{0.1f, 0.2f, 0.3f, 0.4f, 0.5f}}; auto actions = ctrl.decide_update(stats, 0.0f, 0.5f, 0.0f, 0.1f, 0.0f, 0.0f, 1.0f, 0.0f); EXPECT_EQ(actions.size(0), 1); EXPECT_EQ(actions.size(1), GENOME_OUTPUT_DIM); } TEST(ControllerTest, OrthogonalChild) { FuzzyController parent; auto child = parent.create_orthogonal_child(1.0f); EXPECT_EQ(child.origin, "phoenix_rebirth"); } TEST(ControllerTest, BanachFission) { FuzzyController parent; auto [plus, minus] = parent.banach_tarski_fission(1.0f); EXPECT_NE(plus.id, minus.id); }