// 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:analyzer/src/dart/analysis/unlinked_api_signature.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../ast/parse_base.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(UnitApiSignatureTest);
  });
}

@reflectiveTest
class UnitApiSignatureTest extends ParseBase {
  test_class_annotation() async {
    _assertNotSameSignature(r'''
const a = 0;

class C {}
''', r'''
const a = 0;

@a
class C {}
''');
  }

  test_class_constructor_block_to_empty() {
    _assertSameSignature(r'''
class C {
  C() {
    var v = 1;
  }
}
''', r'''
class C {
  C();
}
''');
  }

  test_class_constructor_body() {
    _assertSameSignature(r'''
class C {
  C() {
    var v = 1;
  }
}
''', r'''
class C {
  C() {
    var v = 2;
  }
}
''');
  }

  test_class_constructor_empty_to_block() {
    _assertSameSignature(r'''
class C {
  C();
}
''', r'''
class C {
  C() {
    var v = 1;
  }
}
''');
  }

  test_class_constructor_initializer_const() {
    _assertNotSameSignature(r'''
class C {
  final int f;
  const C() : f = 1;
}
''', r'''
class C {
  final int f;
  const C() : f = 2;
}
''');
  }

  test_class_constructor_initializer_empty() {
    _assertNotSameSignature(r'''
class C {
  C.foo() : ;
}
''', r'''
class C {
  C.foo() : f;
}
''');
  }

  /// See https://github.com/dart-lang/sdk/issues/46206
  test_class_constructor_initializer_notConst() {
    _assertNotSameSignature(r'''
class C {
  final int f;
  C.foo() : f = 1;
  const C.bar();
}
''', r'''
class C {
  final int f;
  C.foo() : f = 2;
  const C.bar();
}
''');
  }

  test_class_constructor_parameters_add() {
    _assertNotSameSignature(r'''
class C {
  C(int a);
}
''', r'''
class C {
  C(int a, int b);
}
''');
  }

  test_class_constructor_parameters_remove() {
    _assertNotSameSignature(r'''
class C {
  C(int a, int b);
}
''', r'''
class C {
  C(int a);
}
''');
  }

  test_class_constructor_parameters_rename() {
    _assertNotSameSignature(r'''
class C {
  C(int a);
}
''', r'''
class C {
  C(int b);
}
''');
  }

  test_class_constructor_parameters_type() {
    _assertNotSameSignature(r'''
class C {
  C(int p);
}
''', r'''
class C {
  C(double p);
}
''');
  }

  test_class_constructor_redirectedConstructor_const() {
    _assertNotSameSignature(r'''
class A {
  const factory A() = B.foo;
}
class B implements A {
  const B.foo();
  const B.bar();
}
''', r'''
class A {
  const factory A() = B.bar;
}
class B implements A {
  const B.foo();
  const B.bar();
}
''');
  }

  test_class_constructor_redirectedConstructor_notConst() {
    _assertNotSameSignature(r'''
class A {
  factory A() = B.foo;
}
class B implements A {
  B.foo();
  B.bar();
}
''', r'''
class A {
  factory A() = B.bar;
}
class B implements A {
  B.foo();
  B.bar();
}
''');
  }

  test_class_documentation_add() async {
    _assertSameSignature(r'''
class C {}
''', r'''
/// foo
class C {}
''');
  }

  test_class_documentation_change() async {
    _assertSameSignature(r'''
/// foo
class C {}
''', r'''
/// bar bar
class C {}
''');
  }

  test_class_documentation_remove() async {
    _assertSameSignature(r'''
/// foo
class C {}
''', r'''
class C {}
''');
  }

  test_class_extends() {
    _assertNotSameSignature(r'''
class A {}
class B {}
''', r'''
class A {}
class B extends A {}
''');
  }

  /// The code `=;` is parsed as `= <emptyString>;`, and there was a bug that
  /// the absence of the redirecting constructor was encoded as the same
  /// byte sequence as the empty string. But these are different ASTs,
  /// so they should have different signatures.
  test_class_factoryConstructor_addEqNothing() {
    _assertNotSameSignature(r'''
class A {
  factory A();
}
''', r'''
class A {
  factory A() =;
}
''');
  }

