// Copyright (c) 2022, 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/dart/analysis/results.dart';
import 'package:analyzer/error/error.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';

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

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

@reflectiveTest
class MockSdkTest extends PubPackageResolutionTest {
  test_dart_async() async {
    await _assertOnlyWarningsInLibraryUri('dart:async');
  }

  test_dart_convert() async {
    await _assertOnlyWarningsInLibraryUri('dart:convert');
  }

  test_dart_core() async {
    await _assertOnlyWarningsInLibraryUri('dart:core');
  }

  test_dart_math() async {
    await _assertOnlyWarningsInLibraryUri('dart:math');
  }

  void _assertOnlyHintsInLibrary(ResolvedLibraryResult coreResolvedResult) {
    for (var resolvedUnit in coreResolvedResult.units) {
      _assertOnlyWarningsInUnit(resolvedUnit);
    }
  }

  Future<void> _assertOnlyWarningsInLibraryUri(String uriStr) async {
    var coreResolvedResult = await _resolvedLibraryByUri(uriStr);
    _assertOnlyHintsInLibrary(coreResolvedResult);
  }

  void _assertOnlyWarningsInUnit(ResolvedUnitResult resolvedUnit) {
    var notHints = resolvedUnit.errors
        .where((element) =>
            element.errorCode.type != ErrorType.HINT &&
            element.errorCode.type != ErrorType.STATIC_WARNING)
        .toList();
    assertErrorsInList(notHints, []);
  }

  Future<ResolvedLibraryResult> _resolvedLibraryByUri(String uriStr) async {
    var analysisSession = contextFor(testFile).currentSession;
    var coreElementResult =
        await analysisSession.getLibraryByUri(uriStr) as LibraryElementResult;
    return await analysisSession.getResolvedLibraryByElement2(
        coreElementResult.element2) as ResolvedLibraryResult;
  }
}
