198 lines
4.9 KiB
JavaScript
198 lines
4.9 KiB
JavaScript
import expect from '../expect.js';
|
|
import {
|
|
ceil,
|
|
clamp,
|
|
floor,
|
|
lerp,
|
|
modulo,
|
|
round,
|
|
solveLinearSystem,
|
|
toDegrees,
|
|
toFixed,
|
|
toRadians,
|
|
} from '../../../src/ol/math.js';
|
|
|
|
describe('ol/math.js', () => {
|
|
describe('clamp', function () {
|
|
it('returns the correct value at -Infinity', function () {
|
|
expect(clamp(-Infinity, 10, 20)).to.eql(10);
|
|
});
|
|
|
|
it('returns the correct value at min', function () {
|
|
expect(clamp(10, 10, 20)).to.eql(10);
|
|
});
|
|
|
|
it('returns the correct value at mid point', function () {
|
|
expect(clamp(15, 10, 20)).to.eql(15);
|
|
});
|
|
|
|
it('returns the correct value at max', function () {
|
|
expect(clamp(20, 10, 20)).to.eql(20);
|
|
});
|
|
|
|
it('returns the correct value at Infinity', function () {
|
|
expect(clamp(Infinity, 10, 20)).to.eql(20);
|
|
});
|
|
});
|
|
|
|
describe('solveLinearSystem', function () {
|
|
it('calculates correctly', function () {
|
|
const result = solveLinearSystem([
|
|
[2, 1, 3, 1],
|
|
[2, 6, 8, 3],
|
|
[6, 8, 18, 5],
|
|
]);
|
|
expect(result[0]).to.roughlyEqual(0.3, 1e-9);
|
|
expect(result[1]).to.roughlyEqual(0.4, 1e-9);
|
|
expect(result[2]).to.roughlyEqual(0, 1e-9);
|
|
});
|
|
|
|
it('can handle singular matrix', function () {
|
|
const result = solveLinearSystem([
|
|
[2, 1, 3, 1],
|
|
[2, 6, 8, 3],
|
|
[2, 1, 3, 1],
|
|
]);
|
|
expect(result).to.be(null);
|
|
});
|
|
});
|
|
|
|
describe('toDegrees', function () {
|
|
it('returns the correct value at -π', function () {
|
|
expect(toDegrees(-Math.PI)).to.be(-180);
|
|
});
|
|
it('returns the correct value at 0', function () {
|
|
expect(toDegrees(0)).to.be(0);
|
|
});
|
|
it('returns the correct value at π', function () {
|
|
expect(toDegrees(Math.PI)).to.be(180);
|
|
});
|
|
});
|
|
|
|
describe('toRadians', function () {
|
|
it('returns the correct value at -180', function () {
|
|
expect(toRadians(-180)).to.be(-Math.PI);
|
|
});
|
|
it('returns the correct value at 0', function () {
|
|
expect(toRadians(0)).to.be(0);
|
|
});
|
|
it('returns the correct value at 180', function () {
|
|
expect(toRadians(180)).to.be(Math.PI);
|
|
});
|
|
});
|
|
|
|
describe('modulo', function () {
|
|
it('256 / 8 returns 0', function () {
|
|
expect(modulo(256, 8)).to.be(0);
|
|
});
|
|
it('positive and positive returns a positive ', function () {
|
|
expect(modulo(7, 8)).to.be(7);
|
|
});
|
|
it('same Dividend and Divisor returns 0', function () {
|
|
expect(modulo(4, 4)).to.be(0);
|
|
});
|
|
it('negative and positive returns positive', function () {
|
|
expect(modulo(-3, 4)).to.be(1);
|
|
});
|
|
it('negative and negative returns negative', function () {
|
|
expect(modulo(-4, -5)).to.be(-4);
|
|
expect(modulo(-3, -4)).to.be(-3);
|
|
});
|
|
it('positive and negative returns negative', function () {
|
|
expect(modulo(3, -4)).to.be(-1);
|
|
expect(modulo(1, -5)).to.be(-4);
|
|
expect(modulo(6, -5)).to.be(-4);
|
|
});
|
|
});
|
|
|
|
describe('lerp', function () {
|
|
it('correctly interpolated numbers', function () {
|
|
expect(lerp(0, 0, 0)).to.be(0);
|
|
expect(lerp(0, 1, 0)).to.be(0);
|
|
expect(lerp(1, 11, 5)).to.be(51);
|
|
});
|
|
it('correctly interpolates floats', function () {
|
|
expect(lerp(0, 1, 0.5)).to.be(0.5);
|
|
expect(lerp(0.25, 0.75, 0.5)).to.be(0.5);
|
|
});
|
|
});
|
|
|
|
describe('toFixed', () => {
|
|
it('returns a number with a limited number of decimals', () => {
|
|
expect(toFixed(0.123456789, 3)).to.be(0.123);
|
|
});
|
|
|
|
it('rounds up', () => {
|
|
expect(toFixed(0.123456789, 4)).to.be(0.1235);
|
|
});
|
|
|
|
const cases = [
|
|
[1.23456789, 0],
|
|
[1.23456789, 1],
|
|
[1.23456789, 2],
|
|
[1.23456789, 3],
|
|
[1.23456789, 4],
|
|
[1.23456789, 5],
|
|
[1.23456789, 6],
|
|
[1.23456789, 7],
|
|
[1.23456789, 8],
|
|
[1.23456789, 9],
|
|
[1.23456789, 10],
|
|
];
|
|
for (const c of cases) {
|
|
it(`provides numeric equivalent of (${c[0]}).toFixed(${c[1]})`, () => {
|
|
const string = c[0].toFixed(c[1]);
|
|
const expected = parseFloat(string);
|
|
const actual = toFixed(c[0], c[1]);
|
|
expect(actual).to.be(expected);
|
|
});
|
|
}
|
|
});
|
|
|
|
describe('round', () => {
|
|
const cases = [
|
|
[1.23, 2, 1],
|
|
[3.45, 1, 4],
|
|
[3.45, 2, 3],
|
|
[-3.45, 1, -3],
|
|
[-3.45, 2, -3],
|
|
];
|
|
|
|
for (const c of cases) {
|
|
it(`works for round(${c[0]}, ${c[1]})`, () => {
|
|
expect(round(c[0], c[1])).to.be(c[2]);
|
|
});
|
|
}
|
|
});
|
|
|
|
describe('floor', () => {
|
|
const cases = [
|
|
[3.999, 4, 3],
|
|
[3.999, 2, 4],
|
|
[-3.01, 2, -4],
|
|
[-3.01, 1, -3],
|
|
];
|
|
|
|
for (const c of cases) {
|
|
it(`works for floor(${c[0]}, ${c[1]})`, () => {
|
|
expect(floor(c[0], c[1])).to.be(c[2]);
|
|
});
|
|
}
|
|
});
|
|
|
|
describe('ceil', () => {
|
|
const cases = [
|
|
[4.001, 4, 5],
|
|
[4.001, 2, 4],
|
|
[-3.99, 3, -3],
|
|
[-3.99, 1, -4],
|
|
];
|
|
|
|
for (const c of cases) {
|
|
it(`works for ceil(${c[0]}, ${c[1]})`, () => {
|
|
expect(ceil(c[0], c[1])).to.be(c[2]);
|
|
});
|
|
}
|
|
});
|
|
});
|