1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#include <functional>
#include <optional>
#include <list>
#include "cata_catch.h"
#include "character.h"
#include "item.h"
#include "item_location.h"
#include "map.h"
#include "map_helpers.h"
#include "map_selector.h"
#include "player_helpers.h"
#include "pocket_type.h"
#include "point.h"
#include "ret_val.h"
#include "rng.h"
#include "type_id.h"
#include "visitable.h"
static const itype_id itype_jeans( "jeans" );
static const itype_id itype_tshirt( "tshirt" );
TEST_CASE( "item_location_can_maintain_reference_despite_item_removal", "[item][item_location]" )
{
clear_map();
map &m = get_map();
tripoint pos( 60, 60, 0 );
m.i_clear( pos );
m.add_item( pos, item( "jeans" ) );
m.add_item( pos, item( "jeans" ) );
m.add_item( pos, item( "tshirt" ) );
m.add_item( pos, item( "jeans" ) );
m.add_item( pos, item( "jeans" ) );
map_cursor cursor( pos );
item *tshirt = nullptr;
cursor.visit_items( [&tshirt]( item * i, item * ) {
if( i->typeId() == itype_tshirt ) {
tshirt = i;
return VisitResponse::ABORT;
}
return VisitResponse::NEXT;
} );
REQUIRE( tshirt != nullptr );
item_location item_loc( cursor, tshirt );
REQUIRE( item_loc->typeId() == itype_tshirt );
for( int j = 0; j < 4; ++j ) {
// Delete up to 4 random jeans
map_stack stack = m.i_at( pos );
REQUIRE( !stack.empty() );
item *i = &random_entry_opt( stack )->get();
if( i->typeId() == itype_jeans ) {
m.i_rem( pos, i );
}
}
CAPTURE( m.i_at( pos ) );
REQUIRE( item_loc );
CHECK( item_loc->typeId() == itype_tshirt );
}
TEST_CASE( "item_location_doesnt_return_stale_map_item", "[item][item_location]" )
{
clear_map();
map &m = get_map();
tripoint pos( 60, 60, 0 );
m.i_clear( pos );
m.add_item( pos, item( "tshirt" ) );
item_location item_loc( map_cursor( pos ), &m.i_at( pos ).only_item() );
REQUIRE( item_loc->typeId() == itype_tshirt );
m.i_rem( pos, &*item_loc );
m.add_item( pos, item( "jeans" ) );
CHECK( !item_loc );
}
TEST_CASE( "item_in_container", "[item][item_location]" )
{
Character &dummy = get_player_character();
clear_avatar();
item_location backpack = dummy.i_add( item( "backpack" ) );
item jeans( "jeans" );
REQUIRE( dummy.has_item( *backpack ) );
backpack->put_in( jeans, pocket_type::CONTAINER );
item_location backpack_loc( dummy, & **dummy.wear_item( *backpack ) );
REQUIRE( dummy.has_item( *backpack_loc ) );
item_location jeans_loc( backpack_loc, &backpack_loc->only_item() );
REQUIRE( backpack_loc.where() == item_location::type::character );
REQUIRE( jeans_loc.where() == item_location::type::container );
const int obtain_cost_calculation = dummy.item_handling_cost( *jeans_loc, true,
backpack_loc->obtain_cost( *jeans_loc ) );
CHECK( obtain_cost_calculation == jeans_loc.obtain_cost( dummy ) );
CHECK( jeans_loc.parent_item() == backpack_loc );
}
|