// Copyright (c) 2024, 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. /// WARNING /// /// Not all of the expectations in this test match the language specification. /// /// This is part of a set of tests covering "callable objects". Please consider /// them all together when making changes: /// /// ``` /// tests/lib/js/call_field_test.dart /// tests/lib/js/call_getter_test.dart /// tests/lib/js/call_method_test.dart /// ``` /// /// This test was created with expectations that match the current behavior to /// make it more clear when something changes and when the results in the web /// compilers differ. /// /// If your change causes an expectation to fail you should decide if the /// new result is desirable and update the expectation accordingly. import 'package:expect/expect.dart'; import 'package:js/js.dart'; import 'call_utils.dart'; @JS('jsFunction') external String Function(String) jsFunctionAsFunction; @JS('jsObject') external String Function(String) jsObjectAsFunction; @JS('jsClass') external String Function(String) jsClassAsFunction; @JS('jsFunction') external Function jsFunctionAsFunctionInterface; @JS('jsObject') external Function jsObjectAsFunctionInterface; @JS('jsClass') external Function jsClassAsFunctionInterface; @JS() class NamedClass { external String call(String s); } @JS('jsFunction') external NamedClass get functionAsNamedClass; @JS('jsObject') external NamedClass get jsObjectAsNamedClass; @JS('jsClass') external NamedClass get jsClassAsNamedClass; @JS() @anonymous class SomeClass { external String call(String s); } @JS('jsFunction') external SomeClass get functionAsSomeClass; @JS('jsObject') external SomeClass get jsObjectAsSomeClass; @JS('jsClass') external SomeClass get jsClassAsSomeClass; void main() { injectJS(); testFunction(); testFunctionInterface(); testNamedClass(); testAnonymous(); testDynamic(); } void testFunction() { var obj = jsFunctionAsFunction; Expect.equals('C', obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.equals('C', (obj.call)('Cello')); } Expect.equals('C', obj('Cello')); obj = jsObjectAsFunction; Expect.throwsNoSuchMethodError(() => obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.throwsNoSuchMethodError(() => (obj.call)('Cello')); } Expect.throwsNoSuchMethodError(() => obj('Cello')); obj = jsClassAsFunction; Expect.throwsNoSuchMethodError(() => obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.throwsNoSuchMethodError(() => (obj.call)('Cello')); } Expect.throwsNoSuchMethodError(() => obj('Cello')); } void testFunctionInterface() { var obj = jsFunctionAsFunctionInterface; Expect.equals('C', obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.equals('C', (obj.call)('Cello')); } Expect.equals('C', obj('Cello')); obj = jsObjectAsFunctionInterface; Expect.throwsNoSuchMethodError(() => obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.equals('C', (obj.call)('Cello')); } Expect.throwsNoSuchMethodError(() => obj('Cello')); obj = jsClassAsFunctionInterface; Expect.throwsNoSuchMethodError(() => obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.throws(() => (obj.call)('Cello'), jsThisIsNullCheck); } Expect.throwsNoSuchMethodError(() => obj('Cello')); } void testNamedClass() { var obj = functionAsNamedClass; Expect.equals('C', obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.equals('C', (obj.call)('Cello')); } Expect.equals('C', obj('Cello')); obj = jsObjectAsNamedClass; Expect.throwsNoSuchMethodError(() => obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.throwsNoSuchMethodError(() => (obj.call)('Cello')); } Expect.throwsNoSuchMethodError(() => obj('Cello')); obj = jsClassAsNamedClass; Expect.throwsNoSuchMethodError(() => obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => (obj.call)); } else { Expect.throwsNoSuchMethodError(() => (obj.call)('Cello')); } Expect.throwsNoSuchMethodError(() => obj('Cello')); } void testAnonymous() { var obj = functionAsSomeClass; Expect.equals('C', obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.equals('C', (obj.call)('Cello')); } Expect.equals('C', obj('Cello')); obj = jsObjectAsSomeClass; Expect.throwsNoSuchMethodError(() => obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.throwsNoSuchMethodError(() => (obj.call)('Cello')); } Expect.throwsNoSuchMethodError(() => obj('Cello')); obj = jsClassAsSomeClass; Expect.throwsNoSuchMethodError(() => obj.call('Cello')); if (dart2js) { Expect.throwsNoSuchMethodError(() => obj.call); } else { Expect.throwsNoSuchMethodError(() => (obj.call)('Cello')); } Expect.throwsNoSuchMethodError(() => obj('Cello')); } void testDynamic() { var d = confuse(jsFunctionAsFunction); Expect.equals('F', d.call('Fosse')); if (dart2js) { Expect.throwsNoSuchMethodError(() => d.call); } else { Expect.equals('F', (d.call)('Fosse')); } Expect.equals('F', d('Fosse')); d = confuse(jsClassAsFunction); Expect.throwsNoSuchMethodError(() => d.call('Fosse')); if (dart2js) { Expect.throwsNoSuchMethodError(() => d.call); } else { Expect.throws(() => (d.call)('Fosse'), jsThisIsNullCheck); } Expect.throwsNoSuchMethodError(() => d('Fosse')); d = confuse(jsObjectAsFunction); Expect.throwsNoSuchMethodError(() => d.call('Fosse')); if (dart2js) { Expect.throwsNoSuchMethodError(() => d.call); } else { Expect.equals('F', (d.call)('Fosse')); } Expect.throwsNoSuchMethodError(() => d('Fosse')); }