#define CATCH_CONFIG_MAIN
#include <catch.h>
#include <sstream>
#include <Gorgon/IO/Stream.h>
#include <Gorgon/Graphics/Color.h>
#include <Gorgon/Geometry/Point.h>
#include <Gorgon/Geometry/Size.h>
using namespace Gorgon;
using namespace Gorgon::IO;
std::stringstream stream;
auto resetStream = []() {
stream.clear();
stream.str("");
};
TEST_CASE("ReadEnum32", "[IO]") {
enum TestEnum { VAL1 = 1, VAL2 = 2 };
resetStream();
WriteEnum32(stream, VAL1);
stream.seekg(0);
REQUIRE(ReadEnum32<TestEnum>(stream) == VAL1);
}
TEST_CASE("ReadInt32", "[IO]") {
int32_t val = 123456;
resetStream();
WriteInt32(stream, val);
stream.seekg(0);
REQUIRE(ReadInt32(stream) == val);
}
TEST_CASE("ReadUInt32", "[IO]") {
uint32_t val = 654321;
resetStream();
WriteUInt32(stream, val);
stream.seekg(0);
REQUIRE(ReadUInt32(stream) == val);
}
TEST_CASE("ReadInt16", "[IO]") {
int16_t val = -1234;
resetStream();
WriteInt16(stream, val);
stream.seekg(0);
REQUIRE(ReadInt16(stream) == val);
}
TEST_CASE("ReadUInt16", "[IO]") {
uint16_t val = 5678;
resetStream();
WriteUInt16(stream, val);
stream.seekg(0);
REQUIRE(ReadUInt16(stream) == val);
}
TEST_CASE("ReadInt8", "[IO]") {
int8_t val = -42;
resetStream();
WriteInt8(stream, val);
stream.seekg(0);
REQUIRE(ReadInt8(stream) == val);
}
TEST_CASE("ReadUInt8", "[IO]") {
uint8_t val = 255;
resetStream();
WriteUInt8(stream, val);
stream.seekg(0);
REQUIRE(ReadUInt8(stream) == val);
}
TEST_CASE("ReadFloat", "[IO]") {
float val = 3.14f;
resetStream();
WriteFloat(stream, val);
stream.seekg(0);
REQUIRE(ReadFloat(stream) == Approx(val));
}
/*TEST_CASE("ReadDouble", "[IO]") {
double val = 2.718;
resetStream();
WriteDouble(stream, val);
stream.seekg(0);
REQUIRE(ReadDouble(stream) == Approx(val));
}
*/
TEST_CASE("ReadBool", "[IO]") {
bool val = true;
resetStream();
WriteBool(stream, val);
stream.seekg(0);
REQUIRE(ReadBool(stream) == val);
}
TEST_CASE("ReadString", "[IO]") {
std::string str = "Hello Gorgon";
resetStream();
WriteStringWithSize(stream, str);
stream.seekg(0);
REQUIRE(ReadString(stream) == str);
}
TEST_CASE("ReadRGBA", "[IO]") {
Graphics::RGBA color = {255, 128, 64, 32};
resetStream();
WriteRGBA(stream, color);
stream.seekg(0);
auto read = ReadRGBA(stream);
REQUIRE(read.R == color.R);
REQUIRE(read.G == color.G);
REQUIRE(read.B == color.B);
REQUIRE(read.A == color.A);
}
TEST_CASE("ReadRGBAf", "[IO]") {
Graphics::RGBAf colorf = {1.0f, 0.5f, 0.25f, 0.125f};
resetStream();
WriteRGBAf(stream, colorf);
stream.seekg(0);
auto read = ReadRGBAf(stream);
REQUIRE(read.R == Approx(colorf.R));
REQUIRE(read.G == Approx(colorf.G));
REQUIRE(read.B == Approx(colorf.B));
REQUIRE(read.A == Approx(colorf.A));
}
// TEST_CASE("ReadGuid", "[IO]") {
// SGuid guid{};
// guid.Data1 = 0x12345678;
// guid.Data2 = 0x90AB;
// guid.Data3 = 0xCDEF;
// guid.Bytes[0] = 0x12;
// guid.Bytes[1] = 0x34;
// guid.Bytes[2] = 0x56;
// guid.Bytes[3] = 0x78;
// guid.Bytes[4] = 0x9A;
// guid.Bytes[5] = 0xBC;
// guid.Bytes[6] = 0xDE;
// guid.Bytes[7] = 0xF0;
// resetStream();
// WriteGuid(stream, guid);
// stream.seekg(0);
// REQUIRE(ReadGuid(stream) == guid); // == operatörü varsa
// }
TEST_CASE("ReadPoint", "[IO]") {
Geometry::Point point = {10, 20};
resetStream();
WritePoint(stream, point);
stream.seekg(0);
REQUIRE(ReadPoint(stream) == point);
}
TEST_CASE("ReadPointf", "[IO]") {
Geometry::Pointf pointf = {10.5f, 20.5f};
resetStream();
WritePointf(stream, pointf); // DÜZELTİLDİ
stream.seekg(0);
auto read = ReadPointf(stream);
REQUIRE(read.X == Approx(pointf.X));
REQUIRE(read.Y == Approx(pointf.Y));
}
TEST_CASE("ReadSize", "[IO]") {
Geometry::Size size = {640, 480};
resetStream();
WriteSize(stream, size);
stream.seekg(0);
REQUIRE(ReadSize(stream) == size);
}