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