Merge branch 'test/ride-ratings' into develop

This commit is contained in:
Ted John 2017-06-05 22:31:26 +01:00
commit 528dbe115d
18 changed files with 477 additions and 19 deletions

View File

@ -16,7 +16,7 @@ matrix:
services:
- docker
env:
- OPENRCT2_CMAKE_OPTS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=OpenRCT2 -DPORTABLE=ON" TARGET=ubuntu_amd64
- OPENRCT2_CMAKE_OPTS="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=OpenRCT2 -DPORTABLE=ON -DDISABLE_RCT2_TESTS=on" TARGET=ubuntu_amd64
- secure: "S3u2VCE2Vy8KNXoeh+DhnzjCmgTX0r95uEZrXDU+IKANOOCKn7Dg4OFDZE3LY/i1y2/EUDpnR5yLC38Ks795EUP/sv/OoMl4tjQ20yERjqWh+gcIRrgx7SdVabuAh3t4aBdaLD4Pfnj5avxeCt6rL7yGnj0wdbrbJSBZPsgSnuQ="
after_success:
- sudo chown -R $USER build
@ -37,7 +37,7 @@ matrix:
services:
- docker
env:
- OPENRCT2_CMAKE_OPTS="-DFORCE32=ON -DDISABLE_RCT2=OFF -DCMAKE_INSTALL_PREFIX=OpenRCT2" TARGET=ubuntu_i686
- OPENRCT2_CMAKE_OPTS="-DFORCE32=ON -DDISABLE_RCT2=OFF -DCMAKE_INSTALL_PREFIX=OpenRCT2 -DDISABLE_RCT2_TESTS=on" TARGET=ubuntu_i686
- secure: "S3u2VCE2Vy8KNXoeh+DhnzjCmgTX0r95uEZrXDU+IKANOOCKn7Dg4OFDZE3LY/i1y2/EUDpnR5yLC38Ks795EUP/sv/OoMl4tjQ20yERjqWh+gcIRrgx7SdVabuAh3t4aBdaLD4Pfnj5avxeCt6rL7yGnj0wdbrbJSBZPsgSnuQ="
after_success:
- sudo chown -R $USER build
@ -55,19 +55,19 @@ matrix:
else curl --progress-bar --upload-file openrct2-linux.tar.gz https://transfer.sh/openrct2-linux-i686.tar.gz -o link && cat link;
fi
- os: linux
env: OPENRCT2_CMAKE_OPTS="-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++" TARGET=ubuntu_amd64
env: OPENRCT2_CMAKE_OPTS="-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DDISABLE_RCT2_TESTS=on" TARGET=ubuntu_amd64
- os: linux
env: OPENRCT2_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DFORCE32=on" TARGET=windows
env: OPENRCT2_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=../CMakeLists_mingw.txt -DFORCE32=on -DDISABLE_RCT2_TESTS=on" TARGET=windows
- os: linux
env: TARGET=docker64 OPENRCT2_CMAKE_OPTS="-DDISABLE_TTF=ON -DCMAKE_BUILD_TYPE=release"
env: TARGET=docker64 OPENRCT2_CMAKE_OPTS="-DDISABLE_TTF=ON -DCMAKE_BUILD_TYPE=release -DDISABLE_RCT2_TESTS=on"
services:
- docker
- os: linux
env: OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON" TARGET=docker64
env: OPENRCT2_CMAKE_OPTS="-DDISABLE_NETWORK=ON -DDISABLE_HTTP_TWITCH=ON -DDISABLE_RCT2_TESTS=on" TARGET=docker64
services:
- docker
- os: linux
env: OPENRCT2_CMAKE_OPTS="-DDISABLE_OPENGL=ON" TARGET=docker64
env: OPENRCT2_CMAKE_OPTS="-DDISABLE_OPENGL=ON -DDISABLE_RCT2_TESTS=on" TARGET=docker64
services:
- docker
- os: osx

View File

@ -21,7 +21,9 @@ configuration: Release
build:
project: openrct2.proj
test_script:
- ps: msbuild openrct2.proj /t:test /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
- ps: msbuild openrct2.proj /t:TestNoRCT2 /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
after_test:
- ps: (new-object net.webclient).UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\artifacts\test-results.xml))
artifacts:
- path: .\artifacts\openrct2-portable*.zip
name: OpenRCT2-portable

View File

@ -189,7 +189,10 @@
</Target>
<Target Name="Test" DependsOnTargets="Build">
<Exec Command="$(TargetDir)tests\tests.exe" />
<Exec Command="$(TargetDir)tests\tests.exe &quot;--gtest_output=xml:$(ArtifactsDir)test-results.xml&quot;" />
</Target>
<Target Name="TestNoRCT2" DependsOnTargets="Build">
<Exec Command="$(TargetDir)tests\tests.exe &quot;--gtest_filter=-RideRatings*&quot; &quot;--gtest_output=xml:$(ArtifactsDir)test-results.xml&quot;" />
</Target>
<Target Name="TestPaint" DependsOnTargets="Build" Condition="'$(Platform)'=='Win32'">
<Exec Command="$(TargetDir)testpaint\openrct2.exe" />

View File

@ -294,6 +294,6 @@ typedef struct registers {
assert_struct_size(registers, 7 * 4);
#pragma pack(pop)
#define UNUSED(x) ((void)(x))
#define UNUSED(x) ((void)(x))
#endif

View File

@ -71,6 +71,38 @@ namespace File
auto fs = FileStream(path, FILE_MODE_WRITE);
fs.Write(buffer, length);
}
std::vector<std::string> ReadAllLines(const std::string &path)
{
std::vector<std::string> lines;
size_t length;
char * data = (char *)ReadAllBytes(path, &length);
char * lineStart = data;
char * ch = data;
char lastC = 0;
for (size_t i = 0; i < length; i++)
{
char c = *ch;
if (c == '\n' && lastC == '\r')
{
// Ignore \r\n
lineStart = ch + 1;
}
else if (c == '\n' || c == '\r')
{
lines.emplace_back(lineStart, ch - lineStart);
lineStart = ch + 1;
}
lastC = c;
ch++;
}
// Last line
lines.emplace_back(lineStart, ch - lineStart);
Memory::Free(data);
return lines;
}
}
extern "C"

View File

@ -17,6 +17,7 @@
#pragma once
#include <string>
#include <vector>
#include "../common.h"
namespace File
@ -27,4 +28,5 @@ namespace File
bool Move(const std::string &srcPath, const std::string &dstPath);
void * ReadAllBytes(const std::string &path, size_t * length);
void WriteAllBytes(const std::string &path, const void * buffer, size_t length);
std::vector<std::string> ReadAllLines(const std::string &path);
}

View File

