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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
|
#include <iosfwd>
#include <string>
#include <vector>
#include "cata_catch.h"
#include "cata_scope_helpers.h"
#include "coordinates.h"
#include "cuboid_rectangle.h"
#include "point.h"
TEST_CASE( "rectangle_containment_raw", "[point]" )
{
// NOLINTNEXTLINE(cata-use-named-point-constants)
half_open_rectangle<point> r1( point( 0, 0 ), point( 2, 2 ) );
CHECK( !r1.contains( point( 0, -1 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r1.contains( point( 0, 0 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r1.contains( point( 0, 1 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( !r1.contains( point( 0, 2 ) ) );
CHECK( !r1.contains( point( 0, 3 ) ) );
// NOLINTNEXTLINE(cata-use-named-point-constants)
inclusive_rectangle<point> r2( point( 0, 0 ), point( 2, 2 ) );
CHECK( !r2.contains( point( 0, -1 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r2.contains( point( 0, 0 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r2.contains( point( 0, 1 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r2.contains( point( 0, 2 ) ) );
CHECK( !r2.contains( point( 0, 3 ) ) );
}
TEST_CASE( "rectangle_overlapping_inclusive", "[point]" )
{
// NOLINTNEXTLINE(cata-use-named-point-constants)
inclusive_rectangle<point> r1( point( 0, 0 ), point( 2, 2 ) );
inclusive_rectangle<point> r2( point( 2, 2 ), point( 3, 3 ) );
// NOLINTNEXTLINE(cata-use-named-point-constants)
inclusive_rectangle<point> r3( point( 0, 0 ), point( 2, 1 ) );
inclusive_rectangle<point> r4( point( -2, -4 ), point( 4, -1 ) );
inclusive_rectangle<point> r5( point( -1, -3 ), point( 0, -2 ) );
CHECK( r1.overlaps( r1 ) );
CHECK( r1.overlaps( r2 ) );
CHECK( r1.overlaps( r3 ) );
CHECK( !r1.overlaps( r4 ) );
CHECK( !r1.overlaps( r5 ) );
CHECK( r2.overlaps( r1 ) );
CHECK( r2.overlaps( r2 ) );
CHECK( !r2.overlaps( r3 ) );
CHECK( !r2.overlaps( r4 ) );
CHECK( !r2.overlaps( r5 ) );
CHECK( r3.overlaps( r1 ) );
CHECK( !r3.overlaps( r2 ) );
CHECK( r3.overlaps( r3 ) );
CHECK( !r3.overlaps( r4 ) );
CHECK( !r3.overlaps( r5 ) );
CHECK( !r4.overlaps( r1 ) );
CHECK( !r4.overlaps( r2 ) );
CHECK( !r4.overlaps( r3 ) );
CHECK( r4.overlaps( r4 ) );
CHECK( r4.overlaps( r5 ) );
CHECK( r5.overlaps( r4 ) );
}
TEST_CASE( "rectangle_overlapping_half_open", "[point]" )
{
// NOLINTNEXTLINE(cata-use-named-point-constants)
half_open_rectangle<point> r1( point( 0, 0 ), point( 2, 2 ) );
half_open_rectangle<point> r2( point( 2, 2 ), point( 3, 3 ) );
// NOLINTNEXTLINE(cata-use-named-point-constants)
half_open_rectangle<point> r3( point( 0, 0 ), point( 2, 1 ) );
half_open_rectangle<point> r4( point( -2, -4 ), point( 4, -1 ) );
half_open_rectangle<point> r5( point( -1, -3 ), point( 0, -2 ) );
CHECK( r1.overlaps( r1 ) );
CHECK( !r1.overlaps( r2 ) );
CHECK( r1.overlaps( r3 ) );
CHECK( !r1.overlaps( r4 ) );
CHECK( !r1.overlaps( r5 ) );
CHECK( !r2.overlaps( r1 ) );
CHECK( r2.overlaps( r2 ) );
CHECK( !r2.overlaps( r3 ) );
CHECK( !r2.overlaps( r4 ) );
CHECK( !r2.overlaps( r5 ) );
CHECK( r3.overlaps( r1 ) );
CHECK( !r3.overlaps( r2 ) );
CHECK( r3.overlaps( r3 ) );
CHECK( !r3.overlaps( r4 ) );
CHECK( !r3.overlaps( r5 ) );
CHECK( !r4.overlaps( r1 ) );
CHECK( !r4.overlaps( r2 ) );
CHECK( !r4.overlaps( r3 ) );
CHECK( r4.overlaps( r4 ) );
CHECK( r4.overlaps( r5 ) );
CHECK( r5.overlaps( r4 ) );
}
TEST_CASE( "rectangle_containment_coord", "[point]" )
{
// NOLINTNEXTLINE(cata-use-named-point-constants)
half_open_rectangle<point_abs_omt> r1( point_abs_omt( 0, 0 ), point_abs_omt( 2, 2 ) );
CHECK( !r1.contains( point_abs_omt( 0, -1 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r1.contains( point_abs_omt( 0, 0 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r1.contains( point_abs_omt( 0, 1 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( !r1.contains( point_abs_omt( 0, 2 ) ) );
CHECK( !r1.contains( point_abs_omt( 0, 3 ) ) );
// NOLINTNEXTLINE(cata-use-named-point-constants)
inclusive_rectangle<point_abs_omt> r2( point_abs_omt( 0, 0 ), point_abs_omt( 2, 2 ) );
CHECK( !r2.contains( point_abs_omt( 0, -1 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r2.contains( point_abs_omt( 0, 0 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r2.contains( point_abs_omt( 0, 1 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( r2.contains( point_abs_omt( 0, 2 ) ) );
CHECK( !r2.contains( point_abs_omt( 0, 3 ) ) );
}
TEST_CASE( "cuboid_shrinks", "[point]" )
{
half_open_cuboid<tripoint> b( tripoint_zero, tripoint( 3, 3, 3 ) );
CAPTURE( b );
CHECK( b.contains( tripoint( 1, 0, 0 ) ) ); // NOLINT(cata-use-named-point-constants)
CHECK( b.contains( tripoint( 2, 1, 2 ) ) );
b.shrink( tripoint( 1, 1, 0 ) ); // NOLINT(cata-use-named-point-constants)
CAPTURE( b );
// Shrank in the x and y directions
// NOLINTNEXTLINE(cata-use-named-point-constants)
CHECK( !b.contains( tripoint( 1, 0, 0 ) ) );
CHECK( !b.contains( tripoint( 2, 1, 2 ) ) );
// Didn't shrink in the z direction
// NOLINTNEXTLINE(cata-use-named-point-constants)
CHECK( b.contains( tripoint( 1, 1, 0 ) ) );
CHECK( b.contains( tripoint( 1, 1, 2 ) ) );
}
TEST_CASE( "point_to_from_string", "[point]" )
{
bool use_locale = GENERATE( false, true );
if( use_locale ) {
std::locale const &oldloc = std::locale();
on_out_of_scope reset_loc( [&oldloc]() {
std::locale::global( oldloc );
} );
try {
std::locale::global( std::locale( "en_US.UTF-8" ) );
} catch( std::runtime_error &e ) {
WARN( "couldn't set locale for point test: " << e.what() );
return;
}
char *result = setlocale( LC_ALL, "" );
REQUIRE( result );
}
CAPTURE( std::locale().name() );
SECTION( "points_from_string" ) {
CHECK( point_south.to_string() == "(0,1)" );
CHECK( tripoint( -1, 0, 1 ).to_string() == "(-1,0,1)" );
CHECK( point( 77777, 0 ).to_string() == "(77777,0)" );
CHECK( tripoint( 77777, 0, 0 ).to_string() == "(77777,0,0)" );
}
SECTION( "point_round_trip" ) {
point p( 10, -77777 );
CHECK( point::from_string( p.to_string() ) == p );
}
SECTION( "tripoint_round_trip" ) {
tripoint p( 10, -77777, 6 );
CHECK( tripoint::from_string( p.to_string() ) == p );
}
}
TEST_CASE( "tripoint_xy", "[point]" )
{
tripoint p( 1, 2, 3 );
CHECK( p.xy() == point( 1, 2 ) );
}
TEST_CASE( "closest_points_first_tripoint", "[point]" )
{
const tripoint center = { 1, -1, 2 };
GIVEN( "min_dist > max_dist" ) {
const std::vector<tripoint> result = closest_points_first( center, 1, 0 );
CHECK( result.empty() );
}
GIVEN( "min_dist = max_dist = 0" ) {
const std::vector<tripoint> result = closest_points_first( center, 0, 0 );
REQUIRE( result.size() == 1 );
CHECK( result[0] == tripoint{ 1, -1, 2 } );
}
GIVEN( "min_dist = 0, max_dist = 1" ) {
const std::vector<tripoint> result = closest_points_first( center, 0, 1 );
REQUIRE( result.size() == 9 );
CHECK( result[0] == tripoint{ 1, -1, 2 } );
CHECK( result[1] == tripoint{ 2, -1, 2 } );
CHECK( result[2] == tripoint{ 2, 0, 2 } );
CHECK( result[3] == tripoint{ 1, 0, 2 } );
CHECK( result[4] == tripoint{ 0, 0, 2 } );
CHECK( result[5] == tripoint{ 0, -1, 2 } );
CHECK( result[6] == tripoint{ 0, -2, 2 } );
CHECK( result[7] == tripoint{ 1, -2, 2 } );
CHECK( result[8] == tripoint{ 2, -2, 2 } );
}
GIVEN( "min_dist = 2, max_dist = 2" ) {
const std::vector<tripoint> result = closest_points_first( center, 2, 2 );
REQUIRE( result.size() == 16 );
CHECK( result[0] == tripoint{ 3, -2, 2 } );
CHECK( result[1] == tripoint{ 3, -1, 2 } );
CHECK( result[2] == tripoint{ 3, 0, 2 } );
CHECK( result[3] == tripoint{ 3, 1, 2 } );
CHECK( result[4] == tripoint{ 2, 1, 2 } );
CHECK( result[5] == tripoint{ 1, 1, 2 } );
CHECK( result[6] == tripoint{ 0, 1, 2 } );
CHECK( result[7] == tripoint{ -1, 1, 2 } );
CHECK( result[8] == tripoint{ -1, 0, 2 } );
CHECK( result[9] == tripoint{ -1, -1, 2 } );
CHECK( result[10] == tripoint{ -1, -2, 2 } );
CHECK( result[11] == tripoint{ -1, -3, 2 } );
CHECK( result[12] == tripoint{ 0, -3, 2 } );
CHECK( result[13] == tripoint{ 1, -3, 2 } );
CHECK( result[14] == tripoint{ 2, -3, 2 } );
CHECK( result[15] == tripoint{ 3, -3, 2 } );
}
}
TEST_CASE( "closest_points_first_point_abs_omt", "[point]" )
{
const point_abs_omt center( 1, 3 );
GIVEN( "min_dist > max_dist" ) {
const std::vector<point_abs_omt> result = closest_points_first( center, 1, 0 );
CHECK( result.empty() );
}
GIVEN( "min_dist = max_dist = 0" ) {
const std::vector<point_abs_omt> result = closest_points_first( center, 0, 0 );
REQUIRE( result.size() == 1 );
CHECK( result[0].raw() == point{ 1, 3 } );
}
GIVEN( "min_dist = 0, max_dist = 1" ) {
const std::vector<point_abs_omt> result = closest_points_first( center, 0, 1 );
REQUIRE( result.size() == 9 );
CHECK( result[0].raw() == point{ 1, 3 } );
CHECK( result[1].raw() == point{ 2, 3 } );
CHECK( result[2].raw() == point{ 2, 4 } );
CHECK( result[3].raw() == point{ 1, 4 } );
CHECK( result[4].raw() == point{ 0, 4 } );
CHECK( result[5].raw() == point{ 0, 3 } );
CHECK( result[6].raw() == point{ 0, 2 } );
CHECK( result[7].raw() == point{ 1, 2 } );
CHECK( result[8].raw() == point{ 2, 2 } );
}
}
|