1
0
Fork 0

wip(core): Migrated to named exports only

This commit is contained in:
Joost De Cock 2022-08-28 02:14:39 +02:00
parent 4b12a7330c
commit c09ae4aa69
23 changed files with 592 additions and 557 deletions

View file

@ -1,4 +1,4 @@
function Attributes() {
export function Attributes() {
this.list = {}
}
@ -103,4 +103,3 @@ Attributes.prototype.clone = function () {
return clone
}
export default Attributes

View file

@ -1,4 +1,4 @@
import Pattern from './pattern.mjs'
import { Pattern } from './pattern.mjs'
import { addPartConfig } from './utils.mjs'
@ -6,7 +6,7 @@ import { addPartConfig } from './utils.mjs'
* The Design constructor. Returns a Pattern constructor
* So it's sort of a super-constructor
*/
export default function Design(config) {
export function Design(config) {
// Merge config with defaults
config = {

View file

@ -1,4 +1,4 @@
export default function Hooks() {
export function Hooks() {
return {
preDraft: [],
postDraft: [],

View file

@ -1,42 +1,78 @@
import Design from './design.mjs'
import Pattern from './pattern.mjs'
import Point from './point.mjs'
import Path from './path.mjs'
import Snippet from './snippet.mjs'
import * as utils from './utils.mjs'
import pkg from '../package.json' assert { type: 'json' }
const { version } = pkg
/*
* Named exports will become the default in FreeSewing v3
*/
export {
version,
Design,
Pattern,
Point,
Path,
Snippet,
utils,
}
// This is a helper for configuration files
export const pctBasedOn = utils.pctBasedOn
// This is a helper for manual layouts
export const generatePartTransform = utils.generatePartTransform
/*
* Default exports will be removed in FreeSewing v3
*/
export default {
version,
Design,
Pattern,
Point,
Path,
Snippet,
utils,
import { Attributes } from './attributes.mjs'
import { Design } from './design.mjs'
import { Pattern } from './pattern.mjs'
import { Point } from './point.mjs'
import { Path } from './path.mjs'
import { Snippet } from './snippet.mjs'
import {
isCoord,
capitalize,
beamsIntersect,
linesIntersect,
pointOnBeam,
pointOnLine,
pointOnCurve,
splitCurve,
beamIntersectsX,
beamIntersectsY,
units,
lineIntersectsCurve,
curveIntersectsX,
curveIntersectsY,
curvesIntersect,
circlesIntersect,
beamIntersectsCircle,
lineIntersectsCircle,
curveEdge,
stretchToScale,
round,
sampleStyle,
deg2rad,
rad2deg,
pctBasedOn,
Bezier,
generatePartTransform,
macroName,
} from "./utils.mjs"
import { version } from '../package.json' assert { type: 'json' }
// Named exports
export {
Attributes,
Design,
Pattern,
Point,
Path,
Snippet,
Bezier,
version,
capitalize,
beamsIntersect,
linesIntersect,
pointOnBeam,
pointOnLine,
pointOnCurve,
splitCurve,
beamIntersectsX,
beamIntersectsY,
units,
lineIntersectsCurve,
curveIntersectsX,
curveIntersectsY,
curvesIntersect,
circlesIntersect,
beamIntersectsCircle,
lineIntersectsCircle,
curveEdge,
stretchToScale,
round,
sampleStyle,
deg2rad,
rad2deg,
pctBasedOn,
generatePartTransform,
macroName,
isCoord
}

View file

@ -1,4 +1,4 @@
function Option(config) {
export function Option(config) {
this.id = config.id
this.config = config
this.val = config.val
@ -6,4 +6,3 @@ function Option(config) {
return this
}
export default Option

View file

@ -1,11 +1,11 @@
import { Attributes } from './attributes.mjs'
import * as utils from './utils.mjs'
import Point from './point.mjs'
import Path from './path.mjs'
import Snippet from './snippet.mjs'
import Attributes from './attributes.mjs'
import Hooks from './hooks.mjs'
import { Point } from './point.mjs'
import { Path } from './path.mjs'
import { Snippet } from './snippet.mjs'
import { Hooks } from './hooks.mjs'
function Part() {
export function Part() {
this.attributes = new Attributes()
this.points = {}
this.paths = {}

View file

@ -1,5 +1,5 @@
import Attributes from './attributes.mjs'
import Point from './point.mjs'
import { Attributes } from './attributes.mjs'
import { Point } from './point.mjs'
import { Bezier } from 'bezier-js'
import {
linesIntersect,
@ -11,7 +11,7 @@ import {
round,
} from './utils.mjs'
function Path(debug = false) {
export function Path(debug = false) {
this.render = true
this.topLeft = false
this.bottomRight = false
@ -913,4 +913,3 @@ Path.prototype.translate = function (x, y) {
return clone
}
export default Path

View file

@ -1,23 +1,28 @@
import { Attributes } from './attributes.mjs'
import pack from 'bin-pack'
import {
macroName,
sampleStyle,
capitalize,
decoratePartDependency,
addPartConfig,
mergeDependencies,
} from './utils.mjs'
import Part from './part.mjs'
import Point from './point.mjs'
import Path from './path.mjs'
import Snippet from './snippet.mjs'
import Svg from './svg.mjs'
import Store from './store.mjs'
import Hooks from './hooks.mjs'
import Attributes from './attributes.mjs'
import { Part } from './part.mjs'
import { Point } from './point.mjs'
import { Path } from './path.mjs'
import { Snippet } from './snippet.mjs'
import { Svg } from './svg.mjs'
import { Store } from './store.mjs'
import { Hooks } from './hooks.mjs'
import { version } from '../package.json' assert { type: 'json' }
export default function Pattern(config = { options: {} }) {
/*
* Makes sure an object passed to be attached as a part it not merely a method
*/
const decoratePartDependency = (obj, name) => (typeof obj === 'function') ? { draft: obj, name } : obj
export function Pattern(config = { options: {} }) {
// Apply default settings
this.settings = {

View file

@ -1,6 +1,6 @@
import Attributes from './attributes.mjs'
import { Attributes } from './attributes.mjs'
function Point(x, y, debug = false) {
export function Point(x, y, debug = false) {
this.x = x
this.y = y
this.attributes = new Attributes()
@ -249,4 +249,3 @@ Point.prototype.setCircle = function (radius = false, className=false) {
return this
}
export default Point

View file

@ -1,6 +1,6 @@
import Attributes from './attributes.mjs'
import { Attributes } from './attributes.mjs'
function Snippet(def, anchor, debug = false) {
export function Snippet(def, anchor, debug = false) {
this.def = def
this.anchor = anchor
this.attributes = new Attributes()
@ -31,4 +31,3 @@ Snippet.prototype.clone = function () {
return clone
}
export default Snippet

View file

@ -1,21 +0,0 @@
import Path from './path'
/** Splits a curve on a point */
export default function splitCurve(start, cp1, cp2, end, split) {
let [c1, c2] = new Path().move(start).curve(cp1, cp2, end).split(split)
return [
{
start: c1.ops[0].to,
cp1: c1.ops[1].cp1,
cp2: c1.ops[1].cp2,
end: c1.ops[1].to,
},
{
start: c2.ops[0].to,
cp1: c2.ops[1].cp1,
cp2: c2.ops[1].cp2,
end: c2.ops[1].to,
},
]
}

View file

@ -1,4 +1,4 @@
function Store(raise) {
export function Store(raise) {
this.data = new Map()
this.raise = raise
}
@ -20,4 +20,3 @@ Store.prototype.get = function (key) {
return this.data.get(key)
}
export default Store

View file

@ -1,8 +1,8 @@
import Attributes from './attributes.mjs'
import { Attributes } from './attributes.mjs'
import { round } from './utils.mjs'
import pkg from '../package.json'
import { version } from '../package.json'
function Svg(pattern) {
export function Svg(pattern) {
this.openGroups = []
this.layout = {}
this.freeId = 0
@ -23,7 +23,7 @@ function Svg(pattern) {
this.attributes.add('xmlns:xlink', 'http://www.w3.org/1999/xlink')
this.attributes.add('xml:lang', pattern.settings.locale)
this.attributes.add('xmlns:freesewing', 'http://freesewing.org/namespaces/freesewing')
this.attributes.add('freesewing', pkg.version)
this.attributes.add('freesewing', version)
}
Svg.prototype.runHooks = function (hookName, data = false) {
@ -312,4 +312,3 @@ Svg.prototype.getId = function () {
return '' + this.freeId
}
export default Svg

View file

@ -1,6 +1,6 @@
import { Bezier } from 'bezier-js'
import Path from './path.mjs'
import Point from './point.mjs'
import { Path } from './path.mjs'
import { Point } from './point.mjs'
export function capitalize(string) {
return string.charAt(0).toUpperCase() + string.slice(1)
@ -410,11 +410,6 @@ export const generatePartTransform = (x, y, rotate, flipX, flipY, part) => {
}
}
/*
* Makes sure an object passed to be attached as a part it not merely a method
*/
export const decoratePartDependency = (obj, name) => (typeof obj === 'function') ? { draft: obj, name } : obj
// Add part-level options
const addPartOptions = (part, config) => {
if (part.options) {
@ -432,6 +427,7 @@ const addPartOptions = (part, config) => {
return config
}
/*
// Helper method for detecting a array with only strings
const isStringArray = val => (Array.isArray(val) && val.length > 0)
? val.reduce((prev=true, cur) => (prev && typeof cur === 'string'))
@ -473,7 +469,7 @@ const mergeOptionGroups = (cur, add) => {
return cur
}
*/
// Add part-level optionGroups
const addPartOptionGroups = (part, config) => {
if (typeof config.optionGroups === 'undefined') {

View file

@ -1,11 +1,11 @@
import chai from "chai"
import freesewing from "./dist/index.mjs"
import { Design } from "./dist/index.mjs"
const expect = chai.expect
describe('Design', () => {
it("Design constructor should return pattern constructor", () => {
const design = new freesewing.Design({
const design = new Design({
foo: "bar",
options: {
constant: 2,
@ -35,7 +35,7 @@ describe('Design', () => {
}
};
let design = new freesewing.Design({plugins: plugin});
let design = new Design({plugins: plugin});
let pattern = new design();
expect(pattern.hooks.preRender.length).to.equal(1);
});
@ -60,7 +60,7 @@ describe('Design', () => {
}
};
let design = new freesewing.Design( { plugins: [plugin1, plugin2] });
let design = new Design( { plugins: [plugin1, plugin2] });
let pattern = new design();
expect(pattern.hooks.preRender.length).to.equal(2);
});
@ -76,7 +76,7 @@ describe('Design', () => {
}
};
const condition = () => true
const design = new freesewing.Design({ conditionalPlugins: { plugin, condition } });
const design = new Design({ conditionalPlugins: { plugin, condition } });
const pattern = new design();
expect(pattern.hooks.preRender.length).to.equal(1);
});
@ -92,7 +92,7 @@ describe('Design', () => {
}
};
const condition = () => false
const design = new freesewing.Design({ conditionalPlugins: { plugin, condition } });
const design = new Design({ conditionalPlugins: { plugin, condition } });
const pattern = new design();
expect(pattern.hooks.preRender.length).to.equal(0);
});
@ -109,7 +109,7 @@ describe('Design', () => {
};
const condition1 = () => true
const condition2 = () => false
const design = new freesewing.Design({ conditionalPlugins: [
const design = new Design({ conditionalPlugins: [
{ plugin, condition: condition1 },
{ plugin, condition: condition2 },
]});
@ -203,7 +203,7 @@ describe('Design', () => {
*/
it("Pattern constructor should add default hide() method to options", () => {
const design = new freesewing.Design({
const design = new Design({
foo: "bar",
options: {
constant: 2,

View file

@ -1,11 +1,11 @@
import chai from "chai"
import freesewing from "./dist/index.mjs"
import { Pattern, Path } from "./dist/index.mjs"
const expect = chai.expect
describe('Part', () => {
it("Svg constructor should initialize object", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
expect(part.paths).to.eql({});
expect(part.snippets).to.eql({});
@ -18,20 +18,20 @@ describe('Part', () => {
});
it("Should return a function from macroClosure", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
expect(typeof part.macroClosure()).to.equal("function");
});
it("Should not run an unknown macro", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
let macro = part.macroClosure();
expect(macro("unknown")).to.equal(undefined);
});
it("Should register and run a macro", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let plugin = {
name: "test",
version: "0.1-test",
@ -51,20 +51,20 @@ describe('Part', () => {
});
it("Should return a free ID", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
let free = part.getId();
expect(part.getId()).to.equal("" + (parseInt(free) + 1));
});
it("Should return a function from unitsClosure", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
expect(typeof part.unitsClosure()).to.equal("function");
});
it("Should convert units", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
let units = part.unitsClosure();
expect(units(123.456)).to.equal("12.35cm");
@ -72,7 +72,7 @@ describe('Part', () => {
});
it("Should set part attributes", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.attr("foo", "bar");
expect(part.attributes.get("foo")).to.equal("bar");
@ -83,12 +83,12 @@ describe('Part', () => {
});
it("Should inject a part", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.points.a = new part.Point(12, 23);
part.points.b = new part.Point(10, 10);
part.points.c = new part.Point(20, 20);
part.paths.bar = new freesewing.Path()
part.paths.bar = new Path()
.move(part.points.a)
.line(part.points.b)
.curve(part.points.c, part.points.b, part.points.a)
@ -109,7 +109,7 @@ describe('Part', () => {
});
it("Should return shorthand", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.mode = "draft";
pattern.settings.paperless = true;
let part = new pattern.Part();
@ -119,7 +119,7 @@ describe('Part', () => {
});
it("Should raise a warning when setting a non-Point value in points", () => {
const pattern = new freesewing.Pattern();
const pattern = new Pattern();
pattern.settings.mode = "draft";
const part = new pattern.Part();
const { points } = part.shorthand()
@ -131,7 +131,7 @@ describe('Part', () => {
});
it("Should raise a warning when setting a non-Snippet value in snippets", () => {
const pattern = new freesewing.Pattern();
const pattern = new Pattern();
pattern.settings.mode = "draft";
const part = new pattern.Part();
const { snippets } = part.shorthand()
@ -143,7 +143,7 @@ describe('Part', () => {
});
it("Should calculate the part boundary with default margin", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.mode = "draft";
let part = new pattern.Part();
let short = part.shorthand();
@ -163,7 +163,7 @@ describe('Part', () => {
});
it("Should calculate the part boundary with custom margin", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.mode = "draft";
pattern.settings.margin = 5;
let part = new pattern.Part();
@ -184,7 +184,7 @@ describe('Part', () => {
});
it("Should calculate the part boundary for paperless", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.mode = "draft";
pattern.settings.margin = 5;
pattern.settings.paperless = true;
@ -206,7 +206,7 @@ describe('Part', () => {
});
it("Should stack a part", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.mode = "draft";
let part = new pattern.Part();
let short = part.shorthand();
@ -220,7 +220,7 @@ describe('Part', () => {
});
it("Should only stack a part if needed", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.mode = "draft";
let part = new pattern.Part();
let short = part.shorthand();
@ -237,7 +237,7 @@ describe('Part', () => {
it("Should run hooks", () => {
let count = 0
const pattern = new freesewing.Pattern()
const pattern = new Pattern()
const part = new pattern.Part();
part.hooks.preDraft = [{ method: function(p) { count++ }} ]
part.runHooks('preDraft')
@ -245,7 +245,7 @@ describe('Part', () => {
});
it("Should get the units closure to raise a debug when passing a non-number", () => {
const pattern = new freesewing.Pattern();
const pattern = new Pattern();
pattern.settings.mode = "draft";
pattern.settings.debug = true
const part = new pattern.Part();
@ -256,7 +256,7 @@ describe('Part', () => {
});
it("Should generate the part transforms", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.mode = "draft";
let part = new pattern.Part();
let short = part.shorthand();
@ -278,7 +278,7 @@ describe('Part', () => {
it("Should add the part cut", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut(4, 'fabric', true)
expect(part.cut.materials.fabric.cut).to.equal(4)
@ -289,7 +289,7 @@ describe('Part', () => {
});
it("Should generate an error if cut is not a number", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut('a', 'fabric', true)
expect(pattern.events.error.length).to.equal(1)
@ -297,7 +297,7 @@ describe('Part', () => {
});
it("Should generate an warning if material is not a string", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut(3, 4)
expect(pattern.events.warning.length).to.equal(1)
@ -305,7 +305,7 @@ describe('Part', () => {
});
it("Should generate an error when removing a material that is not set (through addCut)", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut(4, 'fabric', true)
part.addCut(false, 'lining')
@ -314,7 +314,7 @@ describe('Part', () => {
});
it("Should remove the part cut through addCut", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut(4, 'fabric', true)
part.addCut(false, 'fabric')
@ -322,7 +322,7 @@ describe('Part', () => {
});
it("Should remove the part cut through removeCut", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut(4, 'fabric', true)
part.removeCut('fabric')
@ -330,7 +330,7 @@ describe('Part', () => {
});
it("Should generate an error when removing a material that is not set (through removeCut)", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut(4, 'fabric', true)
part.removeCut('lining')
@ -339,7 +339,7 @@ describe('Part', () => {
});
it("Should generate an error when removing a material that is not a string (through removeCut)", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut(4, 'fabric', true)
part.removeCut(23)
@ -348,7 +348,7 @@ describe('Part', () => {
});
it("Should generate a warning when calling removeCut without parameters", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.addCut(4, 'fabric', true)
part.removeCut()
@ -357,7 +357,7 @@ describe('Part', () => {
});
it("Should set the part grainline", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
expect(part.cut.grain).to.equal(90)
part.setGrain(123)
@ -365,14 +365,14 @@ describe('Part', () => {
});
it("Should raise a warning when calling part.setGrain() without any parameters", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.setGrain()
expect(part.cut.grain).to.equal(false)
});
it("Should raise an error when calling part.setGrain() with a value that is not a number", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
part.setGrain('a')
expect(part.cut.grain).to.equal(90)
@ -381,7 +381,7 @@ describe('Part', () => {
});
it("Should set and then remove the cutOnFold", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
const { Point } = part.shorthand()
part.setCutOnFold(new Point(2,3), new Point(100,200))
@ -394,7 +394,7 @@ describe('Part', () => {
});
it("Should raise an error when setting the cutOnFold with a non-Point value", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
const { Point } = part.shorthand()
part.setCutOnFold(new Point(2,3), 12)
@ -404,13 +404,13 @@ describe('Part', () => {
describe('isEmpty', () => {
it("Should return true if the part has no paths or snippets", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
expect(part.isEmpty()).to.be.true
})
it("Should return true if the part has paths but they have no length", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
const { Path, paths, Point } = part.shorthand()
paths.seam = new Path()
@ -418,7 +418,7 @@ describe('Part', () => {
})
it("Should return true if the part has paths but they don't render", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
const { Path, paths, Point } = part.shorthand()
paths.seam = new Path().move(new Point(0,0)).line(new Point(2,3)).setRender(false)
@ -426,7 +426,7 @@ describe('Part', () => {
})
it("Should return false if the part has a path with length", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
const { Path, paths, Point } = part.shorthand()
paths.seam = new Path().move(new Point(0,0)).line(new Point(2,3))
@ -435,7 +435,7 @@ describe('Part', () => {
})
it("Should return false if the part has a snippet", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
const { Point, snippets, Snippet } = part.shorthand()
snippets.test = new Snippet('test', new Point(0,0))
@ -444,7 +444,7 @@ describe('Part', () => {
})
it("Should return false if the part has a point that has text", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
const {Point, points} = part.shorthand()
points.test = new Point(0,0)
@ -453,7 +453,7 @@ describe('Part', () => {
})
it("Should return false if the part has a point that has a circle", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
const {Point, points} = part.shorthand()
points.test = new Point(0,0)

View file

@ -1,12 +1,11 @@
import chai from "chai"
import freesewing from "./dist/index.mjs"
import { round, Pattern, Path, Point } from "./dist/index.mjs"
const expect = chai.expect
const round = freesewing.utils.round
describe('Path', () => {
it("Should offset a line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -18,7 +17,7 @@ describe('Path', () => {
});
it("Should offset a curve", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -32,7 +31,7 @@ describe('Path', () => {
});
it("Should offset a curve where cp1 = start", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -46,7 +45,7 @@ describe('Path', () => {
});
it("Should offset a curve where cp2 = end", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -61,7 +60,7 @@ describe('Path', () => {
});
it("Should throw error when offsetting line that is no line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -70,7 +69,7 @@ describe('Path', () => {
});
it("Should return the length of a line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -79,7 +78,7 @@ describe('Path', () => {
});
it("Should return the length of a curve", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -91,7 +90,7 @@ describe('Path', () => {
});
it("Should return the path start point", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -104,7 +103,7 @@ describe('Path', () => {
});
it("Should return the path end point", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -119,7 +118,7 @@ describe('Path', () => {
});
it("Should calculate that path boundary", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -135,7 +134,7 @@ describe('Path', () => {
});
it("Should clone a path", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -152,7 +151,7 @@ describe('Path', () => {
});
it("Should join paths", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -165,7 +164,7 @@ describe('Path', () => {
});
it("Should throw error when joining a closed paths", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -178,7 +177,7 @@ describe('Path', () => {
});
it("Should shift along a line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -187,7 +186,7 @@ describe('Path', () => {
});
it("Should not shift along a path/line if we end up on the end point", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -196,7 +195,7 @@ describe('Path', () => {
});
it("Should shift along lines", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -209,7 +208,7 @@ describe('Path', () => {
});
it("Should shift along curve + line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -223,7 +222,7 @@ describe('Path', () => {
});
it("Should throw error when shifting along path further than it's long", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.paths.test = new a.Path()
@ -234,7 +233,7 @@ describe('Path', () => {
});
it("Should shift along with sufficient precision", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.paths.test = new a.Path()
@ -246,7 +245,7 @@ describe('Path', () => {
});
it("Should shift fraction with sufficient precision", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.paths.test = new a.Path()
@ -258,7 +257,7 @@ describe('Path', () => {
});
it("Should shift a fraction along a line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.paths.line = new a.Path()
@ -270,7 +269,7 @@ describe('Path', () => {
});
it("Should find the bounding box of a line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let Path = pattern.parts.a.Path;
let Point = pattern.parts.a.Point;
@ -333,7 +332,7 @@ describe('Path', () => {
});
it("Should find the bounding box of a line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.paths.curve = new a.Path()
@ -348,7 +347,7 @@ describe('Path', () => {
});
it("Should reverse a path", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
let test = new a.Path()
@ -368,7 +367,7 @@ describe('Path', () => {
});
it("Should find the edges of a path", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(45, 60);
@ -403,7 +402,7 @@ describe('Path', () => {
});
it("Should find the edges of a path for corner cases", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(-45, -60);
@ -430,7 +429,7 @@ describe('Path', () => {
});
it("Should find the edge of a path for this edge-case", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(-109.7, 77, 12);
@ -445,7 +444,7 @@ describe('Path', () => {
});
it("Should find where a path intersects with an X value", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(95, 50);
@ -474,7 +473,7 @@ describe('Path', () => {
});
it("Should find where a path intersects with an Y value", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(95, 50);
@ -499,7 +498,7 @@ describe('Path', () => {
});
it("Should throw an error when not passing a value to path.intersectsX", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.paths.test = new a.Path();
@ -508,7 +507,7 @@ describe('Path', () => {
});
it("Should find the intersections between two paths", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(45, 60);
@ -554,7 +553,7 @@ describe('Path', () => {
});
it("Should throw an error when running path.intersect on an identical path", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.paths.test = new a.Path();
@ -562,7 +561,7 @@ describe('Path', () => {
});
it("Should divide a path", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(45, 60);
@ -615,7 +614,7 @@ describe('Path', () => {
});
it("Should split a path on a curve", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(45, 60);
@ -645,7 +644,7 @@ describe('Path', () => {
});
it("Should split a path on a line", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(45, 60);
@ -671,7 +670,7 @@ describe('Path', () => {
});
it("Should trim a path when lines overlap", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(0, 0);
@ -694,7 +693,7 @@ describe('Path', () => {
});
it("Should trim a path when a line overlaps with a curve", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(0, 0);
@ -717,7 +716,7 @@ describe('Path', () => {
});
it("Should trim a path when a curves overlap", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(0, 0);
@ -740,7 +739,7 @@ describe('Path', () => {
});
it("Should translate a path", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
a.points.A = new a.Point(0, 0);
@ -761,7 +760,7 @@ describe('Path', () => {
});
it("Should add a path attribute", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -774,7 +773,7 @@ describe('Path', () => {
});
it("Should overwrite a path attribute", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -790,7 +789,7 @@ describe('Path', () => {
});
it("Should move along a path even if it lands just on a joint", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.parts.a = new pattern.Part();
let a = pattern.parts.a;
@ -811,23 +810,23 @@ describe('Path', () => {
it("Should add raise methods to a path", () => {
const raise = () => 'hello'
const p1 = new freesewing.Path(10, 20).withRaise(raise);
const p1 = new Path(10, 20).withRaise(raise);
expect(p1.raise()).to.equal('hello');
});
it("Should add raise methods to a path", () => {
const raise = () => 'hello'
const p1 = new freesewing.Path().withRaise(raise);
const p1 = new Path().withRaise(raise);
expect(p1.raise()).to.equal('hello');
});
it("Should set render to true/false", () => {
const p1 = new freesewing.Path().setRender(false)
const p1 = new Path().setRender(false)
expect(p1.render).to.equal(false);
});
it("Should set class with setClass", () => {
const p1 = new freesewing.Path().setClass('fabric')
const p1 = new Path().setClass('fabric')
p1.setClass()
expect(p1.attributes.get('class')).to.equal('fabric');
});
@ -835,7 +834,7 @@ describe('Path', () => {
it("Should raise a warning when moving to a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const p1 = new Path().withRaise(raise)
expect(invalid).to.equal(false);
try {
p1.move('a')
@ -849,7 +848,7 @@ describe('Path', () => {
it("Should raise a warning when drawing a line to a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const p1 = new Path().withRaise(raise)
expect(invalid).to.equal(false);
try {
p1.line('a')
@ -863,9 +862,9 @@ describe('Path', () => {
it("Should raise a warning when drawing a curve to a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const a = new freesewing.Point(0,0)
const b = new freesewing.Point(10,10)
const p1 = new Path().withRaise(raise)
const a = new Point(0,0)
const b = new Point(10,10)
expect(invalid).to.equal(false);
try {
p1.move(b).curve(a, b, 'c')
@ -879,9 +878,9 @@ describe('Path', () => {
it("Should raise a warning when drawing a curve with a Cp1 that is a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const a = new freesewing.Point(0,0)
const b = new freesewing.Point(10,10)
const p1 = new Path().withRaise(raise)
const a = new Point(0,0)
const b = new Point(10,10)
expect(invalid).to.equal(false);
try {
p1.move(b).curve(a, 'x', b)
@ -895,8 +894,8 @@ describe('Path', () => {
it("Should raise a warning when drawing a curve with a Cp1 that is a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const b = new freesewing.Point(10,10)
const p1 = new Path().withRaise(raise)
const b = new Point(10,10)
expect(invalid).to.equal(false);
try {
p1.move(b).curve('a', b, b)
@ -910,8 +909,8 @@ describe('Path', () => {
it("Should raise a warning when drawing a curve with a Cp2 that is a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const b = new freesewing.Point(10,10)
const p1 = new Path().withRaise(raise)
const b = new Point(10,10)
expect(invalid).to.equal(false);
try {
p1.move(b).curve(b, 'a', b)
@ -925,8 +924,8 @@ describe('Path', () => {
it("Should raise a warning when drawing a _curve with a To that is a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const b = new freesewing.Point(10,10)
const p1 = new Path().withRaise(raise)
const b = new Point(10,10)
expect(invalid).to.equal(false);
try {
p1.move(b)._curve(b, 'a')
@ -940,8 +939,8 @@ describe('Path', () => {
it("Should raise a warning when drawing a _curve with a Cp2 that is a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const b = new freesewing.Point(10,10)
const p1 = new Path().withRaise(raise)
const b = new Point(10,10)
expect(invalid).to.equal(false);
try {
p1.move(b)._curve('a', b)
@ -955,8 +954,8 @@ describe('Path', () => {
it("Should raise a warning when drawing a curve_ with a To that is a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const b = new freesewing.Point(10,10)
const p1 = new Path().withRaise(raise)
const b = new Point(10,10)
expect(invalid).to.equal(false);
try {
p1.move(b).curve_(b, 'a')
@ -970,8 +969,8 @@ describe('Path', () => {
it("Should raise a warning when drawing a curve_ with a Cp2 that is a non-point", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const p1 = new freesewing.Path().withRaise(raise)
const b = new freesewing.Point(10,10)
const p1 = new Path().withRaise(raise)
const b = new Point(10,10)
expect(invalid).to.equal(false);
try {
p1.move(b).curve_('a', b)
@ -983,16 +982,16 @@ describe('Path', () => {
});
it("Should add a noop operation", () => {
const p1 = new freesewing.Path().noop()
const p1 = new Path().noop()
expect(p1.ops.length).to.equal(1);
expect(p1.ops[0].type).to.equal('noop');
});
it("Should handle an insop operation", () => {
const a = new freesewing.Point(0,0)
const b = new freesewing.Point(10,10)
const p1 = new freesewing.Path().move(a).line(b)
const p2 = new freesewing.Path().noop('test').insop('test', p1)
const a = new Point(0,0)
const b = new Point(10,10)
const p1 = new Path().move(a).line(b)
const p2 = new Path().noop('test').insop('test', p1)
expect(p2.ops.length).to.equal(2);
expect(p1.ops[0].type).to.equal('move');
expect(p1.ops[1].type).to.equal('line');
@ -1001,23 +1000,23 @@ describe('Path', () => {
it("Should raise a warning when an insop operation used an falsy ID", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const a = new freesewing.Point(0,0)
const b = new freesewing.Point(10,10)
const p1 = new freesewing.Path().move(a).line(b)
const a = new Point(0,0)
const b = new Point(10,10)
const p1 = new Path().move(a).line(b)
expect(invalid).to.equal(false);
const p2 = new freesewing.Path().withRaise(raise).noop('test').insop(false, p1)
const p2 = new Path().withRaise(raise).noop('test').insop(false, p1)
expect(invalid).to.equal(true);
});
it("Should raise a warning when an insop operation used an falsy ID", () => {
let invalid = false
const raise = { warning: () => invalid = true }
const a = new freesewing.Point(0,0)
const b = new freesewing.Point(10,10)
const p1 = new freesewing.Path().move(a).line(b)
const a = new Point(0,0)
const b = new Point(10,10)
const p1 = new Path().move(a).line(b)
expect(invalid).to.equal(false);
try {
new freesewing.Path().withRaise(raise).noop('test').insop('test')
new Path().withRaise(raise).noop('test').insop('test')
}
catch (err) {
expect(''+err).to.contain("Cannot read properties of undefined (reading 'ops')")
@ -1029,7 +1028,7 @@ describe('Path', () => {
let invalid = false
const raise = { warning: () => invalid = true }
expect(invalid).to.equal(false);
const p1 = new freesewing.Path().withRaise(raise).attr()
const p1 = new Path().withRaise(raise).attr()
expect(invalid).to.equal(true);
});
@ -1037,12 +1036,12 @@ describe('Path', () => {
let invalid = false
const raise = { warning: () => invalid = true }
expect(invalid).to.equal(false);
const p1 = new freesewing.Path().withRaise(raise).attr('test')
const p1 = new Path().withRaise(raise).attr('test')
expect(invalid).to.equal(true);
});
it("Should raise a warning when calling offset without a distance", () => {
const pattern = new freesewing.Pattern();
const pattern = new Pattern();
pattern.parts.a = new pattern.Part();
const { Path, Point, points, paths } = pattern.parts.a.shorthand()
points.a = new Point(0,0)
@ -1054,7 +1053,7 @@ describe('Path', () => {
});
it("Should raise a warning when calling join without a path", () => {
const pattern = new freesewing.Pattern();
const pattern = new Pattern();
pattern.parts.a = new pattern.Part();
const { Path, Point, points, paths } = pattern.parts.a.shorthand()
points.a = new Point(0,0)
@ -1075,7 +1074,7 @@ describe('Path', () => {
const raise = { error: () => invalid = true }
expect(invalid).to.equal(false);
try {
new freesewing.Path().withRaise(raise).start()
new Path().withRaise(raise).start()
}
catch (err) {
expect(''+err).to.contain("Cannot read properties of undefined (reading 'to')")
@ -1088,7 +1087,7 @@ describe('Path', () => {
const raise = { error: () => invalid = true }
expect(invalid).to.equal(false);
try {
new freesewing.Path().withRaise(raise).end()
new Path().withRaise(raise).end()
}
catch (err) {
expect(''+err).to.contain("Cannot read properties of undefined (reading 'type')")
@ -1100,10 +1099,10 @@ describe('Path', () => {
let invalid = false
const raise = { error: () => invalid = true }
expect(invalid).to.equal(false);
new freesewing.Path()
new Path()
.withRaise(raise)
.move(new freesewing.Point(0,0))
.line(new freesewing.Point(10,10))
.move(new Point(0,0))
.line(new Point(10,10))
.shiftAlong()
expect(invalid).to.equal(true);
});
@ -1115,11 +1114,11 @@ describe('Path', () => {
warning: () => invalid = true,
}
expect(invalid).to.equal(false);
new freesewing.Path()
new Path()
.withRaise(raise)
.move(new freesewing.Point(0,0).withRaise(raise))
.line(new freesewing.Point(10,10).withRaise(raise))
.line(new freesewing.Point(10,20).withRaise(raise))
.move(new Point(0,0).withRaise(raise))
.line(new Point(10,10).withRaise(raise))
.line(new Point(10,20).withRaise(raise))
.shiftFractionAlong()
expect(invalid).to.equal(true);
});
@ -1130,11 +1129,11 @@ describe('Path', () => {
error: () => invalid = true,
warning: () => invalid = true,
}
const from = new freesewing.Point(0,0).withRaise(raise)
const cp1 = new freesewing.Point(10,0).withRaise(raise)
const cp2 = new freesewing.Point(90,0).withRaise(raise)
const to = new freesewing.Point(100,0).withRaise(raise)
const path = new freesewing.Path()
const from = new Point(0,0).withRaise(raise)
const cp1 = new Point(10,0).withRaise(raise)
const cp2 = new Point(90,0).withRaise(raise)
const to = new Point(100,0).withRaise(raise)
const path = new Path()
.withRaise(raise)
.move(from)
.curve(cp1, cp2, to)
@ -1155,11 +1154,11 @@ describe('Path', () => {
error: () => invalid = true,
warning: () => invalid = true,
}
const from = new freesewing.Point(0,0).withRaise(raise)
const cp1 = new freesewing.Point(10,0).withRaise(raise)
const cp2 = new freesewing.Point(90,0).withRaise(raise)
const to = new freesewing.Point(100,0).withRaise(raise)
const path = new freesewing.Path()
const from = new Point(0,0).withRaise(raise)
const cp1 = new Point(10,0).withRaise(raise)
const cp2 = new Point(90,0).withRaise(raise)
const to = new Point(100,0).withRaise(raise)
const path = new Path()
.withRaise(raise)
.move(from)
.curve(cp1, cp2, to)

View file

@ -1,11 +1,11 @@
import chai from "chai"
import freesewing from "./dist/index.mjs"
import { round, Pattern, Design, pctBasedOn } from "./dist/index.mjs"
const expect = chai.expect
describe('Pattern', () => {
it("Pattern constructor should initialize object", () => {
let pattern = new freesewing.Pattern({
let pattern = new Pattern({
foo: "bar",
options: {
constant: 2,
@ -24,7 +24,7 @@ describe('Pattern', () => {
it("Should load percentage options", () => {
let pattern = new freesewing.Pattern({
let pattern = new Pattern({
options: {
test: { pct: 30 }
}
@ -33,7 +33,7 @@ describe('Pattern', () => {
});
it("Should load millimeter options", () => {
let pattern = new freesewing.Pattern({
let pattern = new Pattern({
options: {
test: { mm: 30 }
}
@ -42,7 +42,7 @@ describe('Pattern', () => {
});
it("Should load degree options", () => {
let pattern = new freesewing.Pattern({
let pattern = new Pattern({
options: {
test: { deg: 15 }
}
@ -51,7 +51,7 @@ describe('Pattern', () => {
});
it("Should load an array option", () => {
let pattern = new freesewing.Pattern({
let pattern = new Pattern({
options: {
test: { dflt: "foo" }
}
@ -60,7 +60,7 @@ describe('Pattern', () => {
});
it("Should load a count option", () => {
let pattern = new freesewing.Pattern({
let pattern = new Pattern({
options: {
test: { count: 3 }
}
@ -69,7 +69,7 @@ describe('Pattern', () => {
});
it("Should load a boolean option", () => {
let pattern = new freesewing.Pattern({
let pattern = new Pattern({
options: {
test1: { bool: false },
test2: { bool: true }
@ -82,7 +82,7 @@ describe('Pattern', () => {
it("Should throw an error for an unknown option", () => {
expect(
() =>
new freesewing.Pattern({
new Pattern({
options: {
test: { foo: "bar" }
}
@ -91,7 +91,7 @@ describe('Pattern', () => {
});
it("Should merge settings with default settings", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let settings = {
foo: "bar",
deep: {
@ -124,7 +124,7 @@ describe('Pattern', () => {
return part;
}
}
const Test = new freesewing.Design({
const Test = new Design({
name: "test",
parts: [ back, front ],
});
@ -135,7 +135,7 @@ describe('Pattern', () => {
});
it("Should sample an option", () => {
let pattern = new freesewing.Pattern({
let pattern = new Pattern({
options: {
len: { pct: 30, min: 10 },
bonus: 10
@ -284,7 +284,7 @@ describe('Pattern', () => {
*/
it("Should register a hook via on", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let count = 0;
pattern._draft = () => {};
pattern.on("preDraft", function(pattern) {
@ -295,7 +295,7 @@ describe('Pattern', () => {
});
it("Should register a hook from a plugin", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let count = 0;
pattern._draft = () => {};
let plugin = {
@ -313,7 +313,7 @@ describe('Pattern', () => {
});
it("Should register multiple methods on a single hook", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let count = 0;
pattern._draft = () => {};
let plugin = {
@ -342,7 +342,7 @@ describe('Pattern', () => {
inject: { back: "front" },
hide: ["back"]
};
const Test = new freesewing.Design(config)
const Test = new Design(config)
Test.prototype.draftBack = function(part) {
return part;
};
@ -369,10 +369,10 @@ describe('Pattern', () => {
hide: ["back"]
};
const Test = function(settings = false) {
freesewing.Pattern.call(this, config);
Pattern.call(this, config);
return this;
};
Test.prototype = Object.create(freesewing.Pattern.prototype);
Test.prototype = Object.create(Pattern.prototype);
Test.prototype.constructor = Test;
Test.prototype.draftBack = function(part) {
return part;
@ -397,8 +397,8 @@ describe('Pattern', () => {
name: "test",
dependencies: { front: "back", side: "back", hood: "front", stripe: "hood" },
};
const Test = new freesewing.Design(config)
Test.prototype = Object.create(freesewing.Pattern.prototype);
const Test = new Design(config)
Test.prototype = Object.create(Pattern.prototype);
Test.prototype.constructor = Test;
Test.prototype.draftBack = function(part) {
return part;
@ -432,10 +432,10 @@ describe('Pattern', () => {
dependencies: { front: ["back"], side: ["back"], hood: ["front"], stripe: ["hood"]},
};
const Test = function(settings = false) {
freesewing.Pattern.call(this, config);
Pattern.call(this, config);
return this;
};
Test.prototype = Object.create(freesewing.Pattern.prototype);
Test.prototype = Object.create(Pattern.prototype);
Test.prototype.constructor = Test;
Test.prototype.draftBack = function(part) {
return part;
@ -470,10 +470,10 @@ describe('Pattern', () => {
parts: ['back','front','crotch'],
};
const Test = function(settings = false) {
freesewing.Pattern.call(this, config);
Pattern.call(this, config);
return this;
};
Test.prototype = Object.create(freesewing.Pattern.prototype);
Test.prototype = Object.create(Pattern.prototype);
Test.prototype.constructor = Test;
Test.prototype.draftBack = function(part) {
return part;
@ -495,10 +495,10 @@ describe('Pattern', () => {
parts: ['back','front','crotch'],
};
const Test = function(settings = false) {
freesewing.Pattern.call(this, config);
Pattern.call(this, config);
return this;
};
Test.prototype = Object.create(freesewing.Pattern.prototype);
Test.prototype = Object.create(Pattern.prototype);
Test.prototype.constructor = Test;
Test.prototype.draftBack = function(part) {
return part;
@ -527,10 +527,10 @@ describe('Pattern', () => {
parts: ['back','front','crotch'],
};
const Test = function(settings = false) {
freesewing.Pattern.call(this, config);
Pattern.call(this, config);
return this;
};
Test.prototype = Object.create(freesewing.Pattern.prototype);
Test.prototype = Object.create(Pattern.prototype);
Test.prototype.constructor = Test;
Test.prototype.draftBack = function(part) {
return part;
@ -547,13 +547,13 @@ describe('Pattern', () => {
});
it("Should check whether created parts get the pattern context", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let part = new pattern.Part();
expect(part.context.settings).to.equal(pattern.settings);
});
it("Should correctly merge settings", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
let settings = {
complete: false,
only: [1, 2, 3],
@ -567,7 +567,7 @@ describe('Pattern', () => {
});
it("Should correctly merge settings for existing array", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.only = [1];
let settings = {
complete: false,
@ -585,7 +585,7 @@ describe('Pattern', () => {
name: 'front',
draft: function(part) { return part }
}
const Test = new freesewing.Design({
const Test = new Design({
name: "test",
parts: [front],
});
@ -599,7 +599,7 @@ describe('Pattern', () => {
});
it("Should not pack a pattern with errors", () => {
const pattern = new freesewing.Pattern()
const pattern = new Pattern()
pattern.events.error.push('error')
pattern.pack()
expect(pattern.events.warning.length).to.equal(1)
@ -633,7 +633,7 @@ describe('Pattern', () => {
*/
it("Should handle custom layouts", () => {
const Test = new freesewing.Design({ name: "test", parts: ['front'] })
const Test = new Design({ name: "test", parts: ['front'] })
Test.prototype.draftFront = function(part) { return part }
const pattern = new Test({
layout: {
@ -648,12 +648,12 @@ describe('Pattern', () => {
});
it("Should handle a simple snapped option", () => {
const Test = new freesewing.Design({
const Test = new Design({
name: "test",
parts: ['front'],
measurements: [ 'head' ],
options: {
len: { pct: 50, min: 22, max: 78, snap: 10, ...freesewing.pctBasedOn('head') }
len: { pct: 50, min: 22, max: 78, snap: 10, ...pctBasedOn('head') }
}
})
Test.prototype.draftFront = function(part) {
@ -691,7 +691,7 @@ describe('Pattern', () => {
});
it("Should handle a list snapped option", () => {
const Test = new freesewing.Design({
const Test = new Design({
name: "test",
parts: [
{
@ -710,7 +710,7 @@ describe('Pattern', () => {
],
measurements: [ 'head' ],
options: {
len: { pct: 50, min: 22, max: 78, snap: [10,14,19,28], ...freesewing.pctBasedOn('head') }
len: { pct: 50, min: 22, max: 78, snap: [10,14,19,28], ...pctBasedOn('head') }
}
})
let pattern = new Test({
@ -734,12 +734,12 @@ describe('Pattern', () => {
expect(pattern.parts.front.paths.line_7.ops[1].to.x).to.equal(28);
expect(pattern.parts.front.paths.line_8.ops[1].to.x).to.equal(28);
expect(pattern.parts.front.paths.line_9.ops[1].to.x).to.equal(28);
expect(freesewing.utils.round(pattern.parts.front.paths.line_10.ops[1].to.x)).to.equal(33.72);
expect(round(pattern.parts.front.paths.line_10.ops[1].to.x)).to.equal(33.72);
});
it("Should retrieve the cutList", () => {
const Test = new freesewing.Design({
const Test = new Design({
name: "test",
parts: [{
name: 'front',
@ -818,8 +818,8 @@ describe('Pattern', () => {
}
}
const Design = new freesewing.Design({ parts: [ partC ] });
const pattern = new Design().addPart(partR).draft()
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)
@ -970,8 +970,8 @@ describe('Pattern', () => {
return part
}
}
const Design = new freesewing.Design({ parts: [ partD ] });
const pattern = new Design().draft()
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)
@ -1120,10 +1120,10 @@ describe('Pattern', () => {
},
draft: part => part,
}
let Design, pattern
let design, pattern
try {
Design = new freesewing.Design({ parts: [ partB ] });
pattern = new Design().init()
design = new Design({ parts: [ partB ] });
pattern = new design().init()
} catch(err) {
console.log(err)
}

View file

@ -1,9 +1,7 @@
import chai from "chai"
import freesewing from "./dist/index.mjs"
import { round, Point } from "./dist/index.mjs"
const expect = chai.expect
const Point = freesewing.Point
const round = freesewing.utils.round
describe('Point', () => {
it("Should return point object", () => {

View file

@ -1,25 +1,25 @@
import chai from "chai"
import freesewing from "./dist/index.mjs"
import { Snippet, Point } from "./dist/index.mjs"
const expect = chai.expect
describe('Snippet', () => {
it("Should create a snippet", () => {
let snip1 = new freesewing.Snippet("test", new freesewing.Point(12, 34));
let snip1 = new Snippet("test", new Point(12, 34));
expect(snip1.def).to.equal("test");
expect(snip1.anchor.x).to.equal(12);
expect(snip1.anchor.y).to.equal(34);
});
it("Should clone a snippet", () => {
let snip3 = new freesewing.Snippet("boo", new freesewing.Point(56, 78));
let snip3 = new Snippet("boo", new Point(56, 78));
expect(snip3.clone().def).to.equal("boo");
expect(snip3.clone().anchor.x).to.equal(56);
expect(snip3.clone().anchor.y).to.equal(78);
});
it("Should set an attribute", () => {
let s = new freesewing.Snippet("test", new freesewing.Point(12, -34)).attr(
let s = new Snippet("test", new Point(12, -34)).attr(
"class",
"test"
);

View file

@ -1,9 +1,9 @@
import chai from "chai"
import freesewing from "./dist/index.mjs"
import { Pattern } from "./dist/index.mjs"
const expect = chai.expect
const pattern = new freesewing.Pattern();
const pattern = new Pattern();
const store = pattern.store;
describe('Store', () => {

View file

@ -1,6 +1,6 @@
import chai from "chai"
import chaiString from "chai-string"
import freesewing from "./dist/index.mjs"
import { Pattern } from "./dist/index.mjs"
import pkg from '../package.json' assert { type: 'json' }
import render from "./fixtures/render.mjs"
@ -10,7 +10,7 @@ const { version } = pkg
describe('Svg', () => {
it("Svg constructor should initialize object", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
let svg = pattern.svg;
expect(svg.openGroups).to.eql([]);
@ -37,24 +37,24 @@ describe('Svg', () => {
});
it("Should render Svg boilerplate", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
expect(pattern.render()).to.equalIgnoreSpaces(render.boilerplate);
});
it("Should render language attribute", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.locale = "nl";
expect(pattern.render()).to.equalIgnoreSpaces(render.boilerplateNl);
});
it("Should render Svg boilerplate for embedding", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.embed = true;
expect(pattern.render()).to.equalIgnoreSpaces(render.embed);
});
it("Should render Svg part boilerplate", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
expect(pattern.render()).to.equalIgnoreSpaces(render.part);
@ -63,7 +63,7 @@ describe('Svg', () => {
});
it("Should render Svg path", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -77,7 +77,7 @@ describe('Svg', () => {
expect(pattern.render()).to.equalIgnoreSpaces(render.path);
});
it("Should not render Svg path when render property is false", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -93,7 +93,7 @@ describe('Svg', () => {
});
it("Should render Svg text", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -105,7 +105,7 @@ describe('Svg', () => {
});
it("Should render Svg multi-line text", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -117,7 +117,7 @@ describe('Svg', () => {
});
it("Should render Svg multi-line text with default lineheight", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -128,7 +128,7 @@ describe('Svg', () => {
});
it("Should not render text when there is none", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -137,7 +137,7 @@ describe('Svg', () => {
});
it("Should render Svg text on path", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -153,7 +153,7 @@ describe('Svg', () => {
});
it("Should render Svg text on path, center aligned", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -169,7 +169,7 @@ describe('Svg', () => {
});
it("Should render Svg text on path, right aligned", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -185,7 +185,7 @@ describe('Svg', () => {
});
it("Should render an Svg circle", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -194,7 +194,7 @@ describe('Svg', () => {
});
it("Should render an Svg snippet", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -207,7 +207,7 @@ describe('Svg', () => {
});
it("Should render a rotated Svg snippet", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -220,7 +220,7 @@ describe('Svg', () => {
});
it("Should replaced double quotes in Svg text", () => {
const pattern = new freesewing.Pattern()
const pattern = new Pattern()
pattern.render()
expect(
pattern.svg.escapeText('This is a "test" message')
@ -228,7 +228,7 @@ describe('Svg', () => {
});
it("Should scale an Svg snippet", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.render();
pattern.parts.test = new pattern.Part();
let p = pattern.parts.test;
@ -241,7 +241,7 @@ describe('Svg', () => {
});
it("Should run preRender hook", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.on("preRender", svg => {
svg.attributes.set("data-hook", "preRender");
});
@ -250,7 +250,7 @@ describe('Svg', () => {
});
it("Should run insertText hook", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.on("insertText", (locale, text) => {
return text.toUpperCase();
});
@ -263,7 +263,7 @@ describe('Svg', () => {
});
it("Should run postRender hook", () => {
let pattern = new freesewing.Pattern()
let pattern = new Pattern()
pattern.on("postRender", svg => {
svg.svg = "test";
});
@ -271,7 +271,7 @@ describe('Svg', () => {
});
it("Should tab in and out", () => {
let pattern = new freesewing.Pattern()
let pattern = new Pattern()
pattern.render()
const svg = pattern.svg
svg.tabs = 2

View file

@ -1,221 +1,250 @@
import chai from "chai"
import freesewing from "./dist/index.mjs"
import {
Pattern,
Point,
isCoord,
capitalize,
beamsIntersect,
linesIntersect,
pointOnBeam,
pointOnLine,
pointOnCurve,
splitCurve,
beamIntersectsX,
beamIntersectsY,
units,
lineIntersectsCurve,
curveIntersectsX,
curveIntersectsY,
curvesIntersect,
circlesIntersect,
beamIntersectsCircle,
lineIntersectsCircle,
curveEdge,
stretchToScale,
round,
sampleStyle,
deg2rad,
rad2deg,
pctBasedOn,
Bezier,
generatePartTransform,
macroName,
} from "./dist/index.mjs"
const { expect } = chai
const utils = freesewing.utils
const round = utils.round
describe('Utils', () => {
it("Should return the correct macro name", () => {
expect(utils.macroName("test")).to.equal("_macro_test");
expect(macroName("test")).to.equal("_macro_test");
});
it("Should find the intersection of two endless line segments", () => {
let a = new freesewing.Point(10, 20);
let b = new freesewing.Point(20, 24);
let c = new freesewing.Point(90, 19);
let d = new freesewing.Point(19, 70);
let X = freesewing.utils.beamsIntersect(a, b, c, d);
let a = new Point(10, 20);
let b = new Point(20, 24);
let c = new Point(90, 19);
let d = new Point(19, 70);
let X = beamsIntersect(a, b, c, d);
expect(round(X.x)).to.equal(60.49);
expect(round(X.y)).to.equal(40.2);
});
it("Should detect parallel lines", () => {
let a = new freesewing.Point(10, 20);
let b = new freesewing.Point(20, 20);
let c = new freesewing.Point(90, 40);
let d = new freesewing.Point(19, 40);
expect(freesewing.utils.beamsIntersect(a, b, c, d)).to.equal(false);
expect(freesewing.utils.linesIntersect(a, b, c, d)).to.equal(false);
let a = new Point(10, 20);
let b = new Point(20, 20);
let c = new Point(90, 40);
let d = new Point(19, 40);
expect(beamsIntersect(a, b, c, d)).to.equal(false);
expect(linesIntersect(a, b, c, d)).to.equal(false);
});
it("Should detect vertical lines", () => {
let a = new freesewing.Point(10, 20);
let b = new freesewing.Point(10, 90);
let c = new freesewing.Point(90, 40);
let d = new freesewing.Point(19, 40);
let X = freesewing.utils.beamsIntersect(a, b, c, d);
let a = new Point(10, 20);
let b = new Point(10, 90);
let c = new Point(90, 40);
let d = new Point(19, 40);
let X = beamsIntersect(a, b, c, d);
expect(X.x).to.equal(10);
expect(X.y).to.equal(40);
X = freesewing.utils.beamsIntersect(c, d, a, b);
X = beamsIntersect(c, d, a, b);
expect(X.x).to.equal(10);
});
it("Should swap direction prior to finding beam intersection", () => {
let a = new freesewing.Point(10, 20);
let b = new freesewing.Point(0, 90);
let c = new freesewing.Point(90, 40);
let d = new freesewing.Point(19, 40);
let X = freesewing.utils.beamsIntersect(a, b, c, d);
let a = new Point(10, 20);
let b = new Point(0, 90);
let c = new Point(90, 40);
let d = new Point(19, 40);
let X = beamsIntersect(a, b, c, d);
expect(round(X.x)).to.equal(7.14);
expect(round(X.y)).to.equal(40);
});
it("Should return false when two lines don't intersect", () => {
let a = new freesewing.Point(10, 20);
let b = new freesewing.Point(20, 24);
let c = new freesewing.Point(90, 19);
let d = new freesewing.Point(19, 70);
expect(freesewing.utils.linesIntersect(a, b, c, d)).to.equal(false);
let a = new Point(10, 20);
let b = new Point(20, 24);
let c = new Point(90, 19);
let d = new Point(19, 70);
expect(linesIntersect(a, b, c, d)).to.equal(false);
});
it("Should find the intersection of two line segments", () => {
let a = new freesewing.Point(10, 10);
let b = new freesewing.Point(90, 74);
let c = new freesewing.Point(90, 19);
let d = new freesewing.Point(11, 70);
let X = freesewing.utils.linesIntersect(a, b, c, d);
let a = new Point(10, 10);
let b = new Point(90, 74);
let c = new Point(90, 19);
let d = new Point(11, 70);
let X = linesIntersect(a, b, c, d);
expect(round(X.x)).to.equal(51.95);
expect(round(X.y)).to.equal(43.56);
});
it("Should find the intersection of an endles line and a give X-value", () => {
let a = new freesewing.Point(10, 10);
let b = new freesewing.Point(90, 74);
let X = freesewing.utils.beamIntersectsX(a, b, 69);
let a = new Point(10, 10);
let b = new Point(90, 74);
let X = beamIntersectsX(a, b, 69);
expect(X.x).to.equal(69);
expect(X.y).to.equal(57.2);
});
it("Should find the intersection of an endles line and a give Y-value", () => {
let a = new freesewing.Point(10, 10);
let b = new freesewing.Point(90, 74);
let X = freesewing.utils.beamIntersectsY(a, b, 69);
let a = new Point(10, 10);
let b = new Point(90, 74);
let X = beamIntersectsY(a, b, 69);
expect(X.x).to.equal(83.75);
expect(X.y).to.equal(69);
});
it("Should detect vertical lines never pass a give X-value", () => {
let a = new freesewing.Point(10, 10);
let b = new freesewing.Point(10, 90);
expect(freesewing.utils.beamIntersectsX(a, b, 69)).to.equal(false);
let a = new Point(10, 10);
let b = new Point(10, 90);
expect(beamIntersectsX(a, b, 69)).to.equal(false);
});
it("Should detect horizontal lines never pass a give Y-value", () => {
let a = new freesewing.Point(10, 10);
let b = new freesewing.Point(90, 10);
expect(freesewing.utils.beamIntersectsY(a, b, 69)).to.equal(false);
let a = new Point(10, 10);
let b = new Point(90, 10);
expect(beamIntersectsY(a, b, 69)).to.equal(false);
});
it("Should find no intersections between a curve and a line", () => {
let A = new freesewing.Point(10, 10);
let Acp = new freesewing.Point(310, 40);
let B = new freesewing.Point(110, 70);
let Bcp = new freesewing.Point(-210, 40);
let E = new freesewing.Point(-20, -20);
let D = new freesewing.Point(30, -85);
let A = new Point(10, 10);
let Acp = new Point(310, 40);
let B = new Point(110, 70);
let Bcp = new Point(-210, 40);
let E = new Point(-20, -20);
let D = new Point(30, -85);
let hit = freesewing.utils.lineIntersectsCurve(E, D, A, Acp, Bcp, B);
let hit = lineIntersectsCurve(E, D, A, Acp, Bcp, B);
expect(hit).to.equal(false);
});
it("Should find 1 intersection between a curve and a line", () => {
let A = new freesewing.Point(10, 10);
let Acp = new freesewing.Point(310, 40);
let B = new freesewing.Point(110, 70);
let Bcp = new freesewing.Point(-210, 40);
let E = new freesewing.Point(20, 20);
let D = new freesewing.Point(30, -85);
let A = new Point(10, 10);
let Acp = new Point(310, 40);
let B = new Point(110, 70);
let Bcp = new Point(-210, 40);
let E = new Point(20, 20);
let D = new Point(30, -85);
let hit = freesewing.utils.lineIntersectsCurve(E, D, A, Acp, Bcp, B);
let hit = lineIntersectsCurve(E, D, A, Acp, Bcp, B);
expect(round(hit.x)).to.equal(20.85);
expect(round(hit.y)).to.equal(11.11);
});
it("Should find 3 intersections between a curve and a line", () => {
let A = new freesewing.Point(10, 10);
let Acp = new freesewing.Point(310, 40);
let B = new freesewing.Point(110, 70);
let Bcp = new freesewing.Point(-210, 40);
let E = new freesewing.Point(20, -5);
let D = new freesewing.Point(100, 85);
let A = new Point(10, 10);
let Acp = new Point(310, 40);
let B = new Point(110, 70);
let Bcp = new Point(-210, 40);
let E = new Point(20, -5);
let D = new Point(100, 85);
let hits = freesewing.utils.lineIntersectsCurve(E, D, A, Acp, Bcp, B);
let hits = lineIntersectsCurve(E, D, A, Acp, Bcp, B);
expect(hits.length).to.equal(3);
});
it("Should find 9 intersections between two curves", () => {
let A = new freesewing.Point(10, 10);
let Acp = new freesewing.Point(310, 40);
let B = new freesewing.Point(110, 70);
let Bcp = new freesewing.Point(-210, 40);
let C = new freesewing.Point(20, -5);
let Ccp = new freesewing.Point(60, 300);
let D = new freesewing.Point(100, 85);
let Dcp = new freesewing.Point(70, -220);
let A = new Point(10, 10);
let Acp = new Point(310, 40);
let B = new Point(110, 70);
let Bcp = new Point(-210, 40);
let C = new Point(20, -5);
let Ccp = new Point(60, 300);
let D = new Point(100, 85);
let Dcp = new Point(70, -220);
let hits = freesewing.utils.curvesIntersect(A, Acp, Bcp, B, C, Ccp, Dcp, D);
let hits = curvesIntersect(A, Acp, Bcp, B, C, Ccp, Dcp, D);
expect(hits.length).to.equal(9);
});
it("Should find 1 intersection between two curves", () => {
let A = new freesewing.Point(10, 10);
let Acp = new freesewing.Point(310, 40);
let B = new freesewing.Point(110, 70);
let Bcp = new freesewing.Point(-210, 40);
let C = new freesewing.Point(20, -5);
let Ccp = new freesewing.Point(-60, 300);
let D = new freesewing.Point(-200, 85);
let Dcp = new freesewing.Point(-270, -220);
let A = new Point(10, 10);
let Acp = new Point(310, 40);
let B = new Point(110, 70);
let Bcp = new Point(-210, 40);
let C = new Point(20, -5);
let Ccp = new Point(-60, 300);
let D = new Point(-200, 85);
let Dcp = new Point(-270, -220);
let hit = freesewing.utils.curvesIntersect(A, Acp, Bcp, B, C, Ccp, Dcp, D);
let hit = curvesIntersect(A, Acp, Bcp, B, C, Ccp, Dcp, D);
expect(round(hit.x)).to.equal(15.58);
expect(round(hit.y)).to.equal(10.56);
});
it("Should find no intersection between two curves", () => {
let A = new freesewing.Point(10, 10);
let Acp = new freesewing.Point(310, 40);
let B = new freesewing.Point(110, 70);
let Bcp = new freesewing.Point(-210, 40);
let C = new freesewing.Point(20, -5);
let Ccp = new freesewing.Point(-60, -300);
let D = new freesewing.Point(-200, 85);
let Dcp = new freesewing.Point(-270, -220);
let A = new Point(10, 10);
let Acp = new Point(310, 40);
let B = new Point(110, 70);
let Bcp = new Point(-210, 40);
let C = new Point(20, -5);
let Ccp = new Point(-60, -300);
let D = new Point(-200, 85);
let Dcp = new Point(-270, -220);
let hit = freesewing.utils.curvesIntersect(A, Acp, Bcp, B, C, Ccp, Dcp, D);
let hit = curvesIntersect(A, Acp, Bcp, B, C, Ccp, Dcp, D);
expect(hit).to.equal(false);
});
it("Should correctly format units", () => {
expect(freesewing.utils.units(123.456)).to.equal("12.35cm");
expect(freesewing.utils.units(123.456, "imperial")).to.equal('4.86"');
expect(units(123.456)).to.equal("12.35cm");
expect(units(123.456, "imperial")).to.equal('4.86"');
});
it("Should find a start or end point on beam", () => {
let A = new freesewing.Point(12, 34);
let B = new freesewing.Point(56, 78);
let checkA = new freesewing.Point(12, 34);
let checkB = new freesewing.Point(56, 78);
expect(freesewing.utils.pointOnBeam(A, B, checkA)).to.equal(true);
expect(freesewing.utils.pointOnBeam(A, B, checkB)).to.equal(true);
let A = new Point(12, 34);
let B = new Point(56, 78);
let checkA = new Point(12, 34);
let checkB = new Point(56, 78);
expect(pointOnBeam(A, B, checkA)).to.equal(true);
expect(pointOnBeam(A, B, checkB)).to.equal(true);
});
it("Should find whether a point lies on a line segment", () => {
let A = new freesewing.Point(12, 34);
let B = new freesewing.Point(56, 78);
let A = new Point(12, 34);
let B = new Point(56, 78);
let check1 = A.shiftTowards(B, 10);
let check2 = A.shiftTowards(B, 210);
expect(freesewing.utils.pointOnLine(A, B, check1)).to.equal(true);
expect(freesewing.utils.pointOnLine(A, B, check2)).to.equal(false);
expect(pointOnLine(A, B, check1)).to.equal(true);
expect(pointOnLine(A, B, check2)).to.equal(false);
});
it("Should find a start or end point on curve", () => {
let A = new freesewing.Point(12, 34);
let Acp = new freesewing.Point(123, 4);
let B = new freesewing.Point(56, 78);
let Bcp = new freesewing.Point(5, 678);
let checkA = new freesewing.Point(12, 34);
let checkB = new freesewing.Point(56, 78);
expect(freesewing.utils.pointOnCurve(A, Acp, Bcp, B, checkA)).to.equal(true);
expect(freesewing.utils.pointOnCurve(A, Acp, Bcp, B, checkB)).to.equal(true);
let A = new Point(12, 34);
let Acp = new Point(123, 4);
let B = new Point(56, 78);
let Bcp = new Point(5, 678);
let checkA = new Point(12, 34);
let checkB = new Point(56, 78);
expect(pointOnCurve(A, Acp, Bcp, B, checkA)).to.equal(true);
expect(pointOnCurve(A, Acp, Bcp, B, checkB)).to.equal(true);
});
it("Should find the intersections of a beam and circle", () => {
let A = new freesewing.Point(45, 45).attr("data-circle", 35);
let B = new freesewing.Point(5, 50);
let C = new freesewing.Point(25, 30);
let intersections = freesewing.utils.beamIntersectsCircle(
let A = new Point(45, 45).attr("data-circle", 35);
let B = new Point(5, 50);
let C = new Point(25, 30);
let intersections = beamIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -230,10 +259,10 @@ describe('Utils', () => {
});
it("Should not find the intersections of this beam and circle", () => {
let A = new freesewing.Point(75, 75).attr("data-circle", 35);
let B = new freesewing.Point(5, 5);
let C = new freesewing.Point(10, 5);
let intersections = freesewing.utils.beamIntersectsCircle(
let A = new Point(75, 75).attr("data-circle", 35);
let B = new Point(5, 5);
let C = new Point(10, 5);
let intersections = beamIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -243,10 +272,10 @@ describe('Utils', () => {
});
it("Should find one intersections between this beam and circle", () => {
let A = new freesewing.Point(5, 5).attr("data-circle", 5);
let B = new freesewing.Point(0, 0);
let C = new freesewing.Point(-10, 0);
let intersections = freesewing.utils.beamIntersectsCircle(
let A = new Point(5, 5).attr("data-circle", 5);
let B = new Point(0, 0);
let C = new Point(-10, 0);
let intersections = beamIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -258,10 +287,10 @@ describe('Utils', () => {
});
it("Should find one intersections between this tangent and circle", () => {
let A = new freesewing.Point(5, 5).attr("data-circle", 5);
let B = new freesewing.Point(0, 0);
let C = new freesewing.Point(10, 0);
let intersections = freesewing.utils.lineIntersectsCircle(
let A = new Point(5, 5).attr("data-circle", 5);
let B = new Point(0, 0);
let C = new Point(10, 0);
let intersections = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -273,10 +302,10 @@ describe('Utils', () => {
});
it("Should find one intersection between this line and circle", () => {
let A = new freesewing.Point(5, 5).attr("data-circle", 5);
let B = new freesewing.Point(5, 5);
let C = new freesewing.Point(26, 25);
let intersections = freesewing.utils.lineIntersectsCircle(
let A = new Point(5, 5).attr("data-circle", 5);
let B = new Point(5, 5);
let C = new Point(26, 25);
let intersections = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -288,10 +317,10 @@ describe('Utils', () => {
});
it("Should not find an intersections between this line and circle", () => {
let A = new freesewing.Point(5, 5).attr("data-circle", 5);
let B = new freesewing.Point(0, 0);
let C = new freesewing.Point(-10, 0);
let intersections = freesewing.utils.lineIntersectsCircle(
let A = new Point(5, 5).attr("data-circle", 5);
let B = new Point(0, 0);
let C = new Point(-10, 0);
let intersections = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -301,24 +330,24 @@ describe('Utils', () => {
});
it("Should find two intersections between this line and circle", () => {
let A = new freesewing.Point(6, 7).attr("data-circle", 5);
let B = new freesewing.Point(0, 10);
let C = new freesewing.Point(10, 0);
let intersections1 = freesewing.utils.lineIntersectsCircle(
let A = new Point(6, 7).attr("data-circle", 5);
let B = new Point(0, 10);
let C = new Point(10, 0);
let intersections1 = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
C,
"foo"
);
let intersections2 = freesewing.utils.lineIntersectsCircle(
let intersections2 = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
C,
"x"
);
let intersections3 = freesewing.utils.lineIntersectsCircle(
let intersections3 = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -339,10 +368,10 @@ describe('Utils', () => {
});
it("Should find the intersections of a line and circle", () => {
let A = new freesewing.Point(45, 45).attr("data-circle", 35);
let B = new freesewing.Point(5, 50);
let C = new freesewing.Point(25, 30);
let intersections = freesewing.utils.lineIntersectsCircle(
let A = new Point(45, 45).attr("data-circle", 35);
let B = new Point(5, 50);
let C = new Point(25, 30);
let intersections = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -354,10 +383,10 @@ describe('Utils', () => {
});
it("Should not find intersections of this line and circle", () => {
let A = new freesewing.Point(75, 75).attr("data-circle", 35);
let B = new freesewing.Point(5, 5);
let C = new freesewing.Point(10, 5);
let intersections = freesewing.utils.lineIntersectsCircle(
let A = new Point(75, 75).attr("data-circle", 35);
let B = new Point(5, 5);
let C = new Point(10, 5);
let intersections = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -367,10 +396,10 @@ describe('Utils', () => {
});
it("Should not find intersections of this line and circle", () => {
let A = new freesewing.Point(45, 45).attr("data-circle", 35);
let B = new freesewing.Point(40, 40);
let C = new freesewing.Point(52, 50);
let intersections = freesewing.utils.lineIntersectsCircle(
let A = new Point(45, 45).attr("data-circle", 35);
let B = new Point(40, 40);
let C = new Point(52, 50);
let intersections = lineIntersectsCircle(
A,
A.attributes.get("data-circle"),
B,
@ -380,16 +409,16 @@ describe('Utils', () => {
});
it("Should find intersections between circles", () => {
let A = new freesewing.Point(10, 10).attr("data-circle", 15);
let B = new freesewing.Point(30, 30).attr("data-circle", 35);
let A = new Point(10, 10).attr("data-circle", 15);
let B = new Point(30, 30).attr("data-circle", 35);
let intersections1 = freesewing.utils.circlesIntersect(
let intersections1 = circlesIntersect(
A,
A.attributes.get("data-circle"),
B,
B.attributes.get("data-circle")
);
let intersections2 = freesewing.utils.circlesIntersect(
let intersections2 = circlesIntersect(
A,
A.attributes.get("data-circle"),
B,
@ -409,10 +438,10 @@ describe('Utils', () => {
});
it("Should not find intersections between non-overlapping circles", () => {
let A = new freesewing.Point(10, 10).attr("data-circle", 15);
let B = new freesewing.Point(90, 90).attr("data-circle", 35);
let A = new Point(10, 10).attr("data-circle", 15);
let B = new Point(90, 90).attr("data-circle", 35);
let intersections = freesewing.utils.circlesIntersect(
let intersections = circlesIntersect(
A,
A.attributes.get("data-circle"),
B,
@ -422,10 +451,10 @@ describe('Utils', () => {
});
it("Should not find intersections between contained circles", () => {
let A = new freesewing.Point(10, 10).attr("data-circle", 15);
let B = new freesewing.Point(10, 10).attr("data-circle", 35);
let A = new Point(10, 10).attr("data-circle", 15);
let B = new Point(10, 10).attr("data-circle", 35);
let intersections = freesewing.utils.circlesIntersect(
let intersections = circlesIntersect(
A,
A.attributes.get("data-circle"),
B,
@ -435,10 +464,10 @@ describe('Utils', () => {
});
it("Should not find intersections between identical circles", () => {
let A = new freesewing.Point(10, 10).attr("data-circle", 35);
let B = new freesewing.Point(10, 10).attr("data-circle", 35);
let A = new Point(10, 10).attr("data-circle", 35);
let B = new Point(10, 10).attr("data-circle", 35);
let intersections = freesewing.utils.circlesIntersect(
let intersections = circlesIntersect(
A,
A.attributes.get("data-circle"),
B,
@ -448,22 +477,22 @@ describe('Utils', () => {
});
it("Should return scale for a given amount of stretch", () => {
expect(freesewing.utils.stretchToScale(0)).to.equal(1);
expect(freesewing.utils.stretchToScale(0.25)).to.equal(0.8);
expect(stretchToScale(0)).to.equal(1);
expect(stretchToScale(0.25)).to.equal(0.8);
});
it("Should capitalize a string", () => {
expect(utils.capitalize("test")).to.equal("Test");
expect(utils.capitalize("Freesewing")).to.equal("Freesewing");
expect(capitalize("test")).to.equal("Test");
expect(capitalize("Freesewing")).to.equal("Freesewing");
});
it("Should split a curve", () => {
let a = new freesewing.Point(0, 0);
let b = new freesewing.Point(50, 0);
let c = new freesewing.Point(50, 100);
let d = new freesewing.Point(100, 100);
let X = new freesewing.Point(50, 50);
let [c1, c2] = utils.splitCurve(a, b, c, d, X);
let a = new Point(0, 0);
let b = new Point(50, 0);
let c = new Point(50, 100);
let d = new Point(100, 100);
let X = new Point(50, 50);
let [c1, c2] = splitCurve(a, b, c, d, X);
expect(round(c1.cp1.x)).to.equal(25);
expect(round(c1.cp1.y)).to.equal(0);
expect(round(c1.cp2.x)).to.equal(37.5);
@ -475,48 +504,48 @@ describe('Utils', () => {
});
it("Should find where a curve intersects a given X-value", () => {
let a = new freesewing.Point(0, 0);
let b = new freesewing.Point(50, 0);
let c = new freesewing.Point(50, 100);
let d = new freesewing.Point(100, 100);
let i = utils.curveIntersectsX(a, b, c, d, 30);
let a = new Point(0, 0);
let b = new Point(50, 0);
let c = new Point(50, 100);
let d = new Point(100, 100);
let i = curveIntersectsX(a, b, c, d, 30);
expect(round(i.x)).to.equal(30);
expect(round(i.y)).to.equal(16);
});
it("Should find where a curve intersects a given Y-value", () => {
let a = new freesewing.Point(0, 0);
let b = new freesewing.Point(50, 0);
let c = new freesewing.Point(50, 100);
let d = new freesewing.Point(100, 100);
let i = utils.curveIntersectsY(a, b, c, d, 30);
let a = new Point(0, 0);
let b = new Point(50, 0);
let c = new Point(50, 100);
let d = new Point(100, 100);
let i = curveIntersectsY(a, b, c, d, 30);
expect(round(i.x)).to.equal(39.49);
expect(round(i.y)).to.equal(30);
});
// Recreate issue #1206
it("Should find intersecting beams when a line is almost vertical", () => {
let a = new freesewing.Point(225.72, 241);
let b = new freesewing.Point(225.71999999999997, 600);
let i = utils.beamIntersectsY(a, b, 400);
let a = new Point(225.72, 241);
let b = new Point(225.71999999999997, 600);
let i = beamIntersectsY(a, b, 400);
expect(round(i.y)).to.equal(400);
});
it("Should check for valid coordinate", () => {
expect(utils.isCoord(23423.23)).to.equal(true);
expect(utils.isCoord(0)).to.equal(true);
expect(utils.isCoord()).to.equal(false);
expect(utils.isCoord(null)).to.equal(false);
expect(utils.isCoord('hi')).to.equal(false);
expect(utils.isCoord(NaN)).to.equal(false);
expect(isCoord(23423.23)).to.equal(true);
expect(isCoord(0)).to.equal(true);
expect(isCoord()).to.equal(false);
expect(isCoord(null)).to.equal(false);
expect(isCoord('hi')).to.equal(false);
expect(isCoord(NaN)).to.equal(false);
});
it("Should return the correct sample style", () => {
expect(utils.sampleStyle(0, 5)).to.equal("stroke: hsl(-66, 100%, 35%);")
expect(utils.sampleStyle(1, 5)).to.equal("stroke: hsl(0, 100%, 35%);")
expect(utils.sampleStyle(2, 5)).to.equal("stroke: hsl(66, 100%, 35%);")
expect(utils.sampleStyle(3, 5)).to.equal("stroke: hsl(132, 100%, 35%);")
expect(utils.sampleStyle(4, 5)).to.equal("stroke: hsl(198, 100%, 35%);")
expect(sampleStyle(0, 5)).to.equal("stroke: hsl(-66, 100%, 35%);")
expect(sampleStyle(1, 5)).to.equal("stroke: hsl(0, 100%, 35%);")
expect(sampleStyle(2, 5)).to.equal("stroke: hsl(66, 100%, 35%);")
expect(sampleStyle(3, 5)).to.equal("stroke: hsl(132, 100%, 35%);")
expect(sampleStyle(4, 5)).to.equal("stroke: hsl(198, 100%, 35%);")
});
it("Should return the correct sample styles", () => {
@ -527,21 +556,21 @@ describe('Utils', () => {
"stroke: pink;",
"stroke: orange;",
]
for (let i=0;i<5;i++) expect(utils.sampleStyle(i, 5, styles)).to.equal(styles[i])
for (let i=0;i<5;i++) expect(sampleStyle(i, 5, styles)).to.equal(styles[i])
});
it("Should convert degrees to radians", () => {
expect(utils.deg2rad(0)).to.equal(0);
expect(round(utils.deg2rad(69))).to.equal(1.2);
expect(deg2rad(0)).to.equal(0);
expect(round(deg2rad(69))).to.equal(1.2);
});
it("Should convert radians to degrees", () => {
expect(utils.rad2deg(0)).to.equal(0);
expect(round(utils.rad2deg(69))).to.equal(3953.41);
expect(rad2deg(0)).to.equal(0);
expect(round(rad2deg(69))).to.equal(3953.41);
});
it("Should shoulder return two methods for pctBasedOn", () => {
const result = utils.pctBasedOn('chest')
const result = pctBasedOn('chest')
expect(typeof result.toAbs).to.equal("function");
expect(typeof result.fromAbs).to.equal("function");
const measurements = { chest: 1000 }
@ -550,7 +579,7 @@ describe('Utils', () => {
});
it("Should generate a part transform", () => {
let pattern = new freesewing.Pattern();
let pattern = new Pattern();
pattern.settings.mode = "draft";
let part = new pattern.Part();
let short = part.shorthand();
@ -560,7 +589,7 @@ describe('Utils', () => {
.move(part.points.from)
.line(part.points.to);
part.stack();
const transform = utils.generatePartTransform(30,60,90,true,true,part)
const transform = generatePartTransform(30,60,90,true,true,part)
expect(transform.transform).to.equal(`translate(${30 + part.topLeft.x + part.bottomRight.x} ${60 + part.topLeft.y + part.bottomRight.y}) scale(-1 -1) rotate(90 ${part.topLeft.x + part.width/2} ${part.topLeft.y + part.height/2})`);
});
});