blob: 39b3081ecc29b0d23d8919e64a14a467173f4060 [file] [log] [blame]
// 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.
/// Tests that the logic to load, parse, and validate modular tests.
import 'dart:io';
import 'package:test/test.dart';
import 'package:modular_test/src/loader.dart';
import 'package:modular_test/src/suite.dart';
import 'package:args/args.dart';
main(List<String> args) async {
var options = _Options.parse(args);
var baseUri = Platform.script.resolve('./');
var baseDir = Directory.fromUri(baseUri);
await for (var entry in baseDir.list(recursive: false)) {
if (entry is Directory) {
var dirName = entry.uri.path.substring(baseDir.path.length);
test(dirName, () => _runTest(entry.uri, dirName, options),
skip: options.filter != null && !dirName.contains(options.filter));
}
}
}
Future<void> _runTest(Uri uri, String dirName, _Options options) async {
String result;
String header =
"# This expectation file is generated by loader_test.dart\n\n";
try {
ModularTest test = await loadTest(uri);
result = '$header${_dumpAsText(test)}';
} on Error catch (e) {
result = '$header$e';
}
var file = File.fromUri(uri.resolve('expectation.txt'));
if (!options.updateExpectations) {
expect(await file.exists(), isTrue,
reason: "expectation.txt file is missing");
var expectation = await file.readAsString();
if (expectation != result) {
print("expectation.txt doesn't match the result of the test. "
"To update it, run:\n"
" ${Platform.executable} ${Platform.script} "
"--update --show-update --filter $dirName");
}
expect(expectation, result);
} else if (await file.exists() && (await file.readAsString() == result)) {
print(" expectation matches result and was up to date.");
} else {
await file.writeAsString(result);
print(" updated ${file.uri}");
if (options.showResultOnUpdate) {
print(' new expectation is:\x1b[32m\n$result\x1b[0m');
}
}
}
String _dumpAsText(ModularTest test) {
var buffer = new StringBuffer();
bool isFirst = true;
for (var module in test.modules) {
if (isFirst) {
isFirst = false;
} else {
buffer.write('\n');
}
buffer.write(module.name);
if (module.isMain) {
expect(test.mainModule, module);
buffer.write('\n **main module**');
}
buffer.write('\n is package? ${module.isPackage ? 'yes' : 'no'}');
buffer.write('\n is shared? ${module.isShared ? 'yes' : 'no'}');
buffer.write('\n is sdk? ${module.isSdk ? 'yes' : 'no'}');
if (module.dependencies.isEmpty) {
buffer.write('\n (no dependencies)');
} else {
buffer.write('\n dependencies: '
'${module.dependencies.map((d) => d.name).join(", ")}');
}
if (module.sources.isEmpty) {
buffer.write('\n (no sources)');
} else if (module.isSdk) {
buffer.write('\n (sdk sources omitted)');
} else {
module.sources.forEach((uri) {
buffer.write('\n $uri');
});
}
buffer.write('\n');
}
return '$buffer';
}
class _Options {
bool updateExpectations = false;
bool showResultOnUpdate = false;
String filter = null;
static _Options parse(List<String> args) {
var parser = new ArgParser()
..addFlag('update',
abbr: 'u',
defaultsTo: false,
help: "update expectation files if the result don't match")
..addFlag('show-update',
defaultsTo: false,
help: "print the result when updating expectation files")
..addFlag('show-skipped',
defaultsTo: false,
help: "print the name of the tests skipped by the filtering option")
..addOption('filter',
help: "only run tests containing this filter as a substring");
ArgResults argResults = parser.parse(args);
return _Options()
..updateExpectations = argResults['update']
..showResultOnUpdate = argResults['show-update']
..filter = argResults['filter'];
}
}