1
0
Fork 0
freesewing/packages/core/tests/svg.test.mjs
joostdecock 26e282f5b7 fix: Fix tests after major chai upgrade
Note that the tests for Lumina are failing, but that's not related to
the chai upgrade, rather it seems these tests fail because of issues in
the design that we'll tackle later (it's a brand new design yet to be
released).
2024-02-04 12:14:42 +01:00

277 lines
9 KiB
JavaScript

import { expect, use } from 'chai'
import chaiString from 'chai-string'
import { Svg } from '../src/svg.mjs'
import { Design, Attributes } from '../src/index.mjs'
import { Defs } from '../src/defs.mjs'
import { version } from '../data.mjs'
import render from './fixtures/render.mjs'
import { binpackPlugin } from '../../../plugins/plugin-bin-pack/src/index.mjs'
use(chaiString)
const getPattern = (settings = {}, draft = false) => {
const part = {
name: 'test',
plugins: binpackPlugin,
draft: draft
? draft
: ({ paths, Path, Point, part }) => {
paths.test = new Path()
.move(new Point(0, 0))
.line(new Point(40, 20))
.curve(new Point(12, 34), new Point(56, 78), new Point(21, 32))
.close()
.attr('id', 'something')
.attr('class', 'freesewing')
return part
},
}
const Pattern = new Design({ parts: [part], noCorePlugins: true })
return new Pattern(settings)
}
const trim = (svg) =>
svg
.split('\n')
.map((line) => line.trim())
.join('')
describe('Svg', () => {
it('Svg constructor should initialize object', () => {
const svg = new Svg()
expect(svg.attributes instanceof Attributes).to.equal(true)
expect(svg.freeId).to.equal(0)
expect(svg.style).to.equal('')
expect(svg.defs).to.be.an.instanceof(Defs)
expect(svg.prefix).to.equal('<?xml version="1.0" encoding="UTF-8" standalone="no"?>')
expect(svg.attributes.get('xmlns')).to.equal('http://www.w3.org/2000/svg')
expect(svg.attributes.get('xmlns:svg')).to.equal('http://www.w3.org/2000/svg')
expect(svg.attributes.get('xmlns:xlink')).to.equal('http://www.w3.org/1999/xlink')
expect(svg.attributes.get('xmlns:freesewing')).to.equal(
'http://freesewing.org/namespaces/freesewing'
)
expect(svg.attributes.get('freesewing')).to.equal(version)
})
it('Svg constructor should use the object we pass it as pattern', () => {
const obj = {}
const svg = new Svg(obj)
expect(svg.pattern).to.eql(obj)
})
it('Should render a pattern as SVG', () => {
const pattern = getPattern()
const svg = pattern.draft().render()
expect(trim(svg)).to.equalIgnoreSpaces(render.boilerplate)
})
it('Should render the SVG language attribute', () => {
const pattern = getPattern({ locale: 'nl' })
const svg = pattern.draft().render()
expect(svg).to.equalIgnoreSpaces(render.boilerplateNl)
})
it('Should render the SVG viewBox attribute for embedding', () => {
const pattern = getPattern({ embed: true })
const svg = pattern.draft().render()
expect(trim(svg)).to.equalIgnoreSpaces(render.embed)
})
it('Should render a stack as SVG', () => {
const pattern = getPattern()
pattern.draft().render()
const svg = pattern.svg.__renderStack(pattern.stacks.test)
expect(trim(svg)).to.equalIgnoreSpaces(render.part)
})
it('Should render a part as SVG', () => {
const pattern = getPattern()
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.part)
})
it('Should render a path as SVG', () => {
const pattern = getPattern()
pattern.draft().render()
const svg = pattern.svg.__renderPath(pattern.parts[0].test.paths.test)
expect(trim(svg)).to.equalIgnoreSpaces(render.path)
})
it('Should render Svg text', () => {
const pattern = getPattern({}, ({ points, Point, part }) => {
points.test = new Point(20, 20)
.attr('data-text', 'This is a test')
.attr('data-text-class', 'text-lg')
points.other = new Point(10, 10).attr('data-text', '')
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.text)
})
it('Should render Svg multi-line text', () => {
const pattern = getPattern({}, ({ points, Point, part }) => {
points.test = new Point(20, 20)
.attr('data-text', 'This is a test\nwith text on\nmultiple lines')
.attr('data-text-class', 'text-lg')
.attr('data-text-lineheight', 8)
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.multiText)
})
it('Should render Svg multi-line text with default lineheight', () => {
const pattern = getPattern({}, ({ points, Point, part }) => {
points.test = new Point(20, 20)
.attr('data-text', 'This is a test\nwith text on\nmultiple lines')
.attr('data-text-class', 'text-lg')
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.multiTextDflt)
})
it('Should render Svg text on path', () => {
const pattern = getPattern({}, ({ paths, Path, Point, part }) => {
paths.test = new Path()
.move(new Point(0, 0))
.line(new Point(40, 20))
.curve(new Point(12, 34), new Point(56, 78), new Point(21, 32))
.close()
.attr('data-text', 'This is another test')
.attr('data-text-class', 'text-sm')
.attr('class', 'freesewing')
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.textOnPath)
})
it('Should render Svg text on path, center aligned', () => {
const pattern = getPattern({}, ({ paths, Path, part }) => {
paths.test = new Path()
.attr('data-text', 'This is another test')
.attr('data-text-class', 'center')
.attr('class', 'freesewing')
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.textOnPathCenter)
})
it('Should render Svg text on path, right aligned', () => {
const pattern = getPattern({}, ({ paths, Path, part }) => {
paths.test = new Path()
.attr('data-text', 'This is another test')
.attr('data-text-class', 'right')
.attr('class', 'freesewing')
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.textOnPathRight)
})
it('Should render an Svg circle', () => {
const pattern = getPattern({}, ({ points, Point, part }) => {
points.test = new Point(20, 20).attr('data-circle', '50')
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.circle)
})
it('Should render an Svg snippet', () => {
const pattern = getPattern({}, ({ snippets, Snippet, Point, part }) => {
snippets.test = new Snippet('test', new Point(20, 20))
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.snippet)
})
it('Should render a rotated Svg snippet', () => {
const pattern = getPattern({}, ({ snippets, Snippet, Point, part }) => {
snippets.test = new Snippet('test', new Point(20, 20)).attr('data-rotate', 90)
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.rotatedSnippet)
})
it('Should replaced double quotes in Svg text', () => {
const svg = new Svg()
expect(svg.__escapeText('This is a "test" message')).to.equal(
'This is a &#8220;test&#8220; message'
)
})
it('Should scale an Svg snippet', () => {
const pattern = getPattern({}, ({ snippets, Snippet, Point, part }) => {
snippets.test = new Snippet('test', new Point(20, 20)).attr('data-scale', 2)
return part
})
pattern.draft().render()
const svg = pattern.svg.__renderPart(pattern.parts[0].test)
expect(trim(svg)).to.equalIgnoreSpaces(render.scaledSnippet)
})
it('Should run preRender hook', () => {
const pattern = getPattern()
pattern.on('preRender', (svg) => {
svg.attributes.set('data-hook', 'preRender')
})
pattern.draft().render()
expect(pattern.svg.attributes.get('data-hook')).to.equal('preRender')
})
it('Should run insertText hook', () => {
const pattern = getPattern({}, ({ points, Point, part }) => {
points.test = new Point(20, 20)
.attr('data-text', 'This is a test')
.attr('data-text-class', 'text-lg')
return part
})
pattern.on('insertText', (locale, text) => {
return text.toUpperCase()
})
pattern.draft()
expect(pattern.render()).to.contain('THIS IS A TEST')
})
it('Should run postRender hook', () => {
const pattern = getPattern()
pattern.on('postRender', (svg) => {
svg.svg = 'test'
})
expect(pattern.draft().render()).to.equal('test')
})
it('Should tab in and out', () => {
const svg = new Svg()
svg.tabs = 2
expect(svg.__tab()).to.equal(' ')
})
})