Skip to content

Commit ffafd70

Browse files
committed
Add test.
1 parent 363daac commit ffafd70

File tree

4 files changed

+112
-15
lines changed

4 files changed

+112
-15
lines changed

src/unicode.hpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ inline char32_t read_utf16_stream(std::istream& in) noexcept {
8484
return U'\ufffd';
8585
}
8686
tmp |= (ch & 0x3FF);
87-
if (tmp < 0x80) {
88-
return U'\ufffd';
89-
}
9087
return tmp + U'\U00010000';
9188
}
9289
}
@@ -103,14 +100,14 @@ inline void write_utf8_stream(std::ostream& out, char32_t ch) noexcept {
103100
tmp = char((ch & 0b0011'1111) | 0b1000'0000);
104101
out.write(&tmp, 1);
105102
} else if (ch < 0x10000) {
106-
auto tmp = char((ch >> 12) | 0b1100'0000);
103+
auto tmp = char((ch >> 12) | 0b1110'0000);
107104
out.write(&tmp, 1);
108105
tmp = char(((ch >> 6) & 0b0011'1111) | 0b1000'0000);
109106
out.write(&tmp, 1);
110107
tmp = char((ch & 0b0011'1111) | 0b1000'0000);
111108
out.write(&tmp, 1);
112109
} else {
113-
auto tmp = char((ch >> 18) | 0b1100'0000);
110+
auto tmp = char((ch >> 18) | 0b1111'0000);
114111
out.write(&tmp, 1);
115112
tmp = char(((ch >> 12) & 0b0011'1111) | 0b1000'0000);
116113
out.write(&tmp, 1);

tests/CMakeLists.txt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11

2-
add_executable(sample_test sample_test.cpp)
2+
add_executable(unicode_test unicode_test.cpp)
33

44
add_test(
5-
NAME sample_test
6-
COMMAND $<TARGET_FILE:sample_test>
7-
CONFIGURATIONS Debug Release
8-
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/tmp
5+
NAME unicode_test
6+
COMMAND $<TARGET_FILE:unicode_test>
97
)
108

11-
set_tests_properties(sample_test PROPERTIES LABELS sample)
9+
set_tests_properties(unicode_test PROPERTIES LABELS unicode)

tests/sample_test.cpp

Lines changed: 0 additions & 4 deletions
This file was deleted.

tests/unicode_test.cpp

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#include "../src/unicode.hpp"
2+
#include "../submodules/iutest/include/iutest.hpp"
3+
#include <sstream>
4+
#include <string_view>
5+
6+
IUTEST(unicode, test_read_utf8_stream) {
7+
std::stringstream ss(u8"\1\x7F\u0080\uFFFF\U00010000\U0010FFFF");
8+
IUTEST_ASSERT_EQ(U'\1', fafnir::read_utf8_stream(ss));
9+
IUTEST_ASSERT_EQ(U'\x7F', fafnir::read_utf8_stream(ss));
10+
IUTEST_ASSERT_EQ(U'\u0080', fafnir::read_utf8_stream(ss));
11+
IUTEST_ASSERT_EQ(U'\uFFFF', fafnir::read_utf8_stream(ss));
12+
IUTEST_ASSERT_EQ(U'\U00010000', fafnir::read_utf8_stream(ss));
13+
IUTEST_ASSERT_EQ(U'\U0010FFFF', fafnir::read_utf8_stream(ss));
14+
}
15+
16+
IUTEST(unicode, test_read_bad_utf8_stream) {
17+
std::stringstream ss("\x80\xF0\x80\x80\x80\xED\x9F\xBF\xED\xA0\x80\xED\xBF\xBF\xEE\x80\x80");
18+
IUTEST_ASSERT_EQ(U'\uFFFD', fafnir::read_utf8_stream(ss));
19+
IUTEST_ASSERT_EQ(U'\uFFFD', fafnir::read_utf8_stream(ss));
20+
IUTEST_ASSERT_EQ(U'\uD7FF', fafnir::read_utf8_stream(ss));
21+
IUTEST_ASSERT_EQ(U'\uFFFD', fafnir::read_utf8_stream(ss));
22+
IUTEST_ASSERT_EQ(U'\uFFFD', fafnir::read_utf8_stream(ss));
23+
IUTEST_ASSERT_EQ(U'\uE000', fafnir::read_utf8_stream(ss));
24+
}
25+
26+
IUTEST(unicode, test_read_utf16_stream) {
27+
std::u16string_view str = u"\1\uFFFF\U00010000\U0010FFFF";
28+
std::stringstream ss({
29+
reinterpret_cast<const char*>(str.data()),
30+
reinterpret_cast<const char*>(str.data() + str.size())
31+
});
32+
IUTEST_ASSERT_EQ(U'\1', fafnir::read_utf16_stream(ss));
33+
IUTEST_ASSERT_EQ(U'\uFFFF', fafnir::read_utf16_stream(ss));
34+
IUTEST_ASSERT_EQ(U'\U00010000', fafnir::read_utf16_stream(ss));
35+
IUTEST_ASSERT_EQ(U'\U0010FFFF', fafnir::read_utf16_stream(ss));
36+
}
37+
38+
IUTEST(unicode, test_read_bad_stream) {
39+
char str[] = "\xFF\xD7\x00\xD8\x01\x00\xFF\xDF\x00\xE0";
40+
std::stringstream ss({str, str + sizeof(str) - 1});
41+
IUTEST_ASSERT_EQ(U'\uD7FF', fafnir::read_utf16_stream(ss));
42+
IUTEST_ASSERT_EQ(U'\uFFFD', fafnir::read_utf16_stream(ss));
43+
IUTEST_ASSERT_EQ(U'\uFFFD', fafnir::read_utf16_stream(ss));
44+
IUTEST_ASSERT_EQ(U'\uE000', fafnir::read_utf16_stream(ss));
45+
}
46+
47+
IUTEST(unicode, test_write_utf8_stream) {
48+
std::stringstream ss;
49+
fafnir::write_utf8_stream(ss, U'\1');
50+
fafnir::write_utf8_stream(ss, U'\x7F');
51+
fafnir::write_utf8_stream(ss, U'\u0080');
52+
fafnir::write_utf8_stream(ss, U'\uFFFF');
53+
fafnir::write_utf8_stream(ss, U'\U00010000');
54+
fafnir::write_utf8_stream(ss, U'\U0010FFFF');
55+
IUTEST_ASSERT_EQ(u8"\1\x7F\u0080\uFFFF\U00010000\U0010FFFF", ss.str());
56+
}
57+
58+
IUTEST(unicode, test_write_bad_utf8_stream) {
59+
std::stringstream ss;
60+
fafnir::write_utf8_stream(ss, U'\uD7FF');
61+
fafnir::write_utf8_stream(ss, 0xD800);
62+
fafnir::write_utf8_stream(ss, 0xDFFF);
63+
fafnir::write_utf8_stream(ss, U'\uE000');
64+
fafnir::write_utf8_stream(ss, U'\U0010FFFF');
65+
fafnir::write_utf8_stream(ss, 0x00110000);
66+
IUTEST_ASSERT_EQ(u8"\uD7FF\uFFFD\uFFFD\uE000\U0010FFFF\uFFFD", ss.str());
67+
}
68+
69+
IUTEST(unicode, test_write_utf16_stream) {
70+
std::stringstream ss;
71+
fafnir::write_utf16_stream(ss, U'\1');
72+
fafnir::write_utf16_stream(ss, U'\uFFFF');
73+
fafnir::write_utf16_stream(ss, U'\U00010000');
74+
fafnir::write_utf16_stream(ss, U'\U0010FFFF');
75+
auto str = ss.str();
76+
IUTEST_ASSERT_EQ(
77+
u"\1\uFFFF\U00010000\U0010FFFF",
78+
std::u16string(
79+
reinterpret_cast<const char16_t*>(str.data()),
80+
reinterpret_cast<const char16_t*>(str.data() + str.size())
81+
)
82+
);
83+
}
84+
85+
IUTEST(unicode, test_write_bad_utf16_stream) {
86+
std::stringstream ss;
87+
fafnir::write_utf16_stream(ss, U'\uD7FF');
88+
fafnir::write_utf16_stream(ss, 0xD800);
89+
fafnir::write_utf16_stream(ss, 0xDFFF);
90+
fafnir::write_utf16_stream(ss, U'\uE000');
91+
fafnir::write_utf16_stream(ss, U'\U0010FFFF');
92+
fafnir::write_utf16_stream(ss, 0x00110000);
93+
auto str = ss.str();
94+
IUTEST_ASSERT_EQ(
95+
u"\uD7FF\uFFFD\uFFFD\uE000\U0010FFFF\uFFFD",
96+
std::u16string(
97+
reinterpret_cast<const char16_t*>(str.data()),
98+
reinterpret_cast<const char16_t*>(str.data() + str.size())
99+
)
100+
);
101+
}
102+
103+
int main(int argc, char** argv) {
104+
IUTEST_INIT(&argc, argv);
105+
return IUTEST_RUN_ALL_TESTS();
106+
}

0 commit comments

Comments
 (0)