blob: 24a70a3d558448383e83b5c426058e3fbea49b5c [file] [log] [blame]
// 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<String Function()>(toStringTearoff);
Expect.equals(bigInt.toString, toStringTearoff);
Expect.equals(bigInt.toString(), toStringTearoff());
toStringTearoff = bigIntDynamic.toString;
Expect.type<String Function()>(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<NoSuchMethodError>(noSuchMethodResult);
Expect.contains(methodName, noSuchMethodResult.toString());
}
testNoSuchMethodResult(Expect.throws(() => bigInt.noSuchMethod(invocation)));
testNoSuchMethodResult(
Expect.throws(() => bigIntDynamic.noSuchMethod(invocation)));
var noSuchMethodTearoff = bigInt.noSuchMethod;
Expect.type<dynamic Function(Invocation)>(noSuchMethodTearoff);
Expect.equals(bigInt.noSuchMethod, noSuchMethodTearoff);
testNoSuchMethodResult(Expect.throws(() => noSuchMethodTearoff(invocation)));
noSuchMethodTearoff = bigIntDynamic.noSuchMethod;
Expect.type<dynamic Function(Invocation)>(noSuchMethodTearoff);
Expect.equals(bigIntDynamic.noSuchMethod, noSuchMethodTearoff);
testNoSuchMethodResult(Expect.throws(
() => noSuchMethodTearoff(Invocation.method(Symbol(methodName), null))));
/* runtimeType */
var runtimeTypeResult = bigInt.runtimeType;
Expect.type<Type>(runtimeTypeResult);
Expect.equals(bigInt.runtimeType, runtimeTypeResult);
runtimeTypeResult = bigIntDynamic.runtimeType;
Expect.type<Type>(runtimeTypeResult);
Expect.equals(bigIntDynamic.runtimeType, runtimeTypeResult);
}