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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
#include "cata_catch.h"
#include "submap.h"
#include "game_constants.h"
#include "point.h"
#include "type_id.h"
TEST_CASE( "submap_rotation", "[submap]" )
{
// Corners are labelled starting from the upper-left one, clockwise.
constexpr point corner_1{};
constexpr point corner_2 = point{ SEEX - 1, 0 };
constexpr point corner_3 = point{ SEEX - 1, SEEY - 1 };
constexpr point corner_4 = point{ 0, SEEY - 1 };
constexpr point center_1 = point{ SEEX / 2 - 1, SEEY / 2 - 1 };
constexpr point center_2 = point{ SEEX / 2, SEEY / 2 - 1 };
constexpr point center_3 = point{ SEEX / 2, SEEY / 2 };
constexpr point center_4 = point{ SEEX / 2 - 1, SEEY / 2 };
GIVEN( "a submap with marks" ) {
submap sm;
sm.set_ter( corner_1, ter_id( 1 ) );
sm.set_ter( corner_2, ter_id( 2 ) );
sm.set_ter( corner_3, ter_id( 3 ) );
sm.set_ter( corner_4, ter_id( 4 ) );
sm.set_ter( center_1, ter_id( 1 ) );
sm.set_ter( center_2, ter_id( 2 ) );
sm.set_ter( center_3, ter_id( 3 ) );
sm.set_ter( center_4, ter_id( 4 ) );
WHEN( "it gets rotated for 0 turns (no rotation)" ) {
sm.rotate( 0 );
CHECK( sm.get_ter( corner_1 ) == ter_id( 1 ) );
CHECK( sm.get_ter( corner_2 ) == ter_id( 2 ) );
CHECK( sm.get_ter( corner_3 ) == ter_id( 3 ) );
CHECK( sm.get_ter( corner_4 ) == ter_id( 4 ) );
CHECK( sm.get_ter( center_1 ) == ter_id( 1 ) );
CHECK( sm.get_ter( center_2 ) == ter_id( 2 ) );
CHECK( sm.get_ter( center_3 ) == ter_id( 3 ) );
CHECK( sm.get_ter( center_4 ) == ter_id( 4 ) );
}
WHEN( "it gets rotated for 1 turn" ) {
sm.rotate( 1 );
CHECK( sm.get_ter( corner_1 ) == ter_id( 4 ) );
CHECK( sm.get_ter( corner_2 ) == ter_id( 1 ) );
CHECK( sm.get_ter( corner_3 ) == ter_id( 2 ) );
CHECK( sm.get_ter( corner_4 ) == ter_id( 3 ) );
CHECK( sm.get_ter( center_1 ) == ter_id( 4 ) );
CHECK( sm.get_ter( center_2 ) == ter_id( 1 ) );
CHECK( sm.get_ter( center_3 ) == ter_id( 2 ) );
CHECK( sm.get_ter( center_4 ) == ter_id( 3 ) );
}
WHEN( "it gets rotated for 2 turns" ) {
sm.rotate( 2 );
CHECK( sm.get_ter( corner_1 ) == ter_id( 3 ) );
CHECK( sm.get_ter( corner_2 ) == ter_id( 4 ) );
CHECK( sm.get_ter( corner_3 ) == ter_id( 1 ) );
CHECK( sm.get_ter( corner_4 ) == ter_id( 2 ) );
CHECK( sm.get_ter( center_1 ) == ter_id( 3 ) );
CHECK( sm.get_ter( center_2 ) == ter_id( 4 ) );
CHECK( sm.get_ter( center_3 ) == ter_id( 1 ) );
CHECK( sm.get_ter( center_4 ) == ter_id( 2 ) );
}
WHEN( "it gets rotated for 3 turns" ) {
sm.rotate( 3 );
CHECK( sm.get_ter( corner_1 ) == ter_id( 2 ) );
CHECK( sm.get_ter( corner_2 ) == ter_id( 3 ) );
CHECK( sm.get_ter( corner_3 ) == ter_id( 4 ) );
CHECK( sm.get_ter( corner_4 ) == ter_id( 1 ) );
CHECK( sm.get_ter( center_1 ) == ter_id( 2 ) );
CHECK( sm.get_ter( center_2 ) == ter_id( 3 ) );
CHECK( sm.get_ter( center_3 ) == ter_id( 4 ) );
CHECK( sm.get_ter( center_4 ) == ter_id( 1 ) );
}
}
}
TEST_CASE( "submap_rotation2", "[submap]" )
{
int rotation_turns = GENERATE( 0, 1, 2, 3 );
CAPTURE( rotation_turns );
submap sm;
submap sm_copy;
for( int x = 0; x < SEEX; x++ ) {
for( int y = 0; y < SEEY; y++ ) {
sm.set_radiation( {x, y}, x + y * SEEX );
sm_copy.set_radiation( {x, y}, x + y * SEEX );
}
}
sm.rotate( rotation_turns );
for( int x = 0; x < SEEX; x++ ) {
for( int y = 0; y < SEEY; y++ ) {
point p( x, y );
point p_after_rotation = p.rotate( rotation_turns, {SEEX, SEEY} );
CAPTURE( p, p_after_rotation );
CHECK( sm.get_radiation( p_after_rotation ) == sm_copy.get_radiation( p ) );
}
}
}
|