diff --git a/testdata/test.txt b/testdata/test.txt new file mode 100644 index 0000000..0e5c23f --- /dev/null +++ b/testdata/test.txt @@ -0,0 +1 @@ +abcdefgh diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e10b22f..7041e12 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,6 +6,8 @@ SET(HEADER_TESTS header_point header_rect header_renderer + header_rwops + header_extrarwops header_sdl header_sdl2pp header_texture @@ -15,6 +17,7 @@ SET(HEADER_TESTS # simple command-line tests SET(CLI_TESTS test_pointrect + test_rwops ) # tests which test graphics functionality and thus requre working @@ -23,6 +26,8 @@ SET(GUI_TESTS gui_rendering ) +ADD_DEFINITIONS(-DTESTDATA_DIR="${PROJECT_SOURCE_DIR}/testdata") + FOREACH(TEST ${HEADER_TESTS}) ADD_EXECUTABLE(${TEST} ${TEST}.cc) ENDFOREACH(TEST ${TESTS}) diff --git a/tests/header_extrarwops.cc b/tests/header_extrarwops.cc new file mode 100644 index 0000000..d038838 --- /dev/null +++ b/tests/header_extrarwops.cc @@ -0,0 +1,5 @@ +#include + +int main() { + return 0; +} diff --git a/tests/header_rwops.cc b/tests/header_rwops.cc new file mode 100644 index 0000000..0f64138 --- /dev/null +++ b/tests/header_rwops.cc @@ -0,0 +1,5 @@ +#include + +int main() { + return 0; +} diff --git a/tests/test_rwops.cc b/tests/test_rwops.cc new file mode 100644 index 0000000..67e7036 --- /dev/null +++ b/tests/test_rwops.cc @@ -0,0 +1,132 @@ +#include + +#include +#include +#include + +#include "testing.h" + +using namespace SDL2pp; + +BEGIN_TEST() + // First check our custom ContainerRWops, not touching + // SDL-provided RWops services + { + std::vector buffer = { 'a', 'b', 'c', 'd' }; + + RWops rw((ContainerRWops>(buffer))); + + { + // Initial position + EXPECT_TRUE(rw.Tell() == 0); + } + + { + // Seeks + EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0); + EXPECT_TRUE(rw.Tell() == 0); + EXPECT_TRUE(rw.Seek(1, SEEK_SET) == 1); + EXPECT_TRUE(rw.Tell() == 1); + EXPECT_TRUE(rw.Seek(1, SEEK_CUR) == 2); + EXPECT_TRUE(rw.Tell() == 2); + EXPECT_TRUE(rw.Seek(-1, SEEK_END) == 3); + EXPECT_TRUE(rw.Tell() == 3); + } + + { + // Read via C++ + EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0); + + char buf[4] = {0}; + EXPECT_TRUE(rw.Read(buf, 1, 4) == 4); + EXPECT_TRUE(buf[0] == 'a' && buf[3] == 'd'); + + // Position after read + EXPECT_TRUE(rw.Tell() == 4); + } + + { + // Read via C++ + EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0); + + char buf[4] = {0}; + EXPECT_TRUE(rw.Read(buf, 4, 1) == 1); + EXPECT_TRUE(buf[0] == 'a' && buf[3] == 'd'); + + // Position after read + EXPECT_TRUE(rw.Tell() == 4); + } + + { + // Read via SDL + EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0); + + char buf[4] = {0}; + EXPECT_TRUE(SDL_RWread(rw.Get(), buf, 1, 4) == 4); + EXPECT_TRUE(buf[0] == 'a' && buf[3] == 'd'); + + // Position after read + EXPECT_TRUE(rw.Tell() == 4); + } + + { + // Overread + EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0); + + char buf[6] = {0}; + EXPECT_TRUE(SDL_RWread(rw.Get(), buf, 3, 2) == 1); + rw.Seek(0, SEEK_SET); + EXPECT_TRUE(SDL_RWread(rw.Get(), buf, 2, 3) == 2); + } + + { + // Write + EXPECT_TRUE(rw.Seek(0, SEEK_SET) == 0); + + char buf[2] = {'1', '2'}; + EXPECT_TRUE(rw.Write(buf, 1, 2) == 2); + EXPECT_TRUE(rw.Write(buf, 2, 1) == 1); + EXPECT_TRUE(SDL_RWwrite(rw.Get(), buf, 1, 2) == 2); + EXPECT_TRUE(SDL_RWwrite(rw.Get(), buf, 2, 1) == 1); + + EXPECT_TRUE(rw.Tell() == 8); + EXPECT_TRUE(buffer.size() == 8); + EXPECT_TRUE(buffer == std::vector({'1', '2', '1', '2', '1', '2', '1', '2'})); + } + + { + // Write past EOF + char buf[2] = {'x', 'y'}; + EXPECT_TRUE(rw.Seek(100, SEEK_SET) == 100); + + EXPECT_TRUE(rw.Write(buf, 1, 2) == 2); + EXPECT_TRUE(rw.Tell() == 102); + EXPECT_TRUE(buffer.size() == 102); + EXPECT_TRUE(buffer[99] == '\0'); + EXPECT_TRUE(buffer[100] == 'x'); + EXPECT_TRUE(buffer[101] == 'y'); + } + + { + // Test moving + RWops rw1(std::move(rw)); + rw1.Close(); + } + } + + // SDL file read test + { + RWops rw = RWops::FromFile(TESTDATA_DIR "/test.txt"); + + EXPECT_TRUE(rw.Tell() == 0); + char buf[8] = {0}; + EXPECT_TRUE(rw.Read(buf, 1, 8) == 8); + EXPECT_TRUE(buf[0] == 'a'); + EXPECT_TRUE(buf[7] == 'h'); + EXPECT_TRUE(rw.Tell() == 8); + + rw.Close(); + } +HANDLE_EXCEPTION(Exception& e) + std::cerr << "unexpected SDL exception was thrown during the test: " << e.what() << ": " << e.GetSDLError() << std::endl; +END_TEST()