// Copyright (c) 2021, 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:analysis_server/src/services/correction/fix.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import 'fix_processor.dart';

void main() {
  defineReflectiveSuite(() {
    defineReflectiveTests(ReplaceReturnTypeTest);
  });
}

@reflectiveTest
class ReplaceReturnTypeTest extends FixProcessorTest {
  @override
  FixKind get kind => DartFixKind.REPLACE_RETURN_TYPE;

  Future<void> test_async_method() async {
    await resolveTestCode('''
class A {
  Future<int> m() async {
    return '';
  }
}
''');
    await assertHasFix('''
class A {
  Future<String> m() async {
    return '';
  }
}
''');
  }

  Future<void> test_closure() async {
    await resolveTestCode('''
class A {
  int m() {
    var list = <String>[];
    list.map((e) {
      return 0;
    });
    return 2.4;
  }
}
''');
    await assertHasFix('''
class A {
  double m() {
    var list = <String>[];
    list.map((e) {
      return 0;
    });
    return 2.4;
  }
}
''');
  }

  Future<void> test_function() async {
    await resolveTestCode('''
int f() {
  return '';
}
''');
    await assertHasFix('''
String f() {
  return '';
}
''');
  }

  Future<void> test_function_local() async {
    await resolveTestCode('''
void top() {
  int f() {
    return '';
  }
}
''');
    await assertHasFix('''
void top() {
  String f() {
    return '';
  }
}
''', errorFilter: (error) {
      return error.errorCode ==
          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION;
    });
  }

  Future<void> test_method() async {
    await resolveTestCode('''
class A {
  int m() {
    return '';
  }
}
''');
    await assertHasFix('''
class A {
  String m() {
    return '';
  }
}
''');
  }

  Future<void> test_methodOverride() async {
    await resolveTestCode('''
class A {
  A m() => this;
}
class B extends A {
  @override
  int m() => this;
}
''');
    await assertHasFix('''
class A {
  A m() => this;
}
class B extends A {
  @override
  B m() => this;
}
''', errorFilter: (error) {
      return error.errorCode ==
          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD;
    });
  }

  Future<void> test_methodOverride_multiple_subtype() async {
    await resolveTestCode('''
class A {}
class B extends A {}

class Parent {
  A m() => A();
}

class I {
  B m() => B();
}

class D extends Parent implements I {
  @override
  B m() => A();
}
''');

    await assertNoFix();
  }

  Future<void> test_methodOverride_subtype() async {
    await resolveTestCode('''
class A {
  B m() => B();
}
class B extends A {
  @override
  B m() => A();
}
''');
    await assertNoFix();
  }

  Future<void> test_privateType() async {
    addSource('/home/test/lib/a.dart', '''
class A {
  _B b => _B();
}
class _B {}
''');

    await resolveTestCode('''
import 'package:test/a.dart';

int f(A a) {
  return a.b();
}
''');
    await assertNoFix();
  }

  Future<void> test_upperBound_function() async {
    await resolveTestCode('''
int f() {
  if (true) {
    return 3;
  }
  return 2.4;
}
''');
    await assertHasFix('''
num f() {
  if (true) {
    return 3;
  }
  return 2.4;
}
''', errorFilter: (error) {
      return error.errorCode ==
          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_FUNCTION;
    });
  }

  Future<void> test_upperBound_method() async {
    await resolveTestCode('''
class A {
  int m() {
    if (true) {
      return 3;
    }
    return 2.4;
  }
}
''');
    await assertHasFix('''
class A {
  num m() {
    if (true) {
      return 3;
    }
    return 2.4;
  }
}
''', errorFilter: (error) {
      return error.errorCode ==
          CompileTimeErrorCode.RETURN_OF_INVALID_TYPE_FROM_METHOD;
    });
  }
}
