1
0
ergogen/test/unit/point.js

120 lines
4.1 KiB
JavaScript

const m = require('makerjs')
const Point = require('../../src/point')
const {check} = require('../helpers/point')
describe('Point', function() {
it('construction', function() {
// increasingly verbose parametrization
check(new Point(), [0, 0, 0, {}])
check(new Point(1), [1, 0, 0, {}])
check(new Point(1, 2), [1, 2, 0, {}])
check(new Point(1, 2, 3), [1, 2, 3, {}])
check(new Point(1, 2, 3, {arst: 'neio'}), [1, 2, 3, {arst: 'neio'}])
// point-like instantiation
check(new Point([1, 2]), [1, 2, 0, {}])
})
it('access', function() {
// getting and setting through the virtual `p` field
const p = new Point(1, 2)
p.p.should.deep.equal([1, 2])
p.p = [3, 4]
p.p.should.deep.equal([3, 4])
})
it('cloning', function() {
const p = new Point(1, 2)
const clone = p.clone()
// make sure cloning works
check(clone, [1, 2, 0, {}])
clone.p = [3, 4]
// and make sure it's then independent of the original
check(p, [1, 2, 0, {}])
check(clone, [3, 4, 0, {}])
})
it('shifting', function() {
const p = new Point(0, 0, -90) // at origin, "looking right"
// non-relative shift up and left, should be up and left
check(p.clone().shift([-1, 1], false), [-1, 1, -90, {}])
// relative shift up and left, should be up and right
check(p.clone().shift([-1, 1]), [1, 1, -90, {}])
})
it('rotation', function() {
const p = new Point(0, 1, 0) // above origin, "looking up"
// around default origin
check(p.clone().rotate(-90), [1, 0, -90, {}])
// around custom origin
check(p.clone().rotate(-90, [1, 1]), [1, 2, -90, {}])
})
it('resistance', function() {
const p = new Point(0, 0, 0, {mirrored: true}) // origin, but mirrored
// non-relative shift up and left, mirroring changes it to up and right
check(p.clone().shift([-1, 1], false), [1, 1, 0, {mirrored: true}])
// ...but resistance keeps it up and left
check(p.clone().shift([-1, 1], false, true), [-1, 1, 0, {mirrored: true}])
// mirroring changes rotation direction, too
check(p.clone().rotate(-90), [0, 0, 90, {mirrored: true}])
// ...but not when resistance is applied
check(p.clone().rotate(-90, false, true), [0, 0, -90, {mirrored: true}])
})
it('mirroring', function() {
const p = new Point(0, 1, 0)
// make sure mirroring inverts rotation, as well as positions correctly
check((new Point(-1, 0, 10)).mirror(0), [1, 0, -10, {}])
})
it('positioning', function() {
const p = new Point(1, 1, -90) // above origin, "looking right"
const model = {
paths: {
line: new m.paths.Line([0, 0], [0, 1]),
}
}
// it's both rotated and shifted to the correct position
p.position(model).should.deep.equal({
paths: {
line: {
type: 'line',
origin: [0, 0],
end: [1, 0]
}
},
origin: [1, 1]
})
// `rect` does the same, only with built-in rectangles
const expected_rect = {
origin: [-6, -6],
paths: {
bottom: {
end: [0, 14],
origin: [0, 0],
type: 'line'
},
left: {
end: [14, 14],
origin: [0, 14],
type: 'line'
},
right: {
end: [0, 0],
origin: [14, 0],
type: 'line'
},
top: {
end: [14, 0],
origin: [14, 14],
type: 'line'
}
}
}
p.rect(14).should.deep.equal(expected_rect)
// default size is 14 for keyboard hole reasons
p.rect().should.deep.equal(expected_rect)
})
})