  /// The token `static` is moving from the field declaration to the factory
  /// constructor (its redirected constructor), so semantically its meaning
  /// changes. But we had a bug that we put `static` into the signature
  /// at the same position, without any separator, so failed to see the
  /// difference.
  test_class_factoryConstructor_empty_to_eq() {
    _assertNotSameSignature(r'''
class A {
  factory A();
  static void foo<U>() {}
}
''', r'''
class A {
  factory A() =
  static void foo<U>() {}
}
''');
  }

  test_class_field_const_add_outOfOrder() {
    _assertNotSameSignature(r'''
class A {
  static f = Object();
}
''', r'''
class A {
  const
  static f = Object();
}
''');
  }

  test_class_field_withType_final_hasConstConstructor() {
    _assertNotSameSignature(r'''
class C {
  final int a = 1;
  const C();
}
''', r'''
class C {
  final int a = 2;
  const C();
}
''');
  }

  test_class_field_withType_hasConstConstructor() {
    _assertSameSignature(r'''
class C {
  int a = 1;
  const C();
}
''', r'''
class C {
  int a = 2;
  const C();
}
''');
  }

  test_class_field_withType_static_final_hasConstConstructor() {
    _assertSameSignature(r'''
class C {
  static final int a = 1;
  const C();
}
''', r'''
class C {
  static final int a = 2;
  const C();
}
''');
  }

  test_class_field_withType_static_hasConstConstructor() {
    _assertSameSignature(r'''
class C {
  static int a = 1;
  const C();
}
''', r'''
class C {
  static int a = 2;
  const C();
}
''');
  }

  test_class_implements() {
    _assertNotSameSignature(r'''
class A {}
class B {}
''', r'''
class A {}
class B implements A {}
''');
  }

  test_class_modifier() {
    _assertNotSameSignature(r'''
class C {}
''', r'''
abstract class C {}
''');
  }

  test_class_with() {
    _assertNotSameSignature(r'''
class A {}
class B {}
class C extends A {}
''', r'''
class A {}
class B {}
class C extends A with B {}
''');
  }

  test_classLike_field_const_add_outOfOrder_hasFinal() {
    _assertNotSameSignature_classLike(r'''
static final f = Object();
''', r'''
const
static final f = Object();
''');
  }

  test_classLike_field_final_add() {
    _assertNotSameSignature_classLike(r'''
int a = 0;
''', r'''
final int a = 0;
''');
  }

  test_classLike_field_late_add() {
    _assertNotSameSignature_classLike(r'''
int a;
''', r'''
late int a;
''');
  }

  test_classLike_field_late_remove() {
    _assertNotSameSignature_classLike(r'''
late int a;
''', r'''
int a;
''');
  }

  test_classLike_field_static_add() {
    _assertNotSameSignature_classLike(r'''
int a;
''', r'''
static int a;
''');
  }

  test_classLike_field_withoutType() {
    _assertNotSameSignature_classLike(r'''
var a = 1;
''', r'''
var a = 2;
''');
  }

  test_classLike_field_withoutType2() {
    _assertNotSameSignature_classLike(r'''
var a = 1, b = 2, c, d = 4;
''', r'''
var a = 1, b, c = 3, d = 4;
''');
  }

  test_classLike_field_withType() {
    _assertSameSignature_classLike(r'''
int a = 1;
''', r'''
int a = 2;
''');
  }

  test_classLike_field_withType_const() {
    _assertNotSameSignature_classLike(r'''
static const int a = 1;
''', r'''
static const int a = 2;
''');
  }

  test_classLike_field_withType_final_noConstConstructor() {
    _assertSameSignature_classLike(r'''
final int a = 1;
''', r'''
final int a = 2;
''');
  }

  test_classLike_method_body_block_to_empty() {
    _assertNotSameSignature_classLike(r'''
void foo() {}
''', r'''
void foo();
''');
  }

  test_classLike_method_body_empty_to_block() {
    _assertNotSameSignature_classLike(r'''
void foo();
''', r'''
void foo() {}
''');
  }

  test_classLike_method_body_empty_to_expression() {
    _assertNotSameSignature_classLike(r'''
int foo();
''', r'''
int foo() => 0;
''');
  }

  test_classLike_method_getter_body_block_to_empty() {
    _assertNotSameSignature_classLike(r'''
int get foo {
  return 1;
}
''', r'''
int get foo;
''');
  }

  test_classLike_method_getter_body_empty_to_block() {
    _assertNotSameSignature_classLike(r'''
int get foo;
''', r'''
int get foo {
  return 0;
}
''');
  }

  test_classLike_method_getter_body_empty_to_expression() {
    _assertNotSameSignature_classLike(r'''
int get foo;
''', r'''
int get foo => 0;
''');
  }

  test_classLike_method_getter_body_expression_to_empty() {
    _assertNotSameSignature_classLike(r'''
int get foo => 0;
''', r'''
int get foo;
''');
  }

  test_classLike_method_setter_body_block_to_empty() {
    _assertNotSameSignature_classLike(r'''
set foo(_) {}
''', r'''
set foo(_);
''');
  }

  test_classLike_method_setter_body_empty_to_block() {
    _assertNotSameSignature_classLike(r'''
set foo(_);
''', r'''
set foo(_) {}
''');
  }

  test_commentAdd() {
    _assertSameSignature(r'''
var a = 1;
var b = 2;
var c = 3;
''', r'''
var a = 1; // comment

/// comment 1
/// comment 2
var b = 2;

/**
 *  Comment
 */
var c = 3;
''');
  }

  test_commentRemove() {
    _assertSameSignature(r'''
var a = 1; // comment

/// comment 1
/// comment 2
var b = 2;

/**
 *  Comment
 */
var c = 3;
''', r'''
var a = 1;
var b = 2;
var c = 3;
''');
  }

  test_directive_library_add() {
    _assertNotSameSignature(r'''
class A {}
''', r'''
library foo;
class A {}
''');
  }

  test_directive_library_change_name() {
    _assertNotSameSignature(r'''
library foo;
class A {}
''', r'''
library bar;
class A {}
''');
  }

  test_directive_library_change_name_length() {
    _assertSameSignature(r'''
library foo.bar;
class A {}
''', r'''
library foo. bar;
class A {}
''');
  }

  test_directive_library_change_name_offset() {
    _assertSameSignature(r'''
library foo;
class A {}
''', r'''
library  foo;
class A {}
''');
  }

  test_directive_library_remove() {
    _assertNotSameSignature(r'''
library foo;
class A {}
''', r'''
class A {}
''');
  }

  test_executable_annotation() {
    _assertNotSameSignature_executable(r'''
void foo() {}
''', r'''
@a
void foo() {}
''');
  }

  test_executable_body_async_to_asyncStar() {
    _assertNotSameSignature_executable(r'''
foo() async {}
''', r'''
foo() async* {}
''');
  }

  test_executable_body_async_to_sync() {
    _assertNotSameSignature_executable(r'''
foo() async {}
''', r'''
foo() {}
''');
  }

  test_executable_body_asyncStar_to_async() {
    _assertNotSameSignature_executable(r'''
foo() async* {}
''', r'''
foo() async {}
''');
  }

  test_executable_body_asyncStar_to_syncStar() {
    _assertNotSameSignature_executable(r'''
foo() async* {}
''', r'''
foo() sync* {}
''');
  }

  test_executable_body_block() {
    _assertSameSignature_executable(r'''
int foo() {
  return 1;
}
''', r'''
int foo() {
  return 2;
}
''');
  }

  test_executable_body_block_to_expression() {
    _assertSameSignature_executable(r'''
int foo() {
  return 1;
}
''', r'''
int foo() => 2;
''');
  }

  test_executable_body_expression() {
    _assertSameSignature_executable(r'''
int foo() => 1;
''', r'''
int foo() => 2;
''');
  }

  test_executable_body_expression_to_block() {
    _assertSameSignature_executable(r'''
int foo() => 1;
''', r'''
int foo() {
  return 2;
}
''');
  }

  test_executable_body_sync_to_async() {
    _assertNotSameSignature_executable(r'''
foo() {}
''', r'''
foo() async {}
''');
  }

  test_executable_body_sync_to_syncStar() {
    _assertNotSameSignature_executable(r'''
foo() sync* {}
''', r'''
foo() {}
''');
  }

  test_executable_body_syncStar_to_sync() {
    _assertNotSameSignature_executable(r'''
foo() sync* {}
''', r'''
foo() {}
''');
  }

  test_executable_getter_body_block_to_expression() {
    _assertSameSignature_executable(r'''
int get foo {
  return 1;
}
''', r'''
int get foo => 2;
''');
  }

  test_executable_getter_body_expression_to_block() {
    _assertSameSignature_executable(r'''
int get foo => 1;
''', r'''
int get foo {
  return 2;
}
''');
  }

  test_executable_parameters_add() {
    _assertNotSameSignature_executable(r'''
foo(int a) {}
''', r'''
foo(int a, int b) {}
''');
  }

  test_executable_parameters_remove() {
    _assertNotSameSignature_executable(r'''
foo(int a, int b) {}
''', r'''
foo(int a) {}
''');
  }

  test_executable_parameters_rename() {
    _assertNotSameSignature_executable(r'''
void foo(int a) {}
''', r'''
void foo(int b) {}
''');
  }

  test_executable_parameters_type() {
    _assertNotSameSignature_executable(r'''
void foo(int p) {}
''', r'''
void foo(double p) {}
''');
  }

  test_executable_returnType() {
    _assertNotSameSignature_executable(r'''
int foo() => 0;
''', r'''
num foo() => 0;
''');
  }

  test_executable_typeParameters_add() async {
    _assertNotSameSignature_executable(r'''
void foo() {}
''', r'''
void foo<T>() {}
''');
  }

  test_executable_typeParameters_remove() {
    _assertNotSameSignature_executable(r'''
void foo<T>() {}
''', r'''
void foo() {}
''');
  }

  test_executable_typeParameters_rename() {
    _assertNotSameSignature_executable(r'''
void foo<T>() {}
''', r'''
void foo<U>() {}
''');
  }

  test_featureSet_add() async {
    _assertNotSameSignature(r'''
class A {}
''', r'''
// @dart = 2.5
class A {}
''');
  }

  test_featureSet_change() async {
    _assertNotSameSignature(r'''
// @dart = 2.6
class A {}
''', r'''
// @dart = 2.2
class A {}
''');
  }

  test_featureSet_remove() async {
    _assertNotSameSignature(r'''
// @dart = 2.5
class A {}
''', r'''
class A {}
''');
  }

  test_issue34850() {
    _assertNotSameSignature(r'''
foo
Future<List<int>> bar() {}
''', r'''
foo
Future<List<int>> bar(int x) {}
''');
  }

  test_mixin_field_withoutType() {
    _assertNotSameSignature(r'''
mixin M {
  var a = 1;
}
''', r'''
mixin M {
  var a = 2;
}
''');
  }

  test_mixin_field_withType() {
    _assertSameSignature(r'''
mixin M {
  int a = 1;
}
''', r'''
mixin M {
  int a = 2;
}
''');
  }

  test_mixin_implements() {
    _assertNotSameSignature(r'''
class A {}
mixin M {}
''', r'''
class A {}
mixin M implements A {}
''');
  }

  test_mixin_method_body_block() {
    _assertSameSignature(r'''
mixin M {
  int foo() {
    return 1;
  }
}
''', r'''
mixin M {
  int foo() {
    return 2;
  }
}
''');
  }

