A quick few pointers this week on writing unit tests for 4×4 matrices. I’m building myself a vector math library, and using Test Driven Development to make it. I only get about an hour on the way to work – and another hour on the way back – to work on it, so it’s moving along slowly. I add to it every time I find a vector math function I need for my iPhone project that I haven’t implemented yet :). Most recently I needed to implement inverse matrices. Here’s some things that helped me write unit tests for them.

A matrix has an inverse if and only if the determinant of that matrix is zero. A matrix that can’t be inverted is called a *singular* matrix. An easy way to create a singular matrix is to set an entire row, or an entire column to all zeros

```
void testDeterminant_SingularMatrix_ReturnsZero(){
Matrix4 matrix(0, 0, 74, 1,
0, 435, 0, 1,
345, 0, 34, 1,
0, 0, 0, 0);
float expectedDeterminant = 0;
TS_ASSERT_DELTA(matrix.Determinant(), expectedDeterminant, 0.0001f);
}
```

There aren’t a great lot of matrices out there that have nice neat integer inverses either. I managed to find one in a discussion (which has since hidden from me in my web history) about different ways to calculate determinants, I post it here for your stealing:

void testInverse_NonSingularMatrix_ReturnTrueAndInverseMatrix(){ Matrix4 matrix( 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1); Matrix4 expectedInverse(0, 1,-1, 0, 1,-1, 1, 0, -1, 1, 0, 0, 0, 0, 0, 1); Matrix4 result = Matrix4::Zero; TS_ASSERT_EQUALS(matrix.Inverse(result), true); TS_ASSERT(result == expectedInverse); }

For other helpful hints regarding the creating and testing of matrices, check out the Euclidean Space page on Matrices for plenty of win.

P.S. I will migrate my blog to WordPress on my own site soon, which should clean up a lot of the code formatting issues. For now, my apologies.

what other math objects are you planning on writing?

Keep posting stuff like this i really like it

@Anonymous: This was part of a vector math library I put together for a project I was developing using Test Driven Development. There’s a few other objects that I created as well (Vectors, Quaternions etc.) but I didn’t come across any issues writing tests for those so I didn’t really think they were worth a mention