void ValidateTranslation(const AffineTransform & t, double t_x, double t_y) {
  SquareMatrix m = t.GetMatrix();
  ASSERT_NEAR(1,   m[0][0], ABS_ERR);
  ASSERT_NEAR(0,   m[0][1], ABS_ERR);
  ASSERT_NEAR(t_x, m[0][2], ABS_ERR);
  ASSERT_NEAR(0,   m[1][0], ABS_ERR);
  ASSERT_NEAR(1,   m[1][1], ABS_ERR);
  ASSERT_NEAR(t_y, m[1][2], ABS_ERR);
  ASSERT_NEAR(0,   m[2][0], ABS_ERR);
  ASSERT_NEAR(0,   m[2][1], ABS_ERR);
  ASSERT_NEAR(1,   m[2][2], ABS_ERR);
}
void ValidateScale(const AffineTransform & t, double scale_x, double scale_y) {
  SquareMatrix m = t.GetMatrix();
  ASSERT_NEAR(scale_x, m[0][0], ABS_ERR);
  ASSERT_NEAR(0,       m[0][1], ABS_ERR);
  ASSERT_NEAR(0,       m[0][2], ABS_ERR);
  ASSERT_NEAR(0,       m[1][0], ABS_ERR);
  ASSERT_NEAR(scale_y, m[1][1], ABS_ERR);
  ASSERT_NEAR(0,       m[1][2], ABS_ERR);
  ASSERT_NEAR(0,       m[2][0], ABS_ERR);
  ASSERT_NEAR(0,       m[2][1], ABS_ERR);
  ASSERT_NEAR(1,       m[2][2], ABS_ERR);
}
void ValidateRotation(const AffineTransform & t, double theta) {
  SquareMatrix m = t.GetMatrix();
  ASSERT_NEAR(cos(theta),  m[0][0], ABS_ERR);
  ASSERT_NEAR(-sin(theta), m[0][1], ABS_ERR);
  ASSERT_NEAR(0,           m[0][2], ABS_ERR);
  ASSERT_NEAR(sin(theta),  m[1][0], ABS_ERR);
  ASSERT_NEAR(cos(theta),  m[1][1], ABS_ERR);
  ASSERT_NEAR(0,           m[1][2], ABS_ERR);
  ASSERT_NEAR(0,           m[2][0], ABS_ERR);
  ASSERT_NEAR(0,           m[2][1], ABS_ERR);
  ASSERT_NEAR(1,           m[2][2], ABS_ERR);
}
void ValidateIdentity(const AffineTransform & t) {
  SquareMatrix m = t.GetMatrix();
  for (unsigned int row = 0; row < m.getRows(); row++) {
    for (unsigned int col = 0; col < m.getCols(); col++) {
      if (row == col) {
        ASSERT_NEAR(1, m[row][col], ABS_ERR);
      } else {
        ASSERT_NEAR(0, m[row][col], ABS_ERR);
      }
    }
  }
}
void EqualTransforms(const AffineTransform & l, const AffineTransform & r) {
  EqualMatrices(l.GetMatrix(), r.GetMatrix());
}
void EqualToMatrix(const AffineTransform & t, const SquareMatrix & m) {
  EqualMatrices(t.GetMatrix(), m);
}