// Copyright (c) 2018, 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:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

import '../support/integration_tests.dart';

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

@reflectiveTest
class SdkVersionAsyncExportedFromCoreIntegrationTest
    extends AbstractAnalysisServerIntegrationTest {
  test_update_pubspec() async {
    var pubspecPath = sourcePath('pubspec.yaml');
    writeFile(pubspecPath, r'''
name: test
environment:
  sdk: ^2.0.0
''');

    var testPath = sourcePath('lib/test.dart');
    writeFile(testPath, '''
Future<int> zero() async => 0;
''');
    standardAnalysisSetup();

    // There is a hint with this SDK version constraint.
    await analysisFinished;
    expect(currentAnalysisErrors[testPath], hasLength(1));

    // 2.0.0 -> 2.1.0
    {
      writeFile(pubspecPath, r'''
name: test
environment:
  sdk: ^2.1.0
''');

      // The pubspec.yaml file change has been noticed and processed.
      // No more hints.
      await analysisFinished;
      expect(currentAnalysisErrors[testPath], isEmpty);
    }

    // 2.1.0 -> 2.0.0
    {
      writeFile(pubspecPath, r'''
name: test
environment:
  sdk: ^2.0.0
''');

      // The pubspec.yaml file change has been noticed and processed.
      // There is a hint again.
      await analysisFinished;
      expect(currentAnalysisErrors[testPath], hasLength(1));
    }
  }
}
