// 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:analyzer/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/file_system/physical_file_system.dart';
import 'package:analyzer_utilities/package_root.dart';
import 'package:test/test.dart';

void main() {
  group('analysis_server', () {
    buildTests(packagePath: 'analysis_server');
  });

  group('analyzer', () {
    buildTests(packagePath: 'analyzer');
  });

  group('analyzer_cli', () {
    buildTests(packagePath: 'analyzer_cli');
  });

  group('analyzer_plugin', () {
    buildTests(packagePath: 'analyzer_plugin');
  });
}

void buildTests({required String packagePath}) {
  var provider = PhysicalResourceProvider.INSTANCE;
  var pkgRootPath = provider.pathContext.normalize(packageRoot);

  var testsPath = _toPlatformPath(pkgRootPath, '$packagePath/test');

  var collection = AnalysisContextCollection(
    includedPaths: <String>[testsPath],
    resourceProvider: provider,
  );
  var contexts = collection.contexts;
  if (contexts.length != 1) {
    fail('The directory $testsPath contains multiple analysis contexts.');
  }

  test('no @soloTest', () async {
    var failures = <String>[];
    await buildTestsIn(contexts[0].currentSession, testsPath,
        provider.getFolder(testsPath), failures);

    if (failures.isNotEmpty) {
      fail('@soloTest annotation found in:\n${failures.join('\n')}');
    }
  });
}

Future<void> buildTestsIn(AnalysisSession session, String testDirPath,
    Folder directory, List<String> failures) async {
  var pathContext = session.resourceProvider.pathContext;
  var children = directory.getChildren();
  children.sort((first, second) => first.shortName.compareTo(second.shortName));
  for (var child in children) {
    if (child is Folder) {
      await buildTestsIn(session, testDirPath, child, failures);
    } else if (child is File && child.shortName.endsWith('_test.dart')) {
      var path = child.path;
      var relativePath = pathContext.relative(path, from: testDirPath);

      var result = await session.getParsedUnit2(path);
      if (result is! ParsedUnitResult) {
        fail('Could not parse $path');
      }
      var unit = result.unit;
      var errors = result.errors;
      if (errors.isNotEmpty) {
        fail('Errors found when parsing $path');
      }
      var tracker = SoloTestTracker();
      unit.accept(tracker);
      if (tracker.found) {
        failures.add(relativePath);
      }
    }
  }
}

String _toPlatformPath(String pathPath, String relativePosixPath) {
  var pathContext = PhysicalResourceProvider.INSTANCE.pathContext;
  return pathContext.joinAll([
    pathPath,
    ...relativePosixPath.split('/'),
  ]);
}

/// A [RecursiveAstVisitor] that tracks whether any node is annotated with
/// an annotation named 'soloTest'.
class SoloTestTracker extends RecursiveAstVisitor<void> {
  bool found = false;

  @override
  void visitAnnotation(Annotation node) {
    if (node.name.name == 'soloTest') {
      found = true;
    }
    super.visitAnnotation(node);
  }
}
