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 */ 15declare function print(arg:any, arg1?:any):string; 16declare var ArkTools:any; 17function assert (expr: unknown, msg?: string): asserts expr { 18 if (!expr) throw new Error(msg); 19} 20 21var a : string = "12345"; 22var cr : string = "clashroyale"; 23var c = a + a.substring(2); 24print(c); 25a += a.substring(3); 26print(a); 27a = a + cr.substring(5); 28print(a); 29 30var d = cr.substring(1) + a; 31print(d); 32 33function test_undefined(message, message2, message3, message4) { 34 print(message + ', ' + message2 + ', ' + message3 + ', ' + message4); 35} 36test_undefined('hello'); 37 38let as = "aaaaaaaa"; 39let bs = "bbbbbbbb"; 40let cs = "ccc"; 41let abs = as + bs; 42let abcs = abs + cs; 43assert(abs == "aaaaaaaabbbbbbbb", "Error optimize string add"); 44print(abs == "aaaaaaaabbbbbbbbccc"); 45 46// multiple add case 47var Text1 = "[^-]*-"; 48var Text2 = Text1 + "([^-]" + Text1 + ")*-"; 49var Text3 = Text2 + ">?"; 50var Text4 = "<(!(--" + Text2 + ">|[^-]"; 51print(Text4); 52 53// loop opt case 54var stra = "aaaaaa"; 55var strb = "strb"; 56print(strb); 57assert(ArkTools.isSlicedString(strb) == false, "Error optimize string add"); 58strb = stra + "bbbbbbbb" 59var kk = 10; 60var strc = ""; 61for (let i = 0; i < 3; i++) { 62 if (kk > 100) { 63 strc = strb + "c"; 64 } else { 65 strc = strb + "-"; 66 } 67} 68print(strb); 69let strbHasStringAddOpt: boolean = ArkTools.isSlicedString(strb); 70assert(ArkTools.isSlicedString(strc) == false, "Error optimize string add"); 71 72// function call opt case 73function foo1(str) { 74 var strk = str + "kkk"; 75 for (let j = 0; j < 3; j++) { 76 if (strk.length > 5) { 77 var stre = str + "-"; 78 } else { 79 var stre = str + "+"; 80 } 81 } 82} 83foo1(strb); 84print(strb); 85 86// cocos app opt case 87var count = 9; 88function foo2(num) { 89 if (num < 0) { 90 return 3; 91 } else { 92 return "callthis"; 93 } 94} 95var right = "hmos"; 96if (count > 10) { 97 right += foo2(count); 98} 99var e = "oooohhhhoooossss"; 100assert(ArkTools.isSlicedString(e) == false, "Error optimize string add"); 101for (var i = 0; i < count; i++) { 102 e += right; 103} 104let eHasStringAddOpt: boolean = ArkTools.isSlicedString(e); 105 106function foo3(str :string) { 107 print(str); 108 print(str.length); 109} 110 111let s:string = "aaaaaaaaaaaaaaaa" + "bbbbbbbbbbbbbb"; 112let s1:string = "aaaaaaaaaaaaaaaa" + "bbbbbbbbbbbbbb"; 113let ss:string = s + "-"; 114 115foo3(s); 116print(s1 == s); 117 118// two const 119let str:string = "Hello World"; 120print("Hello" + "World"); 121print(str + "Hello"); 122print("" + "" + "123" + ""); 123 124// one const 125let strs = ["OD", "Huawei", ""]; 126for (let i = 0; i<3; ++i) { 127 let m:string = strs[i]; 128 print("Hello, " + m); 129} 130 131// no const 132function foo(flag) { 133 let str = ["BUG", "full of bug"]; 134 if (flag) { 135 return str[0]; 136 } else { 137 return str[1]; 138 } 139} 140let left:string = foo(true); 141let right1:string = foo(true); 142let right2:string = foo(false); 143print(left + right1); 144print(left + right2); 145print(right2 + right2); 146 147let res1 = `string`; 148for (let i = 0; i < 10; i++) { 149 res1 = res1 + i; 150} 151print(res1); 152 153let res2 = `string`; 154for (let i = 0; i < 10; i++) { 155 res2 = i + res2; 156} 157print(res2); 158 159print(true+""); 160print(false+""); 161print(undefined+""); 162print(null+""); 163 164print(""+true); 165print(""+false); 166print(""+undefined); 167print(""+null); 168 169var obj1 = { 170 number: 6 171} 172print(obj1.number+""); 173 174a = `12`; 175for (let i = 0; i < 10; i++) { 176 a += `${i}` 177} 178print(a); 179 180if (ArkTools.isAOTCompiled(foo)) { 181 // assert(strbHasStringAddOpt == true, "Not optimize string add"); 182 // assert(eHasStringAddOpt == true, "Not optimize string add"); 183} 184 185// const utf-16 add test 186let cn_str:string = "中文测试字符串\n" 187function foo4() { 188 for (let i = 0; i < 20; i++) { 189 cn_str += ("中文字符串测试一" + "中文字符串测试二\n") 190 } 191 print(cn_str) 192} 193foo4() 194print("foo4 result:") 195print(ArkTools.isAOTCompiled(foo4)) 196print(ArkTools.isAOTDeoptimized(foo4)) 197 198// base += case 199function foo5() { 200 for (var e = "", i = 0; i < 20; i++) { 201 e += "-"; 202 } 203 print(e) 204} 205print("foo5 result:") 206foo5() 207print(ArkTools.isAOTCompiled(foo5)) 208print(ArkTools.isAOTDeoptimized(foo5))