From ff10dee94633e27e6c978068900706fc3524132a Mon Sep 17 00:00:00 2001 From: Pablo Andres Fuente Date: Sat, 17 Aug 2024 12:10:09 -0300 Subject: [PATCH] Add unit tests for StreamPeer and StreamPeerBuffer Partially fixes #43440 --- tests/core/io/test_stream_peer.h | 289 ++++++++++++++++++++++++ tests/core/io/test_stream_peer_buffer.h | 185 +++++++++++++++ tests/test_main.cpp | 2 + 3 files changed, 476 insertions(+) create mode 100644 tests/core/io/test_stream_peer.h create mode 100644 tests/core/io/test_stream_peer_buffer.h diff --git a/tests/core/io/test_stream_peer.h b/tests/core/io/test_stream_peer.h new file mode 100644 index 00000000000..31bd69edd0a --- /dev/null +++ b/tests/core/io/test_stream_peer.h @@ -0,0 +1,289 @@ +/**************************************************************************/ +/* test_stream_peer.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef TEST_STREAM_PEER_H +#define TEST_STREAM_PEER_H + +#include "core/io/stream_peer.h" +#include "tests/test_macros.h" + +namespace TestStreamPeer { + +TEST_CASE("[StreamPeer] Initialization through StreamPeerBuffer") { + Ref spb; + spb.instantiate(); + + CHECK_EQ(spb->is_big_endian_enabled(), false); +} + +TEST_CASE("[StreamPeer] Get and sets through StreamPeerBuffer") { + Ref spb; + spb.instantiate(); + + SUBCASE("A int8_t value") { + int8_t value = 42; + + spb->clear(); + spb->put_8(value); + spb->seek(0); + + CHECK_EQ(spb->get_8(), value); + } + + SUBCASE("A uint8_t value") { + uint8_t value = 42; + + spb->clear(); + spb->put_u8(value); + spb->seek(0); + + CHECK_EQ(spb->get_u8(), value); + } + + SUBCASE("A int16_t value") { + int16_t value = 42; + + spb->clear(); + spb->put_16(value); + spb->seek(0); + + CHECK_EQ(spb->get_16(), value); + } + + SUBCASE("A uint16_t value") { + uint16_t value = 42; + + spb->clear(); + spb->put_u16(value); + spb->seek(0); + + CHECK_EQ(spb->get_u16(), value); + } + + SUBCASE("A int32_t value") { + int32_t value = 42; + + spb->clear(); + spb->put_32(value); + spb->seek(0); + + CHECK_EQ(spb->get_32(), value); + } + + SUBCASE("A uint32_t value") { + uint32_t value = 42; + + spb->clear(); + spb->put_u32(value); + spb->seek(0); + + CHECK_EQ(spb->get_u32(), value); + } + + SUBCASE("A int64_t value") { + int64_t value = 42; + + spb->clear(); + spb->put_64(value); + spb->seek(0); + + CHECK_EQ(spb->get_64(), value); + } + + SUBCASE("A int64_t value") { + uint64_t value = 42; + + spb->clear(); + spb->put_u64(value); + spb->seek(0); + + CHECK_EQ(spb->get_u64(), value); + } + + SUBCASE("A float value") { + float value = 42.0f; + + spb->clear(); + spb->put_float(value); + spb->seek(0); + + CHECK_EQ(spb->get_float(), value); + } + + SUBCASE("A double value") { + double value = 42.0; + + spb->clear(); + spb->put_double(value); + spb->seek(0); + + CHECK_EQ(spb->get_double(), value); + } + + SUBCASE("A string value") { + String value = "Hello, World!"; + + spb->clear(); + spb->put_string(value); + spb->seek(0); + + CHECK_EQ(spb->get_string(), value); + } + + SUBCASE("A utf8 string value") { + String value = String::utf8("Hello✩, World✩!"); + + spb->clear(); + spb->put_utf8_string(value); + spb->seek(0); + + CHECK_EQ(spb->get_utf8_string(), value); + } + + SUBCASE("A variant value") { + Array value; + value.push_front(42); + value.push_front("Hello, World!"); + + spb->clear(); + spb->put_var(value); + spb->seek(0); + + CHECK_EQ(spb->get_var(), value); + } +} + +TEST_CASE("[StreamPeer] Get and sets big endian through StreamPeerBuffer") { + Ref spb; + spb.instantiate(); + spb->set_big_endian(true); + + SUBCASE("A int16_t value") { + int16_t value = 42; + + spb->clear(); + spb->put_16(value); + spb->seek(0); + + CHECK_EQ(spb->get_16(), value); + } + + SUBCASE("A uint16_t value") { + uint16_t value = 42; + + spb->clear(); + spb->put_u16(value); + spb->seek(0); + + CHECK_EQ(spb->get_u16(), value); + } + + SUBCASE("A int32_t value") { + int32_t value = 42; + + spb->clear(); + spb->put_32(value); + spb->seek(0); + + CHECK_EQ(spb->get_32(), value); + } + + SUBCASE("A uint32_t value") { + uint32_t value = 42; + + spb->clear(); + spb->put_u32(value); + spb->seek(0); + + CHECK_EQ(spb->get_u32(), value); + } + + SUBCASE("A int64_t value") { + int64_t value = 42; + + spb->clear(); + spb->put_64(value); + spb->seek(0); + + CHECK_EQ(spb->get_64(), value); + } + + SUBCASE("A int64_t value") { + uint64_t value = 42; + + spb->clear(); + spb->put_u64(value); + spb->seek(0); + + CHECK_EQ(spb->get_u64(), value); + } + + SUBCASE("A float value") { + float value = 42.0f; + + spb->clear(); + spb->put_float(value); + spb->seek(0); + + CHECK_EQ(spb->get_float(), value); + } + + SUBCASE("A double value") { + double value = 42.0; + + spb->clear(); + spb->put_double(value); + spb->seek(0); + + CHECK_EQ(spb->get_double(), value); + } +} + +TEST_CASE("[StreamPeer] Get string when there is no string") { + Ref spb; + spb.instantiate(); + + ERR_PRINT_OFF; + CHECK_EQ(spb->get_string(), ""); + ERR_PRINT_ON; +} + +TEST_CASE("[StreamPeer] Get UTF8 string when there is no string") { + Ref spb; + spb.instantiate(); + + ERR_PRINT_OFF; + CHECK_EQ(spb->get_utf8_string(), ""); + ERR_PRINT_ON; +} + +} // namespace TestStreamPeer + +#endif // TEST_STREAM_PEER_H diff --git a/tests/core/io/test_stream_peer_buffer.h b/tests/core/io/test_stream_peer_buffer.h new file mode 100644 index 00000000000..8ba9c0a72cb --- /dev/null +++ b/tests/core/io/test_stream_peer_buffer.h @@ -0,0 +1,185 @@ +/**************************************************************************/ +/* test_stream_peer_buffer.h */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#ifndef TEST_STREAM_PEER_BUFFER_H +#define TEST_STREAM_PEER_BUFFER_H + +#include "core/io/stream_peer.h" +#include "tests/test_macros.h" + +namespace TestStreamPeerBuffer { + +TEST_CASE("[StreamPeerBuffer] Initialization") { + Ref spb; + spb.instantiate(); + CHECK_EQ(spb->get_size(), 0); + CHECK_EQ(spb->get_position(), 0); + CHECK_EQ(spb->get_available_bytes(), 0); +} + +TEST_CASE("[StreamPeerBuffer] Seek") { + Ref spb; + spb.instantiate(); + uint8_t first = 5; + uint8_t second = 7; + uint8_t third = 11; + + spb->put_u8(first); + spb->put_u8(second); + spb->put_u8(third); + + spb->seek(0); + CHECK_EQ(spb->get_u8(), first); + CHECK_EQ(spb->get_u8(), second); + CHECK_EQ(spb->get_u8(), third); + + spb->seek(1); + CHECK_EQ(spb->get_position(), 1); + CHECK_EQ(spb->get_u8(), second); + + spb->seek(1); + ERR_PRINT_OFF; + spb->seek(-1); + ERR_PRINT_ON; + CHECK_EQ(spb->get_position(), 1); + ERR_PRINT_OFF; + spb->seek(5); + ERR_PRINT_ON; + CHECK_EQ(spb->get_position(), 1); +} + +TEST_CASE("[StreamPeerBuffer] Resize") { + Ref spb; + spb.instantiate(); + CHECK_EQ(spb->get_size(), 0); + CHECK_EQ(spb->get_position(), 0); + CHECK_EQ(spb->get_available_bytes(), 0); + + spb->resize(42); + CHECK_EQ(spb->get_size(), 42); + CHECK_EQ(spb->get_position(), 0); + CHECK_EQ(spb->get_available_bytes(), 42); + + spb->seek(21); + CHECK_EQ(spb->get_size(), 42); + CHECK_EQ(spb->get_position(), 21); + CHECK_EQ(spb->get_available_bytes(), 21); +} + +TEST_CASE("[StreamPeerBuffer] Get underlying data array") { + uint8_t first = 5; + uint8_t second = 7; + uint8_t third = 11; + + Ref spb; + spb.instantiate(); + spb->put_u8(first); + spb->put_u8(second); + spb->put_u8(third); + + Vector data_array = spb->get_data_array(); + + CHECK_EQ(data_array[0], first); + CHECK_EQ(data_array[1], second); + CHECK_EQ(data_array[2], third); +} + +TEST_CASE("[StreamPeerBuffer] Set underlying data array") { + uint8_t first = 5; + uint8_t second = 7; + uint8_t third = 11; + + Ref spb; + spb.instantiate(); + spb->put_u8(1); + spb->put_u8(2); + spb->put_u8(3); + + Vector new_data_array; + new_data_array.push_back(first); + new_data_array.push_back(second); + new_data_array.push_back(third); + + spb->set_data_array(new_data_array); + + CHECK_EQ(spb->get_u8(), first); + CHECK_EQ(spb->get_u8(), second); + CHECK_EQ(spb->get_u8(), third); +} + +TEST_CASE("[StreamPeerBuffer] Duplicate") { + uint8_t first = 5; + uint8_t second = 7; + uint8_t third = 11; + + Ref spb; + spb.instantiate(); + spb->put_u8(first); + spb->put_u8(second); + spb->put_u8(third); + + Ref spb2 = spb->duplicate(); + + CHECK_EQ(spb2->get_u8(), first); + CHECK_EQ(spb2->get_u8(), second); + CHECK_EQ(spb2->get_u8(), third); +} + +TEST_CASE("[StreamPeerBuffer] Put data with size equal to zero does nothing") { + Ref spb; + spb.instantiate(); + uint8_t data = 42; + + Error error = spb->put_data((const uint8_t *)&data, 0); + + CHECK_EQ(error, OK); + CHECK_EQ(spb->get_size(), 0); + CHECK_EQ(spb->get_position(), 0); + CHECK_EQ(spb->get_available_bytes(), 0); +} + +TEST_CASE("[StreamPeerBuffer] Get data with invalid size returns an error") { + Ref spb; + spb.instantiate(); + uint8_t data = 42; + spb->put_u8(data); + spb->seek(0); + + uint8_t data_out = 0; + Error error = spb->get_data(&data_out, 3); + + CHECK_EQ(error, ERR_INVALID_PARAMETER); + CHECK_EQ(spb->get_size(), 1); + CHECK_EQ(spb->get_position(), 1); +} + +} // namespace TestStreamPeerBuffer + +#endif // TEST_STREAM_PEER_BUFFER_H diff --git a/tests/test_main.cpp b/tests/test_main.cpp index 12ff3ad4bc9..9645df0ae69 100644 --- a/tests/test_main.cpp +++ b/tests/test_main.cpp @@ -52,6 +52,8 @@ #include "tests/core/io/test_marshalls.h" #include "tests/core/io/test_pck_packer.h" #include "tests/core/io/test_resource.h" +#include "tests/core/io/test_stream_peer.h" +#include "tests/core/io/test_stream_peer_buffer.h" #include "tests/core/io/test_xml_parser.h" #include "tests/core/math/test_aabb.h" #include "tests/core/math/test_astar.h"