// 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:analyzer_testing/package_root.dart' as pkg_root; import 'package:path/path.dart' as path; import 'package:test/test.dart'; import '../tool/spec/from_html.dart'; /// Define tests to fail if there's no mention in the coverage file. void main() { // parse the API file var pathPrefix = path.join(pkg_root.packageRoot, 'analysis_server'); var api = readApi(pkg_root.packageRoot); var coverageFile = File( path.join(pathPrefix, 'integration_test', 'coverage.md'), ); var lines = coverageFile.readAsLinesSync(); // ## server domain var 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) { var index = line.indexOf('('); return index != -1 ? line.substring(0, index).trim() : line; }).toList(); // - [ ] server.getVersion var allMembers = lines .where((line) => line.startsWith('- ')) .map((line) => line.substring('- [ ]'.length).trim()) .toSet(); var coveredMembers = lines .where((line) => line.startsWith('- [x]')) .map((line) => line.substring('- [x]'.length).trim()) .toSet(); // generate domain tests for (var 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 (var request in domain.requests) { var fullName = '${domain.name}.${request.method}'; test(fullName, () { if (!allMembers.contains(fullName)) { fail('$fullName not found in ${coverageFile.path}'); } var fileName = getCamelWords( request.method, ).map((s) => s.toLowerCase()).join('_'); var testName = path.join(domain.name, '${fileName}_test.dart'); var testPath = path.join(pathPrefix, 'integration_test', testName); // Test that if checked, a test file exists; if not checked, no such // file exists. var fileExists = FileSystemEntity.isFileSync(testPath); var isMarkedAsCovered = coveredMembers.contains(fullName); expect( fileExists, isMarkedAsCovered, reason: isMarkedAsCovered ? '$testName marked as covered but has no test at $testPath' : '$testName marked as not covered has test at $testPath', ); }); } }); }); } // validate no unexpected domains group('integration coverage', () { test('no unexpected domains', () { for (var domain in coveredDomains) { expect(api.domains.map((d) => d.name), contains(domain)); } }); }); }