wip(core): Draft fixes and testing
This commit is contained in:
parent
c72c1ec485
commit
032b2d6e3c
4 changed files with 486 additions and 525 deletions
|
@ -181,8 +181,409 @@ describe('Pattern', () => {
|
|||
expect(pattern.config.draftOrder[2]).to.equal('test.partC')
|
||||
})
|
||||
|
||||
})
|
||||
// I am aware this does too much for one unit test, but this is to simplify TDD
|
||||
// we can split it up later
|
||||
it('Pattern.init() should resolve nested injections', () => {
|
||||
const partA = {
|
||||
name: 'partA',
|
||||
options: { optionA: { bool: true } },
|
||||
measurements: ['measieA'],
|
||||
optionalMeasurements: ['optmeasieA'],
|
||||
draft: (part) => {
|
||||
const { points, Point, paths, Path } = part.shorthand()
|
||||
points.a1 = new Point(1, 1)
|
||||
points.a2 = new Point(11, 11)
|
||||
paths.a = new Path().move(points.a1).line(points.a2)
|
||||
return part
|
||||
},
|
||||
}
|
||||
const partB = {
|
||||
name: 'partB',
|
||||
from: partA,
|
||||
options: { optionB: { pct: 12, min: 2, max: 20 } },
|
||||
measurements: ['measieB'],
|
||||
optionalMeasurements: ['optmeasieB', 'measieA'],
|
||||
draft: (part) => {
|
||||
const { points, Point, paths, Path } = part.shorthand()
|
||||
points.b1 = new Point(2, 2)
|
||||
points.b2 = new Point(22, 22)
|
||||
paths.b = new Path().move(points.b1).line(points.b2)
|
||||
return part
|
||||
},
|
||||
}
|
||||
const partC = {
|
||||
name: 'partC',
|
||||
from: partB,
|
||||
options: { optionC: { deg: 5, min: 0, max: 15 } },
|
||||
measurements: ['measieC'],
|
||||
optionalMeasurements: ['optmeasieC', 'measieA'],
|
||||
draft: (part) => {
|
||||
const { points, Point, paths, Path } = part.shorthand()
|
||||
points.c1 = new Point(3, 3)
|
||||
points.c2 = new Point(33, 33)
|
||||
paths.c = new Path().move(points.c1).line(points.c2)
|
||||
return part
|
||||
},
|
||||
}
|
||||
const partR = {
|
||||
// R for runtime, which is when this wil be attached
|
||||
name: 'partR',
|
||||
from: partA,
|
||||
after: partC,
|
||||
options: { optionR: { dflt: 'red', list: ['red', 'green', 'blue'] } },
|
||||
measurements: ['measieR'],
|
||||
optionalMeasurements: ['optmeasieR', 'measieA'],
|
||||
draft: (part) => {
|
||||
const { points, Point, paths, Path } = part.shorthand()
|
||||
points.r1 = new Point(4, 4)
|
||||
points.r2 = new Point(44, 44)
|
||||
paths.r = new Path().move(points.r1).line(points.r2)
|
||||
return part
|
||||
},
|
||||
}
|
||||
|
||||
const design = new Design({ parts: [partC] })
|
||||
const pattern = new design().addPart(partR).draft()
|
||||
// Measurements
|
||||
expect(pattern.config.measurements.length).to.equal(4)
|
||||
expect(pattern.config.measurements.indexOf('measieA') === -1).to.equal(false)
|
||||
expect(pattern.config.measurements.indexOf('measieB') === -1).to.equal(false)
|
||||
expect(pattern.config.measurements.indexOf('measieC') === -1).to.equal(false)
|
||||
expect(pattern.config.measurements.indexOf('measieR') === -1).to.equal(false)
|
||||
// Optional measurements
|
||||
expect(pattern.config.optionalMeasurements.length).to.equal(4)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('optmeasieA') === -1).to.equal(false)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('optmeasieB') === -1).to.equal(false)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('optmeasieC') === -1).to.equal(false)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('optmeasieR') === -1).to.equal(false)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('measieA') === -1).to.equal(true)
|
||||
// Options
|
||||
expect(pattern.config.options.optionA.bool).to.equal(true)
|
||||
expect(pattern.config.options.optionB.pct).to.equal(12)
|
||||
expect(pattern.config.options.optionB.min).to.equal(2)
|
||||
expect(pattern.config.options.optionB.max).to.equal(20)
|
||||
expect(pattern.config.options.optionC.deg).to.equal(5)
|
||||
expect(pattern.config.options.optionC.min).to.equal(0)
|
||||
expect(pattern.config.options.optionC.max).to.equal(15)
|
||||
expect(pattern.config.options.optionR.dflt).to.equal('red')
|
||||
expect(pattern.config.options.optionR.list[0]).to.equal('red')
|
||||
expect(pattern.config.options.optionR.list[1]).to.equal('green')
|
||||
expect(pattern.config.options.optionR.list[2]).to.equal('blue')
|
||||
// Dependencies
|
||||
expect(pattern.__dependencies.partB[0]).to.equal('partA')
|
||||
expect(pattern.__dependencies.partC[0]).to.equal('partB')
|
||||
expect(pattern.__dependencies.partR[0]).to.equal('partC')
|
||||
expect(pattern.__dependencies.partR[1]).to.equal('partA')
|
||||
// Inject
|
||||
expect(pattern.__inject.partB).to.equal('partA')
|
||||
expect(pattern.__inject.partC).to.equal('partB')
|
||||
expect(pattern.__inject.partR).to.equal('partA')
|
||||
// Draft order
|
||||
expect(pattern.config.draftOrder[0]).to.equal('partA')
|
||||
expect(pattern.config.draftOrder[1]).to.equal('partB')
|
||||
expect(pattern.config.draftOrder[2]).to.equal('partC')
|
||||
expect(pattern.config.draftOrder[3]).to.equal('partR')
|
||||
// Points
|
||||
expect(pattern.parts.partA.points.a1.x).to.equal(1)
|
||||
expect(pattern.parts.partA.points.a1.y).to.equal(1)
|
||||
expect(pattern.parts.partA.points.a2.x).to.equal(11)
|
||||
expect(pattern.parts.partA.points.a2.y).to.equal(11)
|
||||
expect(pattern.parts.partB.points.b1.x).to.equal(2)
|
||||
expect(pattern.parts.partB.points.b1.y).to.equal(2)
|
||||
expect(pattern.parts.partB.points.b2.x).to.equal(22)
|
||||
expect(pattern.parts.partB.points.b2.y).to.equal(22)
|
||||
expect(pattern.parts.partC.points.c1.x).to.equal(3)
|
||||
expect(pattern.parts.partC.points.c1.y).to.equal(3)
|
||||
expect(pattern.parts.partC.points.c2.x).to.equal(33)
|
||||
expect(pattern.parts.partC.points.c2.y).to.equal(33)
|
||||
expect(pattern.parts.partR.points.r1.x).to.equal(4)
|
||||
expect(pattern.parts.partR.points.r1.y).to.equal(4)
|
||||
expect(pattern.parts.partR.points.r2.x).to.equal(44)
|
||||
expect(pattern.parts.partR.points.r2.y).to.equal(44)
|
||||
// Paths in partA
|
||||
expect(pattern.parts.partA.paths.a.ops[0].to.x).to.equal(1)
|
||||
expect(pattern.parts.partA.paths.a.ops[0].to.y).to.equal(1)
|
||||
expect(pattern.parts.partA.paths.a.ops[1].to.x).to.equal(11)
|
||||
expect(pattern.parts.partA.paths.a.ops[1].to.y).to.equal(11)
|
||||
// Paths in partB
|
||||
expect(pattern.parts.partB.paths.a.ops[0].to.x).to.equal(1)
|
||||
expect(pattern.parts.partB.paths.a.ops[0].to.y).to.equal(1)
|
||||
expect(pattern.parts.partB.paths.a.ops[1].to.x).to.equal(11)
|
||||
expect(pattern.parts.partB.paths.a.ops[1].to.y).to.equal(11)
|
||||
expect(pattern.parts.partB.paths.b.ops[0].to.x).to.equal(2)
|
||||
expect(pattern.parts.partB.paths.b.ops[0].to.y).to.equal(2)
|
||||
expect(pattern.parts.partB.paths.b.ops[1].to.x).to.equal(22)
|
||||
expect(pattern.parts.partB.paths.b.ops[1].to.y).to.equal(22)
|
||||
// Paths in partC
|
||||
expect(pattern.parts.partC.paths.a.ops[0].to.x).to.equal(1)
|
||||
expect(pattern.parts.partC.paths.a.ops[0].to.y).to.equal(1)
|
||||
expect(pattern.parts.partC.paths.a.ops[1].to.x).to.equal(11)
|
||||
expect(pattern.parts.partC.paths.a.ops[1].to.y).to.equal(11)
|
||||
expect(pattern.parts.partC.paths.b.ops[0].to.x).to.equal(2)
|
||||
expect(pattern.parts.partC.paths.b.ops[0].to.y).to.equal(2)
|
||||
expect(pattern.parts.partC.paths.b.ops[1].to.x).to.equal(22)
|
||||
expect(pattern.parts.partC.paths.b.ops[1].to.y).to.equal(22)
|
||||
expect(pattern.parts.partC.paths.c.ops[0].to.x).to.equal(3)
|
||||
expect(pattern.parts.partC.paths.c.ops[0].to.y).to.equal(3)
|
||||
expect(pattern.parts.partC.paths.c.ops[1].to.x).to.equal(33)
|
||||
expect(pattern.parts.partC.paths.c.ops[1].to.y).to.equal(33)
|
||||
// Paths in partR
|
||||
expect(pattern.parts.partC.paths.a.ops[0].to.x).to.equal(1)
|
||||
expect(pattern.parts.partC.paths.a.ops[0].to.y).to.equal(1)
|
||||
expect(pattern.parts.partC.paths.a.ops[1].to.x).to.equal(11)
|
||||
expect(pattern.parts.partC.paths.a.ops[1].to.y).to.equal(11)
|
||||
expect(pattern.parts.partR.paths.r.ops[0].to.x).to.equal(4)
|
||||
expect(pattern.parts.partR.paths.r.ops[0].to.y).to.equal(4)
|
||||
expect(pattern.parts.partR.paths.r.ops[1].to.x).to.equal(44)
|
||||
expect(pattern.parts.partR.paths.r.ops[1].to.y).to.equal(44)
|
||||
})
|
||||
|
||||
it('Pattern.init() should resolve nested dependencies', () => {
|
||||
const partA = {
|
||||
name: 'partA',
|
||||
options: { optionA: { bool: true } },
|
||||
measurements: ['measieA'],
|
||||
optionalMeasurements: ['optmeasieA'],
|
||||
draft: (part) => {
|
||||
const { points, Point, paths, Path } = part.shorthand()
|
||||
points.a1 = new Point(1, 1)
|
||||
points.a2 = new Point(11, 11)
|
||||
paths.a = new Path().move(points.a1).line(points.a2)
|
||||
return part
|
||||
},
|
||||
}
|
||||
const partB = {
|
||||
name: 'partB',
|
||||
from: partA,
|
||||
options: { optionB: { pct: 12, min: 2, max: 20 } },
|
||||
measurements: ['measieB'],
|
||||
optionalMeasurements: ['optmeasieB', 'measieA'],
|
||||
draft: (part) => {
|
||||
const { points, Point, paths, Path } = part.shorthand()
|
||||
points.b1 = new Point(2, 2)
|
||||
points.b2 = new Point(22, 22)
|
||||
paths.b = new Path().move(points.b1).line(points.b2)
|
||||
return part
|
||||
},
|
||||
}
|
||||
const partC = {
|
||||
name: 'partC',
|
||||
from: partB,
|
||||
options: { optionC: { deg: 5, min: 0, max: 15 } },
|
||||
measurements: ['measieC'],
|
||||
optionalMeasurements: ['optmeasieC', 'measieA'],
|
||||
draft: (part) => {
|
||||
const { points, Point, paths, Path } = part.shorthand()
|
||||
points.c1 = new Point(3, 3)
|
||||
points.c2 = new Point(33, 33)
|
||||
paths.c = new Path().move(points.c1).line(points.c2)
|
||||
return part
|
||||
},
|
||||
}
|
||||
const partD = {
|
||||
name: 'partD',
|
||||
after: partC,
|
||||
options: { optionD: { dflt: 'red', list: ['red', 'green', 'blue'] } },
|
||||
measurements: ['measieD'],
|
||||
optionalMeasurements: ['optmeasieD', 'measieA'],
|
||||
draft: (part) => {
|
||||
const { points, Point, paths, Path } = part.shorthand()
|
||||
points.d1 = new Point(4, 4)
|
||||
points.d2 = new Point(44, 44)
|
||||
paths.d = new Path().move(points.d1).line(points.d2)
|
||||
return part
|
||||
},
|
||||
}
|
||||
const design = new Design({ parts: [partD] })
|
||||
const pattern = new design().draft()
|
||||
// Measurements
|
||||
expect(pattern.config.measurements.length).to.equal(4)
|
||||
expect(pattern.config.measurements.indexOf('measieA') === -1).to.equal(false)
|
||||
expect(pattern.config.measurements.indexOf('measieB') === -1).to.equal(false)
|
||||
expect(pattern.config.measurements.indexOf('measieC') === -1).to.equal(false)
|
||||
expect(pattern.config.measurements.indexOf('measieD') === -1).to.equal(false)
|
||||
// Optional measurements
|
||||
expect(pattern.config.optionalMeasurements.length).to.equal(4)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('optmeasieA') === -1).to.equal(false)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('optmeasieB') === -1).to.equal(false)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('optmeasieC') === -1).to.equal(false)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('optmeasieD') === -1).to.equal(false)
|
||||
expect(pattern.config.optionalMeasurements.indexOf('measieA') === -1).to.equal(true)
|
||||
// Options
|
||||
expect(pattern.config.options.optionA.bool).to.equal(true)
|
||||
expect(pattern.config.options.optionB.pct).to.equal(12)
|
||||
expect(pattern.config.options.optionB.min).to.equal(2)
|
||||
expect(pattern.config.options.optionB.max).to.equal(20)
|
||||
expect(pattern.config.options.optionC.deg).to.equal(5)
|
||||
expect(pattern.config.options.optionC.min).to.equal(0)
|
||||
expect(pattern.config.options.optionC.max).to.equal(15)
|
||||
expect(pattern.config.options.optionD.dflt).to.equal('red')
|
||||
expect(pattern.config.options.optionD.list[0]).to.equal('red')
|
||||
expect(pattern.config.options.optionD.list[1]).to.equal('green')
|
||||
expect(pattern.config.options.optionD.list[2]).to.equal('blue')
|
||||
// Dependencies
|
||||
expect(pattern.__dependencies.partB[0]).to.equal('partA')
|
||||
expect(pattern.__dependencies.partC[0]).to.equal('partB')
|
||||
expect(pattern.__dependencies.partD[0]).to.equal('partC')
|
||||
// Inject
|
||||
expect(pattern.__inject.partB).to.equal('partA')
|
||||
expect(pattern.__inject.partC).to.equal('partB')
|
||||
// Draft order
|
||||
expect(pattern.config.draftOrder[0]).to.equal('partA')
|
||||
expect(pattern.config.draftOrder[1]).to.equal('partB')
|
||||
expect(pattern.config.draftOrder[2]).to.equal('partC')
|
||||
expect(pattern.config.draftOrder[3]).to.equal('partD')
|
||||
// Points
|
||||
expect(pattern.parts.partA.points.a1.x).to.equal(1)
|
||||
expect(pattern.parts.partA.points.a1.y).to.equal(1)
|
||||
expect(pattern.parts.partA.points.a2.x).to.equal(11)
|
||||
expect(pattern.parts.partA.points.a2.y).to.equal(11)
|
||||
expect(pattern.parts.partB.points.b1.x).to.equal(2)
|
||||
expect(pattern.parts.partB.points.b1.y).to.equal(2)
|
||||
expect(pattern.parts.partB.points.b2.x).to.equal(22)
|
||||
expect(pattern.parts.partB.points.b2.y).to.equal(22)
|
||||
expect(pattern.parts.partC.points.c1.x).to.equal(3)
|
||||
expect(pattern.parts.partC.points.c1.y).to.equal(3)
|
||||
expect(pattern.parts.partC.points.c2.x).to.equal(33)
|
||||
expect(pattern.parts.partC.points.c2.y).to.equal(33)
|
||||
expect(pattern.parts.partD.points.d1.x).to.equal(4)
|
||||
expect(pattern.parts.partD.points.d1.y).to.equal(4)
|
||||
expect(pattern.parts.partD.points.d2.x).to.equal(44)
|
||||
expect(pattern.parts.partD.points.d2.y).to.equal(44)
|
||||
// Paths in partA
|
||||
expect(pattern.parts.partA.paths.a.ops[0].to.x).to.equal(1)
|
||||
expect(pattern.parts.partA.paths.a.ops[0].to.y).to.equal(1)
|
||||
expect(pattern.parts.partA.paths.a.ops[1].to.x).to.equal(11)
|
||||
expect(pattern.parts.partA.paths.a.ops[1].to.y).to.equal(11)
|
||||
// Paths in partB
|
||||
expect(pattern.parts.partB.paths.a.ops[0].to.x).to.equal(1)
|
||||
expect(pattern.parts.partB.paths.a.ops[0].to.y).to.equal(1)
|
||||
expect(pattern.parts.partB.paths.a.ops[1].to.x).to.equal(11)
|
||||
expect(pattern.parts.partB.paths.a.ops[1].to.y).to.equal(11)
|
||||
expect(pattern.parts.partB.paths.b.ops[0].to.x).to.equal(2)
|
||||
expect(pattern.parts.partB.paths.b.ops[0].to.y).to.equal(2)
|
||||
expect(pattern.parts.partB.paths.b.ops[1].to.x).to.equal(22)
|
||||
expect(pattern.parts.partB.paths.b.ops[1].to.y).to.equal(22)
|
||||
// Paths in partC
|
||||
expect(pattern.parts.partC.paths.a.ops[0].to.x).to.equal(1)
|
||||
expect(pattern.parts.partC.paths.a.ops[0].to.y).to.equal(1)
|
||||
expect(pattern.parts.partC.paths.a.ops[1].to.x).to.equal(11)
|
||||
expect(pattern.parts.partC.paths.a.ops[1].to.y).to.equal(11)
|
||||
expect(pattern.parts.partC.paths.b.ops[0].to.x).to.equal(2)
|
||||
expect(pattern.parts.partC.paths.b.ops[0].to.y).to.equal(2)
|
||||
expect(pattern.parts.partC.paths.b.ops[1].to.x).to.equal(22)
|
||||
expect(pattern.parts.partC.paths.b.ops[1].to.y).to.equal(22)
|
||||
expect(pattern.parts.partC.paths.c.ops[0].to.x).to.equal(3)
|
||||
expect(pattern.parts.partC.paths.c.ops[0].to.y).to.equal(3)
|
||||
expect(pattern.parts.partC.paths.c.ops[1].to.x).to.equal(33)
|
||||
expect(pattern.parts.partC.paths.c.ops[1].to.y).to.equal(33)
|
||||
// Paths in partR
|
||||
expect(pattern.parts.partD.paths.d.ops[0].to.x).to.equal(4)
|
||||
expect(pattern.parts.partD.paths.d.ops[0].to.y).to.equal(4)
|
||||
expect(pattern.parts.partD.paths.d.ops[1].to.x).to.equal(44)
|
||||
expect(pattern.parts.partD.paths.d.ops[1].to.y).to.equal(44)
|
||||
})
|
||||
|
||||
it('Pattern.init() should load a single plugin', () => {
|
||||
const plugin = {
|
||||
name: 'example',
|
||||
version: 1,
|
||||
hooks: {
|
||||
preRender: function (svg, attributes) {
|
||||
svg.attributes.add('freesewing:plugin-example', version)
|
||||
},
|
||||
},
|
||||
}
|
||||
const part = {
|
||||
name: 'test.part',
|
||||
plugins: plugin,
|
||||
draft: (part) => part,
|
||||
}
|
||||
const design = new Design({ parts: [part] })
|
||||
const pattern = new design()
|
||||
pattern.init()
|
||||
expect(pattern.hooks.preRender.length).to.equal(1)
|
||||
})
|
||||
|
||||
it("Pattern.init() should load array of plugins", () => {
|
||||
const plugin1 = {
|
||||
name: "example1",
|
||||
version: 1,
|
||||
hooks: {
|
||||
preRender: function(svg, attributes) {
|
||||
svg.attributes.add("freesewing:plugin-example1", version);
|
||||
}
|
||||
}
|
||||
};
|
||||
const plugin2 = {
|
||||
name: "example2",
|
||||
version: 2,
|
||||
hooks: {
|
||||
preRender: function(svg, attributes) {
|
||||
svg.attributes.add("freesewing:plugin-example2", version);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const design = new Design( { plugins: [plugin1, plugin2] });
|
||||
const pattern = new design();
|
||||
pattern.init()
|
||||
expect(pattern.hooks.preRender.length).to.equal(2);
|
||||
});
|
||||
it("Pattern.init() should load conditional plugin", () => {
|
||||
const plugin = {
|
||||
name: "example",
|
||||
version: 1,
|
||||
hooks: {
|
||||
preRender: function(svg, attributes) {
|
||||
svg.attributes.add("freesewing:plugin-example", version);
|
||||
}
|
||||
}
|
||||
};
|
||||
const condition = () => true
|
||||
const design = new Design({ plugins: [ { plugin, condition } ] });
|
||||
const pattern = new design();
|
||||
pattern.init()
|
||||
expect(pattern.hooks.preRender.length).to.equal(1);
|
||||
});
|
||||
|
||||
it("Pattern.init() should not load conditional plugin", () => {
|
||||
const plugin = {
|
||||
name: "example",
|
||||
version: 1,
|
||||
hooks: {
|
||||
preRender: function(svg, attributes) {
|
||||
svg.attributes.add("freesewing:plugin-example", version);
|
||||
}
|
||||
}
|
||||
};
|
||||
const condition = () => false
|
||||
const design = new Design({ plugins: { plugin, condition } });
|
||||
const pattern = new design();
|
||||
expect(pattern.hooks.preRender.length).to.equal(0);
|
||||
});
|
||||
|
||||
it("Pattern.init() should load multiple conditional plugins", () => {
|
||||
const plugin = {
|
||||
name: "example",
|
||||
version: 1,
|
||||
hooks: {
|
||||
preRender: function(svg, attributes) {
|
||||
svg.attributes.add("freesewing:plugin-example", version);
|
||||
}
|
||||
}
|
||||
};
|
||||
const condition1 = () => true
|
||||
const condition2 = () => false
|
||||
const design = new Design({ plugins: [
|
||||
{ plugin, condition: condition1 },
|
||||
{ plugin, condition: condition2 },
|
||||
]});
|
||||
const pattern = new design();
|
||||
pattern.init()
|
||||
expect(pattern.hooks.preRender.length).to.equal(1);
|
||||
})
|
||||
})
|
||||
|
||||
describe('Pattern.settings', () => {
|
||||
|
||||
|
@ -235,6 +636,22 @@ describe('Pattern', () => {
|
|||
it('Pattern settings should contain bool options', () => {
|
||||
expect(pattern.settings.options.bool).to.equal(false)
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
it('Pattern should throw an error for an unknown option', () => {
|
||||
const part = {
|
||||
name: 'test.part',
|
||||
options: { unknown: { foo: 30 } },
|
||||
draft: () => { }
|
||||
}
|
||||
const Pattern = new Design({
|
||||
data: { name: 'test', version: '1.2.3' },
|
||||
parts: [ part ]
|
||||
})
|
||||
const pattern = new Pattern()
|
||||
expect(() => pattern.init()).to.throw()
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue