blob: c3d6fa697b61c93e8b90a714b65deee0e84a72c3 [file] [log] [blame]
import 'dart:async';
import 'dart:io';
import 'package:mustache/mustache.dart' as mustache;
import 'dart:json' as json;
var verbose = false;
var testName = null;
main() {
var args = new Options().arguments;
if (!args.isEmpty) {
for (var arg in args) {
if (arg == '--verbose' || arg == '-v') {
verbose = true;
} else if (arg.startsWith('-')) {
print('Unknown argument: $arg');
print('Usage: dart test/mustache_spec_test.dart [--verbose] [test name]');
return;
} else {
testName = arg;
verbose = true;
}
}
}
var specs = new Directory('test/spec')
.listSync()
.where((f) => f is File && f.path.endsWith('.json'));
Future.forEach(specs,
(file) => file
.readAsString()
.then((s) => json.parse(s))
.then((spec) {
print('Specification: ${file.path}');
spec['tests'].forEach((map) => runTest(
map['name'],
map['desc'],
map['data'],
map['template'],
map['expected']));
print('');
}));
}
runTest(String name, String desc, Map data, String template, String expected) {
if (testName != null && name != testName)
return;
var output;
var exception;
try {
output = mustache.parse(template, lenient: true).renderString(data, lenient: true);
} catch (ex) {
exception = ex;
}
var passed = output == expected;
var result = passed ? 'Pass' : 'Fail';
print(' $result $name');
if (verbose && !passed) {
print(desc);
print(' Template: $template');
print(' Data: ${json.stringify(data)}');
print(' Expected: $expected');
print(' Output: $output');
if (exception != null) print(' Exception: $exception'); // TODO stack trace.
print('');
print('');
}
}