forked from CleverRaven/Cataclysm-DDA
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathitem_location_test.cpp
96 lines (85 loc) · 2.97 KB
/
item_location_test.cpp
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
#include <functional>
#include <functional>
#include <list>
#include "cata_catch.h"
#include "character.h"
#include "item.h"
#include "item_location.h"
#include "item_pocket.h"
#include "map.h"
#include "map_helpers.h"
#include "map_selector.h"
#include "optional.h"
#include "player_helpers.h"
#include "point.h"
#include "ret_val.h"
#include "rng.h"
#include "type_id.h"
#include "visitable.h"
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_id( "tshirt" ) ) {
tshirt = i;
return VisitResponse::ABORT;
}
return VisitResponse::NEXT;
} );
REQUIRE( tshirt != nullptr );
item_location item_loc( cursor, tshirt );
REQUIRE( item_loc->typeId() == itype_id( "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_id( "jeans" ) ) {
m.i_rem( pos, i );
}
}
CAPTURE( m.i_at( pos ) );
REQUIRE( item_loc );
CHECK( item_loc->typeId() == itype_id( "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_id( "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 &backpack = dummy.i_add( item( "backpack" ) );
item jeans( "jeans" );
REQUIRE( dummy.has_item( backpack ) );
backpack.put_in( jeans, item_pocket::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 );
}