// Copyright (c) 2019, 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 'package:expect/expect.dart';
import 'package:expect/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package

/// This test is currently written as a white box test to ensure we don't
/// regress on any of the existing code paths that lead to NoSuchMethod errors
/// from dynamic calls. The test cases written with the knowledge of what the
/// generated code will look like.

// TODO(52190): Improve the NSM errors to make them more helpful.

expectThrowsNSMWithExactError(
  void Function() computation,
  String expectedErrorMessage,
) => Expect.throws<NoSuchMethodError>(
  computation,
  (error) => error.toString() == expectedErrorMessage,
);

class A {
  String arity1(int val) {
    val += 10;
    return val.toString();
  }

  void genericArity2<T, S>() => print('$T, $S');

  static String staticArity1(int val) {
    val += 10;
    return val.toString();
  }

  static void staticGenericArity2<T, S>() => print('$T, $S');

  Function? nullField;

  Function fieldArity1 = (int val) {
    val += 10;
    return val.toString();
  };
}

String arity1(int val) {
  val += 10;
  return val.toString();
}

void genericArity2<T, S>() => print('$T, $S');

Function fieldArity1 = (int val) {
  val += 10;
  return val.toString();
};

String requiredNamedArity1({required bool fosse}) {
  return fosse.toString();
}

int? x;

