// Copyright (c) 2017, 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 'dart:io';

import 'package:analyzer_plugin/src/utilities/string_utilities.dart';
import 'package:path/path.dart' as path;
import 'package:test/test.dart';

import '../../tool/spec/api.dart';
import '../../tool/spec/from_html.dart';

/// Define tests to fail if there's no mention in the coverage file.
main() {
  Api api;
  File coverageFile;
  String pathPrefix;

  // parse the API file
  if (FileSystemEntity
      .isFileSync(path.join('tool', 'spec', 'spec_input.html'))) {
    api = readApi('.');
    pathPrefix = '.';
  } else {
    api = readApi(path.join('pkg', 'analysis_server'));
    pathPrefix = path.join('pkg', 'analysis_server');
  }

  coverageFile =
      new File(path.join(pathPrefix, 'test', 'integration', 'coverage.md'));
  List<String> lines = coverageFile.readAsLinesSync();

  // ## server domain
  Set<String> coveredDomains = lines
      .where((line) => line.startsWith('## ') && line.endsWith(' domain'))
      .map((line) =>
          line.substring('##'.length, line.length - 'domain'.length).trim())
      .toSet();

  // Remove any ' (test failed)' suffixes.
  lines = lines.map((String line) {
    int index = line.indexOf('(');
    return index != -1 ? line.substring(0, index).trim() : line;
  }).toList();

  // - [ ] server.getVersion
  Set<String> allMembers = lines
      .where((line) => line.startsWith('- '))
      .map((line) => line.substring('- [ ]'.length).trim())
      .toSet();
  Set<String> coveredMembers = lines
      .where((line) => line.startsWith('- [x]'))
      .map((line) => line.substring('- [x]'.length).trim())
      .toSet();

  // generate domain tests
  for (Domain domain in api.domains) {
    group('integration coverage of ${domain.name}', () {
      // domain
      test('domain', () {
        if (!coveredDomains.contains(domain.name)) {
          fail('${domain.name} domain not found in ${coverageFile.path}');
        }
      });

      // requests
      group('request', () {
        for (Request request in domain.requests) {
          String fullName = '${domain.name}.${request.method}';
          test(fullName, () {
            if (!allMembers.contains(fullName)) {
              fail('$fullName not found in ${coverageFile.path}');
            }

            final String fileName = getCamelWords(request.method)
                .map((s) => s.toLowerCase())
                .join('_');
            final String testName =
                path.join(domain.name, '${fileName}_test.dart');
            final String testPath =
                path.join(pathPrefix, 'test', 'integration', testName);

            // Test that if checked, a test file exists; if not checked, no such
            // file exists.
            expect(FileSystemEntity.isFileSync(testPath),
                coveredMembers.contains(fullName),
                reason: '$testName state incorrect');
          });
        }
      });

      // notifications
      group('notification', () {
        for (Notification notification in domain.notifications) {
          String fullName = '${domain.name}.${notification.event}';
          test(fullName, () {
            if (!allMembers.contains(fullName)) {
              fail('$fullName not found in ${coverageFile.path}');
            }

            final String fileName = getCamelWords(notification.event)
                .map((s) => s.toLowerCase())
                .join('_');
            final String testName =
                path.join(domain.name, '${fileName}_test.dart');
            final String testPath =
                path.join(pathPrefix, 'test', 'integration', testName);

            // Test that if checked, a test file exists; if not checked, no such
            // file exists.
            expect(FileSystemEntity.isFileSync(testPath),
                coveredMembers.contains(fullName),
                reason: '$testName state incorrect');
          });
        }
      });
    });
  }

  // validate no unexpected domains
  group('integration coverage', () {
    test('no unexpected domains', () {
      for (String domain in coveredDomains) {
        expect(api.domains.map((d) => d.name), contains(domain));
      }
    });
  });
}
