anchor.diff:          expect(quaternion.abs(), closeTo(1.0, epsilon));
         });
         test('tryParse', () {
  -        expect(Quaternion.tryParse('1+2i+3j+4k'), Quaternion(1, 2, 3, 4));
  -        expect(Quaternion.tryParse('1-2i+3j-4k'), Quaternion(1, -2, 3, -4));
  -        expect(Quaternion.tryParse('-1+2i-3j+4k'), Quaternion(-1, 2, -3, 4));
  -        expect(Quaternion.tryParse('-1-2i-3j-4k'), Quaternion(-1, -2, -3, -4));
  +        expect(Quaternion.tryParse('1+2i+3j+4k'), const Quaternion(1, 2, 3, 4));
  +        expect(
  +            Quaternion.tryParse('1-2i+3j-4k'), const Quaternion(1, -2, 3, -4));
  +        expect(
  +            Quaternion.tryParse('-1+2i-3j+4k'), const Quaternion(-1, 2, -3, 4));
  +        expect(Quaternion.tryParse('-1-2i-3j-4k'),
  +            const Quaternion(-1, -2, -3, -4));
         });
         test('tryParse (permutation)', () {
  -        expect(Quaternion.tryParse('1+2i+3j+4k'), Quaternion(1, 2, 3, 4));
  -        expect(Quaternion.tryParse('2i+1+3j+4k'), Quaternion(1, 2, 3, 4));
  -        expect(Quaternion.tryParse('4k+2i+3j+1'), Quaternion(1, 2, 3, 4));
  -        expect(Quaternion.tryParse('3j+4k+2i+1'), Quaternion(1, 2, 3, 4));
  +        expect(Quaternion.tryParse('1+2i+3j+4k'), const Quaternion(1, 2, 3, 4));
  +        expect(Quaternion.tryParse('2i+1+3j+4k'), const Quaternion(1, 2, 3, 4));
  +        expect(Quaternion.tryParse('4k+2i+3j+1'), const Quaternion(1, 2, 3, 4));
  +        expect(Quaternion.tryParse('3j+4k+2i+1'), const Quaternion(1, 2, 3, 4));
         });
         test('tryParse (whitespace)', () {
  -        expect(Quaternion.tryParse('1 + 2i + 3j + 4k'), Quaternion(1, 2, 3, 4));
  +        expect(Quaternion.tryParse('1 + 2i + 3j + 4k'),
  +            const Quaternion(1, 2, 3, 4));
           expect(Quaternion.tryParse(' 1 - 2i + 3j - 4k '),
  -            Quaternion(1, -2, 3, -4));
  +            const Quaternion(1, -2, 3, -4));
         });
         test('tryParse (real)', () {
  -        expect(Quaternion.tryParse('1'), Quaternion(1));
  -        expect(Quaternion.tryParse('1.2'), Quaternion(1.2));
  -        expect(Quaternion.tryParse('-1.2'), Quaternion(-1.2));
  -        expect(Quaternion.tryParse('1.2e2'), Quaternion(120));
  -        expect(Quaternion.tryParse('1.2e-2'), Quaternion(0.012));
  +        expect(Quaternion.tryParse('1'), const Quaternion(1));
  +        expect(Quaternion.tryParse('1.2'), const Quaternion(1.2));
  +        expect(Quaternion.tryParse('-1.2'), const Quaternion(-1.2));
  +        expect(Quaternion.tryParse('1.2e2'), const Quaternion(120));
  +        expect(Quaternion.tryParse('1.2e-2'), const Quaternion(0.012));
         });
         test('tryParse (vector)', () {
  -        expect(Quaternion.tryParse('i'), Quaternion(0, 1));
  -        expect(Quaternion.tryParse('j'), Quaternion(0, 0, 1));
  -        expect(Quaternion.tryParse('k'), Quaternion(0, 0, 0, 1));
  -        expect(Quaternion.tryParse('1.2I'), Quaternion(0, 1.2));
  -        expect(Quaternion.tryParse('1.2J'), Quaternion(0, 0, 1.2));
  -        expect(Quaternion.tryParse('1.2K'), Quaternion(0, 0, 0, 1.2));
  -        expect(Quaternion.tryParse('1.2e2i'), Quaternion(0, 120));
  -        expect(Quaternion.tryParse('1.2e2j'), Quaternion(0, 0, 120));
  -        expect(Quaternion.tryParse('1.2e2k'), Quaternion(0, 0, 0, 120));
  -        expect(Quaternion.tryParse('-1.2e-2i'), Quaternion(0, -0.012));
  -        expect(Quaternion.tryParse('-1.2e-2j'), Quaternion(0, 0, -0.012));
  -        expect(Quaternion.tryParse('-1.2e-2k'), Quaternion(0, 0, 0, -0.012));
  +        expect(Quaternion.tryParse('i'), const Quaternion(0, 1));
  +        expect(Quaternion.tryParse('j'), const Quaternion(0, 0, 1));
  +        expect(Quaternion.tryParse('k'), const Quaternion(0, 0, 0, 1));
  +        expect(Quaternion.tryParse('1.2I'), const Quaternion(0, 1.2));
  +        expect(Quaternion.tryParse('1.2J'), const Quaternion(0, 0, 1.2));
  +        expect(Quaternion.tryParse('1.2K'), const Quaternion(0, 0, 0, 1.2));
  +        expect(Quaternion.tryParse('1.2e2i'), const Quaternion(0, 120));
  +        expect(Quaternion.tryParse('1.2e2j'), const Quaternion(0, 0, 120));
  +        expect(Quaternion.tryParse('1.2e2k'), const Quaternion(0, 0, 0, 120));
  +        expect(Quaternion.tryParse('-1.2e-2i'), const Quaternion(0, -0.012));
  +        expect(Quaternion.tryParse('-1.2e-2j'), const Quaternion(0, 0, -0.012));
  +        expect(
  +            Quaternion.tryParse('-1.2e-2k'), const Quaternion(0, 0, 0, -0.012));
         });
         test('tryParse (error)', () {
           expect(Quaternion.tryParse(''), isNull);
  
positive.code:         expect(Quaternion.i.toString(), 'Quaternion(0, 1, 0, 0)');
          expect(Quaternion.j.toString(), 'Quaternion(0, 0, 1, 0)');
          expect(Quaternion.k.toString(), 'Quaternion(0, 0, 0, 1)');
          expect(Quaternion(0, 2, 4, 6).toString(), 'Quaternion(0, 2, 4, 6)');
          expect(Quaternion(1, -1, 2, -3).toString(), 'Quaternion(1, -1, 2, -3)');
        });
      });
      group('comparing', () {
        test('equal', () {
          expect(Quaternion(2, 3, 4, 5) == Quaternion(2, 3, 4, 5), isTrue);
          expect(Quaternion(2, 3, 4, 5) == Quaternion(1, 3, 4, 5), isFalse);
          expect(Quaternion(2, 3, 4, 5) == Quaternion(2, 4, 4, 5), isFalse);
          expect(Quaternion(2, 3, 4, 5) == Quaternion(2, 3, 3, 5), isFalse);
          expect(Quaternion(2, 3, 4, 5) == Quaternion(2, 3, 4, 6), isFalse);
        });
        test('hash', () {
          expect(
              Quaternion(2, 3, 4, 5).hashCode, Quaternion(2, 3, 4, 5).hashCode);
          expect(Quaternion(2, 3, 4, 5).hashCode,
              isNot(Quaternion(3, 2, 4, 5).hashCode));
          expect(Quaternion(2, 3, 4, 5).hashCode,
              isNot(Quaternion(2, 4, 3, 5).hashCode));
          expect(Quaternion(2, 3, 4, 5).hashCode,
              isNot(Quaternion(2, 3, 5, 4).hashCode));
        });
      });
    });
  
