summaryrefslogtreecommitdiff
path: root/test/io/read_test.cpp
diff options
context:
space:
mode:
authorljfa-ag <ljfa-ag@web.de>2015-08-04 19:33:58 +0200
committerljfa-ag <ljfa-ag@web.de>2015-08-04 19:33:58 +0200
commit5f86fd9785b417aef6fec7a9f913bc4349d6c59b (patch)
tree5989b60cbeb75f275220f40ef7c6bef3d2b31e50 /test/io/read_test.cpp
parent47531478a60d979faf8d744d17c246c8e40a7d24 (diff)
downloadProject-Tick-5f86fd9785b417aef6fec7a9f913bc4349d6c59b.tar.gz
Project-Tick-5f86fd9785b417aef6fec7a9f913bc4349d6c59b.zip
Add tests for stream_reader
Diffstat (limited to 'test/io/read_test.cpp')
-rw-r--r--test/io/read_test.cpp79
1 files changed, 78 insertions, 1 deletions
diff --git a/test/io/read_test.cpp b/test/io/read_test.cpp
index f47b1e832b..aaed5e4471 100644
--- a/test/io/read_test.cpp
+++ b/test/io/read_test.cpp
@@ -17,9 +17,86 @@
* You should have received a copy of the GNU Lesser General Public License
* along with libnbt++. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "microtest.h"
#include "io/stream_reader.h"
+#include <sstream>
-int main()
+using namespace nbt;
+
+void test_stream_reader_big()
+{
+ const char input[] {
+ 1, //tag_type::Byte
+ 0, //tag_type::End
+ 11, //tag_type::Int_Array
+
+ 0x0a, 0x0b, 0x0c, 0x0d, //0x0a0b0c0d in Big Endian
+
+ 0x00, 0x06, //String length in Big Endian
+ 'f', 'o', 'o', 'b', 'a', 'r',
+
+ 0 //tag_type::End (invalid with allow_end = false)
+ };
+ std::istringstream is(std::string(input, sizeof input));
+ nbt::io::stream_reader reader(is);
+
+ ASSERT(&reader.get_istr() == &is);
+ ASSERT(reader.get_endian() == endian::big);
+
+ ASSERT(reader.read_type() == tag_type::Byte);
+ ASSERT(reader.read_type(true) == tag_type::End);
+ ASSERT(reader.read_type(false) == tag_type::Int_Array);
+
+ int32_t i;
+ reader.read_num(i);
+ ASSERT(i == 0x0a0b0c0dL);
+
+ ASSERT(reader.read_string() == "foobar");
+
+ EXPECT_EXCEPTION(reader.read_type(false), io::stream_reader::input_error);
+ ASSERT(!is);
+ is.clear();
+
+ //Test for invalid tag type 12
+ is.str("\x0c");
+ EXPECT_EXCEPTION(reader.read_type(), io::stream_reader::input_error);
+ ASSERT(!is);
+ is.clear();
+
+ //Test for unexpcted EOF on numbers (input too short for int32_t)
+ is.str("\x03\x04");
+ EXPECT_EXCEPTION(reader.read_num(i), io::stream_reader::input_error);
+ ASSERT(!is);
+}
+
+void test_stream_reader_little()
{
+ const char input[] {
+ 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, //0x0d0c0b0a09080706 in Little Endian
+
+ 0x06, 0x00, //String length in Little Endian
+ 'f', 'o', 'o', 'b', 'a', 'r',
+
+ 0x10, 0x00, //String length (intentionally too large)
+ 'a', 'b', 'c', 'd' //unexpected EOF
+ };
+ std::istringstream is(std::string(input, sizeof input));
+ nbt::io::stream_reader reader(is, endian::little);
+
+ ASSERT(reader.get_endian() == endian::little);
+ int64_t i;
+ reader.read_num(i);
+ ASSERT(i == 0x0d0c0b0a09080706LL);
+
+ ASSERT(reader.read_string() == "foobar");
+
+ EXPECT_EXCEPTION(reader.read_string(), io::stream_reader::input_error);
+ ASSERT(!is);
+}
+
+int main()
+{
+ test_stream_reader_big();
+ test_stream_reader_little();
}