Skip to content

Commit e494b74

Browse files
committed
initial tests for unicode (tests utf8 only for now)
1 parent ee0595b commit e494b74

File tree

5 files changed

+120
-81
lines changed

5 files changed

+120
-81
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#ifndef guard_unicode_h_fg45jhftg45zj4sdas
2+
#define guard_unicode_h_fg45jhftg45zj4sdas
3+
4+
#include <cage-core/utf.h>
5+
6+
namespace cage
7+
{
8+
// todo
9+
}
10+
11+
#endif // guard_unicode_h_fg45jhftg45zj4sdas

sources/libcore/unicode.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#include <cage-core/unicode.h>
2+
3+
namespace cage
4+
{
5+
// todo
6+
}

sources/libcore/utf.cpp

Lines changed: 78 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@ namespace utf8
1414
#include <cage-core/pointerRangeHolder.h>
1515
#include <cage-core/utf.h>
1616

17-
#define TRY_BEGIN try
17+
#define TRY_BEGIN \
18+
try \
19+
{
1820
#define TRY_END \
21+
} \
1922
catch (const std::exception &e) \
2023
{ \
2124
CAGE_LOG_THROW(e.what()); \
@@ -27,9 +30,7 @@ namespace cage
2730
bool utfValid(PointerRange<const char> buffer)
2831
{
2932
TRY_BEGIN
30-
{
31-
return utf8::is_valid(buffer.begin(), buffer.end());
32-
}
33+
return utf8::is_valid(buffer.begin(), buffer.end());
3334
TRY_END
3435
}
3536

@@ -43,111 +44,107 @@ namespace cage
4344
return utfValid({ str, str + numeric_cast<uint32>(std::strlen(str)) });
4445
}
4546

46-
uint32 utf32Length(PointerRange<const char> buffer){ TRY_BEGIN{ return numeric_cast<uint32>(utf8::distance(buffer.begin(), buffer.end()));
47-
}
48-
TRY_END
49-
}
47+
uint32 utf32Length(PointerRange<const char> buffer)
48+
{
49+
TRY_BEGIN
50+
return numeric_cast<uint32>(utf8::distance(buffer.begin(), buffer.end()));
51+
TRY_END
52+
}
5053

51-
uint32 utf32Length(const String &str)
52-
{
53-
return utf32Length({ str.c_str(), str.c_str() + str.length() });
54-
}
54+
uint32 utf32Length(const String &str)
55+
{
56+
return utf32Length({ str.c_str(), str.c_str() + str.length() });
57+
}
5558

56-
uint32 utf32Length(const char *str)
57-
{
58-
return utf32Length({ str, str + numeric_cast<uint32>(std::strlen(str)) });
59-
}
59+
uint32 utf32Length(const char *str)
60+
{
61+
return utf32Length({ str, str + numeric_cast<uint32>(std::strlen(str)) });
62+
}
6063

61-
uint32 utf8Length(PointerRange<const uint32> buffer){ TRY_BEGIN{ const uint32 *b = buffer.begin();
62-
const uint32 *e = buffer.end();
63-
char tmp[7];
64-
uint32 result = 0;
65-
while (b != e)
66-
{
67-
char *d = utf8::utf32to8(b, b + 1, tmp);
68-
result += numeric_cast<uint32>(d - tmp);
69-
b++;
70-
}
71-
return result;
72-
}
73-
TRY_END
74-
}
64+
uint32 utf8Length(PointerRange<const uint32> buffer)
65+
{
66+
TRY_BEGIN
67+
const uint32 *b = buffer.begin();
68+
const uint32 *e = buffer.end();
69+
char tmp[7];
70+
uint32 result = 0;
71+
while (b != e)
72+
{
73+
char *d = utf8::utf32to8(b, b + 1, tmp);
74+
result += numeric_cast<uint32>(d - tmp);
75+
b++;
76+
}
77+
return result;
78+
TRY_END
79+
}
7580

76-
Holder<PointerRange<uint32>> utf8to32(PointerRange<const char> inBuffer)
77-
{
78-
PointerRangeHolder<uint32> result;
79-
result.resize(utf32Length(inBuffer));
80-
TRY_BEGIN
81+
Holder<PointerRange<uint32>> utf8to32(PointerRange<const char> inBuffer)
8182
{
83+
PointerRangeHolder<uint32> result;
84+
result.resize(utf32Length(inBuffer));
85+
TRY_BEGIN
8286
uint32 *end = utf8::utf8to32(inBuffer.begin(), inBuffer.end(), result.data());
8387
CAGE_ASSERT(end == result.data() + result.size());
8488
return result;
89+
TRY_END
8590
}
86-
TRY_END
87-
}
8891

89-
Holder<PointerRange<uint32>> utf8to32(const String &str)
90-
{
91-
return utf8to32({ str.c_str(), str.c_str() + str.length() });
92-
}
92+
Holder<PointerRange<uint32>> utf8to32(const String &str)
93+
{
94+
return utf8to32({ str.c_str(), str.c_str() + str.length() });
95+
}
9396

94-
Holder<PointerRange<uint32>> utf8to32(const char *str)
95-
{
96-
return utf8to32({ str, str + numeric_cast<uint32>(std::strlen(str)) });
97-
}
97+
Holder<PointerRange<uint32>> utf8to32(const char *str)
98+
{
99+
return utf8to32({ str, str + numeric_cast<uint32>(std::strlen(str)) });
100+
}
98101

