diff options
| -rw-r--r-- | include/nbt_visitor.h | 2 | ||||
| -rw-r--r-- | include/tag.h | 1 | ||||
| -rw-r--r-- | include/tag_array.h | 5 | ||||
| -rw-r--r-- | include/tag_list.h | 1 | ||||
| -rw-r--r-- | include/tagfwd.h | 1 | ||||
| -rw-r--r-- | src/tag.cpp | 4 | ||||
| -rw-r--r-- | src/tag_array.cpp | 49 | ||||
| -rw-r--r-- | src/tag_list.cpp | 1 | ||||
| -rw-r--r-- | src/text/json_formatter.cpp | 12 | ||||
| -rw-r--r-- | test/CMakeLists.txt | 83 | ||||
| -rw-r--r-- | test/data.h | 39 | ||||
| -rw-r--r-- | test/format_test.cpp | 1 | ||||
| -rw-r--r-- | test/nbttest.h | 37 | ||||
| -rw-r--r-- | test/read_test.h | 54 | ||||
| -rw-r--r-- | test/write_test.h | 6 | ||||
| -rw-r--r-- | test/zlibstream_test.h | 46 |
16 files changed, 283 insertions, 59 deletions
diff --git a/include/nbt_visitor.h b/include/nbt_visitor.h index fd24ae22d7..fe2688afb9 100644 --- a/include/nbt_visitor.h +++ b/include/nbt_visitor.h @@ -46,6 +46,7 @@ public: virtual void visit(tag_list&) {} virtual void visit(tag_compound&) {} virtual void visit(tag_int_array&) {} + virtual void visit(tag_long_array&) {} }; /** @@ -69,6 +70,7 @@ public: virtual void visit(const tag_list&) {} virtual void visit(const tag_compound&) {} virtual void visit(const tag_int_array&) {} + virtual void visit(const tag_long_array&) {} }; inline nbt_visitor::~nbt_visitor() noexcept {} diff --git a/include/tag.h b/include/tag.h index 35c71dfd30..c4f1d5d0b2 100644 --- a/include/tag.h +++ b/include/tag.h @@ -43,6 +43,7 @@ enum class tag_type : int8_t List = 9, Compound = 10, Int_Array = 11, + Long_Array = 12, Null = -1 ///< Used to denote empty @ref value s }; diff --git a/include/tag_array.h b/include/tag_array.h index be9591c0f3..6e6a92bbeb 100644 --- a/include/tag_array.h +++ b/include/tag_array.h @@ -36,13 +36,14 @@ namespace detail template<> struct get_array_type<int8_t> : public std::integral_constant<tag_type, tag_type::Byte_Array> {}; template<> struct get_array_type<int32_t> : public std::integral_constant<tag_type, tag_type::Int_Array> {}; + template<> struct get_array_type<int64_t> : public std::integral_constant<tag_type, tag_type::Long_Array> {}; } ///@cond /** * @brief Tag that contains an array of byte or int values * - * Common class for tag_byte_array and tag_int_array. + * Common class for tag_byte_array, tag_int_array and tag_long_array. */ template<class T> class tag_array final : public detail::crtp_tag<tag_array<T>> @@ -123,10 +124,12 @@ template<class T> bool operator!=(const tag_array<T>& lhs, const tag_array<T>& r //Typedefs that should be used instead of the template tag_array. typedef tag_array<int8_t> tag_byte_array; typedef tag_array<int32_t> tag_int_array; +typedef tag_array<int64_t> tag_long_array; //Explicit instantiations template class NBT_EXPORT tag_array<int8_t>; template class NBT_EXPORT tag_array<int32_t>; +template class NBT_EXPORT tag_array<int64_t>; } diff --git a/include/tag_list.h b/include/tag_list.h index c6a568ec36..ecd7e89c11 100644 --- a/include/tag_list.h +++ b/include/tag_list.h @@ -81,6 +81,7 @@ public: tag_list(std::initializer_list<tag_list> init); tag_list(std::initializer_list<tag_compound> init); tag_list(std::initializer_list<tag_int_array> init); + tag_list(std::initializer_list<tag_long_array> init); /** * @brief Constructs a list with the given contents diff --git a/include/tagfwd.h b/include/tagfwd.h index 178edd7e47..a359885ce1 100644 --- a/include/tagfwd.h +++ b/include/tagfwd.h @@ -42,6 +42,7 @@ class tag_string; template<class T> class tag_array; typedef tag_array<int8_t> tag_byte_array; typedef tag_array<int32_t> tag_int_array; +typedef tag_array<int64_t> tag_long_array; class tag_list; class tag_compound; diff --git a/src/tag.cpp b/src/tag.cpp index df4d8cb555..7e3be3911c 100644 --- a/src/tag.cpp +++ b/src/tag.cpp @@ -33,7 +33,7 @@ static_assert(std::numeric_limits<float>::is_iec559 && std::numeric_limits<doubl bool is_valid_type(int type, bool allow_end) { - return (allow_end ? 0 : 1) <= type && type <= 11; + return (allow_end ? 0 : 1) <= type && type <= 12; } std::unique_ptr<tag> tag::clone() && @@ -56,6 +56,7 @@ std::unique_ptr<tag> tag::create(tag_type type) case tag_type::List: return make_unique<tag_list>(); case tag_type::Compound: return make_unique<tag_compound>(); case tag_type::Int_Array: return make_unique<tag_int_array>(); + case tag_type::Long_Array: return make_unique<tag_long_array>(); default: throw std::invalid_argument("Invalid tag type"); } @@ -89,6 +90,7 @@ std::ostream& operator<<(std::ostream& os, tag_type tt) case tag_type::List: return os << "list"; case tag_type::Compound: return os << "compound"; case tag_type::Int_Array: return os << "int_array"; + case tag_type::Long_Array: return os << "long_array"; case tag_type::Null: return os << "null"; default: return os << "invalid"; diff --git a/src/tag_array.cpp b/src/tag_array.cpp index 6173dbb1dd..4a1668ad1e 100644 --- a/src/tag_array.cpp +++ b/src/tag_array.cpp @@ -43,26 +43,48 @@ void tag_array<int8_t>::read_payload(io::stream_reader& reader) throw io::input_error("Error reading contents of tag_byte_array"); } +template<typename T> +void tag_array<T>::read_payload(io::stream_reader& reader) +{ + int32_t length; + reader.read_num(length); + if(length < 0) + reader.get_istr().setstate(std::ios::failbit); + if(!reader.get_istr()) + throw io::input_error("Error reading length of generic array tag"); + + data.clear(); + data.reserve(length); + for(T i = 0; i < length; ++i) + { + T val; + reader.read_num(val); + data.push_back(val); + } + if(!reader.get_istr()) + throw io::input_error("Error reading contents of generic array tag"); +} + template<> -void tag_array<int32_t>::read_payload(io::stream_reader& reader) +void tag_array<int64_t>::read_payload(io::stream_reader& reader) { int32_t length; reader.read_num(length); if(length < 0) reader.get_istr().setstate(std::ios::failbit); if(!reader.get_istr()) - throw io::input_error("Error reading length of tag_int_array"); + throw io::input_error("Error reading length of tag_long_array"); data.clear(); data.reserve(length); for(int32_t i = 0; i < length; ++i) { - int32_t val; + int64_t val; reader.read_num(val); data.push_back(val); } if(!reader.get_istr()) - throw io::input_error("Error reading contents of tag_int_array"); + throw io::input_error("Error reading contents of tag_long_array"); } //Writing @@ -78,16 +100,29 @@ void tag_array<int8_t>::write_payload(io::stream_writer& writer) const writer.get_ostr().write(reinterpret_cast<const char*>(data.data()), data.size()); } +template<typename T> +void tag_array<T>::write_payload(io::stream_writer& writer) const +{ + if(size() > io::stream_writer::max_array_len) + { + writer.get_ostr().setstate(std::ios::failbit); + throw std::length_error("Generic array is too large for NBT"); + } + writer.write_num(static_cast<int32_t>(size())); + for(T i: data) + writer.write_num(i); +} + template<> -void tag_array<int32_t>::write_payload(io::stream_writer& writer) const +void tag_array<int64_t>::write_payload(io::stream_writer& writer) const { if(size() > io::stream_writer::max_array_len) { writer.get_ostr().setstate(std::ios::failbit); - throw std::length_error("Int array is too large for NBT"); + throw std::length_error("Long array is too large for NBT"); } writer.write_num(static_cast<int32_t>(size())); - for(int32_t i: data) + for(int64_t i: data) writer.write_num(i); } diff --git a/src/tag_list.cpp b/src/tag_list.cpp index 67a3d4c15f..1650e602e3 100644 --- a/src/tag_list.cpp +++ b/src/tag_list.cpp @@ -37,6 +37,7 @@ tag_list::tag_list(std::initializer_list<tag_byte_array> il) { init<tag_byte_arr tag_list::tag_list(std::initializer_list<tag_list> il) { init<tag_list>(il); } tag_list::tag_list(std::initializer_list<tag_compound> il) { init<tag_compound>(il); } tag_list::tag_list(std::initializer_list<tag_int_array> il) { init<tag_int_array>(il); } +tag_list::tag_list(std::initializer_list<tag_long_array> il) { init<tag_long_array>(il); } tag_list::tag_list(std::initializer_list<value> init) { diff --git a/src/text/json_formatter.cpp b/src/text/json_formatter.cpp index 9b47210c6a..3001ff0958 100644 --- a/src/text/json_formatter.cpp +++ b/src/text/json_formatter.cpp @@ -151,6 +151,18 @@ namespace //anonymous os << "]"; } + void visit(const tag_long_array& la) override + { + os << "["; + for(unsigned int i = 0; i < la.size(); ++i) + { + os << la[i]; + if(i != la.size()-1) + os << ", "; + } + os << "]"; + } + private: const std::string indent_str = " "; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 5dedfcf1fb..5f6e241f93 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,9 +1,64 @@ +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + if(CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_SYSTEM_PROCESSOR STREQUAL amd64) + set(OBJCOPY_TARGET "elf64-x86-64") + set(OBJCOPY_ARCH "x86_64") + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL i686) + set(OBJCOPY_TARGET "elf32-i386") + set(OBJCOPY_ARCH "i386") + else() + message(AUTHOR_WARNING "This is not a platform that would support testing nbt++") + return() + endif() +else() + message(AUTHOR_WARNING "This is not a platform that would support testing nbt++") + return() +endif() + enable_testing() find_package(CxxTest REQUIRED) include_directories(${libnbt++_SOURCE_DIR}/include) include_directories(${CXXTEST_INCLUDE_DIR}) +function(build_data out_var) + set(result) + foreach(in_f ${ARGN}) + set(out_f "${CMAKE_CURRENT_BINARY_DIR}/testfiles/${in_f}.obj") + add_custom_command( + COMMAND mkdir -p "${CMAKE_CURRENT_BINARY_DIR}/testfiles" + COMMAND ${CMAKE_OBJCOPY} --prefix-symbol=_ --input-target=binary --output-target=${OBJCOPY_TARGET} "${in_f}" "${out_f}" + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/testfiles/${in_f} + OUTPUT ${out_f} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/testfiles/ + VERBATIM + ) + SET_SOURCE_FILES_PROPERTIES( + ${out_f} + PROPERTIES + EXTERNAL_OBJECT true + GENERATED true + ) + list(APPEND result ${out_f}) + endforeach() + set(${out_var} "${result}" PARENT_SCOPE) +endfunction() + +build_data(DATA_OBJECTS + bigtest.nbt + bigtest.zlib + bigtest_corrupt.nbt + bigtest_eof.nbt + bigtest_uncompr + errortest_eof1 + errortest_eof2 + errortest_neg_length + errortest_noend + littletest_uncompr + toplevel_string + trailing_data.zlib +) +add_library(NbtTestData STATIC ${DATA_OBJECTS}) + #Specifies that the directory containing the testfiles get copied when the target is built function(use_testfiles target) add_custom_command(TARGET ${target} POST_BUILD @@ -11,30 +66,40 @@ function(use_testfiles target) copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/testfiles ${CMAKE_CURRENT_BINARY_DIR}) endfunction() +function(stop_warnings target) + target_compile_options(${target} PRIVATE + -Wno-unused-value + -Wno-self-assign-overloaded + ) +endfunction() + if(NBT_USE_ZLIB) set(EXTRA_TEST_LIBS ${ZLIB_LIBRARY}) endif() CXXTEST_ADD_TEST(nbttest nbttest.cpp ${CMAKE_CURRENT_SOURCE_DIR}/nbttest.h) -target_link_libraries(nbttest nbt++) +target_link_libraries(nbttest ${NBT_NAME}) +stop_warnings(nbttest) CXXTEST_ADD_TEST(endian_str_test endian_str_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/endian_str_test.h) -target_link_libraries(endian_str_test nbt++) +target_link_libraries(endian_str_test ${NBT_NAME}) +stop_warnings(endian_str_test) CXXTEST_ADD_TEST(read_test read_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/read_test.h) -target_link_libraries(read_test nbt++ ${EXTRA_TEST_LIBS}) -use_testfiles(read_test) +target_link_libraries(read_test ${NBT_NAME} ${EXTRA_TEST_LIBS} NbtTestData) +stop_warnings(read_test) CXXTEST_ADD_TEST(write_test write_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/write_test.h) -target_link_libraries(write_test nbt++ ${EXTRA_TEST_LIBS}) -use_testfiles(write_test) +target_link_libraries(write_test ${NBT_NAME} ${EXTRA_TEST_LIBS} NbtTestData) +stop_warnings(write_test) if(NBT_USE_ZLIB) CXXTEST_ADD_TEST(zlibstream_test zlibstream_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/zlibstream_test.h) - target_link_libraries(zlibstream_test nbt++ ${EXTRA_TEST_LIBS}) - use_testfiles(zlibstream_test) + target_link_libraries(zlibstream_test ${NBT_NAME} ${EXTRA_TEST_LIBS} NbtTestData) + stop_warnings(zlibstream_test) endif() add_executable(format_test format_test.cpp) -target_link_libraries(format_test nbt++) +target_link_libraries(format_test ${NBT_NAME}) add_test(format_test format_test) +stop_warnings(format_test) diff --git a/test/data.h b/test/data.h new file mode 100644 index 0000000000..b6995190c5 --- /dev/null +++ b/test/data.h @@ -0,0 +1,39 @@ +#pragma once + +#include <cstdint> + +extern "C" uint8_t __binary_bigtest_uncompr_start[]; +extern "C" uint8_t __binary_bigtest_uncompr_end[]; + +extern "C" uint8_t __binary_littletest_uncompr_start[]; +extern "C" uint8_t __binary_littletest_uncompr_end[]; + +extern "C" uint8_t __binary_errortest_eof1_start[]; +extern "C" uint8_t __binary_errortest_eof1_end[]; + +extern "C" uint8_t __binary_errortest_eof2_start[]; +extern "C" uint8_t __binary_errortest_eof2_end[]; + +extern "C" uint8_t __binary_errortest_noend_start[]; +extern "C" uint8_t __binary_errortest_noend_end[]; + +extern "C" uint8_t __binary_errortest_neg_length_start[]; +extern "C" uint8_t __binary_errortest_neg_length_end[]; + +extern "C" uint8_t __binary_toplevel_string_start[]; +extern "C" uint8_t __binary_toplevel_string_end[]; + +extern "C" uint8_t __binary_bigtest_nbt_start[]; +extern "C" uint8_t __binary_bigtest_nbt_end[]; + +extern "C" uint8_t __binary_bigtest_zlib_start[]; +extern "C" uint8_t __binary_bigtest_zlib_end[]; + +extern "C" uint8_t __binary_bigtest_corrupt_nbt_start[]; +extern "C" uint8_t __binary_bigtest_corrupt_nbt_end[]; + +extern "C" uint8_t __binary_bigtest_eof_nbt_start[]; +extern "C" uint8_t __binary_bigtest_eof_nbt_end[]; + +extern "C" uint8_t __binary_trailing_data_zlib_start[]; +extern "C" uint8_t __binary_trailing_data_zlib_end[]; diff --git a/test/format_test.cpp b/test/format_test.cpp index 8ea4095c90..87f7b21d72 100644 --- a/test/format_test.cpp +++ b/test/format_test.cpp @@ -52,6 +52,7 @@ int main() {"byte array", tag_byte_array{12, 13, 14, 15, 16}}, {"int array", tag_int_array{0x0badc0de, -0x0dedbeef, 0x1badbabe}}, + {"long array", tag_long_array{0x0badc0de0badc0de, -0x0dedbeef0dedbeef, 0x1badbabe1badbabe}}, {"list (empty)", tag_list::of<tag_byte_array>({})}, {"list (float)", tag_list{2.0f, 1.0f, 0.5f, 0.25f}}, diff --git a/test/nbttest.h b/test/nbttest.h index 0ebce0c306..e3e16c548f 100644 --- a/test/nbttest.h +++ b/test/nbttest.h @@ -37,8 +37,8 @@ public: TS_ASSERT(is_valid_type(1)); TS_ASSERT(is_valid_type(5, false)); TS_ASSERT(is_valid_type(7, true)); - TS_ASSERT(is_valid_type(11)); - TS_ASSERT(!is_valid_type(12)); + TS_ASSERT(is_valid_type(12)); + TS_ASSERT(!is_valid_type(13)); //looks like TS_ASSERT_EQUALS can't handle abstract classes... TS_ASSERT(*tag::create(tag_type::Byte) == tag_byte()); @@ -78,6 +78,7 @@ public: TS_ASSERT_EQUALS(tag_list().get_type() , tag_type::List); TS_ASSERT_EQUALS(tag_compound().get_type() , tag_type::Compound); TS_ASSERT_EQUALS(tag_int_array().get_type() , tag_type::Int_Array); + TS_ASSERT_EQUALS(tag_long_array().get_type(), tag_type::Long_Array); } void test_tag_primitive() @@ -396,6 +397,7 @@ public: TS_ASSERT_EQUALS(arr.size(), 3u); TS_ASSERT((arr == tag_byte_array{1, 2, 127})); TS_ASSERT((arr != tag_int_array{1, 2, 127})); + TS_ASSERT((arr != tag_long_array{1, 2, 127})); TS_ASSERT((arr != tag_byte_array{1, 2, -1})); arr.clear(); @@ -431,6 +433,35 @@ public: TS_ASSERT(arr == tag_int_array()); } + void test_tag_long_array() + { + std::vector<int64_t> vec{100, 200, INT64_MAX, INT64_MIN}; + tag_long_array arr{100, 200, INT64_MAX, INT64_MIN}; + TS_ASSERT_EQUALS(arr.size(), 4u); + TS_ASSERT(arr.at(0) == 100 && arr[1] == 200 && arr[2] == INT64_MAX && arr.at(3) == INT64_MIN); + TS_ASSERT_THROWS(arr.at(-1), std::out_of_range); + TS_ASSERT_THROWS(arr.at(4), std::out_of_range); + + TS_ASSERT(arr.get() == vec); + TS_ASSERT(arr == tag_long_array(std::vector<int64_t>(vec))); + + arr.push_back(42); + vec.push_back(42); + + TS_ASSERT_EQUALS(arr.size(), 5u); + TS_ASSERT_EQUALS(arr.end() - arr.begin(), int(arr.size())); + TS_ASSERT(std::equal(arr.begin(), arr.end(), vec.begin())); + + arr.pop_back(); + arr.pop_back(); + TS_ASSERT_EQUALS(arr.size(), 3u); + TS_ASSERT((arr == tag_long_array{100, 200, INT64_MAX})); + TS_ASSERT((arr != tag_long_array{100, -56, -1})); + + arr.clear(); + TS_ASSERT(arr == tag_long_array()); + } + void test_visitor() { struct : public nbt_visitor @@ -448,6 +479,7 @@ public: void visit(tag_list& tag) { visited = &tag; } void visit(tag_compound& tag) { visited = &tag; } void visit(tag_int_array& tag) { visited = &tag; } + void visit(tag_long_array& tag) { visited = &tag; } } v; tag_byte b; b.accept(v); TS_ASSERT_EQUALS(v.visited, &b); @@ -461,5 +493,6 @@ public: tag_list ls; ls.accept(v); TS_ASSERT_EQUALS(v.visited, &ls); tag_compound c; c.accept(v); TS_ASSERT_EQUALS(v.visited, &c); tag_int_array ia; ia.accept(v); TS_ASSERT_EQUALS(v.visited, &ia); + tag_long_array la; la.accept(v); TS_ASSERT_EQUALS(v.visited, &la); } }; diff --git a/test/read_test.h b/test/read_test.h index e7c00a8d8e..75ddbd5594 100644 --- a/test/read_test.h +++ b/test/read_test.h @@ -29,6 +29,8 @@ using namespace nbt; +#include "data.h" + class read_test : public CxxTest::TestSuite { public: @@ -66,8 +68,8 @@ public: TS_ASSERT(!is); is.clear(); - //Test for invalid tag type 12 - is.str("\x0c"); + //Test for invalid tag type 13 + is.str("\x0d"); TS_ASSERT_THROWS(reader.read_type(), io::input_error); TS_ASSERT(!is); is.clear(); @@ -143,8 +145,8 @@ public: void test_read_bigtest() { //Uses an extended variant of Notch's original bigtest file - std::ifstream file("bigtest_uncompr", std::ios::binary); - TS_ASSERT(file); + std::string input(__binary_bigtest_uncompr_start, __binary_bigtest_uncompr_end); + std::istringstream file(input, std::ios::binary); auto pair = nbt::io::read_compound(file); TS_ASSERT_EQUALS(pair.first, "Level"); @@ -154,8 +156,8 @@ public: void test_read_littletest() { //Same as bigtest, but little endian - std::ifstream file("littletest_uncompr", std::ios::binary); - TS_ASSERT(file); + std::string input(__binary_littletest_uncompr_start, __binary_littletest_uncompr_end); + std::istringstream file(input, std::ios::binary); auto pair = nbt::io::read_compound(file, endian::little); TS_ASSERT_EQUALS(pair.first, "Level"); @@ -163,34 +165,49 @@ public: verify_bigtest_structure(*pair.second); } - void test_read_errors() + void test_read_eof1() { - std::ifstream file; + std::string input(__binary_errortest_eof1_start, __binary_errortest_eof1_end); + std::istringstream file(input, std::ios::binary); nbt::io::stream_reader reader(file); //EOF within a tag_double payload - file.open("errortest_eof1", std::ios::binary); TS_ASSERT(file); TS_ASSERT_THROWS(reader.read_tag(), io::input_error); TS_ASSERT(!file); + } + + void test_read_eof2() + { + std::string input(__binary_errortest_eof2_start, __binary_errortest_eof2_end); + std::istringstream file(input, std::ios::binary); + nbt::io::stream_reader reader(file); //EOF within a key in a compound - file.close(); - file.open("errortest_eof2", std::ios::binary); TS_ASSERT(file); TS_ASSERT_THROWS(reader.read_tag(), io::input_error); TS_ASSERT(!file); + } + + void test_read_errortest_noend() + { + std::string input(__binary_errortest_noend_start, __binary_errortest_noend_end); + std::istringstream file(input, std::ios::binary); + nbt::io::stream_reader reader(file); //Missing tag_end - file.close(); - file.open("errortest_noend", std::ios::binary); TS_ASSERT(file); TS_ASSERT_THROWS(reader.read_tag(), io::input_error); TS_ASSERT(!file); + } + + void test_read_errortest_neg_length() + { + std::string input(__binary_errortest_neg_length_start, __binary_errortest_neg_length_end); + std::istringstream file(input, std::ios::binary); + nbt::io::stream_reader reader(file); //Negative list length - file.close(); - file.open("errortest_neg_length", std::ios::binary); TS_ASSERT(file); TS_ASSERT_THROWS(reader.read_tag(), io::input_error); TS_ASSERT(!file); @@ -198,11 +215,11 @@ public: void test_read_misc() { - std::ifstream file; + std::string input(__binary_toplevel_string_start, __binary_toplevel_string_end); + std::istringstream file(input, std::ios::binary); nbt::io::stream_reader reader(file); //Toplevel tag other than compound - file.open("toplevel_string", std::ios::binary); TS_ASSERT(file); TS_ASSERT_THROWS(reader.read_compound(), io::input_error); TS_ASSERT(!file); @@ -219,7 +236,8 @@ public: void test_read_gzip() { #ifdef NBT_HAVE_ZLIB - std::ifstream file("bigtest.nbt", std::ios::binary); + std::string input(__binary_bigtest_nbt_start, __binary_bigtest_nbt_end); + std::istringstream file(input, std::ios::binary); zlib::izlibstream igzs(file); TS_ASSERT(file && igzs); diff --git a/test/write_test.h b/test/write_test.h index a302891074..8b16b2a779 100644 --- a/test/write_test.h +++ b/test/write_test.h @@ -29,6 +29,8 @@ #include <fstream> #include <sstream> +#include "data.h" + using namespace nbt; class read_test : public CxxTest::TestSuite @@ -226,7 +228,9 @@ public: Instead, we assume that reading already works correctly and re-read the written tag. Smaller-grained tests are already done above. */ - std::ifstream file("bigtest_uncompr", std::ios::binary); + std::string input(__binary_bigtest_uncompr_start, __binary_bigtest_uncompr_end); + std::istringstream file(input, std::ios::binary); + const auto orig_pair = io::read_compound(file); std::stringstream sstr; diff --git a/test/zlibstream_test.h b/test/zlibstream_test.h index e76745f80f..26f86e0538 100644 --- a/test/zlibstream_test.h +++ b/test/zlibstream_test.h @@ -23,6 +23,8 @@ #include <fstream> #include <sstream> +#include "data.h" + using namespace zlib; class zlibstream_test : public CxxTest::TestSuite @@ -33,7 +35,8 @@ private: public: zlibstream_test() { - std::ifstream bigtest_f("bigtest_uncompr", std::ios::binary); + std::string input(__binary_bigtest_uncompr_start, __binary_bigtest_uncompr_end); + std::istringstream bigtest_f(input, std::ios::binary); std::stringbuf bigtest_b; bigtest_f >> &bigtest_b; bigtest = bigtest_b.str(); @@ -43,7 +46,8 @@ public: void test_inflate_gzip() { - std::ifstream gzip_in("bigtest.nbt", std::ios::binary); + std::string input(__binary_bigtest_nbt_start, __binary_bigtest_nbt_end); + std::istringstream gzip_in(input, std::ios::binary); TS_ASSERT(gzip_in); std::stringbuf data; @@ -93,7 +97,8 @@ public: void test_inflate_zlib() { - std::ifstream zlib_in("bigtest.zlib", std::ios::binary); + std::string input(__binary_bigtest_zlib_start, __binary_bigtest_zlib_end); + std::istringstream zlib_in(input, std::ios::binary); TS_ASSERT(zlib_in); std::stringbuf data; @@ -109,34 +114,35 @@ public: void test_inflate_corrupt() { - std::ifstream gzip_in("bigtest_corrupt.nbt", std::ios::binary); + std::string input(__binary_bigtest_corrupt_nbt_start, __binary_bigtest_corrupt_nbt_end); + std::istringstream gzip_in(input, std::ios::binary); TS_ASSERT(gzip_in); std::vector<char> buf(bigtest.size()); - { - izlibstream igzs(gzip_in); - igzs.exceptions(std::ios::failbit | std::ios::badbit); - TS_ASSERT_THROWS(igzs.read(buf.data(), buf.size()), zlib_error); - TS_ASSERT(igzs.bad()); - } + izlibstream igzs(gzip_in); + igzs.exceptions(std::ios::failbit | std::ios::badbit); + TS_ASSERT_THROWS(igzs.read(buf.data(), buf.size()), zlib_error); + TS_ASSERT(igzs.bad()); + } - gzip_in.close(); - gzip_in.clear(); - gzip_in.open("bigtest_eof.nbt", std::ios::binary); + void test_inflate_eof() + { + std::string input(__binary_bigtest_eof_nbt_start, __binary_bigtest_eof_nbt_end); + std::istringstream gzip_in(input, std::ios::binary); TS_ASSERT(gzip_in); - { - izlibstream igzs(gzip_in); - igzs.exceptions(std::ios::failbit | std::ios::badbit); - TS_ASSERT_THROWS(igzs.read(buf.data(), buf.size()), zlib_error); - TS_ASSERT(igzs.bad()); - } + std::vector<char> buf(bigtest.size()); + izlibstream igzs(gzip_in); + igzs.exceptions(std::ios::failbit | std::ios::badbit); + TS_ASSERT_THROWS(igzs.read(buf.data(), buf.size()), zlib_error); + TS_ASSERT(igzs.bad()); } void test_inflate_trailing() { //This file contains additional uncompressed data after the zlib-compressed data - std::ifstream file("trailing_data.zlib", std::ios::binary); + std::string input(__binary_trailing_data_zlib_start, __binary_trailing_data_zlib_end); + std::istringstream file(input, std::ios::binary); izlibstream izls(file, 32); TS_ASSERT(file && izls); |
