Unit testing in D
This code is partly described in the Agile low level programming with D-post.
import std.stdio;
import std.math;
struct Vector3 {
real x, y, z;
Vector3 opNeg() {
return Vector3(-x, -y, -z);
}
Vector3 opAdd(Vector3 a) {
return Vector3(x + a.x, y + a.y, z + a.z);
}
Vector3 opSub(Vector3 a) {
return Vector3(x + a.x, y + a.y, z + a.z);
}
Vector3 opMul(real k) {
return Vector3(x * k, y * k, z * k);
}
Vector3 opDiv(real k) {
return Vector3(x / k, y / k, z / k);
}
Vector3 crossProduct(Vector3 a) {
return Vector3(y*a.z - z*a.y, z*a.x - x*a.z, x*a.y - y*a.x);
}
real dotProduct(Vector3 a) {
return x*a.x + y*a.y + z*a.z;
}
real length() {
return sqrt(x*x + y*y + z*z);
}
unittest
{
void assertEqual(Vector3 desired, Vector3 actual, char[] msg) {
assert(desired.x == actual.x, msg ~ ": x not equal");
assert(desired.y == actual.y, msg ~ ": y not equal");
assert(desired.z == actual.z, msg ~ ": z not equal");
}
// Test Fixture
Vector3 v1 = Vector3(1, 2, 3);
Vector3 v2 = Vector3(3, 2, 1);
assertEqual(Vector3(4, 4, 4), v1 + v2,
"Testing add operator");
assertEqual(Vector3(4, 4, 4), v1 - v2,
"Testing sub operator");
assertEqual(Vector3(-1, -2, -3), -v1,
"Testing neg operator");
assertEqual(Vector3(2, 4, 6), v1 * 2,
"Testing mul operator with scalar");
assertEqual(Vector3(0.5, 1, 1.5), v1 / 2,
"Testing div operator with scalar");
assertEqual(Vector3(-4, 8, -4), v1.crossProduct(v2),
"Testing cross product");
assert(10 == v1.dotProduct(v2),
"Testing dot product");
assert(sqrt(14.0) == v1.length(),
"Testing length");
}
}
int main(char[][] args)
{
writefln("All unit tests passed!");
return 0;
}