negative.code:     });
      group('arithmetic', () {
        test('addition', () {
          expect(
              const Complex(1, -2) + const Complex(-3, 4), const Complex(-2, 2));
          expect(const Complex(1, -2) + 3, const Complex(4, -2));
          expect(() => const Complex(1, -2) + 'foo', throwsArgumentError);
        });
        test('substraction', () {
          expect(
              const Complex(1, -2) - const Complex(-3, 4), const Complex(4, -6));
          expect(const Complex(1, -2) - 4, const Complex(-3, -2));
          expect(() => const Complex(1, -2) - 'foo', throwsArgumentError);
        });
        test('multiplication', () {
          expect(
              const Complex(1, -2) * const Complex(-3, 4), const Complex(5, 10));
          expect(
              const Complex(-3, 4) * const Complex(1, -2), const Complex(5, 10));
          expect(const Complex(-3, 4) * 2, const Complex(-6, 8));
          expect(() => const Complex(-3, 4) * 'foo', throwsArgumentError);
        });
        test('division', () {
          expect(
              const Complex(5, 10) / const Complex(-3, 4), const Complex(1, -2));
          expect(
              const Complex(5, 10) / const Complex(1, -2), const Complex(-3, 4));
          expect(const Complex(6, 10) / 2, const Complex(3, 5));
          expect(() => const Complex(6, 10) / 'foo', throwsArgumentError);
        });
        test('negate', () {
          expect(-const Complex(1, -2), const Complex(-1, 2));
        });
        test('conjugate', () {
          expect(const Complex(1, -2).conjugate(), const Complex(1, 2));
        });
        test('reciprocal', () {
          expect(const Complex(1, -2).reciprocal(), const Complex(0.2, 0.4));
        });
        test('exp', () {
          expect(const Complex(1, 2).exp(), isClose(-1.131204, 2.471726));
        });
        test('log', () {
          expect(const Complex(1, 2).log(), isClose(0.804718, 1.107148));
        });
        test('pow', () {
          expect(const Complex(1, 2).pow(const Complex(3, 4)),
              isClose(0.129009, 0.033924));
        });
        test('square', () {
          expect(const Complex(2, 3).square(), const Complex(-5, 12));
          expect(const Complex(-2, 3).square(), const Complex(-5, -12));
          expect(const Complex(2, -3).square(), const Complex(-5, -12));
          expect(const Complex(-2, -3).square(), const Complex(-5, 12));
        });
        test('sqrt', () {
          expect(const Complex(2, 3).sqrt(), isClose(1.674149, 0.895977));
          expect(const Complex(-2, 3).sqrt(), isClose(0.895977, 1.674149));
          expect(const Complex(2, -3).sqrt(), isClose(1.674149, -0.895977));
          expect(const Complex(-2, -3).sqrt(), isClose(0.895977, -1.674149));
          expect(const Complex(2, 3).sqrt().square(), isClose(2, 3));
        });
        group('roots', () {
          const source = const Complex(2, 3);
          void testRoots(int n) {
            test('$source.roots($n)', () {
              final roots = source.roots(n);
  