  test_mixin_method_body_expression() {
    _assertSameSignature(r'''
mixin M {
  int foo() => 1;
}
''', r'''
mixin M {
  int foo() => 2;
}
''');
  }

  test_mixin_on() {
    _assertNotSameSignature(r'''
class A {}
mixin M {}
''', r'''
class A {}
mixin M on A {}
''');
  }

  test_topLevelVariable_final_add() {
    _assertNotSameSignature(r'''
int a = 0;
''', r'''
final int a = 0;
''');
  }

  test_topLevelVariable_late_add() {
    _assertNotSameSignature(r'''
int a;
''', r'''
late int a;
''');
  }

  test_topLevelVariable_late_remove() {
    _assertNotSameSignature(r'''
late int a;
''', r'''
int a;
''');
  }

  test_topLevelVariable_withoutType() {
    _assertNotSameSignature(r'''
var a = 1;
''', r'''
var a = 2;
''');
  }

  test_topLevelVariable_withoutType2() {
    _assertNotSameSignature(r'''
var a = 1, b = 2, c, d = 4;;
''', r'''
var a = 1, b, c = 3, d = 4;;
''');
  }

  test_topLevelVariable_withType() {
    _assertSameSignature(r'''
int a = 1;
''', r'''
int a = 2;
''');
  }

  test_topLevelVariable_withType_const() {
    _assertNotSameSignature(r'''
const int a = 1;
''', r'''
const int a = 2;
''');
  }

  test_topLevelVariable_withType_final() {
    _assertSameSignature(r'''
final int a = 1;
''', r'''
final int a = 2;
''');
  }

  test_topLevelVariable_withType_initializer_add() {
    _assertNotSameSignature(r'''
int a;
''', r'''
int a = 1;
''');
  }

  test_topLevelVariable_withType_initializer_remove() {
    _assertNotSameSignature(r'''
int a = 1;
''', r'''
int a;
''');
  }

  test_typedef_generic_parameters_type() {
    _assertNotSameSignature(r'''
typedef F = void Function(int);
''', r'''
typedef F = void Function(double);
''');
  }

  void _assertNotSameSignature(String oldCode, String newCode) {
    _assertSignature(oldCode, newCode, same: false);
  }

  void _assertNotSameSignature_classLike(String oldCode, String newCode) {
    _assertSignature_classLike(oldCode, newCode, same: false);
  }

  void _assertNotSameSignature_executable(String oldCode, String newCode) {
    _assertSignature_executable(oldCode, newCode, same: false);
  }

  void _assertSameSignature(String oldCode, String newCode) {
    _assertSignature(oldCode, newCode, same: true);
  }

  void _assertSameSignature_classLike(String oldCode, String newCode) {
    _assertSignature_classLike(oldCode, newCode, same: true);
  }

  void _assertSameSignature_executable(String oldCode, String newCode) {
    _assertSignature_executable(oldCode, newCode, same: true);
  }

  void _assertSignature(String oldCode, String newCode, {required bool same}) {
    var path = convertPath('/test.dart');

    newFile2(path, oldCode);
    var oldUnit = parseUnit(path).unit;
    var oldSignature = computeUnlinkedApiSignature(oldUnit);

    newFile2(path, newCode);
    var newUnit = parseUnit(path).unit;
    var newSignature = computeUnlinkedApiSignature(newUnit);

    if (same) {
      expect(newSignature, oldSignature);
    } else {
      expect(newSignature, isNot(oldSignature));
    }
  }

  void _assertSignature_classLike(
    String oldCode,
    String newCode, {
    required bool same,
  }) {
    _assertSignature('''
class A {
$oldCode
}
''', '''
class A {
$newCode
}
''', same: same);

    _assertSignature('''
mixin M {
$oldCode
}
''', '''
mixin M {
$newCode
}
''', same: same);
  }

  void _assertSignature_executable(String oldCode, String newCode,
      {required bool same}) {
    _assertSignature_classLike(oldCode, newCode, same: same);
    _assertSignature(oldCode, newCode, same: same);
  }
}
