13af6ab5fSopenharmony_ci/* 23af6ab5fSopenharmony_ci * Copyright (c) 2023-2024 Huawei Device Co., Ltd. 33af6ab5fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 43af6ab5fSopenharmony_ci * you may not use this file except in compliance with the License. 53af6ab5fSopenharmony_ci * You may obtain a copy of the License at 63af6ab5fSopenharmony_ci * 73af6ab5fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 83af6ab5fSopenharmony_ci * 93af6ab5fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 103af6ab5fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 113af6ab5fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 123af6ab5fSopenharmony_ci * See the License for the specific language governing permissions and 133af6ab5fSopenharmony_ci * limitations under the License. 143af6ab5fSopenharmony_ci */ 153af6ab5fSopenharmony_ci 163af6ab5fSopenharmony_cifunction test_create_empty_bigint(): void { 173af6ab5fSopenharmony_ci let a = new BigInt() 183af6ab5fSopenharmony_ci assert a.positive() 193af6ab5fSopenharmony_ci assert a == 0n 203af6ab5fSopenharmony_ci 213af6ab5fSopenharmony_ci let b = new BigInt() 223af6ab5fSopenharmony_ci assert b.positive() 233af6ab5fSopenharmony_ci assert b == 0n 243af6ab5fSopenharmony_ci} 253af6ab5fSopenharmony_ci 263af6ab5fSopenharmony_cifunction test_invalid_bigint(): void { 273af6ab5fSopenharmony_ci // NOTE(kkonsw): implement validation 283af6ab5fSopenharmony_ci} 293af6ab5fSopenharmony_ci 303af6ab5fSopenharmony_cifunction test_bigint_as_string(): void { 313af6ab5fSopenharmony_ci assert new BigInt("10").toString() == "10" 323af6ab5fSopenharmony_ci assert new BigInt("1000").toString() == "1000" 333af6ab5fSopenharmony_ci assert new BigInt("-1000").toString() == "-1000" 343af6ab5fSopenharmony_ci assert new BigInt("-1").toString() == "-1" 353af6ab5fSopenharmony_ci assert new BigInt("-10").toString() == "-10" 363af6ab5fSopenharmony_ci assert new BigInt("-100").toString() == "-100" 373af6ab5fSopenharmony_ci assert new BigInt("-100000000000000").toString() == "-100000000000000" 383af6ab5fSopenharmony_ci assert new BigInt("0").toString() == "0" 393af6ab5fSopenharmony_ci} 403af6ab5fSopenharmony_ci 413af6ab5fSopenharmony_cifunction test_type(): void { 423af6ab5fSopenharmony_ci let num0 = 0n; 433af6ab5fSopenharmony_ci let num1 = 100_100_100_100_100_100n 443af6ab5fSopenharmony_ci let num2 = -57896044618658097711785492504343953926634992332820282019728792003956564819967n 453af6ab5fSopenharmony_ci 463af6ab5fSopenharmony_ci assert (num0 instanceof bigint) 473af6ab5fSopenharmony_ci assert (num1 instanceof bigint) 483af6ab5fSopenharmony_ci assert (num2 instanceof bigint) 493af6ab5fSopenharmony_ci} 503af6ab5fSopenharmony_ci 513af6ab5fSopenharmony_cifunction test_assignment(): void { 523af6ab5fSopenharmony_ci let a = -24059059045444224545405903904190343043049209420234290480n 533af6ab5fSopenharmony_ci let b = a 543af6ab5fSopenharmony_ci assert (a instanceof bigint) 553af6ab5fSopenharmony_ci assert (b instanceof bigint) 563af6ab5fSopenharmony_ci assert (a == b); 573af6ab5fSopenharmony_ci 583af6ab5fSopenharmony_ci a = 123n; 593af6ab5fSopenharmony_ci assert (a instanceof bigint) 603af6ab5fSopenharmony_ci assert (a.toString() == "123"); 613af6ab5fSopenharmony_ci assert (a == 123n); 623af6ab5fSopenharmony_ci 633af6ab5fSopenharmony_ci const zero = 0n; 643af6ab5fSopenharmony_ci let c = zero; 653af6ab5fSopenharmony_ci assert (zero instanceof bigint) 663af6ab5fSopenharmony_ci assert (c instanceof bigint) 673af6ab5fSopenharmony_ci assert (zero == c); 683af6ab5fSopenharmony_ci} 693af6ab5fSopenharmony_ci 703af6ab5fSopenharmony_cifunction test_compare(): void { 713af6ab5fSopenharmony_ci const a = 24400569094091093912039019089543850580328542852805043n 723af6ab5fSopenharmony_ci const b = 34034240244909504590902901119302940942904944029040950n 733af6ab5fSopenharmony_ci 743af6ab5fSopenharmony_ci assert 44493059209094029409209402940924902n < 140044940590459049067274048929058908989042385n 753af6ab5fSopenharmony_ci assert 44493059209094029409209402940924902n < a 763af6ab5fSopenharmony_ci assert a < 34034240244909504590902901119302940942904944029040950n 773af6ab5fSopenharmony_ci assert a < b 783af6ab5fSopenharmony_ci 793af6ab5fSopenharmony_ci assert 44493059209094029409209402940924902n <= 140044940590459049067274048929058908989042385n 803af6ab5fSopenharmony_ci assert 44493059209094029409209402940924902n <= a 813af6ab5fSopenharmony_ci assert a <= 34034240244909504590902901119302940942904944029040950n 823af6ab5fSopenharmony_ci assert a <= b 833af6ab5fSopenharmony_ci 843af6ab5fSopenharmony_ci assert 44493059209094029409209402940924902n <= 44493059209094029409209402940924902n 853af6ab5fSopenharmony_ci assert 24400569094091093912039019089543850580328542852805043n <= a 863af6ab5fSopenharmony_ci assert a <= 24400569094091093912039019089543850580328542852805043n 873af6ab5fSopenharmony_ci assert a <= a 883af6ab5fSopenharmony_ci 893af6ab5fSopenharmony_ci assert 40044940590459049067274048929058908989042385n > 44493059209094029409209402940924902n 903af6ab5fSopenharmony_ci assert 34034240244909504590902901119302940942904944029040950n > a 913af6ab5fSopenharmony_ci assert a > 140044940590459049067274048929058908989042385n 923af6ab5fSopenharmony_ci assert b > a 933af6ab5fSopenharmony_ci 943af6ab5fSopenharmony_ci assert 40044940590459049067274048929058908989042385n >= 44493059209094029409209402940924902n 953af6ab5fSopenharmony_ci assert 34034240244909504590902901119302940942904944029040950n >= a 963af6ab5fSopenharmony_ci assert a >= 140044940590459049067274048929058908989042385n 973af6ab5fSopenharmony_ci assert b >= a 983af6ab5fSopenharmony_ci 993af6ab5fSopenharmony_ci assert 44493059209094029409209402940924902n <= 44493059209094029409209402940924902n 1003af6ab5fSopenharmony_ci assert 24400569094091093912039019089543850580328542852805043n <= a 1013af6ab5fSopenharmony_ci assert a <= 24400569094091093912039019089543850580328542852805043n 1023af6ab5fSopenharmony_ci assert a <= a 1033af6ab5fSopenharmony_ci} 1043af6ab5fSopenharmony_ci 1053af6ab5fSopenharmony_cifunction test_literals() : void { 1063af6ab5fSopenharmony_ci let num0 = 0n 1073af6ab5fSopenharmony_ci assert (num0.toString() == "0") 1083af6ab5fSopenharmony_ci 1093af6ab5fSopenharmony_ci let num1 = 127n 1103af6ab5fSopenharmony_ci assert (num1.toString() == "127") 1113af6ab5fSopenharmony_ci 1123af6ab5fSopenharmony_ci let num2 = 32767n 1133af6ab5fSopenharmony_ci assert (num2.toString() == "32767") 1143af6ab5fSopenharmony_ci 1153af6ab5fSopenharmony_ci let num3 = 2147483647n 1163af6ab5fSopenharmony_ci assert (num3.toString() == "2147483647") 1173af6ab5fSopenharmony_ci 1183af6ab5fSopenharmony_ci let num4 = 9223372036854775807n 1193af6ab5fSopenharmony_ci assert (num4.toString() == "9223372036854775807") 1203af6ab5fSopenharmony_ci 1213af6ab5fSopenharmony_ci let num5 = 170141183460469231731687303715884105727n 1223af6ab5fSopenharmony_ci assert (num5.toString() == "170141183460469231731687303715884105727") 1233af6ab5fSopenharmony_ci 1243af6ab5fSopenharmony_ci let num6 = 57896044618658097711785492504343953926634992332820282019728792003956564819967n 1253af6ab5fSopenharmony_ci assert (num6.toString() == "57896044618658097711785492504343953926634992332820282019728792003956564819967") 1263af6ab5fSopenharmony_ci 1273af6ab5fSopenharmony_ci let num1_n = -128n 1283af6ab5fSopenharmony_ci assert (num1_n.toString() == "-128") 1293af6ab5fSopenharmony_ci 1303af6ab5fSopenharmony_ci let num2_n = -32768n 1313af6ab5fSopenharmony_ci assert (num2_n.toString() == "-32768") 1323af6ab5fSopenharmony_ci 1333af6ab5fSopenharmony_ci let num3_n = -2147483648n 1343af6ab5fSopenharmony_ci assert (num3_n.toString() == "-2147483648") 1353af6ab5fSopenharmony_ci 1363af6ab5fSopenharmony_ci let num4_n = -9223372036854775808n 1373af6ab5fSopenharmony_ci assert (num4_n.toString() == "-9223372036854775808") 1383af6ab5fSopenharmony_ci 1393af6ab5fSopenharmony_ci let num5_n = -170141183460469231731687303715884105728n 1403af6ab5fSopenharmony_ci assert (num5_n.toString() == "-170141183460469231731687303715884105728") 1413af6ab5fSopenharmony_ci 1423af6ab5fSopenharmony_ci let num6_n = -57896044618658097711785492504343953926634992332820282019728792003956564819968n 1433af6ab5fSopenharmony_ci assert (num6_n.toString() == "-57896044618658097711785492504343953926634992332820282019728792003956564819968") 1443af6ab5fSopenharmony_ci 1453af6ab5fSopenharmony_ci let num1_sep = 1_991_653_125_841_217_555_434419_9091_123000000_3_3313_5775_3282_29n 1463af6ab5fSopenharmony_ci assert (num1_sep.toString() == "19916531258412175554344199091123000000333135775328229") 1473af6ab5fSopenharmony_ci 1483af6ab5fSopenharmony_ci let num2_sep = -422_12_3333_9844_3333_3443_34111_43434_1111_11_1_3_3_411909_990081n 1493af6ab5fSopenharmony_ci assert (num2_sep.toString() == "-4221233339844333334433411143434111111133411909990081") 1503af6ab5fSopenharmony_ci 1513af6ab5fSopenharmony_ci let num0_t: bigint = 0n 1523af6ab5fSopenharmony_ci assert (num0_t.toString() == "0") 1533af6ab5fSopenharmony_ci 1543af6ab5fSopenharmony_ci let num1_t: bigint = 57896044618658097711785492504343953926634992332820282019728792003956564819967n 1553af6ab5fSopenharmony_ci assert (num1_t.toString() == "57896044618658097711785492504343953926634992332820282019728792003956564819967") 1563af6ab5fSopenharmony_ci 1573af6ab5fSopenharmony_ci let num2_t: bigint = -9223372036854775808n 1583af6ab5fSopenharmony_ci assert (num2_t.toString() == "-9223372036854775808") 1593af6ab5fSopenharmony_ci 1603af6ab5fSopenharmony_ci let num3_t: bigint = 1_991_653_125_841_217_555_434419_9091_123000000_3_3313_5775_3282_29n 1613af6ab5fSopenharmony_ci assert (num3_t.toString() == "19916531258412175554344199091123000000333135775328229") 1623af6ab5fSopenharmony_ci 1633af6ab5fSopenharmony_ci let num4_t: bigint = -422_12_3333_9844_3333_3443_34111_43434_1111_11_1_3_3_411909_990081n 1643af6ab5fSopenharmony_ci assert (num4_t.toString() == "-4221233339844333334433411143434111111133411909990081") 1653af6ab5fSopenharmony_ci 1663af6ab5fSopenharmony_ci const num0_c = 0n 1673af6ab5fSopenharmony_ci assert (num0_c.toString() == "0") 1683af6ab5fSopenharmony_ci 1693af6ab5fSopenharmony_ci const num1_c = 1267650600228229401496703205376n 1703af6ab5fSopenharmony_ci assert (num1_c.toString() == "1267650600228229401496703205376") 1713af6ab5fSopenharmony_ci 1723af6ab5fSopenharmony_ci const num2_c = -1427247692705959881058285969449495136382746624n 1733af6ab5fSopenharmony_ci assert (num2_c.toString() == "-1427247692705959881058285969449495136382746624") 1743af6ab5fSopenharmony_ci 1753af6ab5fSopenharmony_ci const num3_c = 4_000_000_000_000_000_000_000_100n 1763af6ab5fSopenharmony_ci assert (num3_c.toString() == "4000000000000000000000100") 1773af6ab5fSopenharmony_ci 1783af6ab5fSopenharmony_ci const num4_c: bigint = -7777777_666666_55555_4444_333_22_1n 1793af6ab5fSopenharmony_ci assert (num4_c.toString() == "-7777777666666555554444333221") 1803af6ab5fSopenharmony_ci} 1813af6ab5fSopenharmony_ci 1823af6ab5fSopenharmony_cifunction test_cast(): void { 1833af6ab5fSopenharmony_ci const v = 1559053 1843af6ab5fSopenharmony_ci const b: byte = 44 1853af6ab5fSopenharmony_ci const s: short = -17600 1863af6ab5fSopenharmony_ci const i: int = 1150483640 1873af6ab5fSopenharmony_ci const l: long = -8223372036854775808 1883af6ab5fSopenharmony_ci 1893af6ab5fSopenharmony_ci // NOTE(kkonsw): casts currently do not work 1903af6ab5fSopenharmony_ci} 1913af6ab5fSopenharmony_ci 1923af6ab5fSopenharmony_cifunction test_bigint_methods(): void { 1933af6ab5fSopenharmony_ci const b: byte = 44 1943af6ab5fSopenharmony_ci const s: short = -17600 1953af6ab5fSopenharmony_ci const i: int = 1150483640 1963af6ab5fSopenharmony_ci const l: long = -8223372036854775808 1973af6ab5fSopenharmony_ci 1983af6ab5fSopenharmony_ci /* Testing BigInt constructor */ 1993af6ab5fSopenharmony_ci let n0 = new BigInt(0) 2003af6ab5fSopenharmony_ci assert n0 == 0n 2013af6ab5fSopenharmony_ci assert(n0.toString() == "0") 2023af6ab5fSopenharmony_ci 2033af6ab5fSopenharmony_ci let n1 = new BigInt(654093) 2043af6ab5fSopenharmony_ci assert(n1.toString() == "654093") 2053af6ab5fSopenharmony_ci assert n1 == 654093n 2063af6ab5fSopenharmony_ci 2073af6ab5fSopenharmony_ci let n2 = new BigInt(b) 2083af6ab5fSopenharmony_ci assert(n2.toString() == "44") 2093af6ab5fSopenharmony_ci assert n2 == 44n 2103af6ab5fSopenharmony_ci 2113af6ab5fSopenharmony_ci let n3 = new BigInt(s) 2123af6ab5fSopenharmony_ci assert(n3.toString() == "-17600") 2133af6ab5fSopenharmony_ci assert n3 == -17600n 2143af6ab5fSopenharmony_ci 2153af6ab5fSopenharmony_ci let n4 = new BigInt(i) 2163af6ab5fSopenharmony_ci assert(n4.toString() == "1150483640") 2173af6ab5fSopenharmony_ci assert n4 == 1150483640n 2183af6ab5fSopenharmony_ci 2193af6ab5fSopenharmony_ci let n5 = new BigInt(l) 2203af6ab5fSopenharmony_ci assert(n5.toString() == "-8223372036854775808") 2213af6ab5fSopenharmony_ci assert n5 == -8223372036854775808n 2223af6ab5fSopenharmony_ci 2233af6ab5fSopenharmony_ci let dec = new BigInt("-12392320390239294724747283477947923471101032") 2243af6ab5fSopenharmony_ci assert dec == -12392320390239294724747283477947923471101032n 2253af6ab5fSopenharmony_ci 2263af6ab5fSopenharmony_ci const n7 = 12392320390239294724747283477947923471101032n 2273af6ab5fSopenharmony_ci 2283af6ab5fSopenharmony_ci /* Testing asIntN() static method */ 2293af6ab5fSopenharmony_ci assert BigInt.asIntN(0, n7) == 0n 2303af6ab5fSopenharmony_ci assert BigInt.asIntN(8, n7) == 104n 2313af6ab5fSopenharmony_ci assert BigInt.asIntN(16, n7) == 27752n 2323af6ab5fSopenharmony_ci assert BigInt.asIntN(32, n7) == -737317784n 2333af6ab5fSopenharmony_ci assert BigInt.asIntN(64, n7) == -7098331616643290008n 2343af6ab5fSopenharmony_ci 2353af6ab5fSopenharmony_ci /* Testing asUintN() static method */ 2363af6ab5fSopenharmony_ci assert BigInt.asUintN(0, n7) == 0n 2373af6ab5fSopenharmony_ci assert BigInt.asUintN(8, n7) == 104n 2383af6ab5fSopenharmony_ci assert BigInt.asUintN(16, n7) == 27752n 2393af6ab5fSopenharmony_ci assert BigInt.asUintN(32, n7) == 3557649512n 2403af6ab5fSopenharmony_ci assert BigInt.asUintN(64, n7) == 11348412457066261608n 2413af6ab5fSopenharmony_ci} 2423af6ab5fSopenharmony_ci 2433af6ab5fSopenharmony_cifunction test_shift(): void { 2443af6ab5fSopenharmony_ci const a = 245599210405555256299145n 2453af6ab5fSopenharmony_ci /* Testing left shift (<<) */ 2463af6ab5fSopenharmony_ci assert a << 100n == 311333986486181324779687697000809288883015536628203520n 2473af6ab5fSopenharmony_ci assert a << 0n == a 2483af6ab5fSopenharmony_ci 2493af6ab5fSopenharmony_ci /* Testing right shift (>>) */ 2503af6ab5fSopenharmony_ci assert a >> 60n == 213023n 2513af6ab5fSopenharmony_ci assert a >> 0n == a 2523af6ab5fSopenharmony_ci} 2533af6ab5fSopenharmony_ci 2543af6ab5fSopenharmony_cifunction test_scientific(): void { 2553af6ab5fSopenharmony_ci assert new BigInt(0.0e0).toString() == "0" : "BigInt(0.0e0)" 2563af6ab5fSopenharmony_ci assert new BigInt(0.0e+0).toString() == "0" : "BigInt(0.0e+0)" 2573af6ab5fSopenharmony_ci assert new BigInt(0.0e-0).toString() == "0" : "BigInt(0.0e-0).toString()" 2583af6ab5fSopenharmony_ci assert new BigInt(-0.0e0).toString() == "0" : "BigInt(-0.0e0).toString()" 2593af6ab5fSopenharmony_ci assert new BigInt(1e23).toString() == "100000000000000000000000" : "BigInt(1e22)" 2603af6ab5fSopenharmony_ci assert new BigInt(1e+23).toString() == "100000000000000000000000" : "BigInt(1e+22)" 2613af6ab5fSopenharmony_ci assert new BigInt(-1e23).toString() == "-100000000000000000000000" : "BigInt(-1e22)" 2623af6ab5fSopenharmony_ci assert new BigInt(-1e+23).toString() == "-100000000000000000000000" : "BigInt(-1e+22)" 2633af6ab5fSopenharmony_ci 2643af6ab5fSopenharmony_ci assert new BigInt(1.234567e10).toString() == "12345670000" : "BigInt(1.234567e10).toString()" 2653af6ab5fSopenharmony_ci assert new BigInt(1.234567e20).toString() == "123456700000000000000" : "BigInt(1.234567e20).toString()" 2663af6ab5fSopenharmony_ci 2673af6ab5fSopenharmony_ci assert new BigInt(1.2345678912e21).toString() == "1234567891200000000000" : "BigInt(1.2345678912e21)" 2683af6ab5fSopenharmony_ci assert new BigInt(1.2345678912e+21).toString() == "1234567891200000000000" : "BigInt(1.2345678912e+21)" 2693af6ab5fSopenharmony_ci assert new BigInt(-1.2345678912e21).toString() == "-1234567891200000000000" : "BigInt(-1.2345678912e21)" 2703af6ab5fSopenharmony_ci} 2713af6ab5fSopenharmony_ci 2723af6ab5fSopenharmony_cifunction test_double(): void { 2733af6ab5fSopenharmony_ci let bigIntFromDouble = (x: number): boolean => { 2743af6ab5fSopenharmony_ci try { 2753af6ab5fSopenharmony_ci let b = new BigInt(x); 2763af6ab5fSopenharmony_ci } catch (e) { 2773af6ab5fSopenharmony_ci return e instanceof Error; 2783af6ab5fSopenharmony_ci } 2793af6ab5fSopenharmony_ci return false 2803af6ab5fSopenharmony_ci }; 2813af6ab5fSopenharmony_ci 2823af6ab5fSopenharmony_ci assert bigIntFromDouble(0.1) : "BigInt(0.1)" 2833af6ab5fSopenharmony_ci assert bigIntFromDouble(-0.1) : "BigInt(-0.1)" 2843af6ab5fSopenharmony_ci assert bigIntFromDouble(42.1234567) : "BigInt(42.1234567)" 2853af6ab5fSopenharmony_ci assert bigIntFromDouble(1.234567e2) : "BigInt(1.234567e2)" 2863af6ab5fSopenharmony_ci assert bigIntFromDouble(1e-22) : "BigInt(1e-22)" 2873af6ab5fSopenharmony_ci assert bigIntFromDouble(-1e-22) : "BigInt(-1e-22)" 2883af6ab5fSopenharmony_ci assert bigIntFromDouble(1.88e-20) : "BigInt(1.88e-20)" 2893af6ab5fSopenharmony_ci assert bigIntFromDouble(1.2345678848e-21) : "BigInt(1.2345678484e-21)" 2903af6ab5fSopenharmony_ci} 2913af6ab5fSopenharmony_ci 2923af6ab5fSopenharmony_cifunction main() : void { 2933af6ab5fSopenharmony_ci test_create_empty_bigint(); 2943af6ab5fSopenharmony_ci test_bigint_as_string(); 2953af6ab5fSopenharmony_ci test_invalid_bigint(); 2963af6ab5fSopenharmony_ci test_type(); 2973af6ab5fSopenharmony_ci test_assignment(); 2983af6ab5fSopenharmony_ci test_compare(); 2993af6ab5fSopenharmony_ci test_literals(); 3003af6ab5fSopenharmony_ci test_cast(); 3013af6ab5fSopenharmony_ci test_bigint_methods(); 3023af6ab5fSopenharmony_ci test_shift(); 3033af6ab5fSopenharmony_ci test_double(); 3043af6ab5fSopenharmony_ci // NOTE(aakmaev): Enable after fix #17683. 3053af6ab5fSopenharmony_ci // test_scientific(); 3063af6ab5fSopenharmony_ci} 307