diff options
| author | ljfa-ag <ljfa-ag@web.de> | 2015-08-04 19:33:58 +0200 |
|---|---|---|
| committer | ljfa-ag <ljfa-ag@web.de> | 2015-08-04 19:33:58 +0200 |
| commit | 5f86fd9785b417aef6fec7a9f913bc4349d6c59b (patch) | |
| tree | 5989b60cbeb75f275220f40ef7c6bef3d2b31e50 /test/io/read_test.cpp | |
| parent | 47531478a60d979faf8d744d17c246c8e40a7d24 (diff) | |
| download | Project-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.cpp | 79 |
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(); } |
