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
|
#include "catch/catch.hpp"
#include "game.h"
#include "map.h"
#include "player.h"
#include "veh_type.h"
#include "vehicle.h"
TEST_CASE( "vehicle_split_section" )
{
for( int dir = 0; dir < 360; dir += 15 ) {
const tripoint test_origin( 15, 15, 0 );
g->u.setpos( test_origin );
tripoint vehicle_origin = tripoint( 10, 10, 0 );
VehicleList vehs = g->m.get_vehicles();
vehicle *veh_ptr;
for( auto &vehs_v : vehs ) {
veh_ptr = vehs_v.v;
g->m.destroy_vehicle( veh_ptr );
}
g->refresh_all();
REQUIRE( g->m.get_vehicles().empty() );
veh_ptr = g->m.add_vehicle( vproto_id( "cross_split_test" ), vehicle_origin, dir, 0, 0 );
REQUIRE( veh_ptr != nullptr );
std::set<tripoint> original_points = veh_ptr->get_points( true );
g->m.destroy( vehicle_origin );
veh_ptr->part_removal_cleanup();
REQUIRE( veh_ptr->get_parts_at( vehicle_origin, "", part_status_flag::available ).empty() );
vehs = g->m.get_vehicles();
// destroying the center frame results in 4 new vehicles
CHECK( vehs.size() == 4 );
if( vehs.size() == 4 ) {
// correct number of parts
CHECK( vehs[ 0 ].v->parts.size() == 10 );
CHECK( vehs[ 1 ].v->parts.size() == 10 );
CHECK( vehs[ 2 ].v->parts.size() == 2 );
CHECK( vehs[ 3 ].v->parts.size() == 3 );
std::vector<std::set<tripoint>> all_points;
for( int i = 0; i < 4; i++ ) {
std::set<tripoint> &veh_points = vehs[ i ].v->get_points( true );
all_points.push_back( veh_points );
}
for( int i = 0; i < 4; i++ ) {
std::set<tripoint> &veh_points = all_points[ i ];
// every point in the new vehicle was in the old vehicle
for( const tripoint &vpos : veh_points ) {
CHECK( original_points.find( vpos ) != original_points.end() );
}
// no point in any new vehicle is in any other new vehicle
for( int j = i + 1; j < 4; j++ ) {
std::set<tripoint> &other_points = all_points[ j ];
for( const tripoint &vpos : veh_points ) {
CHECK( other_points.find( vpos ) == other_points.end() );
}
}
}
g->m.destroy_vehicle( vehs[ 3 ].v );
g->m.destroy_vehicle( vehs[ 2 ].v );
g->m.destroy_vehicle( vehs[ 1 ].v );
g->m.destroy_vehicle( vehs[ 0 ].v );
}
g->refresh_all();
REQUIRE( g->m.get_vehicles().empty() );
vehicle_origin = tripoint( 20, 20, 0 );
veh_ptr = g->m.add_vehicle( vproto_id( "circle_split_test" ), vehicle_origin, dir, 0, 0 );
REQUIRE( veh_ptr != nullptr );
g->m.destroy( vehicle_origin );
veh_ptr->part_removal_cleanup();
REQUIRE( veh_ptr->get_parts_at( vehicle_origin, "", part_status_flag::available ).empty() );
vehs = g->m.get_vehicles();
CHECK( vehs.size() == 1 );
if( vehs.size() == 1 ) {
CHECK( vehs[ 0 ].v->parts.size() == 38 );
}
}
}
|