diff --git a/tests/test.d b/tests/test.d new file mode 100755 index 0000000..7ee3b7d --- /dev/null +++ b/tests/test.d @@ -0,0 +1,55 @@ +#!/usr/bin/env rdmd +/// Port of `test.sh`. Runs the tests in this directory. +import std.algorithm, std.array, std.conv, std.file, std.path, std.process; +import std.stdio, std.string, std.typecons, std.range, std.uni; + +version (Windows) + enum dfmt = "..\\bin\\dfmt.exe"; +else + enum dfmt = "../bin/dfmt"; + +int main() +{ + foreach (braceStyle; ["allman", "otbs", "knr"]) + { + foreach (entry; dirEntries(".", "*.d", SpanMode.shallow).filter!(e => e.baseName(".d") != thisExePath.baseName(".exe"))) + { + const source = entry.baseName; + const argsFile = source.stripExtension ~ ".args"; + string[] args = argsFile.exists ? readText(argsFile).splitter!isWhite.filter!(a => a.length).array : []; + writeln(dfmt, " --brace_style=", braceStyle, " ", args.map!(a => a ~ " ").join, source); + auto output = File(buildPath(braceStyle, source ~ ".out"), "w+"); + int dfmt_result = spawnProcess([dfmt, "--brace_style=" ~ braceStyle] ~ args ~ [source], + stdin, output, stderr, null, Config.retainStdout).wait; + if (dfmt_result) + return dfmt_result; + + output.rewind; + auto keepTerminator = args.any!(a => a.canFind("--end_of_line")).to!(Flag!"keepTerminator"); + auto reference = buildPath(braceStyle, source ~ ".ref").readText.splitLines(keepTerminator); + foreach (i, line; output.byLine(keepTerminator).enumerate) + { + if (line != reference[i]) + { + writeln("Found difference between ", output.name, " and ", + buildPath(braceStyle, source ~ ".ref"), " on line ", i + 1, ":"); + writeln("dfmt: ", line.stripRight); + writeln("ref : ", reference[i].stripRight); + writeln("Representation:"); + writeln("dfmt: ", line.representation); + writeln("ref : ", reference[i].representation); + return 1; + } + } + } + } + + foreach (entry; dirEntries("expected_failures", "*.d", SpanMode.shallow)) + if (execute([dfmt, entry]).status == 0) + { + stderr.writeln("Expected failure on test " ~ entry ~ " but passed."); + return 1; + } + + return 0; +}