// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'dart:_interceptors'; import 'package:js/js.dart'; import 'package:expect/expect.dart'; @JS() external JavaScriptBigInt bigInt; @JS('bigInt') external dynamic bigIntDynamic; @JS('BigInt') external JavaScriptBigInt makeBigInt(String value); @JS() main() { const s = '9876543210000000000000123456789'; bigInt = makeBigInt(s); /* toString */ Expect.equals(s, bigInt.toString()); Expect.equals(s, bigIntDynamic.toString()); // String interpolation Expect.equals(s, '$bigInt'); Expect.equals(s, '$bigIntDynamic'); // toString tear-offs var toStringTearoff = bigInt.toString; Expect.type(toStringTearoff); Expect.equals(bigInt.toString, toStringTearoff); Expect.equals(bigInt.toString(), toStringTearoff()); toStringTearoff = bigIntDynamic.toString; Expect.type(toStringTearoff); Expect.equals(bigInt.toString, toStringTearoff); Expect.equals(bigInt.toString(), toStringTearoff()); /* hashCode */ // This value is allowed to change, but for lack of a better existing option, // we return 0. Expect.equals(0, bigInt.hashCode); Expect.equals(0, bigIntDynamic.hashCode); /* == */ // Prefer `==` over `Expect.equals` so we can check dynamic vs non-dynamic // calls. Expect.isTrue(bigInt == bigInt); Expect.isTrue(bigIntDynamic == bigInt); final differentBigInt = makeBigInt('1234567890000000000000987654321'); Expect.isFalse(bigInt == differentBigInt); Expect.isFalse(bigIntDynamic == differentBigInt); /* noSuchMethod */ final methodName = 'testMethod'; final invocation = Invocation.method(Symbol(methodName), null); void testNoSuchMethodResult(noSuchMethodResult) { Expect.type(noSuchMethodResult); Expect.contains(methodName, noSuchMethodResult.toString()); } testNoSuchMethodResult(Expect.throws(() => bigInt.noSuchMethod(invocation))); testNoSuchMethodResult( Expect.throws(() => bigIntDynamic.noSuchMethod(invocation)), ); var noSuchMethodTearoff = bigInt.noSuchMethod; Expect.type(noSuchMethodTearoff); Expect.equals(bigInt.noSuchMethod, noSuchMethodTearoff); testNoSuchMethodResult(Expect.throws(() => noSuchMethodTearoff(invocation))); noSuchMethodTearoff = bigIntDynamic.noSuchMethod; Expect.type(noSuchMethodTearoff); Expect.equals(bigIntDynamic.noSuchMethod, noSuchMethodTearoff); testNoSuchMethodResult( Expect.throws( () => noSuchMethodTearoff(Invocation.method(Symbol(methodName), null)), ), ); /* runtimeType */ var runtimeTypeResult = bigInt.runtimeType; Expect.type(runtimeTypeResult); Expect.equals(bigInt.runtimeType, runtimeTypeResult); runtimeTypeResult = bigIntDynamic.runtimeType; Expect.type(runtimeTypeResult); Expect.equals(bigIntDynamic.runtimeType, runtimeTypeResult); }