// 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(MissingReturnTest);
    defineReflectiveTests(MissingReturnWithNullSafetyTest);
  });
}

@reflectiveTest
class MissingReturnTest extends PubPackageResolutionTest {
  test_alwaysThrows() async {
    writeTestPackageConfigWithMeta();
    await assertNoErrorsInCode(r'''
import 'package:meta/meta.dart';

@alwaysThrows
void a() {
  throw 'msg';
}

int f() {
  a();
}''');
  }

  test_constructor_factory() async {
    await assertErrorsInCode(r'''
class A {
  factory A() {}
}
''', [
      error(HintCode.MISSING_RETURN, 12, 14),
    ]);
  }

  test_function_async_block_futureInt() async {
    await assertErrorsInCode(r'''
Future<int> f() async {}
''', [
      error(HintCode.MISSING_RETURN, 12, 1),
    ]);
  }

  test_function_async_block_futureOrVoid() async {
    await assertNoErrorsInCode(r'''
import 'dart:async';
FutureOr<void> f(Future f) async {}
''');
  }

  test_function_async_block_futureVoid() async {
    await assertNoErrorsInCode(r'''
Future<void> f() async {}
''');
  }

  test_function_sync_block_expression() async {
    await assertNoErrorsInCode(r'''
int f() => 0;
''');
  }

  test_function_sync_block_int() async {
    await assertErrorsInCode(r'''
int f() {}
''', [
      error(HintCode.MISSING_RETURN, 4, 1),
    ]);
  }

  test_function_sync_block_noReturnType() async {
    await assertNoErrorsInCode(r'''
f() {}
''');
  }

  test_function_sync_block_void() async {
    await assertNoErrorsInCode(r'''
void f() {}
''');
  }

  test_functionExpression_async_block_dynamic() async {
    await assertNoErrorsInCode(r'''
Future Function() f = () async {};
''');
  }

  test_functionExpression_async_block_futureInt() async {
    await assertErrorsInCode(r'''
Future<int> Function() f = () async {}; 
''', [
      error(HintCode.MISSING_RETURN, 27, 11),
    ]);
  }

  test_functionExpression_async_block_void() async {
    await assertNoErrorsInCode(r'''
void Function(bool) v = (bool a) async {
  if (a) {
    return 0;
  }
};
''');
  }

  test_functionExpression_sync_block_futureOrDynamic() async {
    await assertNoErrorsInCode(r'''
import 'dart:async';

FutureOr<dynamic> Function() f = () {};
''');
  }

  test_functionExpression_sync_block_futureOrInt() async {
    await assertErrorsInCode(r'''
import 'dart:async';

FutureOr<int> Function() f = () {};
''', [
      error(HintCode.MISSING_RETURN, 51, 5),
    ]);
  }

  test_functionExpression_sync_block_int() async {
    await assertErrorsInCode(r'''
int Function() f = () {};
''', [
      error(HintCode.MISSING_RETURN, 19, 5),
    ]);
  }

  test_functionExpression_sync_dynamic() async {
    await assertNoErrorsInCode(r'''
Function() f = () {};
''');
  }

  test_functionExpression_sync_expression() async {
    await assertNoErrorsInCode(r'''
int Function() f = () => null;
''');
  }

  test_localFunction_sync_dynamic() async {
    await assertNoErrorsInCode(r'''
main() {
  f() {}
  f;
}
''');
  }

  test_method_emptyFunctionBody() async {
    await assertNoErrorsInCode(r'''
abstract class A {
  int m();
}
''');
  }

  test_method_sync_block_futureOrDynamic() async {
    await assertNoErrorsInCode(r'''
import 'dart:async';

class A {
  FutureOr<dynamic> m() {}
}
''');
  }

  test_method_sync_block_futureOrInt() async {
    await assertErrorsInCode(r'''
import 'dart:async';

class A {
  FutureOr<int> m() {}
}
''', [
      error(HintCode.MISSING_RETURN, 48, 1),
    ]);
  }

  test_method_sync_block_int() async {
    await assertErrorsInCode(r'''
class A {
  int m() {}
}
''', [
      error(HintCode.MISSING_RETURN, 16, 1),
    ]);
  }

  test_method_sync_block_int_inferred() async {
    await assertErrorsInCode(r'''
abstract class A {
  int m();
}

class B extends A {
  m() {}
}
''', [
      error(HintCode.MISSING_RETURN, 55, 1),
    ]);
  }
}

@reflectiveTest
class MissingReturnWithNullSafetyTest extends PubPackageResolutionTest
    with WithNullSafetyMixin {
  test_returnNever() async {
    newFile('$testPackageLibPath/a.dart', content: r'''
Never foo() {
  throw 0;
}
''');
    await assertNoErrorsInCode(r'''
// @dart = 2.8
import 'a.dart';

int f() {
  foo();
}
''');
  }
}