void main() {
  group('Dynamic call of', () {
    dynamic instanceOfA = A();
    test('instance of a class with no `call()` method', () {
      // Compiled as `dcall()`.
      expectThrowsNSMWithExactError(
        () => instanceOfA(),
        "NoSuchMethodError: 'call'\n"
        "Dynamic call of object has no instance method 'call'.\n"
        "Receiver: ${Error.safeToString(instanceOfA)}\n"
        "Arguments: []",
      );
    });
    group('null', () {
      // TODO(49628): These should actually throw NoSuchMethodError with a
      // helpful error message.
      group('value', () {
        dynamic nullVal = null;
        test('without type arguments', () {
          // Compiled as `dcall()`.
          Expect.throws(() => nullVal());
        });
        test('passing type arguments', () {
          // Compiled as `dgcall()`.
          Expect.throws(() => nullVal<String, bool>());
        });
      });
      group('instance field', () {
        test('without type arguments', () {
          // Compiled as `dsend()`.
          Expect.throws(() => instanceOfA.nullField());
        });
        test('passing type arguments', () {
          // Compiled as `dgsend()`.
          Expect.throws(() => instanceOfA.nullField<String, bool>());
        });
      });
    });
    group('class instance members that do not exist', () {
      group('method', () {
        test('without passing type arguments', () {
          // Compiled as `dsend()`.
          expectThrowsNSMWithExactError(
            () => instanceOfA.doesNotExist(),
            "NoSuchMethodError: 'doesNotExist'\n"
            "Dynamic call of null.\n"
            "Receiver: ${Error.safeToString(instanceOfA)}\n"
            "Arguments: []",
          );
        });
        test('passing type arguments', () {
          // Compiled as `dgsend()`.
          expectThrowsNSMWithExactError(
            () => instanceOfA.doesNotExist<String, bool>(),
            "NoSuchMethodError: 'doesNotExist'\n"
            "Dynamic call of null.\n"
            "Receiver: ${Error.safeToString(instanceOfA)}\n"
            "Arguments: []",
          );
        });
      });
      test('setter', () {
        // Compiled as `dput()`.
        expectThrowsNSMWithExactError(
          () => instanceOfA.doesNotExist = 10,
          "NoSuchMethodError: 'doesNotExist='\n"
          "method not found\n"
          "Receiver: ${Error.safeToString(instanceOfA)}\n"
          "Arguments: [10]",
        );
      });
      test('getter', () {
        // Compiled as `dload()`.
        expectThrowsNSMWithExactError(
          () => x = instanceOfA.doesNotExist,
          "NoSuchMethodError: 'doesNotExist'\n"
          "method not found\n"
          "Receiver: ${Error.safeToString(instanceOfA)}\n"
          "Arguments: []",
        );
      });
    });
    group('tearoff', () {
      // The code path for throwing NoSuchMethodErrors because of the incorrect
      // type arguments is shared by all forms of dynamic invocations. Simply
      // using tearoffs to trigger each form of the error.
      dynamic arity1Tearoff = arity1;
      dynamic genericArity2Tearoff = genericArity2;
      dynamic instantiatedTearoff = genericArity2<int, String>;
      test('passing unexpected type arguments', () {
        // Compiled as `dgcall()` and throws from `checkAndCall()`.
        expectThrowsNSMWithExactError(
          () => arity1Tearoff<bool>(42),
          "NoSuchMethodError: 'arity1'\n"
          "Dynamic call with unexpected type arguments. "
          "Expected: 0 Actual: 1\n"
          "Receiver: ${Error.safeToString(arity1Tearoff)}\n"
          "Arguments: [42]",
        );
      });
      test('passing too many type arguments', () {
        // Compiled as `dgcall()` and throws from `checkAndCall()`.
        expectThrowsNSMWithExactError(
          () => genericArity2Tearoff<int, double, String>(),
          "NoSuchMethodError: 'genericArity2'\n"
          "Dynamic call with incorrect number of type arguments. "
          "Expected: 2 Actual: 3\n"
          "Receiver: ${Error.safeToString(genericArity2Tearoff)}\n"
          "Arguments: []",
        );
      });
      test('passing too few type arguments', () {
        // Compiled as `dgcall()` and throws from `checkAndCall()`.
        expectThrowsNSMWithExactError(
          () => genericArity2Tearoff<int>(),
          "NoSuchMethodError: 'genericArity2'\n"
          "Dynamic call with incorrect number of type arguments. "
          "Expected: 2 Actual: 1\n"
          "Receiver: ${Error.safeToString(genericArity2Tearoff)}\n"
          "Arguments: []",
        );
      });
      test('already instantiated and passing type arguments ', () {
        // Compiled as `dgcall()` and throws from `checkAndCall()`.
        expectThrowsNSMWithExactError(
          () => instantiatedTearoff<int, double>(),
          "NoSuchMethodError: 'result'\n"
          "Dynamic call with unexpected type arguments. "
          "Expected: 0 Actual: 2\n"
          "Receiver: ${Error.safeToString(instantiatedTearoff)}\n"
          "Arguments: []",
        );
      });
    });
    group('`Function.apply()`', () {
      Function arity1Tearoff = arity1;
      Function requiredNamedArity1Tearoff = requiredNamedArity1;
      // The code path for throwing NoSuchMethodErrors because of the wrong
      // number of arguments or incorrect named arguments is shared by all
      // forms of dynamic invocations. Function.apply used here for simplicity.
      // Argument errors generated from `_argumentErrors()`.
      test('passing too many arguments', () {
        expectThrowsNSMWithExactError(
          () => Function.apply(arity1Tearoff, [42, false]),
          "NoSuchMethodError: 'arity1'\n"
          "Dynamic call with too many positional arguments. "
          "Expected: 1 Actual: 2\n"
          "Receiver: ${Error.safeToString(arity1Tearoff)}\n"
          "Arguments: [42, false]",
        );
      });
      test('passing too few arguments', () {
        expectThrowsNSMWithExactError(
          () => Function.apply(arity1Tearoff, []),
          "NoSuchMethodError: 'arity1'\n"
          "Dynamic call with missing positional arguments. "
          "Expected: 1 Actual: 0\n"
          "Receiver: ${Error.safeToString(arity1Tearoff)}\n"
          "Arguments: []",
        );
      });
      test('passing unexpected named argument', () {
        expectThrowsNSMWithExactError(
          () => Function.apply(requiredNamedArity1Tearoff, null, {
            #fosse: true,
            #cello: true,
          }),
          "NoSuchMethodError: 'requiredNamedArity1'\n"
          "Dynamic call with unexpected named argument 'cello'.\n"
          "Receiver: ${Error.safeToString(requiredNamedArity1Tearoff)}\n"
          "Arguments: [fosse: true, cello: true]",
        );
      });
      test('missing required named argument', () {
        // Missing required named arguments are not an error when running
        // without sound null safety.
        if (hasUnsoundNullSafety) return;
        expectThrowsNSMWithExactError(
          () => Function.apply(requiredNamedArity1Tearoff, null),
          "NoSuchMethodError: 'requiredNamedArity1'\n"
          "Dynamic call with missing required named arguments: fosse.\n"
          "Receiver: ${Error.safeToString(requiredNamedArity1Tearoff)}\n"
          "Arguments: []",
        );
      });
    });
  });
  group('Descriptors appearing in `NoSuchMethodError` message for ', () {
    // Some extra tests for the names that appear in all the forms of dynamic
    // calls. All of these tests pass wrong number of arguments just to trigger
    // the error message.
    test('class instance method', () {
      dynamic instanceOfA = A();
      Expect.throws<NoSuchMethodError>(
        () => instanceOfA.arity1(),
        (error) => error.toString().contains("NoSuchMethodError: 'arity1'"),
      );
    });
    test('class instance method tearoff', () {
      dynamic tearoff = A().arity1;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(),
        (error) =>
            error.toString().contains("NoSuchMethodError: 'bound arity1'"),
      );
    });
    test('class instance generic method', () {
      dynamic instanceOfA = A();
      Expect.throws<NoSuchMethodError>(
        () => instanceOfA.genericArity2(10),
        (error) =>
            error.toString().contains("NoSuchMethodError: 'genericArity2'"),
      );
    });
    test('class instance generic method tearoff', () {
      dynamic tearoff = A().genericArity2;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(10),
        (error) => error.toString().contains(
          "NoSuchMethodError: 'bound genericArity2'",
        ),
      );
    });
    test('class instance generic method tearoff instantiated', () {
      dynamic tearoff = A().genericArity2<int, String>;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(10),
        (error) => error.toString().contains("NoSuchMethodError: 'result'"),
      );
    });
    test('class instance field', () {
      dynamic instanceOfA = A();
      Expect.throws<NoSuchMethodError>(
        () => instanceOfA.fieldArity1(),
        (error) =>
            error.toString().contains("NoSuchMethodError: 'fieldArity1'"),
      );
    });
    test('class static method tearoff', () {
      dynamic tearoff = A.staticArity1;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(),
        (error) =>
            error.toString().contains("NoSuchMethodError: 'staticArity1'"),
      );
    });
    test('class static generic method tearoff', () {
      dynamic tearoff = A.staticGenericArity2;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(10),
        (error) => error.toString().contains(
          "NoSuchMethodError: 'staticGenericArity2'",
        ),
      );
    });
    test('class static generic method tearoff instantiated', () {
      dynamic tearoff = A.staticGenericArity2<int, double>;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(10),
        (error) => error.toString().contains("NoSuchMethodError: 'result'"),
      );
    });
    test('top level method tearoff', () {
      dynamic tearoff = A.staticArity1;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(),
        (error) =>
            error.toString().contains("NoSuchMethodError: 'staticArity1'"),
      );
    });
    test('top level generic method tearoff', () {
      dynamic tearoff = genericArity2;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(10),
        (error) =>
            error.toString().contains("NoSuchMethodError: 'genericArity2'"),
      );
    });
    test('top level generic method tearoff instantiated', () {
      dynamic tearoff = genericArity2<int, String>;
      Expect.throws<NoSuchMethodError>(
        () => tearoff(10),
        (error) => error.toString().contains("NoSuchMethodError: 'result'"),
      );
    });
    test('top level field', () {
      Expect.throws<NoSuchMethodError>(
        () => fieldArity1(),
        (error) => error.toString().contains("NoSuchMethodError: ''"),
      );
    });
  });
}
