// 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/dart/analysis/analysis_context_collection.dart';
import 'package:analyzer/dart/analysis/results.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/src/lint/linter.dart';
import 'package:analyzer/src/lint/registry.dart';
import 'package:analyzer_utilities/package_root.dart';
import 'package:linter/src/rules.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';

void main() {
  /// Ensure server lint name representations correspond w/ actual lint rules.
  /// See, e.g., https://dart-review.googlesource.com/c/sdk/+/95743.
  test('lint_names', () async {
    var pkgRootPath = path.normalize(packageRoot);
    var fixFilePath = path.join(pkgRootPath, 'analysis_server', 'lib', 'src',
        'services', 'linter', 'lint_names.dart');
    var contextCollection = AnalysisContextCollection(
      includedPaths: [fixFilePath],
    );
    var parseResult = contextCollection
        .contextFor(fixFilePath)
        .currentSession
        .getParsedUnit(fixFilePath) as ParsedUnitResult;

    if (parseResult.errors.isNotEmpty) {
      throw Exception(parseResult.errors);
    }

    var lintNamesClass = parseResult.unit.declarations
        .firstWhere((m) => m is ClassDeclaration && m.name.name == 'LintNames');

    var collector = _FixCollector();
    lintNamesClass.accept(collector);
    for (var name in collector.lintNames) {
      expect(registeredLintNames, contains(name));
    }
  });
}

List<LintRule>? _registeredLints;

Iterable<String> get registeredLintNames => registeredLints.map((r) => r.name);

List<LintRule> get registeredLints {
  var registeredLints = _registeredLints;
  if (registeredLints == null) {
    if (Registry.ruleRegistry.isEmpty) {
      registerLintRules();
    }
    registeredLints = Registry.ruleRegistry.toList();
    _registeredLints = registeredLints;
  }
  return registeredLints;
}

class _FixCollector extends GeneralizingAstVisitor<void> {
  final List<String> lintNames = <String>[];

  @override
  void visitFieldDeclaration(FieldDeclaration node) {
    for (var v in node.fields.variables) {
      lintNames.add(v.name.name);
    }
  }
}
