2017-11-22 16:46:52 -05:00
|
|
|
import postcss from 'postcss'
|
|
|
|
|
import plugin from '../src/lib/substituteVariantsAtRules'
|
2017-11-24 16:26:40 +02:00
|
|
|
import config from '../defaultConfig.stub.js'
|
2017-11-22 16:46:52 -05:00
|
|
|
|
2017-11-24 16:26:40 +02:00
|
|
|
function run(input, opts = () => config) {
|
2018-03-06 14:07:27 -05:00
|
|
|
return postcss([plugin(opts)]).process(input, { from: undefined })
|
2017-11-22 16:46:52 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
test('it can generate hover variants', () => {
|
|
|
|
|
const input = `
|
|
|
|
|
@variants hover {
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const output = `
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
2017-11-30 15:55:06 -05:00
|
|
|
.hover\\:banana:hover { color: yellow; }
|
|
|
|
|
.hover\\:chocolate:hover { color: brown; }
|
2017-11-22 16:46:52 -05:00
|
|
|
`
|
|
|
|
|
|
|
|
|
|
return run(input).then(result => {
|
|
|
|
|
expect(result.css).toMatchCss(output)
|
|
|
|
|
expect(result.warnings().length).toBe(0)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
2018-02-09 20:20:24 +01:00
|
|
|
test('it can generate active variants', () => {
|
|
|
|
|
const input = `
|
|
|
|
|
@variants active {
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const output = `
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
.active\\:banana:active { color: yellow; }
|
|
|
|
|
.active\\:chocolate:active { color: brown; }
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
return run(input).then(result => {
|
|
|
|
|
expect(result.css).toMatchCss(output)
|
|
|
|
|
expect(result.warnings().length).toBe(0)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
2017-11-22 16:46:52 -05:00
|
|
|
test('it can generate focus variants', () => {
|
|
|
|
|
const input = `
|
|
|
|
|
@variants focus {
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const output = `
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
2017-11-30 15:55:06 -05:00
|
|
|
.focus\\:banana:focus { color: yellow; }
|
|
|
|
|
.focus\\:chocolate:focus { color: brown; }
|
2017-11-22 16:46:52 -05:00
|
|
|
`
|
|
|
|
|
|
|
|
|
|
return run(input).then(result => {
|
|
|
|
|
expect(result.css).toMatchCss(output)
|
|
|
|
|
expect(result.warnings().length).toBe(0)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
2017-12-01 08:14:58 -05:00
|
|
|
test('it can generate group-hover variants', () => {
|
2017-11-28 14:44:43 -05:00
|
|
|
const input = `
|
2017-12-01 08:14:58 -05:00
|
|
|
@variants group-hover {
|
2017-11-28 14:44:43 -05:00
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const output = `
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
2017-12-01 08:14:58 -05:00
|
|
|
.group:hover .group-hover\\:banana { color: yellow; }
|
|
|
|
|
.group:hover .group-hover\\:chocolate { color: brown; }
|
2017-11-28 14:44:43 -05:00
|
|
|
`
|
|
|
|
|
|
|
|
|
|
return run(input).then(result => {
|
|
|
|
|
expect(result.css).toMatchCss(output)
|
|
|
|
|
expect(result.warnings().length).toBe(0)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
2018-02-09 20:20:24 +01:00
|
|
|
test('it can generate hover, active and focus variants', () => {
|
2017-11-22 16:46:52 -05:00
|
|
|
const input = `
|
2018-06-22 10:35:47 -04:00
|
|
|
@variants group-hover, hover, focus, active {
|
2017-11-22 16:46:52 -05:00
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const output = `
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
2018-03-12 12:21:51 -04:00
|
|
|
.group:hover .group-hover\\:banana { color: yellow; }
|
|
|
|
|
.group:hover .group-hover\\:chocolate { color: brown; }
|
2017-11-30 15:55:06 -05:00
|
|
|
.hover\\:banana:hover { color: yellow; }
|
|
|
|
|
.hover\\:chocolate:hover { color: brown; }
|
2018-03-12 12:21:51 -04:00
|
|
|
.focus\\:banana:focus { color: yellow; }
|
|
|
|
|
.focus\\:chocolate:focus { color: brown; }
|
2018-02-16 18:09:20 +01:00
|
|
|
.active\\:banana:active { color: yellow; }
|
|
|
|
|
.active\\:chocolate:active { color: brown; }
|
2017-11-22 16:46:52 -05:00
|
|
|
`
|
|
|
|
|
|
|
|
|
|
return run(input).then(result => {
|
|
|
|
|
expect(result.css).toMatchCss(output)
|
|
|
|
|
expect(result.warnings().length).toBe(0)
|
|
|
|
|
})
|
|
|
|
|
})
|
2017-11-23 09:58:42 -05:00
|
|
|
|
|
|
|
|
test('it wraps the output in a responsive at-rule if responsive is included as a variant', () => {
|
|
|
|
|
const input = `
|
|
|
|
|
@variants responsive, hover, focus {
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const output = `
|
|
|
|
|
@responsive {
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
2017-11-30 15:55:06 -05:00
|
|
|
.hover\\:banana:hover { color: yellow; }
|
|
|
|
|
.hover\\:chocolate:hover { color: brown; }
|
2018-03-12 12:21:51 -04:00
|
|
|
.focus\\:banana:focus { color: yellow; }
|
|
|
|
|
.focus\\:chocolate:focus { color: brown; }
|
2017-11-23 09:58:42 -05:00
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
return run(input).then(result => {
|
|
|
|
|
expect(result.css).toMatchCss(output)
|
|
|
|
|
expect(result.warnings().length).toBe(0)
|
|
|
|
|
})
|
|
|
|
|
})
|
2018-06-22 10:35:47 -04:00
|
|
|
|
|
|
|
|
test('variants are generated in the order specified', () => {
|
|
|
|
|
const input = `
|
|
|
|
|
@variants focus, active, hover {
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const output = `
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
.focus\\:banana:focus { color: yellow; }
|
|
|
|
|
.focus\\:chocolate:focus { color: brown; }
|
|
|
|
|
.active\\:banana:active { color: yellow; }
|
|
|
|
|
.active\\:chocolate:active { color: brown; }
|
|
|
|
|
.hover\\:banana:hover { color: yellow; }
|
|
|
|
|
.hover\\:chocolate:hover { color: brown; }
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
return run(input).then(result => {
|
|
|
|
|
expect(result.css).toMatchCss(output)
|
|
|
|
|
expect(result.warnings().length).toBe(0)
|
|
|
|
|
})
|
|
|
|
|
})
|
2018-06-22 12:30:30 -04:00
|
|
|
|
|
|
|
|
test('plugin variants work', () => {
|
|
|
|
|
const input = `
|
|
|
|
|
@variants first-child {
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
}
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
const output = `
|
|
|
|
|
.banana { color: yellow; }
|
|
|
|
|
.chocolate { color: brown; }
|
|
|
|
|
.first-child\\:banana:first-child { color: yellow; }
|
|
|
|
|
.first-child\\:chocolate:first-child { color: brown; }
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
return run(input, () => ({
|
|
|
|
|
...config,
|
|
|
|
|
plugins: [
|
|
|
|
|
...config.plugins,
|
|
|
|
|
function({ addVariant }) {
|
|
|
|
|
addVariant('first-child', ({ className, separator }) => {
|
|
|
|
|
return `.first-child${separator}${className}:first-child`
|
|
|
|
|
})
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
})).then(result => {
|
|
|
|
|
expect(result.css).toMatchCss(output)
|
|
|
|
|
expect(result.warnings().length).toBe(0)
|
|
|
|
|
})
|
|
|
|
|
})
|