@js-draw/math
Version:
A math library for js-draw.
80 lines (71 loc) • 3.25 kB
text/typescript
import Mat33 from './Mat33';
import { Vec2 } from './Vec2';
describe('Mat33.fromCSSMatrix', () => {
it('should convert CSS matrix(...) strings to matrices', () => {
// From MDN:
// ⎡ a c e ⎤
// ⎢ b d f ⎥ = matrix(a,b,c,d,e,f)
// ⎣ 0 0 1 ⎦
const identity = Mat33.fromCSSMatrix('matrix(1, 0, 0, 1, 0, 0)');
expect(identity).objEq(Mat33.identity);
expect(Mat33.fromCSSMatrix('matrix(1, 2, 3, 4, 5, 6)')).objEq(
new Mat33(1, 3, 5, 2, 4, 6, 0, 0, 1),
);
expect(Mat33.fromCSSMatrix('matrix(1e2, 2, 3, 4, 5, 6)')).objEq(
new Mat33(1e2, 3, 5, 2, 4, 6, 0, 0, 1),
);
expect(Mat33.fromCSSMatrix('matrix(1.6, 2, .3, 4, 5, 6)')).objEq(
new Mat33(1.6, 0.3, 5, 2, 4, 6, 0, 0, 1),
);
expect(Mat33.fromCSSMatrix('matrix(-1, 2, 3.E-2, 4, -5.123, -6.5)')).objEq(
new Mat33(-1, 0.03, -5.123, 2, 4, -6.5, 0, 0, 1),
);
expect(Mat33.fromCSSMatrix('matrix(1.6,\n\t2, .3, 4, 5, 6)')).objEq(
new Mat33(1.6, 0.3, 5, 2, 4, 6, 0, 0, 1),
);
expect(Mat33.fromCSSMatrix('matrix(1.6,2, .3E-2, 4, 5, 6)')).objEq(
new Mat33(1.6, 3e-3, 5, 2, 4, 6, 0, 0, 1),
);
expect(Mat33.fromCSSMatrix('matrix(-1, 2e6, 3E-2,-5.123, -6.5e-1, 0.01)')).objEq(
new Mat33(-1, 3e-2, -6.5e-1, 2e6, -5.123, 0.01, 0, 0, 1),
);
expect(Mat33.fromCSSMatrix('matrix(-1,\t2e6,3E-2,-5.123, -6.5e-1,\n0.01\n)')).objEq(
new Mat33(-1, 3e-2, -6.5e-1, 2e6, -5.123, 0.01, 0, 0, 1),
);
});
it('should convert multi-matrix arguments into a single CSS matrix', () => {
const identity = Mat33.fromCSSMatrix('matrix(1, 0, 0, 1, 0, 0) matrix(1, 0, 0, 1, 0, 0)');
expect(identity).objEq(Mat33.identity);
expect(
Mat33.fromCSSMatrix(
'matrix(1, 0, 0, 1, 0, 0) matrix(1, 2, 3, 4, 5, 6) matrix(1, 0, 0, 1, 0, 0)',
),
).objEq(new Mat33(1, 3, 5, 2, 4, 6, 0, 0, 1));
expect(
Mat33.fromCSSMatrix(
'matrix(2,\n\t 0, 0, 2, 0, 0) matrix(1, 2, 3, 4, 5, 6) matrix(1, 0, 0, 1, 0, 0)',
),
).objEq(new Mat33(2, 6, 10, 4, 8, 12, 0, 0, 1));
});
it('should convert scale()s with a single argument', () => {
expect(Mat33.fromCSSMatrix('scale(1)')).objEq(Mat33.identity);
expect(Mat33.fromCSSMatrix('scale(0.4)')).objEq(Mat33.scaling2D(0.4));
expect(Mat33.fromCSSMatrix('scale(-0.4 )')).objEq(Mat33.scaling2D(-0.4));
expect(Mat33.fromCSSMatrix('scale(100%)')).objEq(Mat33.identity);
expect(Mat33.fromCSSMatrix('scale(20e2%)')).objEq(Mat33.scaling2D(20));
expect(Mat33.fromCSSMatrix('scale(200%) scale(50%)')).objEq(Mat33.identity);
});
it('should convert scale()s with two arguments', () => {
expect(Mat33.fromCSSMatrix('scale(1\t 1)')).objEq(Mat33.identity);
expect(Mat33.fromCSSMatrix('scale(1\t 2)')).objEq(Mat33.scaling2D(Vec2.of(1, 2)));
expect(Mat33.fromCSSMatrix('scale(1\t 2) scale(1)')).objEq(Mat33.scaling2D(Vec2.of(1, 2)));
});
it('should convert translate()s', () => {
expect(Mat33.fromCSSMatrix('translate(0)')).objEq(Mat33.identity);
expect(Mat33.fromCSSMatrix('translate(1, 1)')).objEq(Mat33.translation(Vec2.of(1, 1)));
expect(Mat33.fromCSSMatrix('translate(1 200%)')).objEq(Mat33.translation(Vec2.of(1, 2)));
});
it('should support px following numbers', () => {
expect(Mat33.fromCSSMatrix('translate(1px, 2px)')).objEq(Mat33.translation(Vec2.of(1, 2)));
});
});