// 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 void eval(String code); @JS() external JavaScriptSymbol symbol; @JS('symbol') external dynamic symbolDynamic; @JS('Symbol') external JavaScriptSymbol makeSymbol(String value); @JS() main() { const s = 'symbolValue'; symbol = makeSymbol(s); /* toString */ final toStringVal = 'Symbol($s)'; Expect.equals(toStringVal, symbol.toString()); Expect.equals(toStringVal, symbolDynamic.toString()); // String interpolation Expect.equals(toStringVal, '$symbol'); Expect.equals(toStringVal, '$symbolDynamic'); // toString tear-offs var toStringTearoff = symbol.toString; Expect.type(toStringTearoff); Expect.equals(symbol.toString, toStringTearoff); Expect.equals(symbol.toString(), toStringTearoff()); toStringTearoff = symbolDynamic.toString; Expect.type(toStringTearoff); Expect.equals(symbol.toString, toStringTearoff); Expect.equals(symbol.toString(), toStringTearoff()); /* hashCode */ // This value is allowed to change, but for lack of a better existing option, // we return 0. Expect.equals(0, symbol.hashCode); Expect.equals(0, symbolDynamic.hashCode); /* == */ // Prefer `==` over `Expect.equals` so we can check dynamic vs non-dynamic // calls. Expect.isTrue(symbol == symbol); Expect.isTrue(symbolDynamic == symbol); // Different symbols with the same values are not equal. final differentSymbol = makeSymbol(s); Expect.isFalse(symbol == differentSymbol); Expect.isFalse(symbolDynamic == differentSymbol); /* 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(() => symbol.noSuchMethod(invocation))); testNoSuchMethodResult( Expect.throws(() => symbolDynamic.noSuchMethod(invocation)), ); var noSuchMethodTearoff = symbol.noSuchMethod; Expect.type(noSuchMethodTearoff); Expect.equals(symbol.noSuchMethod, noSuchMethodTearoff); testNoSuchMethodResult(Expect.throws(() => noSuchMethodTearoff(invocation))); noSuchMethodTearoff = symbolDynamic.noSuchMethod; Expect.type(noSuchMethodTearoff); Expect.equals(symbolDynamic.noSuchMethod, noSuchMethodTearoff); testNoSuchMethodResult( Expect.throws( () => noSuchMethodTearoff(Invocation.method(Symbol(methodName), null)), ), ); /* runtimeType */ var runtimeTypeResult = symbol.runtimeType; Expect.type(runtimeTypeResult); Expect.equals(symbol.runtimeType, runtimeTypeResult); runtimeTypeResult = symbolDynamic.runtimeType; Expect.type(runtimeTypeResult); Expect.equals(symbolDynamic.runtimeType, runtimeTypeResult); }