|  | // 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<String Function()>(toStringTearoff); | 
|  | Expect.equals(symbol.toString, toStringTearoff); | 
|  | Expect.equals(symbol.toString(), toStringTearoff()); | 
|  | toStringTearoff = symbolDynamic.toString; | 
|  | Expect.type<String Function()>(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<NoSuchMethodError>(noSuchMethodResult); | 
|  | Expect.contains(methodName, noSuchMethodResult.toString()); | 
|  | } | 
|  |  | 
|  | testNoSuchMethodResult(Expect.throws(() => symbol.noSuchMethod(invocation))); | 
|  | testNoSuchMethodResult( | 
|  | Expect.throws(() => symbolDynamic.noSuchMethod(invocation))); | 
|  |  | 
|  | var noSuchMethodTearoff = symbol.noSuchMethod; | 
|  | Expect.type<dynamic Function(Invocation)>(noSuchMethodTearoff); | 
|  | Expect.equals(symbol.noSuchMethod, noSuchMethodTearoff); | 
|  | testNoSuchMethodResult(Expect.throws(() => noSuchMethodTearoff(invocation))); | 
|  | noSuchMethodTearoff = symbolDynamic.noSuchMethod; | 
|  | Expect.type<dynamic Function(Invocation)>(noSuchMethodTearoff); | 
|  | Expect.equals(symbolDynamic.noSuchMethod, noSuchMethodTearoff); | 
|  | testNoSuchMethodResult(Expect.throws( | 
|  | () => noSuchMethodTearoff(Invocation.method(Symbol(methodName), null)))); | 
|  |  | 
|  | /* runtimeType */ | 
|  | var runtimeTypeResult = symbol.runtimeType; | 
|  | Expect.type<Type>(runtimeTypeResult); | 
|  | Expect.equals(symbol.runtimeType, runtimeTypeResult); | 
|  | runtimeTypeResult = symbolDynamic.runtimeType; | 
|  | Expect.type<Type>(runtimeTypeResult); | 
|  | Expect.equals(symbolDynamic.runtimeType, runtimeTypeResult); | 
|  | } |