vows.describe('media queries')
.addBatch({
'different ones': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media print{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media print{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red}}@media print{div{display:block}}');
}
},
'other than @media': {
- topic: new CleanCSS().minify('@font-face{font-family:A}@font-face{font-family:B}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@font-face{font-family:A}@font-face{font-family:B}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@font-face{font-family:A}@font-face{font-family:B}');
}
})
.addBatch({
'same two adjacent': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red}div{display:block}}');
}
},
'same three adjacent': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media screen{div{display:block}}@media screen{body{width:100%}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media screen{div{display:block}}@media screen{body{width:100%}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red}div{display:block}body{width:100%}}');
}
},
'same two with selectors in between': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}body{width:100%}.one{height:100px}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}body{width:100%}.one{height:100px}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, 'body{width:100%}.one{height:100px}@media screen{a{color:red}div{display:block}}');
}
},
'same two with other @media in between': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){body{width:100%}}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){body{width:100%}}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media (min-width:1024px){body{width:100%}}@media screen{a{color:red}div{display:block}}');
}
},
'same two with breaking properties in between': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}.one{color:#00f}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}.one{color:#00f}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red}}.one{color:#00f}@media screen{div{display:block}}');
}
},
'same two with breaking @media in between': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){.one{color:#00f}}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){.one{color:#00f}}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red}}@media (min-width:1024px){.one{color:#00f}}@media screen{div{display:block}}');
}
},
'same two with breaking nested @media in between': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){@media screen{.one{color:#00f}}}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){@media screen{.one{color:#00f}}}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red}}@media (min-width:1024px){@media screen{.one{color:#00f}}}@media screen{div{display:block}}');
}
},
'intermixed': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){p{width:100%}}@media screen{div{display:block}}@media (min-width:1024px){body{height:100%}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){p{width:100%}}@media screen{div{display:block}}@media (min-width:1024px){body{height:100%}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red}div{display:block}}@media (min-width:1024px){p{width:100%}body{height:100%}}');
}
},
'same two with overriding shorthand in between': {
- topic: new CleanCSS().minify('@media screen{a{font-size:10px}}@media (min-width:1024px){.one{font:12px Helvetica}}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{font-size:10px}}@media (min-width:1024px){.one{font:12px Helvetica}}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{font-size:10px}}@media (min-width:1024px){.one{font:12px Helvetica}}@media screen{div{display:block}}');
}
},
'same two with different component property in between': {
- topic: new CleanCSS().minify('@media screen{a{font-size:10px}}@media (min-width:1024px){.one{font-weight:700}}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{font-size:10px}}@media (min-width:1024px){.one{font-weight:700}}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media (min-width:1024px){.one{font-weight:700}}@media screen{a{font-size:10px}div{display:block}}');
}
},
'same two with same values as moved in between': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){.one{color:red}}@media screen{div{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media (min-width:1024px){.one{color:red}}@media screen{div{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media (min-width:1024px){.one{color:red}}@media screen{a{color:red}div{display:block}}');
}
})
.addBatch({
'further optimizations': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}@media screen{a{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}@media screen{a{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red;display:block}}');
}
})
.addBatch({
'with comments': {
- topic: new CleanCSS().minify('@media screen{a{color:red}}/*! a comment */@media screen{a{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('@media screen{a{color:red}}/*! a comment */@media screen{a{display:block}}');
+ },
'get merged': function(minified) {
assert.equal(minified.styles, '/*! a comment */@media screen{a{color:red;display:block}}');
}
})
.addBatch({
'disabled': {
- topic: new CleanCSS({ mediaMerging: false }).minify('@media screen{a{color:red}}@media screen{a{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS({ mediaMerging: false }).minify('@media screen{a{color:red}}@media screen{a{display:block}}');
+ },
'keeps @media intact': function(minified) {
assert.equal(minified.styles, '@media screen{a{color:red}}@media screen{a{display:block}}');
}
}
},
'no debug': {
- 'topic': new CleanCSS().minify('a{ color: #f00 }'),
+ 'topic': function () {
+ return new CleanCSS().minify('a{ color: #f00 }');
+ },
'should not populate stats hash': function (error, minified) {
assert.isEmpty(minified.stats);
}
},
'debug': {
- 'topic': new CleanCSS({ debug: true }).minify('a{ color: #f00 }'),
+ 'topic': function () {
+ return new CleanCSS({ debug: true }).minify('a{ color: #f00 }');
+ },
'should give time taken': function (error, minified) {
assert.isNumber(minified.stats.timeSpent);
},
}
},
'no warnings': {
- 'topic': new CleanCSS().minify('a{ color: #f00 }'),
+ 'topic': function () {
+ return new CleanCSS().minify('a{ color: #f00 }');
+ },
'if no reasons given': function (error, minified) {
assert.isEmpty(minified.warnings);
}
},
'warnings': {
- 'topic': new CleanCSS({ root: 'test/fixtures', target: 'custom-warnings.css' }).minify('a{color:red}'),
+ 'topic': function () {
+ return new CleanCSS({ root: 'test/fixtures', target: 'custom-warnings.css' }).minify('a{color:red}');
+ },
'are an array': function (error, minified) {
assert.isArray(minified.warnings);
},
}
},
'warnings on extra closing brace': {
- 'topic': new CleanCSS().minify('a{display:block}}'),
+ 'topic': function () {
+ return new CleanCSS().minify('a{display:block}}');
+ },
'should minify correctly': function (error, minified) {
assert.equal(minified.styles, 'a{display:block}');
},
}
},
'warnings on missing closing brace': {
- 'topic': new CleanCSS().minify('a{display:block'),
+ 'topic': function () {
+ return new CleanCSS().minify('a{display:block');
+ },
'should minify correctly': function (error, minified) {
assert.equal(minified.styles, '');
},
}
},
'warnings on unexpected body': {
- 'topic': new CleanCSS().minify('a{display:block}color:#535353}p{color:red}'),
+ 'topic': function () {
+ return new CleanCSS().minify('a{display:block}color:#535353}p{color:red}');
+ },
'should minify correctly': function (error, minified) {
assert.equal(minified.styles, 'a{display:block}p{color:red}');
},
}
},
'warnings on invalid properties': {
- 'topic': new CleanCSS().minify('a{color:}'),
+ 'topic': function () {
+ return new CleanCSS().minify('a{color:}');
+ },
'should minify correctly': function (error, minified) {
assert.isEmpty(minified.styles);
},
}
},
'warnings on broken urls': {
- 'topic': new CleanCSS().minify('a{background:url(image/}'),
+ 'topic': function () {
+ return new CleanCSS().minify('a{background:url(image/}');
+ },
'should output correct content': function (error, minified) {
assert.equal(minified.styles, 'a{background:url(image/}');
},
}
},
'warnings on broken imports': {
- 'topic': new CleanCSS().minify('@impor'),
+ 'topic': function () {
+ return new CleanCSS().minify('@impor');
+ },
'should output correct content': function (error, minified) {
assert.isEmpty(minified.styles);
},
}
},
'warnings on broken comments': {
- 'topic': new CleanCSS().minify('a{}/* '),
+ 'topic': function () {
+ return new CleanCSS().minify('a{}/* ');
+ },
'should output correct content': function (error, minified) {
assert.isEmpty(minified.styles);
},
}
},
'no errors': {
- 'topic': new CleanCSS().minify('a{color:red}'),
+ 'topic': function () {
+ return new CleanCSS().minify('a{color:red}');
+ },
'if no reasons given': function (error, minified) {
assert.isEmpty(minified.errors);
}
},
'errors': {
- 'topic': new CleanCSS(),
+ 'topic': function () {
+ return new CleanCSS();
+ },
'if both root and output used reasons given': function(minifier) {
assert.doesNotThrow(function () {
minifier.minify('@import url(/some/fake/file);', function (errors) {
}
},
'errors when re-running minification': {
- 'topic': new CleanCSS(),
+ 'topic': function () {
+ return new CleanCSS();
+ },
'if both root and output used reasons given': function (minifier) {
minifier.minify('@import url(/some/fake/file);');
minifier.minify('@import url(/some/fake/file);', function(errors) {
},
'options': {
'advanced': {
- 'topic': new CleanCSS({ advanced: true }).minify('a{color:red}a{color:#fff}'),
+ 'topic': function () {
+ return new CleanCSS({ advanced: true }).minify('a{color:red}a{color:#fff}');
+ },
'gets right output': function (minified) {
assert.equal(minified.styles, 'a{color:#fff}');
}
},
'aggressive merging': {
- 'topic': new CleanCSS({ aggressiveMerging: true }).minify('a{display:block;color:red;display:inline-block}'),
+ 'topic': function () {
+ return new CleanCSS({ aggressiveMerging: true }).minify('a{display:block;color:red;display:inline-block}');
+ },
'gets right output': function (minified) {
assert.equal(minified.styles, 'a{color:red;display:inline-block}');
}
},
'process import': {
- 'topic': new CleanCSS({ processImport: true }).minify('@import url(/test/fixtures/partials/one.css);'),
+ 'topic': function () {
+ return new CleanCSS({ processImport: true }).minify('@import url(/test/fixtures/partials/one.css);');
+ },
'gets right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}');
}
},
'rebase': {
- 'topic': new CleanCSS({ rebase: true, relativeTo: path.join(process.cwd(), 'test', 'fixtures'), root: process.cwd() }).minify('div{background:url(./dummy.png)}'),
+ 'topic': function () {
+ return new CleanCSS({ rebase: true, relativeTo: path.join(process.cwd(), 'test', 'fixtures'), root: process.cwd() }).minify('div{background:url(./dummy.png)}');
+ },
'gets right output': function (minified) {
assert.include(minified.styles, 'url(/test/fixtures/dummy.png)');
}
},
- 'restructuring': {
- 'on': {
- 'topic': new CleanCSS({ restructuring: true }).minify('div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}'),
- 'gets right output': function (minified) {
- assert.equal(minified.styles, '.two,div{margin-top:0}.one{margin:0}.two{display:block}');
- }
+ 'restructuring - on': {
+ 'topic': function () {
+ new CleanCSS({ restructuring: true }).minify('div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}', this.callback);
},
- 'off': {
- 'topic': new CleanCSS({ restructuring: false }).minify('div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}'),
- 'gets right output': function (minified) {
- assert.equal(minified.styles, 'div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}');
- }
+ 'gets right output': function (minified) {
+ assert.equal(minified.styles, '.two,div{margin-top:0}.one{margin:0}.two{display:block}');
+ }
+ },
+ 'restructuring - off': {
+ 'topic': function () {
+ return new CleanCSS({ restructuring: false }).minify('div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}');
+ },
+ 'gets right output': function (minified) {
+ assert.equal(minified.styles, 'div{margin-top:0}.one{margin:0}.two{display:block;margin-top:0}');
}
}
},
'source map': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('/*! a */div[data-id=" abc "] { color:red; }'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('/*! a */div[data-id=" abc "] { color:red; }');
+ },
'should minify correctly': function (minified) {
assert.equal(minified.styles, '/*! a */div[data-id=" abc "]{color:red}');
},
'accepts a list of source files as array': {
'rebased to the current dir': {
'relative': {
- 'topic': new CleanCSS().minify(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']),
+ 'topic': function () {
+ return new CleanCSS().minify(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']);
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(test/fixtures/partials/extra/down.gif)}');
}
},
'absolute': {
- 'topic': new CleanCSS({ relativeTo: process.cwd() }).minify([path.resolve('test/fixtures/partials/one.css'), path.resolve('test/fixtures/partials/three.css')]),
+ 'topic': function () {
+ return new CleanCSS({ relativeTo: process.cwd() }).minify([path.resolve('test/fixtures/partials/one.css'), path.resolve('test/fixtures/partials/three.css')]);
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(test/fixtures/partials/extra/down.gif)}');
}
},
'rebased to a path': {
'relative': {
- 'topic': new CleanCSS({ relativeTo: 'test/fixtures' }).minify(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']),
+ 'topic': function () {
+ return new CleanCSS({ relativeTo: 'test/fixtures' }).minify(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']);
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(partials/extra/down.gif)}');
}
},
'absolute': {
- 'topic': new CleanCSS({ relativeTo: 'test/fixtures' }).minify([path.resolve('test/fixtures/partials/one.css'), path.resolve('test/fixtures/partials/three.css')]),
+ 'topic': function () {
+ return new CleanCSS({ relativeTo: 'test/fixtures' }).minify([path.resolve('test/fixtures/partials/one.css'), path.resolve('test/fixtures/partials/three.css')]);
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(partials/extra/down.gif)}');
}
},
'rebased to root': {
'relative': {
- 'topic': new CleanCSS({ root: 'test/fixtures', relativeTo: 'test/fixtures' }).minify(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']),
+ 'topic': function () {
+ return new CleanCSS({ root: 'test/fixtures', relativeTo: 'test/fixtures' }).minify(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']);
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(/partials/extra/down.gif)}');
}
},
'absolute': {
- 'topic': new CleanCSS({ root: 'test/fixtures', relativeTo: 'test/fixtures' }).minify([path.resolve('test/fixtures/partials/one.css'), path.resolve('test/fixtures/partials/three.css')]),
+ 'topic': function () {
+ return new CleanCSS({ root: 'test/fixtures', relativeTo: 'test/fixtures' }).minify([path.resolve('test/fixtures/partials/one.css'), path.resolve('test/fixtures/partials/three.css')]);
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(/partials/extra/down.gif)}');
}
}
},
- 'with imports off': {
- 'topic': new CleanCSS({ processImport: false }).minify(['./test/fixtures/partials/two.css']),
- 'should give right output': function (minified) {
- assert.equal(minified.styles, '@import url(one.css);@import url(extra/three.css);@import url(./extra/four.css);.two{color:#fff}');
+ 'with imports': {
+ 'off': {
+ 'topic': function () {
+ return new CleanCSS({ processImport: false }).minify(['./test/fixtures/partials/two.css']);
+ },
+ 'should give right output': function (minified) {
+ assert.equal(minified.styles, '@import url(one.css);@import url(extra/three.css);@import url(./extra/four.css);.two{color:#fff}');
+ }
}
}
},
'accepts a list of source files as hash': {
'rebased to the current dir': {
'with relative paths': {
- 'topic': new CleanCSS().minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'])),
+ 'topic': function () {
+ return new CleanCSS().minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(test/fixtures/partials/extra/down.gif)}');
}
},
'with absolute paths': {
- 'topic': new CleanCSS().minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'], true)),
+ 'topic': function () {
+ return new CleanCSS().minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'], true));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(test/fixtures/partials/extra/down.gif)}');
}
},
'rebased to a relative path': {
'with relative paths': {
- 'topic': new CleanCSS({ target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'])),
+ 'topic': function () {
+ return new CleanCSS({ target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(partials/extra/down.gif)}');
}
},
'with absolute paths': {
- 'topic': new CleanCSS({ target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'], true)),
+ 'topic': function () {
+ return new CleanCSS({ target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'], true));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(partials/extra/down.gif)}');
}
},
'rebased to an absolute root': {
'with relative paths': {
- 'topic': new CleanCSS({ root: 'test/fixtures', target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'])),
+ 'topic': function () {
+ return new CleanCSS({ root: 'test/fixtures', target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(/partials/extra/down.gif)}');
}
},
'with absolute paths': {
- 'topic': new CleanCSS({ root: 'test/fixtures', target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'], true)),
+ 'topic': function () {
+ return new CleanCSS({ root: 'test/fixtures', target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'], true));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(/partials/extra/down.gif)}');
}
},
'with rebasing off': {
'with relative paths': {
- 'topic': new CleanCSS({ rebase: false }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'])),
+ 'topic': function () {
+ return new CleanCSS({ rebase: false }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(extra/down.gif)}');
}
},
'with absolute paths': {
- 'topic': new CleanCSS({ rebase: false }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'], true)),
+ 'topic': function () {
+ return new CleanCSS({ rebase: false }).minify(sourcesAsHash(['test/fixtures/partials/one.css', 'test/fixtures/partials/three.css'], true));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{background-image:url(extra/down.gif)}');
}
}
},
'with other imports': {
- 'topic': new CleanCSS().minify(sourcesAsHash(['test/fixtures/partials/two.css'])),
+ 'topic': function () {
+ return new CleanCSS().minify(sourcesAsHash(['test/fixtures/partials/two.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{color:#0f0}.four{color:#00f}.two{color:#fff}');
}
},
'with other imports and rebasing off': {
- 'topic': new CleanCSS({ rebase: false }).minify(sourcesAsHash(['test/fixtures/partials/two.css'])),
+ 'topic': function () {
+ return new CleanCSS({ rebase: false }).minify(sourcesAsHash(['test/fixtures/partials/two.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '.one{color:red}.three{color:#0f0}.four{color:#00f}.two{color:#fff}');
}
},
'with other imports and processing imports off': {
'relative to current path': {
- 'topic': new CleanCSS({ processImport: false }).minify(sourcesAsHash(['test/fixtures/partials/two.css'])),
+ 'topic': function () {
+ return new CleanCSS({ processImport: false }).minify(sourcesAsHash(['test/fixtures/partials/two.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '@import url(test/fixtures/partials/one.css);@import url(test/fixtures/partials/extra/three.css);@import url(test/fixtures/partials/extra/four.css);.two{color:#fff}');
}
},
'relative to different path': {
- 'topic': new CleanCSS({ processImport: false, target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/two.css'])),
+ 'topic': function () {
+ return new CleanCSS({ processImport: false, target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/two.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '@import url(partials/one.css);@import url(partials/extra/three.css);@import url(partials/extra/four.css);.two{color:#fff}');
}
},
'absolute': {
- 'topic': new CleanCSS({ processImport: false, root: 'test/fixtures', target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/two.css'])),
+ 'topic': function () {
+ return new CleanCSS({ processImport: false, root: 'test/fixtures', target: 'test/fixtures' }).minify(sourcesAsHash(['test/fixtures/partials/two.css']));
+ },
'should give right output': function (minified) {
assert.equal(minified.styles, '@import url(/partials/one.css);@import url(/partials/extra/three.css);@import url(/partials/extra/four.css);.two{color:#fff}');
}
vows.describe('source-map')
.addBatch({
'vendor prefix with comments': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('html{font-family:sans-serif;/* 1 */-ms-text-size-adjust:100%;/* 2 */-webkit-text-size-adjust:100%/* 3 */}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('html{font-family:sans-serif;/* 1 */-ms-text-size-adjust:100%;/* 2 */-webkit-text-size-adjust:100%/* 3 */}');
+ },
'gets right output': function (minified) {
assert.equal(minified.styles, 'html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}');
}
},
'background gradient': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('a{background: linear-gradient(to bottom, rgba(0, 0, 0, 0.1) 0, rgba(0, 0, 0, 0.1))}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('a{background: linear-gradient(to bottom, rgba(0, 0, 0, 0.1) 0, rgba(0, 0, 0, 0.1))}');
+ },
'gets right output': function (minified) {
assert.equal(minified.styles, 'a{background:linear-gradient(to bottom,rgba(0,0,0,.1) 0,rgba(0,0,0,.1))}');
}
})
.addBatch({
'module #1': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('/*! a */div[data-id=" abc "] { color:red; }'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('/*! a */div[data-id=" abc "] { color:red; }');
+ },
'should have 2 mappings': function(minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 2);
},
}
},
'module #2': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('@media screen {\n@font-face \n{ \nfont-family: test; } }'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('@media screen {\n@font-face \n{ \nfont-family: test; } }');
+ },
'should have 3 mappings': function(minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 3);
},
}
},
'with keepBreaks': {
- 'topic': new CleanCSS({ sourceMap: true, keepBreaks: true }).minify('@media screen { a{color:red} p {color:blue} }div{color:pink}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true, keepBreaks: true }).minify('@media screen { a{color:red} p {color:blue} }div{color:pink}');
+ },
'should have 7 mappings': function(minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 7);
},
}
},
'shorthands': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('a{background:url(image.png);background-color:red}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('a{background:url(image.png);background-color:red}');
+ },
'should have 3 mappings': function(minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 3);
},
}
},
'keyframes': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('@-webkit-keyframes frames {\n 0% {\n border: 1px;\n }\n 100% {\n border: 3px;\n }\n}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('@-webkit-keyframes frames {\n 0% {\n border: 1px;\n }\n 100% {\n border: 3px;\n }\n}');
+ },
'should have 5 mappings': function(minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 5);
},
}
},
'double comments': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('/* COMMENT 1 */\n/* COMMENT 2 */\ndiv{color:red}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('/* COMMENT 1 */\n/* COMMENT 2 */\ndiv{color:red}');
+ },
'should have 2 mappings': function(minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 2);
},
})
.addBatch({
'input map as string': {
- 'topic': new CleanCSS({ sourceMap: inputMap }).minify('div > a {\n color: red;\n}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: inputMap }).minify('div > a {\n color: red;\n}');
+ },
'should have 2 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 2);
},
}
},
'input map from source': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('div > a {\n color: red;\n}/*# sourceMappingURL=' + inputMapPath + ' */'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('div > a {\n color: red;\n}/*# sourceMappingURL=' + inputMapPath + ' */');
+ },
'should have 2 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 2);
},
}
},
'input map from source with root': {
- 'topic': new CleanCSS({ sourceMap: true, relativeTo: path.dirname(inputMapPath) }).minify('div > a {\n color: red;\n}/*# sourceMappingURL=styles.css.map */'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true, relativeTo: path.dirname(inputMapPath) }).minify('div > a {\n color: red;\n}/*# sourceMappingURL=styles.css.map */');
+ },
'should have 2 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 2);
},
}
},
'complex input map': {
- 'topic': new CleanCSS({ sourceMap: true, root: path.dirname(inputMapPath) }).minify('@import url(import.css);'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true, root: path.dirname(inputMapPath) }).minify('@import url(import.css);');
+ },
'should have 4 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 4);
},
}
},
'complex input map referenced by path': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('@import url(test/fixtures/source-maps/import.css);'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('@import url(test/fixtures/source-maps/import.css);');
+ },
'should have 4 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 4);
}
},
'complex but partial input map referenced by path': {
- 'topic': new CleanCSS({ sourceMap: true, target: process.cwd() }).minify('@import url(test/fixtures/source-maps/no-map-import.css);'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true, target: process.cwd() }).minify('@import url(test/fixtures/source-maps/no-map-import.css);');
+ },
'should have 4 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 4);
},
}
},
'complex input map with an existing file as target': {
- 'topic': new CleanCSS({ sourceMap: true, target: path.join(process.cwd(), 'test', 'fixtures', 'source-maps', 'styles.css') }).minify('@import url(test/fixtures/source-maps/styles.css);'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true, target: path.join(process.cwd(), 'test', 'fixtures', 'source-maps', 'styles.css') }).minify('@import url(test/fixtures/source-maps/styles.css);');
+ },
'should have 2 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 2);
},
}
},
'nested once': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('@import url(test/fixtures/source-maps/nested/once.css);'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('@import url(test/fixtures/source-maps/nested/once.css);');
+ },
'should have 2 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 2);
},
}
},
'nested twice': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('@import url(test/fixtures/source-maps/nested/twice.css);'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('@import url(test/fixtures/source-maps/nested/twice.css);');
+ },
'should have 2 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 2);
},
}
},
'input source map with missing mutliselector input': {
- 'topic': new CleanCSS({ sourceMap: '{"version":3,"sources":["source.css"],"names":[],"mappings":"AAAA;;;;IAII,YAAW;EACd"}' }).minify('a,\na:hover,\na:visited\n{\n color: red;\n}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: '{"version":3,"sources":["source.css"],"names":[],"mappings":"AAAA;;;;IAII,YAAW;EACd"}' }).minify('a,\na:hover,\na:visited\n{\n color: red;\n}');
+ },
'should have 4 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 4);
},
}
},
'input source map with missing mutliselector sortable input': {
- 'topic': new CleanCSS({ sourceMap: '{"version":3,"sources":["source.css"],"names":[],"mappings":"AAAA;;;;IAII,YAAW;EACd"}' }).minify('a.button:link,\na.button:visited,\na.button:hover\n{\n color: red;\n}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: '{"version":3,"sources":["source.css"],"names":[],"mappings":"AAAA;;;;IAII,YAAW;EACd"}' }).minify('a.button:link,\na.button:visited,\na.button:hover\n{\n color: red;\n}');
+ },
'should have 4 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 4);
},
})
.addBatch({
'important comment after a property': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('div { color: #f00 !important; /*!comment*/ }'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('div { color: #f00 !important; /*!comment*/ }');
+ },
'has right output': function (errors, minified) {
assert.equal(minified.styles, 'div{color:red!important/*!comment*/}');
}
},
'important comment between properties': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('div { color: #f00 !important; /*!comment*/; display: block }'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('div { color: #f00 !important; /*!comment*/; display: block }');
+ },
'has right output': function (errors, minified) {
assert.equal(minified.styles, 'div{color:red!important;/*!comment*/display:block}');
}
},
'important comments after a property': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('div { color: #f00 !important; /*!1*//*!2*/ }'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('div { color: #f00 !important; /*!1*//*!2*/ }');
+ },
'has right output': function (errors, minified) {
assert.equal(minified.styles, 'div{color:red!important/*!1*//*!2*/}');
}
.addBatch({
'multiple source maps': {
'relative to local': {
- 'topic': new CleanCSS({ sourceMap: true }).minify({
- 'test/fixtures/source-maps/some.css': {
- styles: 'div {\n color: red;\n}',
- sourceMap: '{"version":3,"sources":["some.less"],"names":[],"mappings":"AAAA;EACE,UAAA","file":"some.css"}'
- },
- 'test/fixtures/source-maps/styles.css': {
- styles: 'div > a {\n color: blue;\n}',
- sourceMap: '{"version":3,"sources":["styles.less"],"names":[],"mappings":"AAAA,GAAI;EACF,WAAA","file":"styles.css"}'
- },
- 'test/fixtures/source-maps/nested/once.css': {
- styles: 'section > div a {\n color: red;\n}',
- sourceMap: '{"version":3,"sources":["once.less"],"names":[],"mappings":"AAAA,OACE,MAAM;EACJ,UAAA","file":"once.css"}'
- }
- }),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify({
+ 'test/fixtures/source-maps/some.css': {
+ styles: 'div {\n color: red;\n}',
+ sourceMap: '{"version":3,"sources":["some.less"],"names":[],"mappings":"AAAA;EACE,UAAA","file":"some.css"}'
+ },
+ 'test/fixtures/source-maps/styles.css': {
+ styles: 'div > a {\n color: blue;\n}',
+ sourceMap: '{"version":3,"sources":["styles.less"],"names":[],"mappings":"AAAA,GAAI;EACF,WAAA","file":"styles.css"}'
+ },
+ 'test/fixtures/source-maps/nested/once.css': {
+ styles: 'section > div a {\n color: red;\n}',
+ sourceMap: '{"version":3,"sources":["once.less"],"names":[],"mappings":"AAAA,OACE,MAAM;EACJ,UAAA","file":"once.css"}'
+ }
+ });
+ },
'has right output': function (errors, minified) {
assert.equal(minified.styles, 'div,section>div a{color:red}div>a{color:#00f}');
},
},
'relative to path': {
'complex but partial input map referenced by path': {
- 'topic': new CleanCSS({ sourceMap: true, target: process.cwd() }).minify({
- 'test/fixtures/source-maps/some.css': {
- styles: 'div {\n color: red;\n}',
- sourceMap: '{"version":3,"sources":["some.less"],"names":[],"mappings":"AAAA;EACE,UAAA","file":"some.css"}'
- },
- 'test/fixtures/source-maps/styles.css': {
- styles: 'div > a {\n color: blue;\n}',
- sourceMap: '{"version":3,"sources":["styles.less"],"names":[],"mappings":"AAAA,GAAI;EACF,WAAA","file":"styles.css"}'
- },
- 'test/fixtures/source-maps/nested/once.css': {
- styles: 'section > div a {\n color: red;\n}',
- sourceMap: '{"version":3,"sources":["once.less"],"names":[],"mappings":"AAAA,OACE,MAAM;EACJ,UAAA","file":"once.css"}'
- }
- }),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true, target: process.cwd() }).minify({
+ 'test/fixtures/source-maps/some.css': {
+ styles: 'div {\n color: red;\n}',
+ sourceMap: '{"version":3,"sources":["some.less"],"names":[],"mappings":"AAAA;EACE,UAAA","file":"some.css"}'
+ },
+ 'test/fixtures/source-maps/styles.css': {
+ styles: 'div > a {\n color: blue;\n}',
+ sourceMap: '{"version":3,"sources":["styles.less"],"names":[],"mappings":"AAAA,GAAI;EACF,WAAA","file":"styles.css"}'
+ },
+ 'test/fixtures/source-maps/nested/once.css': {
+ styles: 'section > div a {\n color: red;\n}',
+ sourceMap: '{"version":3,"sources":["once.less"],"names":[],"mappings":"AAAA,OACE,MAAM;EACJ,UAAA","file":"once.css"}'
+ }
+ });
+ },
'should have 5 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 5);
},
.addBatch({
'advanced optimizations': {
'new property in smart sort': {
- 'topic': new CleanCSS({ sourceMap: true }).minify('a{color:#000}div{color:red}.one{display:block}.two{display:inline;color:red}'),
+ 'topic': function () {
+ return new CleanCSS({ sourceMap: true }).minify('a{color:#000}div{color:red}.one{display:block}.two{display:inline;color:red}');
+ },
'should have 5 mappings': function (minified) {
assert.lengthOf(minified.sourceMap._mappings._array, 9);
},
vows.describe(EscapeStore)
.addBatch({
'no metadata': {
- topic: new EscapeStore('TEST'),
+ topic: function () {
+ return new EscapeStore('TEST');
+ },
store: function (escapeStore) {
var placeholder = escapeStore.store('data');
assert.equal(placeholder, '__ESCAPED_TEST_CLEAN_CSS0__');
}
},
'with metadata': {
- topic: new EscapeStore('TEST'),
+ topic: function () {
+ return new EscapeStore('TEST');
+ },
store: function (escapeStore) {
var placeholder = escapeStore.store('data', ['brown', 'fox', 'jumped', 'over']);
assert.equal(placeholder, '__ESCAPED_TEST_CLEAN_CSS0(brown,fox,jumped,over)__');
}
},
'same data with different metadata': {
- topic: new EscapeStore('TEST'),
+ topic: function () {
+ return new EscapeStore('TEST');
+ },
'store first': function (escapeStore) {
escapeStore.store('data1', [0, 1, 2]);
var placeholder = escapeStore.store('data1', [1, 2, 3]);
vows.describe(Chunker)
.addBatch({
'empty string': {
- topic: new Chunker('', '', 128),
+ 'topic': function () {
+ return new Chunker('', '', 128);
+ },
'is empty': function (chunker) {
assert.isTrue(chunker.isEmpty());
},
}
},
'css': {
- topic: new Chunker('a{color:red}p{}', '}', 3),
+ 'topic': function () {
+ return new Chunker('a{color:red}p{}', '}', 3);
+ },
'is not empty': function (chunker) {
assert.isFalse(chunker.isEmpty());
},
}
},
'comments': {
- topic: new Chunker('/* one */ /* two */', '*/', 3),
+ 'topic': function () {
+ return new Chunker('/* one */ /* two */', '*/', 3);
+ },
'is not empty': function (chunker) {
assert.isFalse(chunker.isEmpty());
},
vows.describe(Compatibility)
.addBatch({
'as an empty hash': {
- topic: new Compatibility({}).toOptions(),
+ 'topic': function () {
+ return new Compatibility({}).toOptions();
+ },
'gets default options': function(options) {
assert.isFalse(options.properties.iePrefixHack);
assert.isFalse(options.properties.ieSuffixHack);
}
},
'not given': {
- topic: new Compatibility().toOptions(),
+ 'topic': function () {
+ return new Compatibility().toOptions();
+ },
'gets default options': function(options) {
assert.deepEqual(options, new Compatibility({}).toOptions());
}
},
'as a populated hash': {
- topic: new Compatibility({ units: { rem: false }, properties: { prefix: true } }).toOptions(),
+ 'topic': function () {
+ return new Compatibility({ units: { rem: false }, properties: { prefix: true } }).toOptions();
+ },
'gets merged options': function(options) {
assert.isFalse(options.properties.iePrefixHack);
assert.isFalse(options.properties.ieSuffixHack);
})
.addBatch({
'as an ie8 template': {
- topic: new Compatibility('ie8').toOptions(),
+ 'topic': function () {
+ return new Compatibility('ie8').toOptions();
+ },
'gets template options': function(options) {
assert.isTrue(options.properties.iePrefixHack);
assert.isTrue(options.properties.ieSuffixHack);
}
},
'as an ie7 template': {
- topic: new Compatibility('ie7').toOptions(),
+ 'topic': function () {
+ return new Compatibility('ie7').toOptions();
+ },
'gets template options': function(options) {
assert.isTrue(options.properties.iePrefixHack);
assert.isTrue(options.properties.ieSuffixHack);
}
},
'as an unknown template': {
- topic: new Compatibility('').toOptions(),
+ 'topic': function () {
+ return new Compatibility('').toOptions();
+ },
'gets default options': function(options) {
assert.deepEqual(options, new Compatibility({}).toOptions());
}
})
.addBatch({
'as a complex string value with group': {
- topic: new Compatibility('ie8,-properties.iePrefixHack,+colors.opacity').toOptions(),
+ 'topic': function () {
+ return new Compatibility('ie8,-properties.iePrefixHack,+colors.opacity').toOptions();
+ },
'gets calculated options': function(options) {
assert.isFalse(options.properties.iePrefixHack);
assert.isTrue(options.properties.ieSuffixHack);
}
},
'as a single string value without group': {
- topic: new Compatibility('+properties.iePrefixHack').toOptions(),
+ 'topic': function () {
+ return new Compatibility('+properties.iePrefixHack').toOptions();
+ },
'gets calculated options': function(options) {
assert.isTrue(options.properties.iePrefixHack);
assert.isFalse(options.properties.ieSuffixHack);
}
},
'as a complex string value without group': {
- topic: new Compatibility('+properties.iePrefixHack,-units.rem').toOptions(),
+ 'topic': function () {
+ return new Compatibility('+properties.iePrefixHack,-units.rem').toOptions();
+ },
'gets calculated options': function(options) {
assert.isTrue(options.properties.iePrefixHack);
assert.isFalse(options.properties.ieSuffixHack);