| // 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)); |
| } |
| }); |
| }); |
| } |