/** * Copyright (c) 2026 Dominic Masters * * This software is released under the MIT License. * https://opensource.org/licenses/MIT */ #include "dusktest.h" #include "util/memory.h" #include "rpg/overworld/tileshape.h" static void test_tileShapeGetRampHeightGroundIsAlwaysFlat(void **state) { assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_GROUND, 0.0f, 0.0f), 0.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_GROUND, 1.0f, 1.0f), 0.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_GROUND, 0.5f, 0.5f), 0.0f, 0.0001f ); assert_int_equal(memoryGetAllocatedCount(), 0); } static void test_tileShapeGetRampHeightCardinalRamps(void **state) { // RAMP_NORTH: rises going north (+y) - height equals localY. assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTH, 0.5f, 0.0f), 0.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTH, 0.5f, 1.0f), 1.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTH, 0.0f, 0.5f), 0.5f, 0.0001f ); // RAMP_SOUTH: rises going south (-y) - height equals 1 - localY. assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_SOUTH, 0.5f, 0.0f), 1.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_SOUTH, 0.5f, 1.0f), 0.0f, 0.0001f ); // RAMP_EAST: rises going east (+x) - height equals localX. assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_EAST, 0.0f, 0.5f), 0.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_EAST, 1.0f, 0.5f), 1.0f, 0.0001f ); // RAMP_WEST: rises going west (-x) - height equals 1 - localX. assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_WEST, 0.0f, 0.5f), 1.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_WEST, 1.0f, 0.5f), 0.0f, 0.0001f ); assert_int_equal(memoryGetAllocatedCount(), 0); } static void test_tileShapeGetRampHeightOuterCornerRamps(void **state) { // RAMP_NORTHEAST: only the NE corner raised - a hip shape, height // equal to min(localX, localY) since the mesh is split along the // SW-NE diagonal into two flat triangles. assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST, 0.0f, 0.0f), 0.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST, 1.0f, 1.0f), 1.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST, 0.3f, 0.7f), 0.3f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST, 0.7f, 0.3f), 0.3f, 0.0001f ); // RAMP_SOUTHWEST: only the SW corner raised - height equal to // min(1 - localX, 1 - localY). assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_SOUTHWEST, 0.0f, 0.0f), 1.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_SOUTHWEST, 1.0f, 1.0f), 0.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_SOUTHWEST, 1.0f, 0.0f), 0.0f, 0.0001f ); assert_int_equal(memoryGetAllocatedCount(), 0); } static void test_tileShapeGetRampHeightInnerCornerRamp(void **state) { // RAMP_NORTHEAST_INNER: only the opposite (SW) corner lowered, rest of // the tile raised - height equal to max(localX, localY). assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST_INNER, 0.0f, 0.0f), 0.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST_INNER, 1.0f, 1.0f), 1.0f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST_INNER, 0.3f, 0.7f), 0.7f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST_INNER, 0.7f, 0.3f), 0.7f, 0.0001f ); assert_float_equal( tileShapeGetRampHeight(TILE_SHAPE_RAMP_NORTHEAST_INNER, 1.0f, 0.0f), 1.0f, 0.0001f ); assert_int_equal(memoryGetAllocatedCount(), 0); } int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test(test_tileShapeGetRampHeightGroundIsAlwaysFlat), cmocka_unit_test(test_tileShapeGetRampHeightCardinalRamps), cmocka_unit_test(test_tileShapeGetRampHeightOuterCornerRamps), cmocka_unit_test(test_tileShapeGetRampHeightInnerCornerRamp), }; return cmocka_run_group_tests(tests, NULL, NULL); }