'use strict'; const { collectStylesheet, computeStyle } = require('./style.js'); const { querySelector } = require('./xast.js'); const svg2js = require('./svgo/svg2js.js'); describe('computeStyle', () => { it('collects styles', () => { const root = svg2js(` `); const stylesheet = collectStylesheet(root); expect(computeStyle(stylesheet, querySelector(root, '#class'))).toEqual({ fill: { type: 'static', inherited: false, value: 'red' }, }); expect( computeStyle(stylesheet, querySelector(root, '#two-classes')) ).toEqual({ fill: { type: 'static', inherited: false, value: 'green' }, stroke: { type: 'static', inherited: false, value: 'black' }, }); expect(computeStyle(stylesheet, querySelector(root, '#attribute'))).toEqual( { fill: { type: 'static', inherited: false, value: 'purple' }, } ); expect( computeStyle(stylesheet, querySelector(root, '#inline-style')) ).toEqual({ fill: { type: 'static', inherited: false, value: 'grey' }, }); expect( computeStyle(stylesheet, querySelector(root, '#inheritance')) ).toEqual({ fill: { type: 'static', inherited: true, value: 'yellow' }, }); expect( computeStyle(stylesheet, querySelector(root, '#nested-inheritance')) ).toEqual({ fill: { type: 'static', inherited: true, value: 'blue' }, }); }); it('prioritizes different kinds of styles', () => { const root = svg2js(` `); const stylesheet = collectStylesheet(root); expect( computeStyle(stylesheet, querySelector(root, '#complex-selector')) ).toEqual({ fill: { type: 'static', inherited: false, value: 'red' }, }); expect( computeStyle( stylesheet, querySelector(root, '#attribute-over-inheritance') ) ).toEqual({ fill: { type: 'static', inherited: false, value: 'orange' }, }); expect( computeStyle( stylesheet, querySelector(root, '#style-rule-over-attribute') ) ).toEqual({ fill: { type: 'static', inherited: false, value: 'blue' }, }); expect( computeStyle( stylesheet, querySelector(root, '#inline-style-over-style-rule') ) ).toEqual({ fill: { type: 'static', inherited: false, value: 'purple' }, }); }); it('prioritizes important styles', () => { const root = svg2js(` `); const stylesheet = collectStylesheet(root); expect( computeStyle(stylesheet, querySelector(root, '#complex-selector')) ).toEqual({ fill: { type: 'static', inherited: false, value: 'green' }, }); expect( computeStyle( stylesheet, querySelector(root, '#style-rule-over-inline-style') ) ).toEqual({ fill: { type: 'static', inherited: false, value: 'green' }, }); expect( computeStyle( stylesheet, querySelector(root, '#inline-style-over-style-rule') ) ).toEqual({ fill: { type: 'static', inherited: false, value: 'purple' }, }); }); it('treats at-rules and pseudo-classes as dynamic styles', () => { const root = svg2js(` `); const stylesheet = collectStylesheet(root); expect( computeStyle(stylesheet, querySelector(root, '#media-query')) ).toEqual({ fill: { type: 'dynamic', inherited: false }, }); expect(computeStyle(stylesheet, querySelector(root, '#hover'))).toEqual({ fill: { type: 'dynamic', inherited: false }, }); expect(computeStyle(stylesheet, querySelector(root, '#inherited'))).toEqual( { fill: { type: 'dynamic', inherited: true }, } ); expect( computeStyle(stylesheet, querySelector(root, '#inherited-overriden')) ).toEqual({ fill: { type: 'static', inherited: false, value: 'blue' }, }); expect(computeStyle(stylesheet, querySelector(root, '#static'))).toEqual({ fill: { type: 'static', inherited: false, value: 'black' }, }); }); it('considers `); const stylesheet = collectStylesheet(root); expect( computeStyle(stylesheet, querySelector(root, '#media-query')) ).toEqual({ fill: { type: 'dynamic', inherited: false }, }); expect( computeStyle(stylesheet, querySelector(root, '#kinda-static')) ).toEqual({ fill: { type: 'dynamic', inherited: false }, }); expect(computeStyle(stylesheet, querySelector(root, '#static'))).toEqual({ fill: { type: 'static', inherited: false, value: 'blue' }, }); }); it('ignores `); const stylesheet = collectStylesheet(root); expect( computeStyle(stylesheet, querySelector(root, '#valid-type')) ).toEqual({ fill: { type: 'static', inherited: false, value: 'red' }, }); expect( computeStyle(stylesheet, querySelector(root, '#empty-type')) ).toEqual({ fill: { type: 'static', inherited: false, value: 'green' }, }); expect( computeStyle(stylesheet, querySelector(root, '#invalid-type')) ).toEqual({}); }); it('ignores keyframes atrule', () => { const root = svg2js(` `); const stylesheet = collectStylesheet(root); expect(computeStyle(stylesheet, querySelector(root, '#element'))).toEqual({ animation: { type: 'static', inherited: false, value: 'loading 4s linear infinite', }, }); }); });