// 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/file_system/file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer_utilities/package_root.dart' as package_root;
import 'package:analyzer_utilities/verify_tests.dart';
import 'package:path/path.dart' as path;

void main() {
  var provider = PhysicalResourceProvider.INSTANCE;
  var packageRoot = provider.pathContext.normalize(package_root.packageRoot);
  var pathToAnalyze = provider.pathContext.join(packageRoot, 'analysis_server');
  var testDirPath = provider.pathContext.join(pathToAnalyze, 'test');
  _VerifyTests(
    testDirPath,
    excludedPaths: [provider.pathContext.join(testDirPath, 'mock_packages')],
  ).build();
}

class _VerifyTests extends VerifyTests {
  _VerifyTests(super.testDirPath, {super.excludedPaths});

  @override
  bool isExpensive(Resource resource) => resource.shortName == 'integration';

  @override
  bool isOkAsAdditionalTestAllImport(Folder folder, String uri) {
    var pathContext = folder.provider.pathContext;

    if (folder.path == pathContext.join(testDirPath, 'lsp') &&
        uri == '../src/lsp/lsp_packet_transformer_test.dart') {
      // `lsp/test_all.dart` also runs this one test in `lsp/src` for
      // convenience.
      return true;
    }
    if (folder.path == testDirPath &&
        uri == '../tool/spec/check_all_test.dart') {
      // The topmost `test_all.dart` also runs this one test in `tool` for
      // convenience.
      return true;
    }

    // Allow for updating textual expectations.
    if (path.url.basename(uri) == 'text_expectations.dart') {
      if (folder.path ==
          pathContext.join(testDirPath, 'services', 'completion', 'dart')) {
        return true;
      }
    }

    return super.isOkAsAdditionalTestAllImport(folder, uri);
  }
}
