// 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/error/syntactic_errors.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../dart/resolution/context_collection_resolution.dart';

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(InvalidNullAwareOperatorAfterShortCircuitTest);
    defineReflectiveTests(InvalidNullAwareOperatorTest);
  });
}

@reflectiveTest
class InvalidNullAwareOperatorAfterShortCircuitTest
    extends PubPackageResolutionTest with WithNullSafetyMixin {
  Future<void> test_getter_previousTarget() async {
    await assertErrorsInCode('''
void f(String? s) {
  s?.length?.isEven;
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT,
          31, 2,
          contextMessages: [message('$testPackageLibPath/test.dart', 23, 2)]),
    ]);
  }

  Future<void> test_index_previousTarget() async {
    await assertErrorsInCode('''
void f(String? s) {
  s?[4]?.length;
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT,
          27, 2,
          contextMessages: [message('$testPackageLibPath/test.dart', 23, 1)]),
    ]);
  }

  Future<void> test_methodInvocation_noTarget() async {
    await assertErrorsInCode('''
class C {
  C? m1() => this;
  C m2() => this;
  void m3() {
    m1()?.m2()?.m2();
  }
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT,
          75, 2,
          contextMessages: [message('$testPackageLibPath/test.dart', 69, 2)]),
    ]);
  }

  Future<void> test_methodInvocation_previousTarget() async {
    await assertErrorsInCode('''
void f(String? s) {
  s?.substring(0, 5)?.length;
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT,
          40, 2,
          contextMessages: [message('$testPackageLibPath/test.dart', 23, 2)]),
    ]);
  }

  Future<void> test_methodInvocation_previousTwoTargets() async {
    await assertErrorsInCode('''
void f(String? s) {
  s?.substring(0, 5)?.toLowerCase()?.length;
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT,
          40, 2,
          contextMessages: [message('$testPackageLibPath/test.dart', 23, 2)]),
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR_AFTER_SHORT_CIRCUIT,
          55, 2,
          contextMessages: [message('$testPackageLibPath/test.dart', 23, 2)]),
    ]);
  }
}

@reflectiveTest
class InvalidNullAwareOperatorTest extends PubPackageResolutionTest {
  test_extensionOverride_assignmentExpression_indexExpression() async {
    await assertErrorsInCode('''
extension E on int {
  operator[]=(int index, bool _) {}
}

void f(int? a, int b) {
  E(a)?[0] = true;
  E(b)?[0] = true;
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 109, 2),
    ]);
  }

  test_extensionOverride_assignmentExpression_propertyAccess() async {
    await assertErrorsInCode('''
extension E on int {
  set foo(bool _) {}
}

void f(int? a, int b) {
  E(a)?.foo = true;
  E(b)?.foo = true;
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 95, 2),
    ]);
  }

  test_extensionOverride_indexExpression() async {
    await assertErrorsInCode('''
extension E on int {
  bool operator[](int index) => true;
}

void f(int? a, int b) {
  E(a)?[0];
  E(b)?[0];
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 104, 2),
    ]);
    assertType(findNode.index('E(a)'), 'bool?');
    assertType(findNode.index('E(b)'), 'bool?');
  }

  test_extensionOverride_methodInvocation() async {
    await assertErrorsInCode('''
extension E on int {
  bool foo() => true;
}

void f(int? a, int b) {
  E(a)?.foo();
  E(b)?.foo();
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 91, 2),
    ]);

    assertType(findNode.methodInvocation('E(a)'), 'bool?');
    assertType(findNode.methodInvocation('E(b)'), 'bool?');
  }

  test_extensionOverride_propertyAccess() async {
    await assertErrorsInCode('''
extension E on int {
  bool get foo => true;
}

void f(int? a, int b) {
  E(a)?.foo;
  E(b)?.foo;
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 91, 2),
    ]);
    assertType(findNode.propertyAccess('E(a)'), 'bool?');
    assertType(findNode.propertyAccess('E(b)'), 'bool?');
  }

  test_getter_class() async {
    await assertNoErrorsInCode('''
class C {
  static int x = 0;
}

f() {
  C?.x;
}
''');
  }

  test_getter_extension() async {
    await assertNoErrorsInCode('''
extension E on int {
  static int x = 0;
}

f() {
  E?.x;
}
''');
  }

  test_getter_legacy() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
// @dart = 2.5
var x = 0;
''');

    await assertErrorsInCode('''
import 'a.dart';

f() {
  x?.isEven;
  x?..isEven;
}
''', [
      error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
    ]);
  }

  test_getter_mixin() async {
    await assertNoErrorsInCode('''