99-
void utf8to32(PointerRange<uint32> &outBuffer, PointerRange<const char> inBuffer)
100-
{
101-
CAGE_ASSERT(outBuffer.size() >= utf32Length(inBuffer));
102-
TRY_BEGIN
102+
void utf8to32(PointerRange<uint32> &outBuffer, PointerRange<const char> inBuffer)
103103
{
104+
CAGE_ASSERT(outBuffer.size() >= utf32Length(inBuffer));
105+
TRY_BEGIN
104106
uint32 *end = utf8::utf8to32(inBuffer.begin(), inBuffer.end(), outBuffer.begin());
105107
outBuffer = { outBuffer.begin(), end };
108+
TRY_END
106109
}
107-
TRY_END
108-
}
109110

110-
void utf8to32(PointerRange<uint32> &outBuffer, const String &str)
111-
{
112-
utf8to32(outBuffer, { str.c_str(), str.c_str() + str.length() });
113-
}
111+
void utf8to32(PointerRange<uint32> &outBuffer, const String &str)
112+
{
113+
utf8to32(outBuffer, { str.c_str(), str.c_str() + str.length() });
114+
}
114115

115-
void utf8to32(PointerRange<uint32> &outBuffer, const char *str)
116-
{
117-
utf8to32(outBuffer, { str, str + numeric_cast<uint32>(std::strlen(str)) });
118-
}
116+
void utf8to32(PointerRange<uint32> &outBuffer, const char *str)
117+
{
118+
utf8to32(outBuffer, { str, str + numeric_cast<uint32>(std::strlen(str)) });
119+
}
119120

120-
Holder<PointerRange<char>> utf32to8(PointerRange<const uint32> buffer)
121-
{
122-
PointerRangeHolder<char> result;
123-
result.resize(utf8Length(buffer));
124-
TRY_BEGIN
121+
Holder<PointerRange<char>> utf32to8(PointerRange<const uint32> buffer)
125122
{
123+
PointerRangeHolder<char> result;
124+
result.resize(utf8Length(buffer));
125+
TRY_BEGIN
126126
char *end = utf8::utf32to8(buffer.begin(), buffer.end(), result.data());
127127
CAGE_ASSERT(end == result.data() + result.size());
128128
return result;
129+
TRY_END
129130
}
130-
TRY_END
131-
}
132131

133-
void utf32to8(PointerRange<char> &outBuffer, PointerRange<const uint32> inBuffer)
134-
{
135-
CAGE_ASSERT(outBuffer.size() >= utf8Length(inBuffer));
136-
TRY_BEGIN
132+
void utf32to8(PointerRange<char> &outBuffer, PointerRange<const uint32> inBuffer)
137133
{
134+
CAGE_ASSERT(outBuffer.size() >= utf8Length(inBuffer));
135+
TRY_BEGIN
138136
char *end = utf8::utf32to8(inBuffer.begin(), inBuffer.end(), outBuffer.begin());
139137
outBuffer = { outBuffer.begin(), end };
138+
TRY_END
140139
}
141-
TRY_END
142-
}
143140

144-
String utf32to8string(PointerRange<const uint32> inBuffer)
145-
{
146-
if (utf8Length(inBuffer) > String::MaxLength)
147-
CAGE_THROW_ERROR(Exception, "utf string too long");
148-
char buff[String::MaxLength];
149-
PointerRange<char> pr = { buff, buff + String::MaxLength - 1 };
150-
utf32to8(pr, inBuffer);
151-
return String(pr);
152-
}
141+
String utf32to8string(PointerRange<const uint32> inBuffer)
142+
{
143+
if (utf8Length(inBuffer) > String::MaxLength)
144+
CAGE_THROW_ERROR(Exception, "utf string too long");
145+
char buff[String::MaxLength];
146+
PointerRange<char> pr = { buff, buff + String::MaxLength - 1 };
147+
utf32to8(pr, inBuffer);
148+
return String(pr);
149+
}
153150
}

sources/test-core/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ void testExceptions();
99
void testNumericTypes();
1010
void testTypeIndex();
1111
void testStrings();
12+
void testUnicode();
1213
void testPaths();
1314
void testDelegates();
1415
void testHolder();
@@ -87,6 +88,7 @@ int main()
8788
testNumericTypes();
8889
testTypeIndex();
8990
testStrings();
91+
testUnicode();
9092
testPaths();
9193
testDelegates();
9294
testHolder();

sources/test-core/unicode.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#include "main.h"
2+
3+
#include <cage-core/unicode.h>
4+
5+
namespace
6+
{
7+
void testUtf32()
8+
{
9+
const String a = "hello there Straße";
10+
const auto b = utf8to32(a);
11+
const String c = utf32to8string(b);
12+
CAGE_TEST(a == c);
13+
CAGE_TEST(utf32Length(a) == b->size());
14+
CAGE_TEST(utf8Length(b) == c.size());
15+
}
16+
}
17+
18+
void testUnicode()
19+
{
20+
CAGE_TESTCASE("unicode");
21+
testUtf32();
22+
// todo
23+
}

0 commit comments

Comments
 (0)