blob: 1cba590d4b6acbf3903000420995c285dc9773b5 [file] [log] [blame]
import 'dart:async';
import 'dart:io';
import 'package:mustache_no_mirrors/mustache_no_mirrors.dart' as mustache;
import 'dart:convert';
var verbose = false;
var testName = null;
var fileName = null; //'test/spec/sections.json';
main(List<String> args) {
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')
&& (fileName == null || f.path == fileName));
Future.forEach(specs,
(file) => file
.readAsString()
.then((s) => JSON.decode(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;
var trace;
try {
output = new mustache.Template(template, lenient: true).renderString(data);
} catch (ex, stacktrace) {
exception = ex;
trace = stacktrace;
}
// if (output != null)
// output = output.replaceAll('\n', '\\n');
// if (expected != null)
// expected = expected.replaceAll('\n', '\\n');
var passed = output == expected;
var result = passed ? 'Pass' : 'Fail';
print(' $result $name');
if (verbose && !passed) {
print(desc);
print(' Template: $template');
print(' Data: ${JSON.encode(data)}');
print(' Expected: $expected');
print(' Output: $output');
if (exception != null) print(' Exception: $exception');
if (trace != null) print(trace);
print('');
print('');
}
}