File: zones_custom_test.cpp

package info (click to toggle)
cataclysm-dda 0.H-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 710,808 kB
  • sloc: cpp: 524,019; python: 11,580; sh: 1,228; makefile: 1,169; xml: 507; javascript: 150; sql: 56; exp: 41; perl: 37
file content (101 lines) | stat: -rw-r--r-- 6,336 bytes parent folder | download
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
99
100
101
#include "cata_catch.h"
#include "clzones.h"
#include "map_helpers.h"

static const zone_type_id zone_type_LOOT_CUSTOM( "LOOT_CUSTOM" );
static const zone_type_id zone_type_LOOT_ITEM_GROUP( "LOOT_ITEM_GROUP" );

using pset = std::unordered_set<tripoint_abs_ms>;

TEST_CASE( "zones_custom", "[zones]" )
{
    WHEN( "overlapping custom zones" ) {
        clear_map();
        map &m = get_map();
        tripoint const zone_loc = m.getabs( tripoint{ 5, 5, 0 } );
        tripoint const zone_hammer_end = zone_loc + tripoint_north;
        tripoint const zone_bowsaw_end = zone_loc + tripoint_south;
        tripoint const zone_testgroup_end = zone_loc + tripoint_east;
        tripoint const zone_groupbatt_end = zone_loc + tripoint_west;
        tripoint_abs_ms const where = m.getglobal( tripoint_zero );
        item hammer( "hammer" );
        item bow_saw( "bow_saw" );
        item pants_fur( "test_pants_fur" );
        item batt( "test_battery_disposable" );
        item bag_plastic( "bag_plastic" );
        item nested_batt( "test_battery_disposable" );
        int const num = GENERATE( 1, 2 );
        for( int i = 0; i < num; i++ ) {
            bag_plastic.put_in( nested_batt, pocket_type::CONTAINER );
        }
        CAPTURE( num, bag_plastic.display_name() );

        mapgen_place_zone( zone_loc + tripoint_north_west, zone_loc + tripoint_south_east,
                           zone_type_LOOT_CUSTOM, your_fac, {}, "completely unrelated overlap" );
        mapgen_place_zone( zone_loc, zone_hammer_end, zone_type_LOOT_CUSTOM, your_fac, {},
                           "hammer" );
        mapgen_place_zone( zone_loc, zone_bowsaw_end, zone_type_LOOT_CUSTOM, your_fac, {},
                           "c:tools,-hammer" );
        mapgen_place_zone( zone_loc, zone_testgroup_end, zone_type_LOOT_ITEM_GROUP, your_fac, {},
                           "test_event_item_spawn" );
        mapgen_place_zone( zone_loc, zone_groupbatt_end, zone_type_LOOT_ITEM_GROUP, your_fac, {},
                           "test_group_disp" );
        tripoint const m_zone_loc = m.getabs( tripoint{-5, -5, 0 } );
        mapgen_place_zone( m_zone_loc, m_zone_loc, zone_type_LOOT_CUSTOM, your_fac, {},
                           "plastic bag" );

        zone_manager &zmgr = zone_manager::get_manager();
        REQUIRE( zmgr.get_near_zone_type_for_item( hammer, where ) == zone_type_LOOT_CUSTOM );
        REQUIRE( zmgr.get_near_zone_type_for_item( bow_saw, where ) == zone_type_LOOT_CUSTOM );
        REQUIRE( !zmgr.get_near_zone_type_for_item( item( "test_glaive" ), where ).is_valid() );
        REQUIRE( zmgr.get_near_zone_type_for_item( pants_fur, where ) ==
                 zone_type_LOOT_ITEM_GROUP );
        REQUIRE( zmgr.get_near_zone_type_for_item( batt, where ) == zone_type_LOOT_ITEM_GROUP );
        // this should match both types but custom zone comes first
        REQUIRE( zmgr.get_near_zone_type_for_item( bag_plastic, where ) == zone_type_LOOT_CUSTOM );

        pset const hammerpoints =
            zmgr.get_near( zone_type_LOOT_CUSTOM, where, ACTIVITY_SEARCH_DISTANCE, &hammer );
        REQUIRE( hammerpoints.count( tripoint_abs_ms( zone_loc ) ) == 1 );
        REQUIRE( hammerpoints.count( tripoint_abs_ms( zone_hammer_end ) ) == 1 );
        REQUIRE( hammerpoints.count( tripoint_abs_ms( zone_bowsaw_end ) ) == 0 );
        REQUIRE( hammerpoints.count( tripoint_abs_ms( zone_testgroup_end ) ) == 0 );
        REQUIRE( hammerpoints.count( tripoint_abs_ms( zone_groupbatt_end ) ) == 0 );
        pset const bowsawpoints =
            zmgr.get_near( zone_type_LOOT_CUSTOM, where, ACTIVITY_SEARCH_DISTANCE, &bow_saw );
        REQUIRE( bowsawpoints.count( tripoint_abs_ms( zone_loc ) ) == 1 );
        REQUIRE( bowsawpoints.count( tripoint_abs_ms( zone_hammer_end ) ) == 0 );
        REQUIRE( bowsawpoints.count( tripoint_abs_ms( zone_bowsaw_end ) ) == 1 );
        REQUIRE( bowsawpoints.count( tripoint_abs_ms( zone_testgroup_end ) ) == 0 );
        REQUIRE( bowsawpoints.count( tripoint_abs_ms( zone_groupbatt_end ) ) == 0 );
        pset const testgrouppoints =
            zmgr.get_near( zone_type_LOOT_ITEM_GROUP, where, ACTIVITY_SEARCH_DISTANCE, &pants_fur );
        REQUIRE( testgrouppoints.count( tripoint_abs_ms( zone_loc ) ) == 1 );
        REQUIRE( testgrouppoints.count( tripoint_abs_ms( zone_hammer_end ) ) == 0 );
        REQUIRE( testgrouppoints.count( tripoint_abs_ms( zone_bowsaw_end ) ) == 0 );
        REQUIRE( testgrouppoints.count( tripoint_abs_ms( zone_testgroup_end ) ) == 1 );
        REQUIRE( testgrouppoints.count( tripoint_abs_ms( zone_groupbatt_end ) ) == 0 );
        pset const groupbattpoints =
            zmgr.get_near( zone_type_LOOT_ITEM_GROUP, where, ACTIVITY_SEARCH_DISTANCE, &batt );
        REQUIRE( groupbattpoints.count( tripoint_abs_ms( zone_loc ) ) == 1 );
        REQUIRE( groupbattpoints.count( tripoint_abs_ms( zone_hammer_end ) ) == 0 );
        REQUIRE( groupbattpoints.count( tripoint_abs_ms( zone_bowsaw_end ) ) == 0 );
        REQUIRE( groupbattpoints.count( tripoint_abs_ms( zone_testgroup_end ) ) == 0 );
        REQUIRE( groupbattpoints.count( tripoint_abs_ms( zone_groupbatt_end ) ) == 1 );
        pset const nestedbattpoints =
            zmgr.get_near( zone_type_LOOT_ITEM_GROUP, where, ACTIVITY_SEARCH_DISTANCE, &bag_plastic );
        REQUIRE( nestedbattpoints.count( tripoint_abs_ms( zone_loc ) ) == 1 );
        REQUIRE( nestedbattpoints.count( tripoint_abs_ms( zone_hammer_end ) ) == 0 );
        REQUIRE( nestedbattpoints.count( tripoint_abs_ms( zone_bowsaw_end ) ) == 0 );
        REQUIRE( nestedbattpoints.count( tripoint_abs_ms( zone_testgroup_end ) ) == 0 );
        REQUIRE( nestedbattpoints.count( tripoint_abs_ms( zone_groupbatt_end ) ) == 1 );
        pset const nbp2 =
            zmgr.get_near( zone_type_LOOT_CUSTOM, where, ACTIVITY_SEARCH_DISTANCE, &bag_plastic );
        REQUIRE( nbp2.count( tripoint_abs_ms( zone_loc ) ) == 0 );
        REQUIRE( nbp2.count( tripoint_abs_ms( zone_hammer_end ) ) == 0 );
        REQUIRE( nbp2.count( tripoint_abs_ms( zone_bowsaw_end ) ) == 0 );
        REQUIRE( nbp2.count( tripoint_abs_ms( zone_testgroup_end ) ) == 0 );
        REQUIRE( nbp2.count( tripoint_abs_ms( zone_groupbatt_end ) ) == 0 );
        REQUIRE( nbp2.count( tripoint_abs_ms( m_zone_loc ) ) == 1 ); // container matches this zone
    }
}