diff --git a/data/mods/TEST_DATA/items.json b/data/mods/TEST_DATA/items.json index c856bf2076b55..5b0140afe53e5 100644 --- a/data/mods/TEST_DATA/items.json +++ b/data/mods/TEST_DATA/items.json @@ -4754,5 +4754,42 @@ "to_hit": -3, "melee_damage": { "bash": 1 }, "revert_to": "cheese_hard" + }, + { + "type": "COMESTIBLE", + "comestible_type": "FOOD", + "id": "test_100_kcal", + "category": "spare_parts", + "symbol": ",", + "color": "light_gray", + "name": { "str": "TEST rock cheese" }, + "description": "A perfectly divided 100kcal portion of pure food.", + "price": 0, + "spoils_in": "360 days", + "calories": 100, + "material": [ "stone" ], + "weight": "100 g", + "volume": "250 ml", + "to_hit": -3, + "melee_damage": { "bash": 1 } + }, + { + "type": "COMESTIBLE", + "comestible_type": "FOOD", + "id": "test_200_kcal", + "category": "spare_parts", + "symbol": ",", + "color": "light_gray", + "name": { "str": "TEST 200kcal recipe inherited" }, + "description": "Two 100kcal portions of pure food smashed together by a rude survivor. Not a sandwich.", + "price": 0, + "spoils_in": "360 days", + "//": "The purpose of this item is to make sure it gives 200kcal when crafted from 100+100, and not the set calories", + "calories": 185, + "material": [ "stone" ], + "weight": "100 g", + "volume": "250 ml", + "to_hit": -3, + "melee_damage": { "bash": 1 } } ] diff --git a/data/mods/TEST_DATA/recipes.json b/data/mods/TEST_DATA/recipes.json index 54acd96e1ca9a..1085f8df64258 100644 --- a/data/mods/TEST_DATA/recipes.json +++ b/data/mods/TEST_DATA/recipes.json @@ -279,5 +279,17 @@ "time": "2 h", "autolearn": true, "using": [ [ "tailoring_cotton_patchwork", 6 ] ] + }, + { + "result": "test_200_kcal", + "type": "recipe", + "activity_level": "NO_EXERCISE", + "category": "CC_FOOD", + "subcategory": "CSC_FOOD_MEAT", + "skill_used": "cooking", + "difficulty": 0, + "time": "2 s", + "autolearn": true, + "components": [ [ [ "test_100_kcal", 2 ] ] ] } ] diff --git a/tests/faction_camp_test.cpp b/tests/faction_camp_test.cpp new file mode 100644 index 0000000000000..10d82d89cab33 --- /dev/null +++ b/tests/faction_camp_test.cpp @@ -0,0 +1,62 @@ +#include +#include +#include +#include + +#include "basecamp.h" +#include "cata_catch.h" +#include "clzones.h" +#include "coordinates.h" +#include "faction.h" +#include "map.h" +#include "map_helpers.h" +#include "overmap.h" +#include "overmapbuffer.h" +#include "player_helpers.h" + +static const zone_type_id zone_type_CAMP_FOOD( "CAMP_FOOD" ); +static const zone_type_id zone_type_CAMP_STORAGE( "CAMP_STORAGE" ); + +TEST_CASE( "camp_calorie_counting", "[camp]" ) +{ + clear_avatar(); + clear_map(); + map &m = get_map(); + const tripoint_abs_ms zone_loc = m.getglobal( tripoint{ 5, 5, 0 } ); + mapgen_place_zone( zone_loc.raw(), zone_loc.raw(), zone_type_CAMP_FOOD, your_fac, {}, + "food" ); + mapgen_place_zone( zone_loc.raw(), zone_loc.raw(), zone_type_CAMP_STORAGE, your_fac, {}, + "storage" ); + faction *camp_faction = get_player_character().get_faction(); + const tripoint_abs_omt this_omt = project_to( zone_loc ); + m.add_camp( this_omt, "faction_camp" ); + std::optional bcp = overmap_buffer.find_camp( this_omt.xy() ); + basecamp *test_camp = *bcp; + WHEN( "a base item is added to larder" ) { + camp_faction->food_supply = 0; + item test_100_kcal( "test_100_kcal" ); + tripoint_bub_ms zone_local = m.bub_from_abs( zone_loc ); + m.i_clear( zone_local.raw() ); + m.add_item_or_charges( zone_local, test_100_kcal ); + REQUIRE( m.has_items( zone_local ) ); + test_camp->distribute_food(); + CHECK( camp_faction->food_supply == 100 ); + } + + WHEN( "an item with inherited components is added to larder" ) { + camp_faction->food_supply = 0; + item test_100_kcal( "test_100_kcal" ); + item test_200_kcal( "test_200_kcal" ); + item_components made_of; + made_of.add( test_100_kcal ); + made_of.add( test_100_kcal ); + // Setting the actual components. This will return 185 unless it's actually made up of two 100kcal components! + test_200_kcal.components = made_of; + tripoint_bub_ms zone_local = m.bub_from_abs( zone_loc ); + m.i_clear( zone_local.raw() ); + m.add_item_or_charges( zone_local, test_200_kcal ); + test_camp->distribute_food(); + CHECK( camp_faction->food_supply == 200 ); + } +} +// TODO: Tests for: Check calorie display at various activity levels, camp crafting works as expected (consumes inputs, returns outputs+byproducts, costs calories)