#include "utf32.hh" #include "utf_error.hh" #include TEST(utf32be, sanity) { std::string_view str("\x00\x00\x00\x24", 4); size_t offset = 0; auto ret = utf::read32be(str, offset); EXPECT_EQ('$', ret); EXPECT_EQ(4, offset); str = std::string_view("\x00\x00\x20\xAC", 4); offset = 0; ret = utf::read32be(str, offset); EXPECT_EQ(0x20AC, ret); EXPECT_EQ(4, offset); str = std::string_view("\x00\x01\x04\x37", 4); offset = 0; ret = utf::read32be(str, offset); EXPECT_EQ(0x10437, ret); EXPECT_EQ(4, offset); } TEST(utf32le, sanity) { std::string_view str("\x24\x00\x00\x00", 4); size_t offset = 0; auto ret = utf::read32le(str, offset); EXPECT_EQ('$', ret); EXPECT_EQ(4, offset); str = std::string_view("\xAC\x20\x00\x00", 4); offset = 0; ret = utf::read32le(str, offset); EXPECT_EQ(0x20AC, ret); EXPECT_EQ(4, offset); str = std::string_view("\x37\x04\x01\x00", 4); offset = 0; ret = utf::read32le(str, offset); EXPECT_EQ(0x10437, ret); EXPECT_EQ(4, offset); } TEST(utf32be, invalid) { std::string_view str("\xFF\xFF\xFF\xFF"); size_t offset = 0; auto ret = utf::read32be(str, offset); EXPECT_EQ(utf::INVALID, ret); EXPECT_EQ(0, offset); str = std::string_view("\x00\x00\xD8\x00", 4); offset = 0; ret = utf::read32be(str, offset); EXPECT_EQ(utf::INVALID, ret); EXPECT_EQ(0, offset); str = ""; offset = 0; ret = utf::read32be(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); str = std::string_view("\x00", 1); offset = 0; ret = utf::read32be(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); str = std::string_view("\x00\x00", 2); offset = 0; ret = utf::read32be(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); str = std::string_view("\x00\x00\x00", 3); offset = 0; ret = utf::read32be(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); } TEST(utf32le, invalid) { std::string_view str("\xFF\xFF\xFF\xFF"); size_t offset = 0; auto ret = utf::read32le(str, offset); EXPECT_EQ(utf::INVALID, ret); EXPECT_EQ(0, offset); str = std::string_view("\x00\xD8\x00\x00", 4); offset = 0; ret = utf::read32le(str, offset); EXPECT_EQ(utf::INVALID, ret); EXPECT_EQ(0, offset); str = ""; offset = 0; ret = utf::read32le(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); str = std::string_view("\x00", 1); offset = 0; ret = utf::read32le(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); str = std::string_view("\x00\x00", 2); offset = 0; ret = utf::read32le(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); str = std::string_view("\x00\x00\x00", 3); offset = 0; ret = utf::read32le(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); } TEST(utf32be, bom) { std::string_view str("\x00\x00\xFF\xFE\x00\x00\x20\xAC", 8); size_t offset = 0; auto ret = utf::read32be(str, offset); EXPECT_EQ(0xFFFE, ret); ret = utf::read32be(str, offset); EXPECT_EQ(0x20AC, ret); ret = utf::read32be(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(str.size(), offset); } TEST(utf32le, bom) { std::string_view str("\xFE\xFF\x00\x00\xAC\x20\x00\x00", 8); size_t offset = 0; auto ret = utf::read32le(str, offset); EXPECT_EQ(0xFFFE, ret); ret = utf::read32le(str, offset); EXPECT_EQ(0x20AC, ret); ret = utf::read32le(str, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(str.size(), offset); }