mixin M {
  static int x = 0;
}

f() {
  M?.x;
}
''');
  }

  test_getter_nonNullable() async {
    await assertErrorsInCode('''
f(int x) {
  x?.isEven;
  x?..isEven;
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 14, 2),
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 27, 3),
    ]);
  }

  test_getter_nullable() async {
    await assertNoErrorsInCode('''
f(int? x) {
  x?.isEven;
  x?..isEven;
}
''');
  }

  /// Here we test that analysis does not crash while checking whether to
  /// report [StaticWarningCode.INVALID_NULL_AWARE_OPERATOR]. But we also
  /// report another error.
  test_getter_prefix() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
int x = 0;
''');
    await assertErrorsInCode('''
import 'a.dart' as p;

f() {
  p?.x;
}
''', [
      error(CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT, 31, 1),
    ]);
  }

  test_index_legacy() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
// @dart = 2.5
var x = [0];
''');

    await assertErrorsInCode('''
import 'a.dart';

f() {
  x?[0];
  x?..[0];
}
''', [
      error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
    ]);
  }

  test_index_nonNullable() async {
    await assertErrorsInCode('''
f(List<int> x) {
  x?[0];
  x?..[0];
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 20, 2),
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 29, 3),
    ]);
  }

  test_index_nullable() async {
    await assertNoErrorsInCode('''
f(List<int>? x) {
  x?[0];
  x?..[0];
}
''');
  }

  test_method_class() async {
    await assertNoErrorsInCode('''
class C {
  static void foo() {}
}

f() {
  C?.foo();
}
''');
  }

  test_method_extension() async {
    await assertNoErrorsInCode('''
extension E on int {
  static void foo() {}
}

f() {
  E?.foo();
}
''');
  }

  test_method_legacy() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
// @dart = 2.5
var x = 0;
''');

    await assertErrorsInCode('''
import 'a.dart';

f() {
  x?.round();
  x?..round();
}
''', [
      error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
    ]);
  }

  test_method_mixin() async {
    await assertNoErrorsInCode('''
mixin M {
  static void foo() {}
}

f() {
  M?.foo();
}
''');
  }

  test_method_nonNullable() async {
    await assertErrorsInCode('''
f(int x) {
  x?.round();
  x?..round();
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 14, 2),
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 28, 3),
    ]);
  }

  test_method_nullable() async {
    await assertNoErrorsInCode('''
f(int? x) {
  x?.round();
  x?..round();
}
''');
  }

  test_nonNullableSpread_nullableType() async {
    await assertNoErrorsInCode('''
f(List<int> x) {
  [...x];
}
''');
  }

  test_nullableSpread_legacyType() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
// @dart = 2.5
var x = <int>[];
''');

    await assertErrorsInCode('''
import 'a.dart';

f() {
  [...?x];
}
''', [
      error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
    ]);
  }

  test_nullableSpread_nonNullableType() async {
    await assertErrorsInCode('''
f(List<int> x) {
  [...?x];
}
''', [
      error(StaticWarningCode.INVALID_NULL_AWARE_OPERATOR, 20, 4),
    ]);
  }

  test_nullableSpread_nullableType() async {
    await assertNoErrorsInCode('''
f(List<int>? x) {
  [...?x];
}
''');
  }

  test_setter_class() async {
    await assertNoErrorsInCode('''
class C {
  static int x = 0;
}

f() {
  C?.x = 0;
}
''');
  }

  test_setter_extension() async {
    await assertNoErrorsInCode('''
extension E on int {
  static int x = 0;
}

f() {
  E?.x = 0;
}
''');
  }

  test_setter_mixin() async {
    await assertNoErrorsInCode('''
mixin M {
  static int x = 0;
}

f() {
  M?.x = 0;
}
''');
  }

  /// Here we test that analysis does not crash while checking whether to
  /// report [StaticWarningCode.INVALID_NULL_AWARE_OPERATOR]. But we also
  /// report another error.
  test_setter_prefix() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
int x = 0;
''');
    await assertErrorsInCode('''
import 'a.dart' as p;

f() {
  p?.x = 0;
}
''', [
      error(CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT, 31, 1),
    ]);
  }

  test_super() async {
    await assertErrorsInCode('''
class A {
  void foo() {}
}

class B extends A {
  void bar() {
    super?.foo();
  }
}
''', [
      error(ParserErrorCode.INVALID_OPERATOR_QUESTIONMARK_PERIOD_FOR_SUPER, 73,
          2),
    ]);
  }
}
