// 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/web/call_field_test.dart
/// tests/web/call_getter_test.dart
/// tests/web/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 desireable and update the expectation accordingly.

import 'package:expect/expect.dart';

@pragma('dart2js:noInline')
@pragma('dart2js:assumeDynamic')
dynamic confuse(dynamic x) => x;

class C {
  int call(String s) => s.length;
}

extension on A {
  int call(String s) => s.length;
}

class A {}

extension type ExtType(B _) {
  int call(String s) => s.length;
}

class B {}

void main() {
  var c = C();
  Expect.equals(5, c.call('Cello'));
  Expect.equals(5, (c.call)('Cello'));
  Expect.equals(5, c('Cello'));

  var d = confuse(C());
  Expect.equals(5, d.call('Fosse'));
  Expect.equals(5, (d.call)('Fosse'));
  Expect.equals(5, d('Fosse'));

  var a = A();
  Expect.equals(5, a.call('Cello'));
  Expect.equals(5, (a.call)('Cello'));
  Expect.equals(5, a('Cello'));

  d = confuse(A());
  Expect.throwsNoSuchMethodError(() => d.call('Fosse'));
  Expect.throwsNoSuchMethodError(() => (d.call)('Fosse'));
  Expect.throwsNoSuchMethodError(() => d('Fosse'));

  var b = ExtType(B());
  Expect.equals(5, b.call('Cello'));
  Expect.equals(5, (b.call)('Cello'));
  Expect.equals(5, b('Cello'));

  d = confuse(ExtType(B()));
  Expect.throwsNoSuchMethodError(() => d.call('Fosse'));
  Expect.throwsNoSuchMethodError(() => (d.call)('Fosse'));
  Expect.throwsNoSuchMethodError(() => d('Fosse'));
}
