#include #include "TamaLogic.h" void setUp() {} void tearDown() {} // Helper: build a minimal BuddyState for updateTama calls static BuddyState makeBuddy(uint32_t revertAt = 0, Mood m = MOOD_NORMAL) { BuddyState b{}; b.revertAt = revertAt; b.mood = m; return b; } // ── initTama ────────────────────────────────────────────────────────────── void test_initTama_sets_initial_values() { TamaState t{}; initTama(t, 0); TEST_ASSERT_EQUAL(10, t.hunger); TEST_ASSERT_EQUAL(80, t.happiness); TEST_ASSERT_EQUAL(90, t.hygiene); } void test_initTama_sets_tick_timestamps() { TamaState t{}; initTama(t, 1000); TEST_ASSERT_EQUAL(1000u + 120000u, t.nextHungerTick); TEST_ASSERT_EQUAL(1000u + 180000u, t.nextHappyTick); TEST_ASSERT_EQUAL(1000u + 240000u, t.nextHygieneTick); } // ── updateTama ticks ────────────────────────────────────────────────────── void test_updateTama_increments_hunger_on_tick() { TamaState t{}; initTama(t, 0); // nextHungerTick = 120000 BuddyState b = makeBuddy(); updateTama(t, b, 120000); TEST_ASSERT_EQUAL(11, t.hunger); } void test_updateTama_does_not_increment_hunger_before_tick() { TamaState t{}; initTama(t, 0); BuddyState b = makeBuddy(); updateTama(t, b, 119999); TEST_ASSERT_EQUAL(10, t.hunger); } void test_updateTama_caps_hunger_at_100() { TamaState t{}; initTama(t, 0); t.hunger = 100; BuddyState b = makeBuddy(); updateTama(t, b, 120000); TEST_ASSERT_EQUAL(100, t.hunger); } void test_updateTama_decrements_happiness_on_tick() { TamaState t{}; initTama(t, 0); // nextHappyTick = 180000 BuddyState b = makeBuddy(); updateTama(t, b, 180000); TEST_ASSERT_EQUAL(79, t.happiness); } void test_updateTama_caps_happiness_at_zero() { TamaState t{}; initTama(t, 0); t.happiness = 0; BuddyState b = makeBuddy(); updateTama(t, b, 180000); TEST_ASSERT_EQUAL(0, t.happiness); } void test_updateTama_decrements_hygiene_on_tick() { TamaState t{}; initTama(t, 0); // nextHygieneTick = 240000 BuddyState b = makeBuddy(); updateTama(t, b, 240000); TEST_ASSERT_EQUAL(89, t.hygiene); } // ── updateTama mood returns ─────────────────────────────────────────────── void test_updateTama_returns_hungry_when_hunger_high() { TamaState t{}; initTama(t, 0); t.hunger = 80; t.nextHungerTick = 999999; // prevent tick BuddyState b = makeBuddy(); TEST_ASSERT_EQUAL(MOOD_HUNGRY, updateTama(t, b, 0)); } void test_updateTama_returns_dirty_when_hygiene_low() { TamaState t{}; initTama(t, 0); t.hygiene = 20; t.nextHygieneTick = 999999; BuddyState b = makeBuddy(); TEST_ASSERT_EQUAL(MOOD_DIRTY, updateTama(t, b, 0)); } void test_updateTama_returns_playful_when_happiness_low() { TamaState t{}; initTama(t, 0); t.happiness = 20; t.nextHappyTick = 999999; BuddyState b = makeBuddy(); TEST_ASSERT_EQUAL(MOOD_PLAYFUL, updateTama(t, b, 0)); } void test_updateTama_no_override_when_revertAt_set() { TamaState t{}; initTama(t, 0); t.hunger = 90; t.nextHungerTick = 999999; BuddyState b = makeBuddy(5000); // revertAt != 0 → guard blocks TEST_ASSERT_EQUAL(MOOD_NORMAL, updateTama(t, b, 0)); } void test_updateTama_returns_normal_when_needs_ok() { TamaState t{}; initTama(t, 0); // hunger=10, happy=80, hygiene=90 — all fine t.nextHungerTick = t.nextHappyTick = t.nextHygieneTick = 999999; BuddyState b = makeBuddy(); TEST_ASSERT_EQUAL(MOOD_NORMAL, updateTama(t, b, 0)); } // ── tamaFeed ────────────────────────────────────────────────────────────── void test_tamaFeed_reduces_hunger_by_30() { TamaState t{}; t.hunger = 50; tamaFeed(t); TEST_ASSERT_EQUAL(20, t.hunger); } void test_tamaFeed_floors_hunger_at_zero() { TamaState t{}; t.hunger = 10; tamaFeed(t); TEST_ASSERT_EQUAL(0, t.hunger); } // ── tamaPlay ────────────────────────────────────────────────────────────── void test_tamaPlay_increases_happiness_by_25() { TamaState t{}; t.happiness = 50; tamaPlay(t); TEST_ASSERT_EQUAL(75, t.happiness); } void test_tamaPlay_caps_happiness_at_100() { TamaState t{}; t.happiness = 90; tamaPlay(t); TEST_ASSERT_EQUAL(100, t.happiness); } // ── tamaClean ───────────────────────────────────────────────────────────── void test_tamaClean_increases_hygiene_by_40() { TamaState t{}; t.hygiene = 50; tamaClean(t); TEST_ASSERT_EQUAL(90, t.hygiene); } void test_tamaClean_caps_hygiene_at_100() { TamaState t{}; t.hygiene = 80; tamaClean(t); TEST_ASSERT_EQUAL(100, t.hygiene); } // ── main ────────────────────────────────────────────────────────────────── int main() { UNITY_BEGIN(); RUN_TEST(test_initTama_sets_initial_values); RUN_TEST(test_initTama_sets_tick_timestamps); RUN_TEST(test_updateTama_increments_hunger_on_tick); RUN_TEST(test_updateTama_does_not_increment_hunger_before_tick); RUN_TEST(test_updateTama_caps_hunger_at_100); RUN_TEST(test_updateTama_decrements_happiness_on_tick); RUN_TEST(test_updateTama_caps_happiness_at_zero); RUN_TEST(test_updateTama_decrements_hygiene_on_tick); RUN_TEST(test_updateTama_returns_hungry_when_hunger_high); RUN_TEST(test_updateTama_returns_dirty_when_hygiene_low); RUN_TEST(test_updateTama_returns_playful_when_happiness_low); RUN_TEST(test_updateTama_no_override_when_revertAt_set); RUN_TEST(test_updateTama_returns_normal_when_needs_ok); RUN_TEST(test_tamaFeed_reduces_hunger_by_30); RUN_TEST(test_tamaFeed_floors_hunger_at_zero); RUN_TEST(test_tamaPlay_increases_happiness_by_25); RUN_TEST(test_tamaPlay_caps_happiness_at_100); RUN_TEST(test_tamaClean_increases_hygiene_by_40); RUN_TEST(test_tamaClean_caps_hygiene_at_100); return UNITY_END(); }