1/* 2 * Copyright (c) 2023 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/* 17 * @tc.name:String 18 * @tc.desc:test String 19 * @tc.type: FUNC 20 * @tc.require: issueI5NO8G 21 */ 22print("string".length); 23print("string"[3]); 24print("string".at(-1)); 25 26let tmp = '今天吃什么:告诉了会晤今天吃什么促“让今天吃什么下来好起来”今天吃今天吃什么于6月1日于北京今天吃什么面。大杂烩中国都五年来首位访华\ 27的今天吃什么王刚说,你吵的菜今天吃什么了赞不绝口,但是今天吃什么吃,他接到一个快递单号为#nsExpress3SF#123456789的包裹'; 28let flag = tmp; 29let str1 = tmp.substring(0, 111) + ',,,,,,,,,,,,,,,,,,,,,,,' + tmp.substring(111 + 23); 30let str2 = tmp.substring(0, 111) + 'nsExpress3SF#123456789的' + tmp.substring(111 + 23,111 + 24) + '需'; 31let str3 = tmp.substring(0, 111) + 'nsExpress3SF#123456789的' + tmp.substring(111 + 23); 32print((flag === str1).toString()); 33print((flag === str2).toString()); 34print((flag === str3).toString()); 35 36let utf81 = '12312463347659634287446568765344234356798653455678899865746435323456709876543679334675235523463756875153764736256\ 37235252537585734523759078945623465357867096834523523765868'; 38let utf82 = utf81.substring(0, 169) + '8'; 39let utf83 = utf81.substring(0, 169) + '0'; 40print((utf81 === utf82).toString()); 41print((utf81 === utf83).toString()); 42 43function foo(a) { 44 return a; 45} 46try { 47 for (let i = 0; i < 25; i++) { 48 foo += foo; 49 } 50} catch (e) { 51 print(e.message); 52} 53let string1 = "fdjDJSAjkdfalDDGETG"; 54let string2 = string1.substring(1); 55print(str1.charAt()); 56print(str2.charCodeAt()); 57print(str1.substr(2, 4)); 58print(string2.toLowerCase(2, 4)); 59 60 61let tmp1 = '今天吃什么:哈哈哈会晤美国phonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatform国务卿促“让今天吃什么下来好起来”今天吃今天吃什么于6月1日于北京今天吃什么面。大杂烩中国都五年来首位访华\ 62的今天吃什么王刚说,你吵的菜今天吃什么了赞不绝口,但是今天吃什么吃,他接到一个快递单号为#nsExpress3SF#123456789的包裹'; 63let flag1 = tmp1; 64let str = tmp1.substring(13, 143); 65let str4 = tmp1.substring(13, 26); 66let str5 = "phonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatform"; 67let str6 = "phonePlatform"; 68var obj = {phonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatformphonePlatform: "wode", 69phonePlatform: "wode1"}; 70 71print(obj[str]); 72print(obj[str4]); 73print((str === str5).toString()); 74print((str4 == str6).toString()); 75 76var s0 = String.fromCharCode(); 77var s1 = String.fromCharCode(65); 78var s2 = String.fromCharCode(65, 66.678); 79var s3 = String.fromCharCode(0x12014); 80var s4 = String.fromCharCode(true); 81print(s0); 82print(s1); 83print(s2); 84print(s3); 85print(s4); 86 87let name1 = 'testfiles就发(2).png'; 88let filename1 = name1.substring(0, 14); 89let kk1 = filename1.toLowerCase(); 90print(kk1); 91 92let name2 = 'testfileswodetwwwpng'; 93let filename2 = name2.substring(0, 14); 94let kk2 = filename2.toLowerCase(); 95print(kk2); 96 97var strA = name2 + name1; 98for (let i = 0; i < 100; i++) { 99strA.toLocaleString(); 100} 101print("true"); 102 103var a = ""; 104var b = a.split(""); 105var c = a.split("1"); 106print(b.length); 107print(c.length); 108var a1 = "123_352_42342_483297538927943872943_12i2"; 109var a2 = "12哈哈3尼352尼42好呀342_4832975389279你们43872943尼12i2"; 110var a3 = a2.substring(1); 111var b1 = a1.split(); 112var c1 = a1.split(""); 113var d1 = a1.split(" "); 114var e1 = a1.split("_"); 115var f1 = a1.split("_", 2); 116var g1 = a2.split("尼", 3); 117var r1 = a3.split("尼", 44); 118var k1 = a3.split("尼", 0); 119var k2 = a3.split("4", 5); 120print(b1); 121print(c1); 122print(d1); 123print(e1); 124print(f1); 125print(g1); 126print(r1); 127print(k1.length); 128print(k2); 129try { 130 var sym = Symbol(); 131 a2.split(sym, 0); 132} catch (e) { 133 print(e.message); 134} 135 136var test1 = "fun123ctionManualChapter123Tip1_352_42342_483297538927943872943_12i2哈哈哈"; 137var test2 = test1.split("_"); 138var test3 = test2[0]; 139var test4 = "1111fun123ctionManualChapter123Tip1" 140let pos = test4.indexOf(test3); 141print(pos); 142 143Object.defineProperty(Array.prototype, "1", { 144 value:37, 145 writable:false, 146}); 147var test5 = "123_wode2222222222222222_fast_哈哈哈"; 148var test6 = "123_wode2222222222222222_fast_hhh"; 149var test7 = test5.split("_"); 150var test8 = test6.split("_"); 151print(test7); 152print(test8); 153 154var test9 = "abc" 155var test10 = new Number(4); 156test10[Symbol.split] = RegExp.prototype[Symbol.split]; 157print(test9.split(test10)); 158var test11 = test1.substring(0, 31); 159var test12 = "1111fun123ctionManualChapter123Tip12222" 160var test13 = test12.split(test11); 161var test14 = test12.lastIndexOf(test11); 162print(test13); 163print(test14); 164 165let s = "abaddbdc" 166s.split("") 167let split = s.split("") 168split[0] = "0" 169print(split) 170print(s.split("")) 171s.split("b") 172split = s.split("b") 173split[2] = 1 174print(split) 175print(s.split("b")) 176s = "d的發的給的点点滴滴多" 177s.split("的") 178split = s.split("的") 179split[2] = 1 180print(split) 181print(s.split("的")) 182 183let newStr = new String("adcdcdccda") 184newStr.split("d") 185split = newStr.split("d") 186split[0] = "0" 187print(split) 188print(newStr.split("d")) 189 190var Tag = { 191 t82 : "82" 192} 193var tag1 = "823".substring(0, 2) 194var val = "val"; 195var m = new Map(); 196m.set(tag1, val); 197m.forEach((a, b)=>{ 198 print("Tag.t82 == b : ", Tag.t82 == b); 199}) 200 201try { 202 "123".padEnd(Math.pow(2, 40)) 203} catch (e) { 204 print(e) 205} 206 207print("abc".startsWith("a", Infinity)) 208print("abc".startsWith("a", -Infinity)) 209print("abc".endsWith("c", Infinity)) 210 211const strings = [ 212 "ab\uD800", 213 "ab\uD800c", 214 "\uDFFFab", 215 "c\uDFFFab", 216 "abc", 217 "ab\uD83D\uDE04c", 218]; 219 220for (const str of strings) { 221 print(str.isWellFormed()); 222} 223 224const strings2 = [ 225 "ab\uD800", 226 "ab\uD800c", 227 "\uDFFFab", 228 "c\uDFFFab", 229 "abc", 230 "ab\uD83D\uDE04c", 231]; 232 233for (const str of strings2) { 234 print(str.toWellFormed()); 235} 236 237const text_str = "So we beat on, boats against the current, borne back ceaselessly into the past." 238const search_str1 = "So we" 239const search_str2 = "borne back" 240print(text_str.startsWith(search_str1)); 241print(text_str.startsWith(search_str1, 10)); 242print(text_str.startsWith(search_str2, 42)); 243print(text_str.startsWith(search_str1, text_str.length - 1)); 244const text_str2 = "So we beat on, boats against the current," + " borne back ceaselessly into the past." 245print(text_str2.startsWith(search_str1)); 246print(text_str2.startsWith(search_str1, 10)); 247print(text_str2.startsWith(search_str2, 42)); 248print(text_str2.startsWith(search_str1, text_str.length - 1)); 249 250const str7 = "测试" 251const iter = str7[Symbol.iterator](); 252print(iter.next().value); 253print(iter.next().value); 254print(iter.next().done); 255print(iter.next().value); 256 257const str_endsWith1 = 'this is a test for string endsWith!'; 258print(str_endsWith1.endsWith('string', '25')); // true 259print(str_endsWith1.endsWith('string', 25)); // true 260print(str_endsWith1.endsWith('endsWith!', 25)); // false 261print(str_endsWith1.endsWith('endsWith!')); // true 262print(str_endsWith1.endsWith('endsWith!', -1)); // false 263print(str_endsWith1.endsWith('endsWith!', 100)); // true 264print(str_endsWith1.endsWith('string', 25.3)); // true 265 266let arr = Array(14); 267let tree_str = arr + 512; 268tree_str.substring(0,arr.length); 269print("sub_string test success!"); 270 271const v0 = [3.0,-1.5053]; 272const v4 = v0.join(); 273print(v4.startsWith(v4,v0)) 274let strFromCodePoint = String.fromCodePoint(49,50,51,0) 275print(strFromCodePoint); 276 277{ 278 const v1 = [5.101952721978723,-1.2836190437943387,-1.1815850946332814e+308,2.220446049250313e-16,-680.5741773264597,0.8970365641701358,NaN]; 279 function f2(a3, a4, a5) { 280 return BigInt64Array.bind(); 281 } 282 283 const o8 = { 284 "get": f2, 285 }; 286 const v10 = new Proxy(v1, o8); 287 try { 288 ("n").search(v10) 289 } catch (err) { 290 print(err); 291 } 292} 293 294// startsWith 边界值测试 295const textStr = "abcd" 296const matchStr = "abcd" 297const offset = 0 298 299// case offset = 0, match true 300class C3 { 301 constructor() { 302 let bb = textStr.startsWith(matchStr, offset); 303 print(bb); // true 304 } 305} 306 307new C3(); 308 309// case offset = 1, match false 310const offset1 = 1 311 312class C4 { 313 constructor() { 314 let flag = textStr.startsWith(matchStr, offset1); 315 print(flag); // false 316 } 317} 318 319new C4(); 320 321print("abcd汉字".startsWith("abcd")); 322 323{ 324 class C2 { 325 constructor(a4) { 326 a4(-3, parseFloat, ..."isFrozen"); 327 } 328 } 329 330 try { 331 new C2(new C2); 332 } catch (err) { 333 print(err); 334 } 335} 336let greeting = " Hello World! "; 337let fooStr = "foo "; 338let barStr = " bar"; 339let chinese = " 我,是一个中文句子 我前面有一些空格,我中间有一些空格。 我后面也有一些空格。 "; 340// test for trimStart() 341print(greeting.trimStart()); 342print(fooStr.trimStart()); 343print(barStr.trimStart()); 344print(chinese.trimStart()); 345// test for trimEnd() 346print(greeting.trimEnd()); 347print(fooStr.trimEnd()); 348print(barStr.trimEnd()); 349print(chinese.trimEnd()); 350// test for trimLeft() 351print(greeting.trimLeft()); 352print(fooStr.trimLeft()); 353print(barStr.trimLeft()); 354print(chinese.trimLeft()); 355// test for trimRight() 356print(greeting.trimRight()); 357print(fooStr.trimRight()); 358print(barStr.trimRight()); 359print(chinese.trimRight()); 360 361// Test case for padStart() 362let start_str = "abc"; 363print(start_str.padStart(10, "123")); 364print(start_str.padStart(5.666, "123")); 365print(start_str.padStart(NaN, "123")); 366print(start_str.padStart(-Infinity, "123")); 367print(start_str.padStart(0, "123")); 368print(start_str.padStart(10, "")); 369 370// test for padEnd() 371print("abc".padEnd(5, 'abc')); 372print('abc'.padEnd(undefined, 'def')); 373print('abc'.padEnd(null, 'def') ); 374print('abc'.padEnd(NaN, 'def') ); 375print('abc'.padEnd(-Infinity, 'def') ); 376print('abc'.padEnd(0, 'def') ); 377print('abc'.padEnd(-1, 'def') ); 378print('abc'.padEnd(5, '')) 379 380let arr1 = [0,0,0,0,0]; 381print(arr1.toString("a")); 382{ 383 function f(n) { return "cba".endsWith("a", n); } 384 print(f()); 385 print(f(4294967296)); 386} 387 388[ 389 ['a', 'b', 'c'], 390 'abc', 391 new Uint8Array([8, 9, 10]) 392].forEach((v) => { 393 // Test the limit value. 394 print(v.at(-Infinity) == undefined); 395}); 396 397const arr_at = new Uint8Array([8, 9, 10]); 398ArkTools.arrayBufferDetach(arr_at.buffer); 399try { 400 arr_at.at(0); 401} catch (e) { 402 print(e instanceof TypeError) 403} 404 405print('trimStart' == String.prototype.trimLeft.name); 406print('trimEnd' == String.prototype.trimRight.name); 407 408{ 409 const abc_str = "abc"; 410 const negativeHeapNumber = -1 * 2**32; 411 const positiveHeapNumber = 2**32; 412 print(abc_str.substring(positiveHeapNumber)) 413 print(abc_str.substring(negativeHeapNumber, positiveHeapNumber)) 414 print(abc_str.substring(-abc_str.length, positiveHeapNumber)) 415 print(abc_str.substring(0, positiveHeapNumber)) 416 print(abc_str.substring(-2, positiveHeapNumber)) 417 print(abc_str.substring(-1, positiveHeapNumber)) 418} 419 420{ 421 const localestr = "island" 422 print(localestr.toLocaleUpperCase()); 423 print(localestr.toLocaleUpperCase('TR')); 424} 425 426// Test empty string search an empty string(Array.tostring). 427let indexOf = String.prototype.indexOf; 428print(0 == "".indexOf([])); 429 430Object.defineProperty(RegExp,"name",{value:1}); 431RegExp.toString(); 432print("native Func toString test Success!") 433 434 435print("================Test unroll char copy================"); 436let srcutf8 = "1234567812345678123456781234567812345678123456781234567812345678"; // bytes == 64 437let srcutf16 = "一二三四五六七八一二三四五六七八一二三四五六七八一二三四五六七八"; // bytes == 64 438 439print(srcutf8.slice(0, 0)); // bytes == 0 440print(srcutf8.slice(64, 64)); // bytes == 0 441print(srcutf8.slice(0, 6)); // bytes < 8 442print(srcutf8.slice(0, 8)); // bytes == 8 443print(srcutf8.slice(0, 14)); // bytes < 16 444print(srcutf8.slice(0, 16)); // bytes == 16 445print(srcutf8.slice(0, 21)); // bytes > 16 && bytes % 16 != 0 446print(srcutf8.slice(0, 24)); // bytes == 3 * 8 447print(srcutf8.slice(0, 26)); // bytes > 16 && bytes % 16 > 8 && bytes % 8 > 0 448print(srcutf8.slice(0, 32)); // bytes == 2 * 16 449print(srcutf8.slice(0, 50)); // bytes > 16 && bytes % 16 != 0 450print(srcutf8.slice(0, 56)); // bytes == 7 * 8 451print(srcutf8.slice(0, 64)); // bytes == 4 * 16 452 453print(srcutf16.slice(0, 0)); // bytes == 0 454print(srcutf16.slice(32, 32)); // bytes == 0 455print(srcutf16.slice(0, 3)); // bytes < 8 456print(srcutf16.slice(0, 4)); // bytes == 8 457print(srcutf16.slice(0, 7)); // bytes < 16 458print(srcutf16.slice(0, 8)); // bytes == 16 459print(srcutf16.slice(0, 10)); // bytes > 16 && bytes % 16 != 0 460print(srcutf16.slice(0, 12)); // bytes == 3 * 8 461print(srcutf16.slice(0, 13)); // bytes > 16 && bytes % 16 > 8 && bytes % 8 > 0 462print(srcutf16.slice(0, 16)); // bytes == 2 * 16 463print(srcutf16.slice(0, 25)); // bytes > 16 && bytes % 16 != 0 464print(srcutf16.slice(0, 28)); // bytes == 7 * 8 465print(srcutf16.slice(0, 32)); // bytes == 4 * 16 466 467var str11; 468var result11; 469var re11 = /[Cz]/; 470var re12 = /([Cz])/; 471 472function createHaystack() { 473 let s = "abCdefgz"; 474 for (let i = 0; i < 3; i++) s += s; 475 return s; 476} 477 478function SimpleSplit2() { 479 result11 = str11.split(re11); 480 if (result11.length != 17) { 481 print("fail!"); 482 } 483} 484 485function Function1Replace(re) { 486 result11 = re[Symbol.replace](str11, String); 487 if (result11 != "abCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgzabCdefgz") { 488 print("fail!"); 489 } 490} 491 492str11 = createHaystack(); 493 494function SimpleMatch1() { 495 result11 = str11.match(re11); 496 if (result11[0] != 'C') { 497 print("fail!"); 498 } 499} 500 501for (let i = 0; i < 10; i++) { 502 SimpleMatch1(); 503} 504 505for (let i = 0; i < 10; i++) { 506 SimpleSplit2(); 507} 508 509for (let i = 0; i < 100; i++) { 510 Function1Replace(re12); 511} 512 513{ 514 print(); 515 let str = "abcde"; 516 print(str.lastIndexOf("")) 517 print(str.indexOf("")) 518} 519 520try { 521 let concatStr = 'c'; 522 for (let i = 0; i < (0x3fffff0);i++) { 523 concatStr += "AAAAA" + concatStr + "BBBBBBBB"; 524 } 525} catch(e) { 526 print(e); 527}