1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "gtest/gtest.h" 17 #include "gtest/hwext/gtest-ext.h" 18 #include "gtest/hwext/gtest-tag.h" 19 #include "unicode/unistr.h" 20 21 #include "base/utils/utf_helper.h" 22 23 using namespace testing; 24 using namespace testing::ext; 25 namespace { 26 const std::u16string TEST_INPUT_U16_STRING = u"THIS IS A STRING"; 27 const std::u16string TEST_INPUT_U16_EMOJI = u""; 28 const std::u32string TEST_INPUT_U32_STRING = U"THIS IS A STRING"; 29 const std::u32string TEST_INPUT_U32_EMOJI = U""; 30 } 31 namespace OHOS::Ace::UtfUtils { 32 class UtfHelperTestOneNg : public Test { SetUp()33 void SetUp() override 34 { 35 index = 0; 36 } 37 38 public: 39 size_t index; 40 }; 41 42 /** 43 * @tc.name: DebuggerConvertRegionUtf16ToUtf8_001 44 * @tc.desc: test DebuggerConvertRegionUtf16ToUtf8 45 * @tc.type: FUNC 46 */ 47 HWTEST_F(UtfHelperTestOneNg, DebuggerConvertRegionUtf16ToUtf8_001, TestSize.Level1) 48 { 49 uint16_t utf16String[] = { 0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002C, 0x0020, 0x4E16, 0x754C }; 50 size_t utf16Len = sizeof(utf16String) / sizeof(utf16String[0]); 51 uint8_t utf8Buffer[100]; 52 size_t res = DebuggerConvertRegionUtf16ToUtf8(utf16String, utf8Buffer, utf16Len, sizeof(utf8Buffer), 0); 53 EXPECT_NE(res, 0); 54 } 55 56 /** 57 * @tc.name: DebuggerConvertRegionUtf16ToUtf8_002 58 * @tc.desc: test DebuggerConvertRegionUtf16ToUtf8 59 * @tc.type: FUNC 60 */ 61 HWTEST_F(UtfHelperTestOneNg, DebuggerConvertRegionUtf16ToUtf8_002, TestSize.Level1) 62 { 63 uint16_t utf16String[] = { 0x0048, 0x0065, 0x006C, 0x006C, 0x006F }; 64 size_t utf16Len = sizeof(utf16String) / sizeof(utf16String[0]); 65 uint8_t utf8Buffer[1]; 66 size_t utf8Len = 0; 67 size_t res = DebuggerConvertRegionUtf16ToUtf8(utf16String, utf8Buffer, utf16Len, utf8Len, 0); 68 EXPECT_EQ(res, 0); 69 } 70 71 /** 72 * @tc.name: DebuggerConvertRegionUtf16ToUtf8_003 73 * @tc.desc: test DebuggerConvertRegionUtf16ToUtf8 74 * @tc.type: FUNC 75 */ 76 HWTEST_F(UtfHelperTestOneNg, DebuggerConvertRegionUtf16ToUtf8_003, TestSize.Level1) 77 { 78 uint16_t utf16String[] = { 0x0048, 0x0065, 0x006C, 0x006C, 0x006F }; 79 size_t utf16Len = sizeof(utf16String) / sizeof(utf16String[0]); 80 uint8_t* utf8Buffer = nullptr; 81 size_t utf8Len = 100; 82 size_t res = DebuggerConvertRegionUtf16ToUtf8(utf16String, utf8Buffer, utf16Len, utf8Len, 0); 83 EXPECT_EQ(res, 0); 84 } 85 86 /** 87 * @tc.name: DebuggerConvertRegionUtf16ToUtf8_004 88 * @tc.desc: test DebuggerConvertRegionUtf16ToUtf8 89 * @tc.type: FUNC 90 */ 91 HWTEST_F(UtfHelperTestOneNg, DebuggerConvertRegionUtf16ToUtf8_004, TestSize.Level1) 92 { 93 const uint16_t* utf16String = nullptr; 94 uint8_t utf8Buffer[100]; 95 size_t utf8Len = 100; 96 size_t utf16Len = 5; 97 size_t res = DebuggerConvertRegionUtf16ToUtf8(utf16String, utf8Buffer, utf16Len, utf8Len, 0); 98 EXPECT_EQ(res, 0); 99 } 100 101 /** 102 * @tc.name: DebuggerConvertRegionUtf16ToUtf8_005 103 * @tc.desc: null string 104 * @tc.type: FUNC 105 */ 106 HWTEST_F(UtfHelperTestOneNg, DebuggerConvertRegionUtf16ToUtf8_005, TestSize.Level1) 107 { 108 const uint16_t* emptyInput = nullptr; 109 uint8_t output[10] = { 0 }; 110 size_t result = DebuggerConvertRegionUtf16ToUtf8(emptyInput, output, 0, 10, 0); 111 EXPECT_EQ(result, 0); 112 } 113 114 /** 115 * @tc.name: DebuggerConvertRegionUtf16ToUtf8_006 116 * @tc.desc: singlebyte string 117 * @tc.type: FUNC 118 */ 119 HWTEST_F(UtfHelperTestOneNg, DebuggerConvertRegionUtf16ToUtf8_006, TestSize.Level1) 120 { 121 const uint16_t input[] = { 0x0061 }; 122 uint8_t output[10] = { 0 }; 123 size_t result = DebuggerConvertRegionUtf16ToUtf8(input, output, 1, 10, 0); 124 EXPECT_EQ(result, 1); 125 EXPECT_EQ(output[0], 0x61); 126 } 127 128 /** 129 * @tc.name: DebuggerConvertRegionUtf16ToUtf8_007 130 * @tc.desc: twobyte string 131 * @tc.type: FUNC 132 */ 133 HWTEST_F(UtfHelperTestOneNg, DebuggerConvertRegionUtf16ToUtf8_007, TestSize.Level1) 134 { 135 const uint16_t input[] = { 0xD800, 0xDC00 }; 136 uint8_t output[10] = { 0 }; 137 size_t result = DebuggerConvertRegionUtf16ToUtf8(input, output, 2, 10, 0); 138 EXPECT_EQ(result, 4); 139 } 140 141 /** 142 * @tc.name: DebuggerConvertRegionUtf16ToUtf8_008 143 * @tc.desc: twobyte string 144 * @tc.type: FUNC 145 */ 146 HWTEST_F(UtfHelperTestOneNg, DebuggerConvertRegionUtf16ToUtf8_008, TestSize.Level1) 147 { 148 const uint16_t input[] = { 0xD800, 0xD800 }; 149 uint8_t output[10] = { 0 }; 150 size_t result = DebuggerConvertRegionUtf16ToUtf8(input, output, 2, 10, 0); 151 EXPECT_EQ(result, 6); 152 } 153 154 /** 155 * @tc.name: Str8DebugToStr16_001 156 * @tc.desc: test Str8DebugToStr16 157 * @tc.type: FUNC 158 */ 159 HWTEST_F(UtfHelperTestOneNg, Str8DebugToStr16_001, TestSize.Level1) 160 { 161 std::string emptyStr = ""; 162 std::u16string result = Str8DebugToStr16(emptyStr); 163 EXPECT_EQ(result, u""); 164 } 165 166 /** 167 * @tc.name: Str8DebugToStr16_002 168 * @tc.desc: test Str8DebugToStr16 169 * @tc.type: FUNC 170 */ 171 HWTEST_F(UtfHelperTestOneNg, Str8DebugToStr16_002, TestSize.Level1) 172 { 173 std::string str = "Hello"; 174 std::u16string result = Str8DebugToStr16(str); 175 EXPECT_EQ(result, u"Hello"); 176 } 177 178 /** 179 * @tc.name: Str8DebugToStr16_003 180 * @tc.desc: test Str8DebugToStr16 181 * @tc.type: FUNC 182 */ 183 HWTEST_F(UtfHelperTestOneNg, Str8DebugToStr16_003, TestSize.Level1) 184 { 185 std::string str = DEFAULT_STR; 186 std::u16string result = Str8DebugToStr16(str); 187 EXPECT_EQ(result, DEFAULT_U16STR); 188 } 189 190 /** 191 * @tc.name: Str8DebugToStr16_004 192 * @tc.desc: test Str8DebugToStr16 193 * @tc.type: FUNC 194 */ 195 HWTEST_F(UtfHelperTestOneNg, Str8DebugToStr16_004, TestSize.Level1) 196 { 197 std::string str = "Word"; 198 std::u16string result = Str8DebugToStr16(str); 199 EXPECT_NE(result, DEFAULT_U16STR); 200 } 201 202 /** 203 * @tc.name: Str16DebugToStr8_001 204 * @tc.desc: test Str16DebugToStr8 205 * @tc.type: FUNC 206 */ 207 HWTEST_F(UtfHelperTestOneNg, Str16DebugToStr8_001, TestSize.Level1) 208 { 209 std::u16string emptyStr = u""; 210 std::string result = Str16DebugToStr8(emptyStr); 211 EXPECT_EQ(result, ""); 212 } 213 214 /** 215 * @tc.name: Str16DebugToStr8_002 216 * @tc.desc: test Str16DebugToStr8 217 * @tc.type: FUNC 218 */ 219 HWTEST_F(UtfHelperTestOneNg, Str16DebugToStr8_002, TestSize.Level1) 220 { 221 std::u16string str = u"Hello"; 222 std::string result = Str16DebugToStr8(str); 223 EXPECT_EQ(result, "Hello"); 224 } 225 226 /** 227 * @tc.name: Str16DebugToStr8_003 228 * @tc.desc: test Str16DebugToStr8 229 * @tc.type: FUNC 230 */ 231 HWTEST_F(UtfHelperTestOneNg, Str16DebugToStr8_003, TestSize.Level1) 232 { 233 std::u16string str = DEFAULT_U16STR; 234 std::string result = Str16DebugToStr8(str); 235 EXPECT_EQ(result, DEFAULT_STR); 236 } 237 238 /** 239 * @tc.name: Str16DebugToStr8_004 240 * @tc.desc: test Str16DebugToStr8 241 * @tc.type: FUNC 242 */ 243 HWTEST_F(UtfHelperTestOneNg, Str16DebugToStr8_004, TestSize.Level1) 244 { 245 std::u16string str = u"Word"; 246 std::string result = Str16DebugToStr8(str); 247 EXPECT_NE(result, DEFAULT_STR); 248 } 249 250 /** 251 * @tc.name: Str16DebugToStr8_005 252 * @tc.desc: test Str16DebugToStr8 253 * @tc.type: FUNC 254 */ 255 HWTEST_F(UtfHelperTestOneNg, Str16DebugToStr8_005, TestSize.Level1) 256 { 257 std::u16string str = u"Word"; 258 std::string result = Str16DebugToStr8(str); 259 EXPECT_EQ(result, "Word"); 260 } 261 262 /** 263 * @tc.name: Utf8ToUtf16Size_001 264 * @tc.desc: test Utf8ToUtf16Size 265 * @tc.type: FUNC 266 */ 267 HWTEST_F(UtfHelperTestOneNg, Utf8ToUtf16Size_001, TestSize.Level1) 268 { 269 uint8_t utf8[] = { 0xF0, 0x9F, 0x98, 0x80 }; 270 size_t utf8Len = sizeof(utf8) / sizeof(uint8_t); 271 size_t result = Utf8ToUtf16Size(utf8, utf8Len); 272 EXPECT_EQ(result, 2); 273 } 274 275 /** 276 * @tc.name: Utf8ToUtf16Size_002 277 * @tc.desc: test Utf8ToUtf16Size 278 * @tc.type: FUNC 279 */ 280 HWTEST_F(UtfHelperTestOneNg, Utf8ToUtf16Size_002, TestSize.Level1) 281 { 282 uint8_t utf8[] = { 0xF0, 0x80, 0x80, 0x80 }; 283 size_t utf8Len = sizeof(utf8) / sizeof(uint8_t); 284 size_t result = Utf8ToUtf16Size(utf8, utf8Len); 285 EXPECT_EQ(result, 1); 286 } 287 288 /** 289 * @tc.name: Utf8ToUtf16Size_003 290 * @tc.desc: test Utf8ToUtf16Size 291 * @tc.type: FUNC 292 */ 293 HWTEST_F(UtfHelperTestOneNg, Utf8ToUtf16Size_003, TestSize.Level1) 294 { 295 uint8_t utf8[] = { 0xC3, 0x82 }; 296 size_t utf8Len = sizeof(utf8) / sizeof(uint8_t); 297 size_t result = Utf8ToUtf16Size(utf8, utf8Len); 298 EXPECT_EQ(result, 1); 299 } 300 301 /** 302 * @tc.name: ConvertRegionUtf8ToUtf16_001 303 * @tc.desc: test ConvertRegionUtf8ToUtf16 304 * @tc.type: FUNC 305 */ 306 HWTEST_F(UtfHelperTestOneNg, ConvertRegionUtf8ToUtf16_001, TestSize.Level1) 307 { 308 uint8_t utf8[] = { 0xF0, 0x9F, 0x98, 0x80 }; 309 size_t utf8Len = sizeof(utf8) / sizeof(uint8_t); 310 uint16_t utf16[2]; 311 size_t utf16Len = sizeof(utf16) / sizeof(uint16_t); 312 size_t result = ConvertRegionUtf8ToUtf16(utf8, utf16, utf8Len, utf16Len); 313 EXPECT_EQ(result, 2); 314 } 315 316 /** 317 * @tc.name: ConvertRegionUtf8ToUtf16_002 318 * @tc.desc: test ConvertRegionUtf8ToUtf16 319 * @tc.type: FUNC 320 */ 321 HWTEST_F(UtfHelperTestOneNg, ConvertRegionUtf8ToUtf16_002, TestSize.Level1) 322 { 323 uint8_t utf8[] = { 0xF0, 0x80, 0x80, 0x80 }; 324 size_t utf8Len = sizeof(utf8) / sizeof(uint8_t); 325 uint16_t utf16[1]; 326 size_t utf16Len = sizeof(utf16) / sizeof(uint16_t); 327 size_t result = ConvertRegionUtf8ToUtf16(utf8, utf16, utf8Len, utf16Len); 328 EXPECT_EQ(result, 1); 329 } 330 331 /** 332 * @tc.name: ConvertRegionUtf8ToUtf16_003 333 * @tc.desc: test ConvertRegionUtf8ToUtf16 334 * @tc.type: FUNC 335 */ 336 HWTEST_F(UtfHelperTestOneNg, ConvertRegionUtf8ToUtf16_003, TestSize.Level1) 337 { 338 uint8_t utf8[] = { 0xC3, 0x81 }; 339 size_t utf8Len = sizeof(utf8) / sizeof(uint8_t); 340 uint16_t utf16[1]; 341 size_t utf16Len = sizeof(utf16) / sizeof(uint16_t); 342 size_t result = ConvertRegionUtf8ToUtf16(utf8, utf16, utf8Len, utf16Len); 343 EXPECT_EQ(result, 1); 344 } 345 346 /** 347 * @tc.name: ConvertRegionUtf8ToUtf16_004 348 * @tc.desc: test ConvertRegionUtf8ToUtf16 349 * @tc.type: FUNC 350 */ 351 HWTEST_F(UtfHelperTestOneNg, ConvertRegionUtf8ToUtf16_004, TestSize.Level1) 352 { 353 const uint8_t utf8Data[] = { 0xF0, 0x90 }; 354 size_t utf8Len = sizeof(utf8Data) / sizeof(utf8Data[0]); 355 uint16_t utf16Data[10] = { 0 }; 356 size_t utf16Len = sizeof(utf16Data) / sizeof(utf16Data[0]); 357 size_t result = ConvertRegionUtf8ToUtf16(utf8Data, utf16Data, utf8Len, utf16Len); 358 EXPECT_EQ(result, 2); 359 } 360 361 /** 362 * @tc.name: ConvertRegionUtf8ToUtf16_005 363 * @tc.desc: test ConvertRegionUtf8ToUtf16 364 * @tc.type: FUNC 365 */ 366 HWTEST_F(UtfHelperTestOneNg, ConvertRegionUtf8ToUtf16_005, TestSize.Level1) 367 { 368 uint8_t utf8[] = {}; 369 size_t utf8Len = sizeof(utf8) / sizeof(uint8_t); 370 uint16_t utf16[10]; 371 size_t utf16Len = sizeof(utf16) / sizeof(uint16_t); 372 size_t result = ConvertRegionUtf8ToUtf16(utf8, utf16, utf8Len, utf16Len); 373 EXPECT_EQ(result, 0); 374 } 375 376 /** 377 * @tc.name: FixUtf8Len_001 378 * @tc.desc: test FixUtf8Len 379 * @tc.type: FUNC 380 */ 381 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_001, TestSize.Level1) 382 { 383 const uint8_t utf8Data[] = { 0xC2 }; 384 size_t utf8Len = sizeof(utf8Data) / sizeof(utf8Data[0]); 385 uint16_t utf16Data[10] = { 0 }; 386 size_t utf16Len = sizeof(utf16Data) / sizeof(utf16Data[0]); 387 size_t result = ConvertRegionUtf8ToUtf16(utf8Data, utf16Data, utf8Len, utf16Len); 388 EXPECT_EQ(result, 1); 389 } 390 391 /** 392 * @tc.name: FixUtf8Len_002 393 * @tc.desc: test FixUtf8Len 394 * @tc.type: FUNC 395 */ 396 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_002, TestSize.Level1) 397 { 398 const uint8_t utf8Data[] = { 0xF0, 0x90 }; 399 size_t utf8Len = sizeof(utf8Data) / sizeof(utf8Data[0]); 400 uint16_t utf16Data[10] = { 0 }; 401 size_t utf16Len = sizeof(utf16Data) / sizeof(utf16Data[0]); 402 size_t result = ConvertRegionUtf8ToUtf16(utf8Data, utf16Data, utf8Len, utf16Len); 403 EXPECT_EQ(result, 2); 404 } 405 406 /** 407 * @tc.name: FixUtf8Len_003 408 * @tc.desc: test FixUtf8Len 409 * @tc.type: FUNC 410 */ 411 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_003, TestSize.Level1) 412 { 413 const uint8_t utf8Data[] = { 0xF0, 0x90, 0x80 }; 414 size_t utf8Len = sizeof(utf8Data) / sizeof(utf8Data[0]); 415 uint16_t utf16Data[10] = { 0 }; 416 size_t utf16Len = sizeof(utf16Data) / sizeof(utf16Data[0]); 417 size_t result = ConvertRegionUtf8ToUtf16(utf8Data, utf16Data, utf8Len, utf16Len); 418 EXPECT_EQ(result, 3); 419 } 420 421 /** 422 * @tc.name: FixUtf8Len_004 423 * @tc.desc: test FixUtf8Len 424 * @tc.type: FUNC 425 */ 426 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_004, TestSize.Level1) 427 { 428 const uint8_t utf8Data[] = { 0x48 }; 429 size_t utf8Len = sizeof(utf8Data) / sizeof(utf8Data[0]); 430 uint16_t utf16Data[10] = { 0 }; 431 size_t utf16Len = sizeof(utf16Data) / sizeof(utf16Data[0]); 432 size_t result = ConvertRegionUtf8ToUtf16(utf8Data, utf16Data, utf8Len, utf16Len); 433 EXPECT_EQ(result, 1); 434 } 435 436 /** 437 * @tc.name: FixUtf8Len_005 438 * @tc.desc: test FixUtf8Len 439 * @tc.type: FUNC 440 */ 441 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_005, TestSize.Level1) 442 { 443 const uint8_t utf8Data[] = { 0x48, 0xC2 }; 444 size_t utf8Len = sizeof(utf8Data) / sizeof(utf8Data[0]); 445 uint16_t utf16Data[10] = { 0 }; 446 size_t utf16Len = sizeof(utf16Data) / sizeof(utf16Data[0]); 447 size_t result = ConvertRegionUtf8ToUtf16(utf8Data, utf16Data, utf8Len, utf16Len); 448 EXPECT_NE(result, 1); 449 } 450 451 /** 452 * @tc.name: FixUtf8Len_006 453 * @tc.desc: test FixUtf8Len 454 * @tc.type: FUNC 455 */ 456 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_006, TestSize.Level1) 457 { 458 const uint8_t utf8Data[] = { 0x48, 0x65, 0xC2 }; 459 size_t utf8Len = sizeof(utf8Data) / sizeof(utf8Data[0]); 460 uint16_t utf16Data[10] = { 0 }; 461 size_t utf16Len = sizeof(utf16Data) / sizeof(utf16Data[0]); 462 size_t result = ConvertRegionUtf8ToUtf16(utf8Data, utf16Data, utf8Len, utf16Len); 463 EXPECT_EQ(result, 3); 464 } 465 466 /** 467 * @tc.name: FixUtf8Len_007 468 * @tc.desc: empty string 469 * @tc.type: FUNC 470 */ 471 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_007, TestSize.Level1) 472 { 473 const uint8_t* emptyInput = nullptr; 474 uint16_t output[10] = { 0 }; 475 size_t result = ConvertRegionUtf8ToUtf16(emptyInput, output, 0, 10); 476 EXPECT_EQ(result, 0); 477 } 478 479 /** 480 * @tc.name: FixUtf8Len_008 481 * @tc.desc: singleByte string 482 * @tc.type: FUNC 483 */ 484 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_008, TestSize.Level1) 485 { 486 const uint8_t* input = reinterpret_cast<const uint8_t*>(u8"a"); 487 uint16_t output[10] = { 0 }; 488 size_t result = ConvertRegionUtf8ToUtf16(input, output, 1, 10); 489 EXPECT_EQ(result, 1); 490 EXPECT_EQ(output[0], 'a'); 491 } 492 493 /** 494 * @tc.name: FixUtf8Len_009 495 * @tc.desc: mixed string 496 * @tc.type: FUNC 497 */ 498 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_009, TestSize.Level1) 499 { 500 const uint8_t* input = reinterpret_cast<const uint8_t*>(u8"Hello, 世界!"); 501 uint16_t output[50] = { 0 }; 502 size_t result = ConvertRegionUtf8ToUtf16(input, output, strlen(reinterpret_cast<const char*>(input)), 50); 503 EXPECT_EQ(result, 10); 504 } 505 506 /** 507 * @tc.name: FixUtf8Len_010 508 * @tc.desc: invalid string 509 * @tc.type: FUNC 510 */ 511 HWTEST_F(UtfHelperTestOneNg, FixUtf8Len_010, TestSize.Level1) 512 { 513 const uint8_t* input = reinterpret_cast<const uint8_t*>(u8"XXXX"); 514 uint16_t output[10] = { 0 }; 515 size_t result = ConvertRegionUtf8ToUtf16(input, output, 4, 10); 516 EXPECT_EQ(result, 4); 517 } 518 519 /** 520 * @tc.name: ConvertRegionUtf16ToUtf8_001 521 * @tc.desc: test ConvertRegionUtf16ToUtf8 522 * @tc.type: FUNC 523 */ 524 HWTEST_F(UtfHelperTestOneNg, ConvertRegionUtf16ToUtf8_001, TestSize.Level1) 525 { 526 uint16_t utf16String[] = { 0x0048, 0x0065, 0x006C, 0x006C, 0x006F }; 527 size_t utf16Len = sizeof(utf16String) / sizeof(utf16String[0]); 528 uint8_t utf8Buffer[1]; 529 size_t utf8Len = 0; 530 size_t res = ConvertRegionUtf16ToUtf8(utf16String, utf8Buffer, utf16Len, utf8Len, 0); 531 EXPECT_EQ(res, 0); 532 } 533 534 /** 535 * @tc.name: Utf16ToUtf8Size001 536 * @tc.desc: Test utf_helper Utf16ToUtf8Size 537 * @tc.type: FUNC 538 */ 539 HWTEST_F(UtfHelperTestOneNg, Utf16ToUtf8Size_001, TestSize.Level1) 540 { 541 uint16_t utf16[1] = { 0xd800 + 1 }; 542 size_t len = sizeof(utf16) / sizeof(utf16[0]); 543 EXPECT_EQ(Utf16ToUtf8Size(utf16, len), 4); 544 } 545 546 /** 547 * @tc.name: Utf16ToUtf8Size_002 548 * @tc.desc: Test utf_helper Utf16ToUtf8Size 549 * @tc.type: FUNC 550 */ 551 HWTEST_F(UtfHelperTestOneNg, Utf16ToUtf8Size_002, TestSize.Level1) 552 { 553 uint16_t utf16[1] = { 0 }; 554 size_t len = sizeof(utf16) / sizeof(utf16[0]); 555 EXPECT_EQ(Utf16ToUtf8Size(utf16, len), 1); 556 } 557 558 /** 559 * @tc.name: Utf16ToUtf8Size_003 560 * @tc.desc: Test utf_helper Utf16ToUtf8Size 561 * @tc.type: FUNC 562 */ 563 HWTEST_F(UtfHelperTestOneNg, Utf16ToUtf8Size_003, TestSize.Level1) 564 { 565 uint16_t utf16[1] = { 0x7ff - 1 }; 566 size_t len = sizeof(utf16) / sizeof(utf16[0]); 567 EXPECT_EQ(Utf16ToUtf8Size(utf16, len), 3); 568 } 569 570 /** 571 * @tc.name: Utf16ToUtf8Size_004 572 * @tc.desc: Test utf_helper Utf16ToUtf8Size 573 * @tc.type: FUNC 574 */ 575 HWTEST_F(UtfHelperTestOneNg, Utf16ToUtf8Size_004, TestSize.Level1) 576 { 577 uint16_t utf16[1] = { 0xd800 + 1 }; 578 size_t len = sizeof(utf16) / sizeof(utf16[0]); 579 EXPECT_EQ(Utf16ToUtf8Size(utf16, len), 4); 580 } 581 582 /** 583 * @tc.name: Utf16ToUtf8Size_005 584 * @tc.desc: Test utf_helper Utf16ToUtf8Size 585 * @tc.type: FUNC 586 */ 587 HWTEST_F(UtfHelperTestOneNg, Utf16ToUtf8Size_005, TestSize.Level1) 588 { 589 uint16_t utf16[2] = { 0xd800 + 1, 0xdc00 + 1 }; 590 size_t len = sizeof(utf16) / sizeof(utf16[0]); 591 EXPECT_EQ(Utf16ToUtf8Size(utf16, len), 5); 592 } 593 594 /** 595 * @tc.name: Utf16ToUtf8Size_006 596 * @tc.desc: Test utf_helper Utf16ToUtf8Size 597 * @tc.type: FUNC 598 */ 599 HWTEST_F(UtfHelperTestOneNg, Utf16ToUtf8Size_006, TestSize.Level1) 600 { 601 uint16_t utf16[2] = { 0xd800 + 1, 0xdc00 - 1 }; 602 size_t len = sizeof(utf16) / sizeof(utf16[0]); 603 EXPECT_EQ(Utf16ToUtf8Size(utf16, len), 7); 604 } 605 606 /** 607 * @tc.name: Utf16ToUtf8Size_007 608 * @tc.desc: Test utf_helper Utf16ToUtf8Size 609 * @tc.type: FUNC 610 */ 611 HWTEST_F(UtfHelperTestOneNg, Utf16ToUtf8Size_007, TestSize.Level1) 612 { 613 uint16_t utf16[2] = { 0xd800 + 1, 0xdfff + 1 }; 614 size_t len = sizeof(utf16) / sizeof(utf16[0]); 615 EXPECT_EQ(Utf16ToUtf8Size(utf16, len), 7); 616 } 617 618 /** 619 * @tc.name: IsIndexInPairedSurrogates_001 620 * @tc.desc: test utf_helper.cpp: justify that index is in paired surrogates 621 * @tc.type: FUNC 622 */ 623 HWTEST_F(UtfHelperTestOneNg, IsIndexInPairedSurrogates_001, TestSize.Level1) 624 { 625 std::u16string emojiStr = u""; 626 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(-1, emojiStr), false); 627 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(0, emojiStr), false); 628 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(1, emojiStr), false); 629 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(2, emojiStr), false); 630 } 631 632 /** 633 * @tc.name: IsIndexInPairedSurrogates_002 634 * @tc.desc: test utf_helper.cpp: justify that index is in paired surrogates 635 * @tc.type: FUNC 636 */ 637 HWTEST_F(UtfHelperTestOneNg, IsIndexInPairedSurrogates_002, TestSize.Level1) 638 { 639 std::u16string emojiStr = u"哈哈"; 640 int32_t len = static_cast<int32_t>(emojiStr.length()); 641 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(-1, emojiStr), false); 642 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(0, emojiStr), false); 643 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(1, emojiStr), false); 644 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(2, emojiStr), false); 645 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(len - 1, emojiStr), true); 646 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(len, emojiStr), false); 647 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(len + 1, emojiStr), false); 648 } 649 650 /** 651 * @tc.name: IsIndexInPairedSurrogates_003 652 * @tc.desc: test utf_helper.cpp: justify that index is in paired surrogates when a emoji is truncated 653 * @tc.type: FUNC 654 */ 655 HWTEST_F(UtfHelperTestOneNg, IsIndexInPairedSurrogates_003, TestSize.Level1) 656 { 657 std::u16string emojiStr = u"哈哈"; 658 int32_t len = static_cast<int32_t>(emojiStr.length()); 659 std::u16string subEmojiStr = emojiStr.substr(0, len - 1); 660 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(0, subEmojiStr), false); 661 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(1, subEmojiStr), false); 662 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(2, subEmojiStr), false); 663 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(3, subEmojiStr), true); 664 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(len - 1, subEmojiStr), false); 665 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(len, subEmojiStr), false); 666 ASSERT_EQ(UtfUtils::IsIndexInPairedSurrogates(len + 1, subEmojiStr), false); 667 } 668 669 /** 670 * @tc.name: Str16ToStr32_001 671 * @tc.desc: test utf_helper.cpp: Convert u16string and u32string 672 * @tc.type: FUNC 673 */ 674 HWTEST_F(UtfHelperTestOneNg, Str16ToStr32_001, TestSize.Level1) 675 { 676 ASSERT_EQ(UtfUtils::Str16ToStr32(TEST_INPUT_U16_STRING), TEST_INPUT_U32_STRING); 677 ASSERT_EQ(UtfUtils::Str16ToStr32(TEST_INPUT_U16_EMOJI), TEST_INPUT_U32_EMOJI); 678 ASSERT_EQ(UtfUtils::Str16ToStr32(u""), U""); 679 ASSERT_EQ(UtfUtils::Str16ToStr32(UtfUtils::DEFAULT_U16STR), UtfUtils::DEFAULT_U32STR); 680 } 681 682 /** 683 * @tc.name: Str16ToStr32_002 684 * @tc.desc: test utf_helper.cpp: Convert u16string to u32string reserving truncated emoji string 685 * @tc.type: FUNC 686 */ 687 HWTEST_F(UtfHelperTestOneNg, Str16ToStr32_002, TestSize.Level1) 688 { 689 std::u16string emojiStr = u""; 690 std::u16string subEmojiStr = emojiStr.substr(0, 1); 691 std::u32string excpectSubEmojiStr = U"哈"; 692 excpectSubEmojiStr[0] = 0xD83D; /* D83D DC01 is utf-16 encoding for emoji */ 693 ASSERT_EQ(UtfUtils::Str16ToStr32(subEmojiStr), excpectSubEmojiStr); 694 } 695 696 /** 697 * @tc.name: Str16ToStr32_003 698 * @tc.desc: test utf_helper.cpp: Convert u16string to u32string reserving truncated emoji string 699 * @tc.type: FUNC 700 */ 701 HWTEST_F(UtfHelperTestOneNg, Str16ToStr32_003, TestSize.Level1) 702 { 703 std::u16string emojiStr = u"哈哈"; 704 std::u16string subEmojiStr = emojiStr.substr(0, 3); 705 std::u32string excpectSubEmojiStr = U"哈哈哈"; 706 excpectSubEmojiStr[2] = 0xD83D; /* D83D DC01 is utf-16 encoding for emoji */ 707 ASSERT_EQ(UtfUtils::Str16ToStr32(subEmojiStr), excpectSubEmojiStr); 708 } 709 710 /** 711 * @tc.name: Str32ToStr16_001 712 * @tc.desc: test utf_helper.cpp: Convert u16string and u32string 713 * @tc.type: FUNC 714 */ 715 HWTEST_F(UtfHelperTestOneNg, Str32ToStr16_001, TestSize.Level1) 716 { 717 ASSERT_EQ(UtfUtils::Str32ToStr16(TEST_INPUT_U32_STRING), TEST_INPUT_U16_STRING); 718 ASSERT_EQ(UtfUtils::Str32ToStr16(TEST_INPUT_U32_EMOJI), TEST_INPUT_U16_EMOJI); 719 ASSERT_EQ(UtfUtils::Str32ToStr16(U""), u""); 720 ASSERT_EQ(UtfUtils::Str32ToStr16(UtfUtils::DEFAULT_U32STR), UtfUtils::DEFAULT_U16STR); 721 } 722 723 /** 724 * @tc.name: Str32ToStr16_002 725 * @tc.desc: test utf_helper.cpp: Convert u16string to u32string reserving truncated emoji string 726 * @tc.type: FUNC 727 */ 728 HWTEST_F(UtfHelperTestOneNg, Str32ToStr16_002, TestSize.Level1) 729 { 730 std::u16string emojiStr = u""; 731 std::u16string subEmojiStr = emojiStr.substr(0, 1); 732 std::u32string excpectSubEmojiStr = U"哈"; 733 excpectSubEmojiStr[0] = 0xD83D; /* D83D DC01 is utf-16 encoding for emoji */ 734 ASSERT_EQ(UtfUtils::Str32ToStr16(UtfUtils::Str16ToStr32(subEmojiStr)), subEmojiStr); 735 } 736 737 /** 738 * @tc.name: Str32ToStr16_003 739 * @tc.desc: test utf_helper.cpp: Convert u16string to u32string reserving truncated emoji string 740 * @tc.type: FUNC 741 */ 742 HWTEST_F(UtfHelperTestOneNg, Str32ToStr16_003, TestSize.Level1) 743 { 744 std::u16string emojiStr = u"哈哈"; 745 std::u16string subEmojiStr = emojiStr.substr(0, 3); 746 std::u32string excpectSubEmojiStr = U"哈哈哈"; 747 excpectSubEmojiStr[2] = 0xD83D; /* D83D DC01 is utf-16 encoding for emoji */ 748 ASSERT_EQ(UtfUtils::Str32ToStr16(UtfUtils::Str16ToStr32(subEmojiStr)), subEmojiStr); 749 } 750 751 } // namespace OHOS::Ace::UtfUtils