Skip to content

Commit 33f5901

Browse files
committed
Add tests for _findLargestStrokeWidth
1 parent 6782995 commit 33f5901

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"json": "^9.0.6",
4040
"lodash.defaultsdeep": "4.6.1",
4141
"mkdirp": "^1.0.3",
42+
"mock-require": "^3.0.3",
4243
"rimraf": "^3.0.1",
4344
"tap": "^11.0.1",
4445
"webpack": "^4.8.0",

test/stroke-width.js

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
const test = require('tap').test;
2+
const jsdom = require('jsdom');
3+
const {JSDOM} = jsdom;
4+
5+
const mockRequire = require('mock-require');
6+
// The font inliner uses Webpack loader require syntax, which doesn't work in Node.
7+
mockRequire('../src/font-inliner', () => {});
8+
9+
const SvgRenderer = require('../src/svg-renderer');
10+
11+
const {window} = new JSDOM();
12+
// The SvgRenderer constructor tries to get a canvas' context, which doesn't work in JSDOM
13+
window.HTMLCanvasElement.prototype.getContext = () => {};
14+
global.window = window;
15+
global.document = window.document;
16+
global.DOMParser = window.DOMParser;
17+
const parser = new window.DOMParser();
18+
19+
const renderer = new SvgRenderer();
20+
21+
const parseSVGString = svgString => parser.parseFromString(svgString, 'image/svg+xml').documentElement;
22+
23+
test('stroke-width set to maximum', t => {
24+
const svg = parseSVGString(`
25+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 256 256" height="256" width="256">
26+
<circle r="128" cy="128" cx="128" fill="red" fill-rule="nonzero" stroke="black" stroke-width="16" />
27+
<circle r="128" cy="128" cx="128" fill="blue" fill-rule="nonzero" stroke="black" stroke-width="32" />
28+
<circle r="128" cy="128" cx="128" fill="green" fill-rule="nonzero" stroke="black" stroke-width="48" />
29+
</svg>
30+
`);
31+
32+
const largestStrokeWidth = renderer._findLargestStrokeWidth(svg);
33+
34+
t.equals(largestStrokeWidth, 48, 'stroke-width is set to largest value');
35+
t.end();
36+
});
37+
38+
39+
test('stroke-width unset', t => {
40+
const svg = parseSVGString(`
41+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 256 256" height="256" width="256">
42+
<circle r="128" cy="128" cx="128" fill="red" fill-rule="nonzero" stroke="black" />
43+
</svg>
44+
`);
45+
46+
const largestStrokeWidth = renderer._findLargestStrokeWidth(svg);
47+
48+
t.equals(largestStrokeWidth, 1, 'stroke-width is 1 by default');
49+
t.end();
50+
});
51+
52+
test('stroke set to none', t => {
53+
const svg = parseSVGString(`
54+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 256 256" height="256" width="256">
55+
<circle r="128" cy="128" cx="128" fill="red" fill-rule="nonzero" stroke="none" stroke-width="32" />
56+
<circle r="128" cy="128" cx="128" fill="red" fill-rule="nonzero" stroke="black" stroke-width="16" />
57+
</svg>
58+
`);
59+
60+
const largestStrokeWidth = renderer._findLargestStrokeWidth(svg);
61+
62+
t.equals(largestStrokeWidth, 16, 'stroke="none" doesn\'t affect width');
63+
t.end();
64+
});
65+
66+
test('stroke-width below 1', t => {
67+
const svg = parseSVGString(`
68+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 256 256" height="256" width="256">
69+
<circle r="128" cy="128" cx="128" fill="red" fill-rule="nonzero" stroke="black" stroke-width="0.5" />
70+
</svg>
71+
`);
72+
73+
const largestStrokeWidth = renderer._findLargestStrokeWidth(svg);
74+
75+
t.equals(largestStrokeWidth, 0.5, 'stroke-width is 0.5');
76+
t.end();
77+
});
78+
79+
test('stroke-width but no stroke', t => {
80+
const svg = parseSVGString(`
81+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 256 256" height="256" width="256">
82+
<circle r="128" cy="128" cx="128" fill="red" fill-rule="nonzero" stroke="black" stroke-width="16" />
83+
<circle r="128" cy="128" cx="128" fill="white" fill-rule="nonzero" stroke-width="32" />
84+
</svg>
85+
`);
86+
87+
const largestStrokeWidth = renderer._findLargestStrokeWidth(svg);
88+
89+
t.equals(largestStrokeWidth, 16, 'stroke-width is ignored when element has no stroke attribute');
90+
t.end();
91+
});
92+
93+
test('stroke-width set to invalid value', t => {
94+
const svg = parseSVGString(`
95+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 256 256" height="256" width="256">
96+
<circle r="128" cy="128" cx="128" fill="red" fill-rule="nonzero" stroke="black" stroke-width="wrong" />
97+
</svg>
98+
`);
99+
100+
const largestStrokeWidth = renderer._findLargestStrokeWidth(svg);
101+
102+
t.equals(largestStrokeWidth, 1, 'invalid stroke-width defaults to 1');
103+
t.end();
104+
});
105+
106+
test('stroke-width on the wrong elements', t => {
107+
const svg = parseSVGString(`
108+
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 256 256" height="256" width="256">
109+
<image href="" stroke="black" stroke-width="64" />
110+
<circle r="128" cy="128" cx="128" fill="white" fill-rule="nonzero" stroke="black" stroke-width="16" />
111+
</svg>
112+
`);
113+
114+
const largestStrokeWidth = renderer._findLargestStrokeWidth(svg);
115+
116+
t.equals(largestStrokeWidth, 16, 'stroke-width is ignored when applied to elements that cannot have a stroke');
117+
t.end();
118+
});

0 commit comments

Comments
 (0)