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

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

main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(UnnecessaryCastTest);
    defineReflectiveTests(UnnecessaryCastTestWithNullSafety);
  });
}

@reflectiveTest
class UnnecessaryCastTest extends PubPackageResolutionTest {
  test_conditionalExpression_changesResultType_left() async {
    await assertNoErrorsInCode(r'''
class A {}
class B extends A {}

dynamic f(bool c, B x, B y) {
  return c ? x as A : y;
}
''');
  }

  test_conditionalExpression_changesResultType_right() async {
    await assertNoErrorsInCode(r'''
class A {}
class B extends A {}

dynamic f(bool c, B x, B y) {
  return c ? x : y as A;
}
''');
  }

  test_conditionalExpression_leftDynamic_rightUnnecessary() async {
    await assertErrorsInCode(r'''
dynamic f(bool c, int a, int b) {
  return c ? a : b as int;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 51, 8),
    ]);
  }

  test_conditionalExpression_leftUnnecessary() async {
    await assertErrorsInCode(r'''
dynamic f(bool c, int a, int b) {
  return c ? a as int : b;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 47, 8),
    ]);
  }

  test_conditionalExpression_leftUnnecessary_rightDynamic() async {
    await assertErrorsInCode(r'''
dynamic f(bool c, int a, dynamic b) {
  return c ? a as int : b;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 51, 8),
    ]);
  }

  test_conditionalExpression_leftUnnecessary_rightUnnecessary() async {
    await assertErrorsInCode(r'''
dynamic f(bool c, int a, int b) {
  return c ? a as int : b as int;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 47, 8),
      error(HintCode.UNNECESSARY_CAST, 58, 8),
    ]);
  }

  test_conditionalExpression_rightUnnecessary() async {
    await assertErrorsInCode(r'''
dynamic f(bool c, int a, int b) {
  return c ? a : b as int;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 51, 8),
    ]);
  }

  test_dynamic_type() async {
    await assertNoErrorsInCode(r'''
void f(a) {
  a as Object;
}
''');
  }

  test_function_toSubtype_viaParameter() async {
    await assertNoErrorsInCode(r'''
void f(void Function(int) a) {
  (a as void Function(num))(3);
}
''');
  }

  test_function_toSubtype_viaReturnType() async {
    await assertNoErrorsInCode(r'''
void f(num Function() a) {
  (a as int Function())();
}
''');
  }

  test_function_toSupertype_viaParameter() async {
    await assertErrorsInCode(r'''
void f(void Function(num) a) {
  (a as void Function(int))(3);
}
''', [
      error(HintCode.UNNECESSARY_CAST, 34, 23),
    ]);
  }

  test_function_toSupertype_viaReturnType() async {
    await assertErrorsInCode(r'''
void f(int Function() a) {
  (a as num Function())();
}
''', [
      error(HintCode.UNNECESSARY_CAST, 30, 19),
    ]);
  }

  test_function_toUnrelated() async {
    await assertNoErrorsInCode(r'''
void f(num Function(num) a) {
  (a as int Function(int))(3);
}
''');
  }

  test_function_toUnrelated_generic() async {
    await assertNoErrorsInCode(r'''
void f<T extends num>(T Function(T) a) {
  (a as int Function(int))(3);
}
''');
  }

  test_type_dynamic() async {
    await assertNoErrorsInCode(r'''
void f() {
  Object as dynamic;
}
''');
  }

  test_type_supertype() async {
    await assertErrorsInCode(r'''
void f(int a) {
  a as Object;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 18, 11),
    ]);
  }

  test_type_type() async {
    await assertErrorsInCode(r'''
void f(num a) {
  a as num;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 18, 8),
    ]);
  }

  test_typeParameter_hasBound_same() async {
    await assertErrorsInCode(r'''
void f<T extends num>(T a) {
  a as num;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 31, 8),
    ]);
  }

  test_typeParameter_hasBound_subtype() async {
    await assertErrorsInCode(r'''
void f<T extends int>(T a) {
  a as num;
}
''', [
      error(HintCode.UNNECESSARY_CAST, 31, 8),
    ]);
  }

  test_typeParameter_hasBound_unrelated() async {
    await assertNoErrorsInCode(r'''
void f<T extends num>(T a) {
  a as String;
}
''');
  }

  test_typeParameter_noBound() async {
    await assertNoErrorsInCode(r'''
void f<T>(T a) {
  a as num;
}
''');
  }
}

@reflectiveTest
class UnnecessaryCastTestWithNullSafety extends UnnecessaryCastTest
    with WithNullSafetyMixin {
  test_interfaceType_star_toNone() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
// @dart = 2.7
int a = 0;
''');

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

void f() {
  var b = a as int;
  b;
}
''', [
      error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
      error(HintCode.UNNECESSARY_CAST, 39, 8),
    ]);
  }

  test_interfaceType_star_toQuestion() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
// @dart = 2.7
int a = 0;
''');

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

void f() {
  var b = a as int?;
  b;
}
''', [
      error(HintCode.IMPORT_OF_LEGACY_LIBRARY_INTO_NULL_SAFE, 7, 8),
    ]);
  }
}
