diff --git a/dub.json b/dub.json
index 63601d1..fcd5a94 100644
--- a/dub.json
+++ b/dub.json
@@ -10,5 +10,19 @@
},
"description": "A minimal D application.",
"copyright": "Copyright © 2017, Johannes Loher",
- "license": "MIT"
+ "license": "MIT",
+ "targetType": "executable",
+ "configurations": [
+ { "name": "executable" },
+ {
+ "name": "unittest",
+ "targetType": "executable",
+ "preBuildCommands": ["dub run unit-threaded -c gen_ut_main -- -f gen/ut.d"],
+ "mainSourceFile": "gen/ut.d",
+ "excludedSourceFiles": ["source/app.d"],
+ "dependencies": {
+ "unit-threaded": "~>0.7.28"
+ }
+ }
+ ]
}
diff --git a/source/fahrplanparser.d b/source/fahrplanparser.d
index 952c487..64ca475 100644
--- a/source/fahrplanparser.d
+++ b/source/fahrplanparser.d
@@ -1,12 +1,17 @@
module fahrplanparser;
+import kxml.xml : readDocument, XmlNode;
+
import std.algorithm : map;
import std.array : empty, front;
import std.conv : to;
import std.datetime : dur, TimeOfDay, DateTimeException;
import std.string : format;
-import kxml.xml : readDocument, XmlNode;
+version (unittest)
+{
+ import unit_threaded;
+}
import substitution;
@@ -50,22 +55,74 @@ auto parsedFahrplan(in string data)
{
import std.array : array;
- auto xml = "";
- assert(xml.parsedFahrplan.array == []);
+ "".parsedFahrplan.array.shouldEqual([]);
- xml = "";
- assert(xml.parsedFahrplan.array == []);
+ "".parsedFahrplan.array.shouldEqual([]);
- xml = "112246Wernerwerkstraße";
- assert(xml.parsedFahrplan.array == [["direction" : "Wernerwerkstraße",
+ q"[
+
+
+
+ 1
+
+ 1224
+
+
+
+ 6
+ Wernerwerkstraße
+
+
+
+
+ ]".parsedFahrplan.array.shouldEqual([["direction" : "Wernerwerkstraße",
"line" : "6", "departure" : "12:24", "delay" : "18"]]);
- xml = "012246Wernerwerkstraße";
- assert(xml.parsedFahrplan.array == [["direction" : "Wernerwerkstraße",
+ q"[
+
+
+
+ 0
+
+ 1224
+
+
+ 6
+ Wernerwerkstraße
+
+
+
+
+ ]".parsedFahrplan.array.shouldEqual([["direction" : "Wernerwerkstraße",
"line" : "6", "departure" : "12:24", "delay" : "0"]]);
- xml = "012246Wernerwerkstraße1135311Burgweinting";
- assert(xml.parsedFahrplan.array == [["direction" : "Wernerwerkstraße", "line" : "6",
+ q"[
+
+
+
+ 0
+
+ 1224
+
+
+ 6
+ Wernerwerkstraße
+
+
+
+ 1
+
+ 1353
+
+
+
+ 11
+ Burgweinting
+
+
+
+
+ ]".parsedFahrplan.array.shouldEqual([["direction" : "Wernerwerkstraße", "line" : "6",
"departure" : "12:24", "delay" : "0"], ["direction" : "Burgweinting",
"line" : "11", "departure" : "13:53", "delay" : "3"]]);
}
@@ -104,41 +161,47 @@ body
@system unittest
{
- import std.exception : assertThrown;
+ "0000".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldEqual(TimeOfDay(0, 0));
- auto xml = "0000".readDocument.parseXPath("/dp").front;
- assert(xml.departureTime == TimeOfDay(0, 0));
+ "0013".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldEqual(TimeOfDay(0, 13));
- xml = "0013".readDocument.parseXPath("/dp").front;
- assert(xml.departureTime == TimeOfDay(0, 13));
+ "1100".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldEqual(TimeOfDay(11, 00));
- xml = "1100".readDocument.parseXPath("/dp").front;
- assert(xml.departureTime == TimeOfDay(11, 00));
+ "1242".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldEqual(TimeOfDay(12, 42));
- xml = "1242".readDocument.parseXPath("/dp").front;
- assert(xml.departureTime == TimeOfDay(12, 42));
+ "2359".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldEqual(TimeOfDay(23, 59));
- xml = "2359".readDocument.parseXPath("/dp").front;
- assert(xml.departureTime == TimeOfDay(23, 59));
+ "2400".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
- assertThrown!DateTimeException("2400".readDocument.parseXPath("/dp")
- .front.departureTime);
- assertThrown!DateTimeException("0061".readDocument.parseXPath("/dp")
- .front.departureTime);
- assertThrown!DateTimeException("2567".readDocument.parseXPath("/dp")
- .front.departureTime);
- assertThrown!DateTimeException("".readDocument.parseXPath("/dp")
- .front.departureTime);
- assertThrown!DateTimeException("0".readDocument.parseXPath("/dp")
- .front.departureTime);
- assertThrown!DateTimeException("00".readDocument.parseXPath("/dp")
- .front.departureTime);
- assertThrown!DateTimeException("000000".readDocument.parseXPath("/dp")
- .front.departureTime);
- assertThrown!DateTimeException("00:00".readDocument.parseXPath("/dp")
- .front.departureTime);
- assertThrown!DateTimeException("abcd".readDocument.parseXPath("/dp")
- .front.departureTime);
+ "0061".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
+
+ "2567".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
+
+ "".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
+
+ "0".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
+
+ "00".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
+
+ "000000".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
+
+ "00:00".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
+
+ "abcd".readDocument.parseXPath("/dp")
+ .front.departureTime.shouldThrow!DateTimeException;
}
auto delay(XmlNode dp)
@@ -173,70 +236,59 @@ body
@system unittest
{
- import std.exception : assertThrown;
import core.exception : AssertError;
- auto xml = "0".readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"minutes"(0));
+ "0".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"minutes"(0));
- xml = "".readDocument.parseXPath("/dp").front;
- assertThrown!(UnexpectedValueException!string)(xml.delay);
+ "".readDocument.parseXPath("/dp")
+ .front.delay.shouldThrow!(UnexpectedValueException!string);
- xml = "2".readDocument.parseXPath("/dp").front;
- assertThrown!(UnexpectedValueException!string)(xml.delay);
+ "2".readDocument.parseXPath("/dp")
+ .front.delay.shouldThrow!(UnexpectedValueException!string);
- xml = "a".readDocument.parseXPath("/dp").front;
- assertThrown!(UnexpectedValueException!string)(xml.delay);
+ "a".readDocument.parseXPath("/dp")
+ .front.delay.shouldThrow!(UnexpectedValueException!string);
- xml = "1".readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"seconds"(0));
+ "1".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"seconds"(0));
- xml = "1".readDocument.parseXPath("/dp").front;
- assertThrown!DateTimeException(xml.delay);
+ "1".readDocument.parseXPath("/dp")
+ .front.delay.shouldThrow!(DateTimeException);
- xml = "1".readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"seconds"(0));
+ "1".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"seconds"(0));
- xml = "".readDocument.parseXPath("/dp").front;
- assertThrown!AssertError(xml.delay);
+ "".readDocument.parseXPath("/dp")
+ .front.delay.shouldThrow!(AssertError);
- xml = "1".readDocument.parseXPath("/dp")
- .front;
- assertThrown!DateTimeException(xml.delay);
+ "1".readDocument.parseXPath("/dp")
+ .front.delay.shouldThrow!(DateTimeException);
- xml = "1".readDocument.parseXPath("/dp")
- .front;
- assertThrown!DateTimeException(xml.delay);
+ "1".readDocument.parseXPath("/dp")
+ .front.delay.shouldThrow!(DateTimeException);
- xml = "10000".readDocument.parseXPath("/dp")
- .front;
- assertThrown!DateTimeException(xml.delay);
+ "10000".readDocument.parseXPath("/dp")
+ .front.delay.shouldThrow!(DateTimeException);
- xml = "10000"
- .readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"minutes"(0));
+ "10000".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"minutes"(0));
- xml = "10000"
- .readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"minutes"(1));
+ "10000".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"minutes"(1));
- xml = "11751"
- .readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"minutes"(2));
+ "11751".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"minutes"(2));
- xml = "11000"
- .readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"minutes"(10));
+ "11000".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"minutes"(10));
- xml = "11242"
- .readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"minutes"(19));
+ "11242".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"minutes"(19));
- xml = "11242"
- .readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"minutes"(678));
+ "11242".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"minutes"(678));
- xml = "12359"
- .readDocument.parseXPath("/dp").front;
- assert(xml.delay == dur!"minutes"(1));
+ "12359".readDocument.parseXPath("/dp")
+ .front.delay.shouldEqual(dur!"minutes"(1));
}
diff --git a/source/substitution.d b/source/substitution.d
index 07c239f..9575426 100644
--- a/source/substitution.d
+++ b/source/substitution.d
@@ -4,6 +4,11 @@ import std.file : slurp;
import std.meta : AliasSeq;
import std.traits : Parameters;
+version (unittest)
+{
+ import unit_threaded;
+}
+
public:
/***********************************
@@ -30,7 +35,7 @@ void loadSubstitutionFile(alias slurpFun = slurp)(string fileName)
}
loadSubstitutionFile!mockSlurpEmpty("");
- assert(map.length == 0);
+ map.length.shouldEqual(0);
static Tuple!(string, string)[] mockSlurpEmptyEntry(Type1, Type2)(string filename,
in char[] format)
@@ -39,9 +44,9 @@ void loadSubstitutionFile(alias slurpFun = slurp)(string fileName)
}
loadSubstitutionFile!mockSlurpEmptyEntry("");
- assert("" in map);
- assert(map.length == 1);
- assert(map[""] == "");
+ "".shouldBeIn(map);
+ map.length.shouldEqual(1);
+ map[""].shouldEqual("");
static Tuple!(string, string)[] mockSlurpSingleEntry(Type1, Type2)(string filename,
in char[] format)
@@ -50,9 +55,9 @@ void loadSubstitutionFile(alias slurpFun = slurp)(string fileName)
}
loadSubstitutionFile!mockSlurpSingleEntry("");
- assert("foo" in map);
- assert(map.length == 1);
- assert(map["foo"] == "bar");
+ "foo".shouldBeIn(map);
+ map.length.shouldEqual(1);
+ map["foo"].shouldEqual("bar");
static Tuple!(string, string)[] mockSlurpMultipleEntries(Type1, Type2)(
string filename, in char[] format)
@@ -61,13 +66,13 @@ void loadSubstitutionFile(alias slurpFun = slurp)(string fileName)
}
loadSubstitutionFile!mockSlurpMultipleEntries("");
- assert("" in map);
- assert("0" in map);
- assert("Text in" in map);
- assert(map.length == 3);
- assert(map[""] == "");
- assert(map["0"] == "1");
- assert(map["Text in"] == "wird durch diesen ersetzt");
+ "".shouldBeIn(map);
+ "0".shouldBeIn(map);
+ "Text in".shouldBeIn(map);
+ map.length.shouldEqual(3);
+ map[""].shouldEqual("");
+ map["0"].shouldEqual("1");
+ map["Text in"].shouldEqual("wird durch diesen ersetzt");
}
/***********************************
@@ -84,20 +89,20 @@ auto substitute(string s) @safe nothrow
@safe unittest
{
map[""] = "";
- assert(substitute("") == "");
+ "".substitute.shouldEqual("");
map["a"] = "b";
- assert(substitute("a") == "b");
+ "a".substitute.shouldEqual("b");
map["Regensburg Danziger Freiheit"] = "Danziger Freiheit";
- assert(substitute("Regensburg Danziger Freiheit") == "Danziger Freiheit");
+ "Regensburg Danziger Freiheit".substitute.shouldEqual("Danziger Freiheit");
map["Regensburg Danziger Freiheit"] = "Anderer Test";
- assert(substitute("Regensburg Danziger Freiheit") == "Anderer Test");
+ "Regensburg Danziger Freiheit".substitute.shouldEqual("Anderer Test");
- assert(substitute("z") == "z");
+ "z".substitute.shouldEqual("z");
- assert(substitute("Regensburg Hauptbahnhof") == "Regensburg Hauptbahnhof");
+ "Regensburg Hauptbahnhof".substitute.shouldEqual("Regensburg Hauptbahnhof");
}
private: