1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "jsapi-tests/tests.h"
9 BEGIN_TEST(test_DeflateStringToUTF8Buffer
) {
11 JSLinearString
* linearStr
;
13 // DeflateStringToUTF8Buffer does not write a null terminator, so the byte
14 // following the last byte written to the |actual| buffer should retain
15 // the value it held before the call to DeflateStringToUTF8Buffer, which is
16 // initialized to 0x1.
19 auto span
= mozilla::Span(actual
);
21 // Test with an ASCII string, which calls JSLinearString::latin1Chars
22 // to retrieve the characters from the string and generates UTF-8 output
23 // that is identical to the ASCII input.
25 str
= JS_NewStringCopyZ(cx
, "Ohai"); // { 0x4F, 0x68, 0x61, 0x69 }
26 MOZ_RELEASE_ASSERT(str
);
27 linearStr
= JS_EnsureLinearString(cx
, str
);
30 const char expected
[] = {0x4F, 0x68, 0x61, 0x69, 0x1};
31 memset(actual
, 0x1, 100);
32 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
);
33 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
34 CHECK_EQUAL(dstlen
, 4u);
38 const char expected
[] = {0x4F, 0x68, 0x61, 0x1};
39 memset(actual
, 0x1, 100);
40 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(3));
41 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
42 CHECK_EQUAL(dstlen
, 3u);
46 const unsigned char expected
[] = {0x1};
47 memset(actual
, 0x1, 100);
48 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(0));
49 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
50 CHECK_EQUAL(dstlen
, 0u);
53 // Test with a Latin-1 string, which calls JSLinearString::latin1Chars
54 // like with the ASCII string but generates UTF-8 output that is different
55 // from the ASCII input.
57 str
= JS_NewUCStringCopyZ(cx
, u
"\xD3\x68\xE3\xEF"); // u"Óhãï"
58 MOZ_RELEASE_ASSERT(str
);
59 linearStr
= JS_EnsureLinearString(cx
, str
);
62 const unsigned char expected
[] = {0xC3, 0x93, 0x68, 0xC3,
63 0xA3, 0xC3, 0xAF, 0x1};
64 memset(actual
, 0x1, 100);
65 JS::DeflateStringToUTF8Buffer(linearStr
, span
);
66 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
70 const unsigned char expected
[] = {0xC3, 0x93, 0x68, 0xC3,
71 0xA3, 0xC3, 0xAF, 0x1};
72 memset(actual
, 0x1, 100);
73 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(7));
74 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
75 CHECK_EQUAL(dstlen
, 7u);
79 // Specify a destination buffer length of 3. That's exactly enough
80 // space to encode the first two characters, which takes three bytes.
81 const unsigned char expected
[] = {0xC3, 0x93, 0x68, 0x1};
82 memset(actual
, 0x1, 100);
83 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(3));
84 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
85 CHECK_EQUAL(dstlen
, 3u);
89 // Specify a destination buffer length of 4. That's only enough space
90 // to encode the first two characters, which takes three bytes, because
91 // the third character would take another two bytes.
92 const unsigned char expected
[] = {0xC3, 0x93, 0x68, 0x1};
93 memset(actual
, 0x1, 100);
94 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(4));
95 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
96 CHECK_EQUAL(dstlen
, 3u);
100 const unsigned char expected
[] = {0x1};
101 memset(actual
, 0x1, 100);
102 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(0));
103 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
104 CHECK_EQUAL(dstlen
, 0u);
107 // Test with a UTF-16 string, which calls JSLinearString::twoByteChars
108 // to retrieve the characters from the string.
110 str
= JS_NewUCStringCopyZ(cx
, u
"\x038C\x0068\x0203\x0457"); // u"Όhȃї"
111 MOZ_RELEASE_ASSERT(str
);
112 linearStr
= JS_EnsureLinearString(cx
, str
);
115 const unsigned char expected
[] = {0xCE, 0x8C, 0x68, 0xC8,
116 0x83, 0xD1, 0x97, 0x1};
117 memset(actual
, 0x1, 100);
118 JS::DeflateStringToUTF8Buffer(linearStr
, span
);
119 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
123 const unsigned char expected
[] = {0xCE, 0x8C, 0x68, 0xC8,
124 0x83, 0xD1, 0x97, 0x1};
125 memset(actual
, 0x1, 100);
126 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(7));
127 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
128 CHECK_EQUAL(dstlen
, 7u);
132 // Specify a destination buffer length of 3. That's exactly enough
133 // space to encode the first two characters, which takes three bytes.
134 const unsigned char expected
[] = {0xCE, 0x8C, 0x68, 0x1};
135 memset(actual
, 0x1, 100);
136 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(3));
137 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
138 CHECK_EQUAL(dstlen
, 3u);
142 // Specify a destination buffer length of 4. That's only enough space
143 // to encode the first two characters, which takes three bytes, because
144 // the third character would take another two bytes.
145 const unsigned char expected
[] = {0xCE, 0x8C, 0x68, 0x1};
146 memset(actual
, 0x1, 100);
147 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(4));
148 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
149 CHECK_EQUAL(dstlen
, 3u);
153 const unsigned char expected
[] = {0x1};
154 memset(actual
, 0x1, 100);
155 size_t dstlen
= JS::DeflateStringToUTF8Buffer(linearStr
, span
.To(0));
156 CHECK_EQUAL(memcmp(actual
, expected
, sizeof(expected
)), 0);
157 CHECK_EQUAL(dstlen
, 0u);
162 END_TEST(test_DeflateStringToUTF8Buffer
)