120 lines
4.1 KiB
JavaScript
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)
|
|
})
|
|
}) |