#include "utf16.hh" #include "utf_error.hh" #include #include TEST(utf16be, sanity) { size_t offset = 0; auto ret = utf::read16be(std::array({0x00, 0x24}), offset); EXPECT_EQ('$', ret); EXPECT_EQ(2, offset); offset = 0; ret = utf::read16be(std::array({0x20, 0xAC}), offset); EXPECT_EQ(0x20AC, ret); EXPECT_EQ(2, offset); offset = 0; ret = utf::read16be(std::array({0xD8, 0x01, 0xDC, 0x37}), offset); EXPECT_EQ(0x10437, ret); EXPECT_EQ(4, offset); offset = 0; ret = utf::read16be(std::array({0xD8, 0x52, 0xDF, 0x62}), offset); EXPECT_EQ(0x24B62, ret); EXPECT_EQ(4, offset); } TEST(utf16le, sanity) { size_t offset = 0; auto ret = utf::read16le(std::array({0x24, 0x00}), offset); EXPECT_EQ('$', ret); EXPECT_EQ(2, offset); offset = 0; ret = utf::read16le(std::array({0xAC, 0x20}), offset); EXPECT_EQ(0x20AC, ret); EXPECT_EQ(2, offset); offset = 0; ret = utf::read16le(std::array({0x01, 0xD8, 0x37, 0xDC}), offset); EXPECT_EQ(0x10437, ret); EXPECT_EQ(4, offset); offset = 0; ret = utf::read16le(std::array({0x52, 0xD8, 0x62, 0xDF}), offset); EXPECT_EQ(0x24B62, ret); EXPECT_EQ(4, offset); } TEST(utf16be, bom) { std::array data({0xFE, 0xFF, 0x20, 0xAC}); size_t offset = 0; auto ret = utf::read16be(data, offset); EXPECT_EQ(0xFEFF, ret); ret = utf::read16be(data, offset); EXPECT_EQ(0x20AC, ret); ret = utf::read16be(data, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(data.size(), offset); } TEST(utf16le, bom) { std::array data({0xFF, 0xFE, 0xAC, 0x20}); size_t offset = 0; auto ret = utf::read16le(data, offset); EXPECT_EQ(0xFEFF, ret); ret = utf::read16le(data, offset); EXPECT_EQ(0x20AC, ret); ret = utf::read16le(data, offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(data.size(), offset); } TEST(utf16be, invalid) { size_t offset = 0; auto ret = utf::read16be(std::array({0xD8}), offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16be(std::array(), offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16be(std::array({0xD8, 0x01}), offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16be(std::array({0xD8, 0x01, 0xDC}), offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16be(std::array({0xDC, 0x37, 0xD8, 0x01}), offset); EXPECT_EQ(utf::INVALID, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16be(std::array({0xD8, 0x01, 0xD8, 0x01}), offset); EXPECT_EQ(utf::INVALID, ret); EXPECT_EQ(0, offset); } TEST(utf16le, invalid) { size_t offset = 0; auto ret = utf::read16le(std::array({0x01}), offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16le(std::array(), offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16le(std::array({0x01, 0xD8}), offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16le(std::array({0x01, 0xD8, 0x37}), offset); EXPECT_EQ(utf::NEED_MORE, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16le(std::array({0x37, 0xDC, 0x01, 0xD8}), offset); EXPECT_EQ(utf::INVALID, ret); EXPECT_EQ(0, offset); offset = 0; ret = utf::read16le(std::array({0x01, 0xD8, 0x01, 0xD8}), offset); EXPECT_EQ(utf::INVALID, ret); EXPECT_EQ(0, offset); }