blob: a1e5284bd231a996c193ab106c87cfa195eed681 [file] [log] [blame]
// 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));
}
});
});
}