@ -23,6 +23,13 @@ namespace Path
{
utf8 * Append(utf8 * buffer, size_t bufferSize, const utf8 * src);
std::string Combine(const std::string &a, const std::string &b);
template<typename... Args>
std::string Combine(const std::string &a, const std::string &b, Args... args)
{
return Combine(a, Combine(b, args...));
}
std::string GetDirectory(const std::string &path);
utf8 * GetDirectory(const utf8 * path);
utf8 * GetDirectory(utf8 * buffer, size_t bufferSize, const utf8 * path);

View File

@ -8221,15 +8221,15 @@ uint32 ride_customers_per_hour(const rct_ride *ride) {
// Calculates the number of customers for this ride in the last 5 minutes (or more correctly 9600 game ticks)
uint32 ride_customers_in_last_5_minutes(const rct_ride *ride) {
uint32 sum = ride->num_customers[0]
+ ride->num_customers[1]
+ ride->num_customers[2]
+ ride->num_customers[3]
+ ride->num_customers[4]
+ ride->num_customers[5]
+ ride->num_customers[6]
+ ride->num_customers[7]
+ ride->num_customers[8]
+ ride->num_customers[9];
+ ride->num_customers[1]
+ ride->num_customers[2]
+ ride->num_customers[3]
+ ride->num_customers[4]
+ ride->num_customers[5]
+ ride->num_customers[6]
+ ride->num_customers[7]
+ ride->num_customers[8]
+ ride->num_customers[9];
return sum;
}
@ -8376,3 +8376,103 @@ bool ride_has_ratings(const rct_ride * ride)
{
return ride->excitement != RIDE_RATING_UNDEFINED;
}
const char * ride_type_get_enum_name(sint32 rideType)
{
static const char * RideTypeEnumNames[RIDE_TYPE_COUNT] =
{
nameof(RIDE_TYPE_SPIRAL_ROLLER_COASTER),
nameof(RIDE_TYPE_STAND_UP_ROLLER_COASTER),
nameof(RIDE_TYPE_SUSPENDED_SWINGING_COASTER),
nameof(RIDE_TYPE_INVERTED_ROLLER_COASTER),
nameof(RIDE_TYPE_JUNIOR_ROLLER_COASTER),
nameof(RIDE_TYPE_MINIATURE_RAILWAY),
nameof(RIDE_TYPE_MONORAIL),
nameof(RIDE_TYPE_MINI_SUSPENDED_COASTER),
nameof(RIDE_TYPE_BOAT_RIDE),
nameof(RIDE_TYPE_WOODEN_WILD_MOUSE),
nameof(RIDE_TYPE_STEEPLECHASE),
nameof(RIDE_TYPE_CAR_RIDE),
nameof(RIDE_TYPE_LAUNCHED_FREEFALL),
nameof(RIDE_TYPE_BOBSLEIGH_COASTER),
nameof(RIDE_TYPE_OBSERVATION_TOWER),
nameof(RIDE_TYPE_LOOPING_ROLLER_COASTER),
nameof(RIDE_TYPE_DINGHY_SLIDE),
nameof(RIDE_TYPE_MINE_TRAIN_COASTER),
nameof(RIDE_TYPE_CHAIRLIFT),
nameof(RIDE_TYPE_CORKSCREW_ROLLER_COASTER),
nameof(RIDE_TYPE_MAZE),
nameof(RIDE_TYPE_SPIRAL_SLIDE),
nameof(RIDE_TYPE_GO_KARTS),
nameof(RIDE_TYPE_LOG_FLUME),
nameof(RIDE_TYPE_RIVER_RAPIDS),
nameof(RIDE_TYPE_DODGEMS),
nameof(RIDE_TYPE_PIRATE_SHIP),
nameof(RIDE_TYPE_SWINGING_INVERTER_SHIP),
nameof(RIDE_TYPE_FOOD_STALL),
nameof(RIDE_TYPE_1D),
nameof(RIDE_TYPE_DRINK_STALL),
nameof(RIDE_TYPE_1F),
nameof(RIDE_TYPE_SHOP),
nameof(RIDE_TYPE_MERRY_GO_ROUND),
nameof(RIDE_TYPE_22),
nameof(RIDE_TYPE_INFORMATION_KIOSK),
nameof(RIDE_TYPE_TOILETS),
nameof(RIDE_TYPE_FERRIS_WHEEL),
nameof(RIDE_TYPE_MOTION_SIMULATOR),
nameof(RIDE_TYPE_3D_CINEMA),
nameof(RIDE_TYPE_TOP_SPIN),
nameof(RIDE_TYPE_SPACE_RINGS),
nameof(RIDE_TYPE_REVERSE_FREEFALL_COASTER),
nameof(RIDE_TYPE_LIFT),
nameof(RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER),
nameof(RIDE_TYPE_CASH_MACHINE),
nameof(RIDE_TYPE_TWIST),
nameof(RIDE_TYPE_HAUNTED_HOUSE),
nameof(RIDE_TYPE_FIRST_AID),
nameof(RIDE_TYPE_CIRCUS_SHOW),
nameof(RIDE_TYPE_GHOST_TRAIN),
nameof(RIDE_TYPE_TWISTER_ROLLER_COASTER),
nameof(RIDE_TYPE_WOODEN_ROLLER_COASTER),
nameof(RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER),
nameof(RIDE_TYPE_WILD_MOUSE),
nameof(RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER),
nameof(RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER_ALT),
nameof(RIDE_TYPE_FLYING_ROLLER_COASTER),
nameof(RIDE_TYPE_FLYING_ROLLER_COASTER_ALT),
nameof(RIDE_TYPE_VIRGINIA_REEL),
nameof(RIDE_TYPE_SPLASH_BOATS),
nameof(RIDE_TYPE_MINI_HELICOPTERS),
nameof(RIDE_TYPE_LAY_DOWN_ROLLER_COASTER),
nameof(RIDE_TYPE_SUSPENDED_MONORAIL),
nameof(RIDE_TYPE_LAY_DOWN_ROLLER_COASTER_ALT),
nameof(RIDE_TYPE_REVERSER_ROLLER_COASTER),
nameof(RIDE_TYPE_HEARTLINE_TWISTER_COASTER),
nameof(RIDE_TYPE_MINI_GOLF),
nameof(RIDE_TYPE_GIGA_COASTER),
nameof(RIDE_TYPE_ROTO_DROP),
nameof(RIDE_TYPE_FLYING_SAUCERS),
nameof(RIDE_TYPE_CROOKED_HOUSE),
nameof(RIDE_TYPE_MONORAIL_CYCLES),
nameof(RIDE_TYPE_COMPACT_INVERTED_COASTER),
nameof(RIDE_TYPE_WATER_COASTER),
nameof(RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER),
nameof(RIDE_TYPE_INVERTED_HAIRPIN_COASTER),
nameof(RIDE_TYPE_MAGIC_CARPET),
nameof(RIDE_TYPE_SUBMARINE_RIDE),
nameof(RIDE_TYPE_RIVER_RAFTS),
nameof(RIDE_TYPE_50),
nameof(RIDE_TYPE_ENTERPRISE),
nameof(RIDE_TYPE_52),
nameof(RIDE_TYPE_53),
nameof(RIDE_TYPE_54),
nameof(RIDE_TYPE_55),
nameof(RIDE_TYPE_INVERTED_IMPULSE_COASTER),
nameof(RIDE_TYPE_MINI_ROLLER_COASTER),
nameof(RIDE_TYPE_MINE_RIDE),
nameof(RIDE_TYPE_59),
nameof(RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER),
};
return RideTypeEnumNames[rideType];
}

View File

@ -1164,4 +1164,6 @@ rct_map_element *get_station_platform(sint32 x, sint32 y, sint32 z, sint32 z_tol
bool ride_has_adjacent_station(rct_ride *ride);
bool ride_has_ratings(const rct_ride * ride);
const char * ride_type_get_enum_name(sint32 rideType);
#endif

View File

@ -68,6 +68,7 @@ rct_ride_rating_calc_data gRideRatingsCalcData;
static const ride_ratings_calculation ride_ratings_calculate_func_table[RIDE_TYPE_COUNT];
static void ride_ratings_update_state();
static void ride_ratings_update_state_0();
static void ride_ratings_update_state_1();
static void ride_ratings_update_state_2();
@ -79,6 +80,25 @@ static void ride_ratings_calculate(rct_ride *ride);
static void ride_ratings_calculate_value(rct_ride *ride);
static void ride_ratings_score_close_proximity(rct_map_element *mapElement);
/**
* This is a small hack function to keep calling the ride rating processor until
* the given ride's ratings have been calculated. What ever is currently being
* processed will be overwritten.
* Only purpose of this function currently is for testing.
*/
void ride_ratings_update_ride(int rideIndex)
{
rct_ride *ride = get_ride(rideIndex);
if (ride->type != RIDE_TYPE_NULL && ride->status != RIDE_STATUS_CLOSED) {
gRideRatingsCalcData.current_ride = rideIndex;
gRideRatingsCalcData.state = RIDE_RATINGS_STATE_INITIALISE;
while (gRideRatingsCalcData.state != RIDE_RATINGS_STATE_FIND_NEXT_RIDE)
{
ride_ratings_update_state();
}
}
}
/**
*
* rct2: 0x006B5A2A
@ -88,6 +108,11 @@ void ride_ratings_update_all()
if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR)
return;
ride_ratings_update_state();
}
static void ride_ratings_update_state()
{
switch (gRideRatingsCalcData.state) {
case RIDE_RATINGS_STATE_FIND_NEXT_RIDE:
ride_ratings_update_state_0();

View File

@ -44,6 +44,7 @@ typedef struct rct_ride_rating_calc_data {
extern rct_ride_rating_calc_data gRideRatingsCalcData;
void ride_ratings_update_ride(int rideIndex);
void ride_ratings_update_all();
#endif

View File

@ -1,5 +1,7 @@
cmake_minimum_required(VERSION 2.6)
option(DISABLE_RCT2_TESTS "Disable tests that require RollerCoaster Tycoon 2 assets.")
# Bootstrap GoogleTest
INCLUDE(ExternalProject)
@ -72,6 +74,16 @@ set(COMMON_TEST_SOURCES
# Create a re-usable library to save some compilation time
add_library(test-common STATIC ${COMMON_TEST_SOURCES})
# Setup testdata. It should be fine here, as the only way to reach here is by explicitly requesting tests.
if (NOT "z$ENV{CI}" STREQUAL "z")
message("Detected CI environment. Disabling ride rating test.")
set(DISABLE_RCT2_TESTS ON)
endif ()
if (NOT DISABLE_RCT2_TESTS)
execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink "${CMAKE_CURRENT_LIST_DIR}/testdata" "${CMAKE_CURRENT_BINARY_DIR}/testdata")
endif ()
# Start of our tests
# sawyercoding test
@ -115,3 +127,12 @@ set(STRING_TEST_SOURCES
add_executable(test_string ${STRING_TEST_SOURCES})
target_link_libraries(test_string ${GTEST_LIBRARIES} test-common dl z)
add_test(NAME string COMMAND test_string)
# Ride ratings test
if (NOT DISABLE_RCT2_TESTS)
set(RIDE_RATINGS_TEST_SOURCES "${CMAKE_CURRENT_LIST_DIR}/RideRatings.cpp"
"${CMAKE_CURRENT_LIST_DIR}/TestData.cpp")
add_executable(test_ride_ratings ${RIDE_RATINGS_TEST_SOURCES})
target_link_libraries(test_ride_ratings ${GTEST_LIBRARIES} libopenrct2 dl z)
add_test(NAME ride_ratings COMMAND test_ride_ratings)
endif ()

View File

@ -0,0 +1,97 @@
#include <string>
#include <gtest/gtest.h>
#include <openrct2/audio/AudioContext.h>
#include <openrct2/Context.h>
#include <openrct2/core/File.h>
#include <openrct2/core/Path.hpp>
#include <openrct2/core/String.hpp>
#include <openrct2/OpenRCT2.h>
#include "TestData.h"
extern "C"
{
#include <openrct2/platform/platform.h>
#include <openrct2/game.h>
}
using namespace OpenRCT2;
class RideRatings : public testing::Test
{
protected:
void CalculateRatingsForAllRides()
{
for (int rideId = 0; rideId < MAX_RIDES; rideId++)
{
rct_ride * ride = get_ride(rideId);
if (ride->type != RIDE_TYPE_NULL)
{
ride_ratings_update_ride(rideId);
}
}
}
void DumpRatings()
{
for (int rideId = 0; rideId < MAX_RIDES; rideId++)
{
rct_ride * ride = get_ride(rideId);
if (ride->type != RIDE_TYPE_NULL)
{
std::string line = FormatRatings(ride);
printf("%s\n", line.c_str());
}
}
}
std::string FormatRatings(rct_ride * ride)
{
rating_tuple ratings = ride->ratings;
std::string line = String::StdFormat("%s: (%d, %d, %d)",
ride_type_get_enum_name(ride->type),
(int)ratings.excitement,
(int)ratings.intensity,
(int)ratings.nausea);
return line;
}
};
TEST_F(RideRatings, all)
{
std::string path = TestData::GetParkPath("bpb.sv6");
gOpenRCT2Headless = true;
core_init();
auto context = CreateContext();
bool initialised = context->Initialise();
ASSERT_TRUE(initialised);
game_load_sv6_path(path.c_str());
// Check ride count to check load was successful
ASSERT_EQ(gRideCount, 134);
CalculateRatingsForAllRides();
// Load expected ratings
auto expectedDataPath = Path::Combine(TestData::GetBasePath(), "ratings", "bpb.sv6.txt");
auto expectedRatings = File::ReadAllLines(expectedDataPath);
// Check ride ratings
int expI = 0;
for (int rideId = 0; rideId < MAX_RIDES; rideId++)
{
rct_ride * ride = get_ride(rideId);
if (ride->type != RIDE_TYPE_NULL)
{
std::string actual = FormatRatings(ride);
std::string expected = expectedRatings[expI];
ASSERT_STREQ(actual.c_str(), expected.c_str());
expI++;
}
}
delete context;
}

16
test/tests/TestData.cpp Normal file
View File

@ -0,0 +1,16 @@
#include <openrct2/core/Path.hpp>
#include "TestData.h"
namespace TestData
{
std::string GetBasePath()
{
return "testdata";
}
std::string GetParkPath(std::string name)
{
std::string path = Path::Combine(GetBasePath(), "parks", name);
return path;
}
};

9
test/tests/TestData.h Normal file
View File

@ -0,0 +1,9 @@
#include <string>
#pragma once
namespace TestData
{
std::string GetBasePath();
std::string GetParkPath(std::string name);
};

BIN
test/tests/testdata/parks/bpb.sv6 vendored Normal file

Binary file not shown.

134
test/tests/testdata/ratings/bpb.sv6.txt vendored Normal file
View File

@ -0,0 +1,134 @@
RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (843, 766, 346)
RIDE_TYPE_WOODEN_ROLLER_COASTER: (639, 1011, 626)
RIDE_TYPE_WOODEN_ROLLER_COASTER: (702, 734, 428)
RIDE_TYPE_MINIATURE_RAILWAY: (465, 37, 27)
RIDE_TYPE_LOG_FLUME: (522, 199, 107)
RIDE_TYPE_BOBSLEIGH_COASTER: (559, 548, 440)
RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (504, 533, 204)
RIDE_TYPE_CAR_RIDE: (418, 58, 3)
RIDE_TYPE_WOODEN_WILD_MOUSE: (324, 381, 220)
RIDE_TYPE_LOG_FLUME: (416, 139, 105)
RIDE_TYPE_3D_CINEMA: (350, 240, 140)
RIDE_TYPE_HAUNTED_HOUSE: (341, 153, 10)
RIDE_TYPE_MONORAIL: (439, 25, 5)
RIDE_TYPE_MINI_GOLF: (306, 90, 0)
RIDE_TYPE_WOODEN_ROLLER_COASTER: (636, 648, 377)
RIDE_TYPE_WOODEN_ROLLER_COASTER: (71, 68, 41)
RIDE_TYPE_STEEPLECHASE: (607, 509, 351)
RIDE_TYPE_STEEPLECHASE: (590, 492, 338)
RIDE_TYPE_JUNIOR_ROLLER_COASTER: (488, 460, 331)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_LOG_FLUME: (133, 37, 19)
RIDE_TYPE_CAR_RIDE: (38, 29, 1)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_CROOKED_HOUSE: (215, 62, 34)
RIDE_TYPE_MINE_TRAIN_COASTER: (35, 32, 22)
RIDE_TYPE_TOILETS: (-1, 0, 0)
RIDE_TYPE_DRINK_STALL: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_GHOST_TRAIN: (389, 43, 22)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_CAR_RIDE: (40, 29, 2)
RIDE_TYPE_SPIRAL_SLIDE: (178, 140, 90)
RIDE_TYPE_TWIST: (193, 157, 250)
RIDE_TYPE_MERRY_GO_ROUND: (125, 60, 75)
RIDE_TYPE_MERRY_GO_ROUND: (106, 60, 75)
RIDE_TYPE_DODGEMS: (275, 80, 35)
RIDE_TYPE_TWIST: (173, 157, 250)
RIDE_TYPE_LAUNCHED_FREEFALL: (379, 879, 543)
RIDE_TYPE_BOAT_RIDE: (269, 89, 100)
RIDE_TYPE_MOTION_SIMULATOR: (290, 350, 300)
RIDE_TYPE_DRINK_STALL: (-1, 0, 0)
RIDE_TYPE_CHAIRLIFT: (289, 55, 51)
RIDE_TYPE_GO_KARTS: (509, 288, 45)
RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_MAZE: (191, 104, 0)
RIDE_TYPE_TWIST: (180, 157, 250)
RIDE_TYPE_DRINK_STALL: (-1, 0, 0)
RIDE_TYPE_DRINK_STALL: (-1, 0, 0)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_TOILETS: (-1, 0, 0)
RIDE_TYPE_TOILETS: (-1, 0, 0)
RIDE_TYPE_TOILETS: (-1, 0, 0)
RIDE_TYPE_TOILETS: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_LOG_FLUME: (586, 268, 172)
RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0)
RIDE_TYPE_WOODEN_ROLLER_COASTER: (124, 150, 87)
RIDE_TYPE_FOOD_STALL: (-1, 30, 0)
RIDE_TYPE_CROOKED_HOUSE: (215, 62, 34)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_DRINK_STALL: (-1, 0, 0)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0)
RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_DRINK_STALL: (-1, 0, 0)
RIDE_TYPE_DODGEMS: (270, 80, 35)
RIDE_TYPE_DODGEMS: (274, 80, 35)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_FOOD_STALL: (-1, 0, 0)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_SHOP: (-1, 0, 0)
RIDE_TYPE_FIRST_AID: (-1, 0, 0)
RIDE_TYPE_CASH_MACHINE: (-1, 0, 0)
RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER: (696, 833, 772)
RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER: (486, 586, 338)
RIDE_TYPE_REVERSER_ROLLER_COASTER: (548, 525, 387)
RIDE_TYPE_INVERTED_HAIRPIN_COASTER: (668, 770, 470)
RIDE_TYPE_VIRGINIA_REEL: (531, 542, 588)
RIDE_TYPE_WILD_MOUSE: (631, 768, 473)
RIDE_TYPE_MINI_ROLLER_COASTER: (541, 563, 397)
RIDE_TYPE_SPIRAL_ROLLER_COASTER: (613, 373, 215)
RIDE_TYPE_LOOPING_ROLLER_COASTER: (467, 441, 182)
RIDE_TYPE_STAND_UP_ROLLER_COASTER: (548, 790, 558)
RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (680, 944, 573)
RIDE_TYPE_TWISTER_ROLLER_COASTER: (778, 769, 425)
RIDE_TYPE_GIGA_COASTER: (624, 359, 200)
RIDE_TYPE_INVERTED_ROLLER_COASTER: (676, 850, 686)
RIDE_TYPE_INVERTED_IMPULSE_COASTER: (643, 750, 569)
RIDE_TYPE_MINI_SUSPENDED_COASTER: (512, 696, 475)
RIDE_TYPE_MINE_RIDE: (644, 458, 381)
RIDE_TYPE_HEARTLINE_TWISTER_COASTER: (315, 658, 462)
RIDE_TYPE_LAY_DOWN_ROLLER_COASTER: (682, 666, 548)
RIDE_TYPE_FLYING_ROLLER_COASTER: (719, 711, 678)
RIDE_TYPE_REVERSE_FREEFALL_COASTER: (518, 747, 534)
RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER: (641, 618, 282)
RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER: (873, 895, 701)
RIDE_TYPE_SUSPENDED_MONORAIL: (338, 47, 23)
RIDE_TYPE_LIFT: (563, 35, 102)
RIDE_TYPE_MONORAIL_CYCLES: (226, 29, 1)
RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55)
RIDE_TYPE_OBSERVATION_TOWER: (594, 0, 61)
RIDE_TYPE_SPIRAL_SLIDE: (157, 140, 90)
RIDE_TYPE_SPACE_RINGS: (167, 210, 650)
RIDE_TYPE_CIRCUS_SHOW: (210, 30, 0)
RIDE_TYPE_FLYING_SAUCERS: (381, 85, 39)
RIDE_TYPE_MAGIC_CARPET: (374, 340, 440)
RIDE_TYPE_PIRATE_SHIP: (264, 245, 251)
RIDE_TYPE_SWINGING_INVERTER_SHIP: (349, 468, 472)
RIDE_TYPE_TOP_SPIN: (201, 480, 574)
RIDE_TYPE_ROTO_DROP: (395, 1148, 1148)
RIDE_TYPE_ENTERPRISE: (392, 647, 764)
RIDE_TYPE_RIVER_RAPIDS: (376, 153, 90)
RIDE_TYPE_RIVER_RAFTS: (263, 45, 43)
RIDE_TYPE_DINGHY_SLIDE: (477, 577, 358)
RIDE_TYPE_MINI_HELICOPTERS: (315, 50, 4)
RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (692, 691, 720)
RIDE_TYPE_COMPACT_INVERTED_COASTER: (679, 830, 698)
RIDE_TYPE_SPLASH_BOATS: (474, 204, 113)
RIDE_TYPE_SUBMARINE_RIDE: (255, 180, 140)

View File

@ -44,17 +44,24 @@
<AdditionalDependencies>libopenrct2.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
<PostBuildEvent>
<Command>xcopy /EIY "$(ProjectDir)testdata" "$(OutputPath)testdata"</Command>
<Message>Copies test data to output directory.</Message>
</PostBuildEvent>
</ItemDefinitionGroup>
<!-- Files -->
<ItemGroup>
<ClInclude Include="AssertHelpers.hpp" />
<ClInclude Include="TestData.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="LanguagePackTest.cpp" />
<ClCompile Include="IniReaderTest.cpp" />
<ClCompile Include="IniWriterTest.cpp" />
<ClCompile Include="RideRatings.cpp" />
<ClCompile Include="sawyercoding_test.cpp" />
<ClCompile Include="$(GtestDir)\src\gtest-all.cc" />
<ClCompile Include="TestData.cpp" />
<ClCompile Include="tests.cpp" />
<ClCompile Include="StringTest.cpp" />
</ItemGroup>