2013-04-14 23:38:24 +02:00
< ? php
use MatthiasMullie\Minify ;
/**
* CSS minifier test case .
*/
class CSSTest extends PHPUnit_Framework_TestCase
{
2014-10-12 21:10:12 +02:00
/**
* @ var Minify\CSS
*/
2013-04-14 23:38:24 +02:00
private $minifier ;
/**
* Prepares the environment before running a test .
*/
protected function setUp ()
{
parent :: setUp ();
2015-05-13 17:43:23 +02:00
// override save method, there's no point in writing the result out here
$this -> minifier = $this -> getMockBuilder ( '\MatthiasMullie\Minify\CSS' )
-> setMethods ( array ( 'save' ))
-> getMock ();
2013-04-14 23:38:24 +02:00
}
/**
* Cleans up the environment after running a test .
*/
protected function tearDown ()
{
$this -> minifier = null ;
parent :: tearDown ();
}
/**
2014-10-12 21:10:12 +02:00
* Test CSS minifier rules , provided by dataProvider .
2013-04-14 23:38:24 +02:00
*
* @ test
* @ dataProvider dataProvider
*/
2014-10-12 17:42:22 +02:00
public function minify ( $input , $expected )
2013-04-14 23:38:24 +02:00
{
2015-02-20 16:50:56 +01:00
$input = ( array ) $input ;
foreach ( $input as $css ) {
$this -> minifier -> add ( $css );
}
2014-10-07 18:21:22 +02:00
$result = $this -> minifier -> minify ();
2013-04-14 23:38:24 +02:00
2013-12-26 20:39:10 +01:00
$this -> assertEquals ( $expected , $result );
2013-04-14 23:38:24 +02:00
}
2013-12-01 23:47:40 +01:00
/**
2014-10-12 21:10:12 +02:00
* Test conversion of relative paths , provided by dataProviderPaths .
2013-12-01 23:47:40 +01:00
*
* @ test
* @ dataProvider dataProviderPaths
*/
2014-10-30 10:43:48 +01:00
public function convertRelativePath ( $source , $target , $expected )
2014-10-09 08:56:14 +02:00
{
2015-02-20 16:50:56 +01:00
$source = ( array ) $source ;
2015-05-13 17:43:23 +02:00
foreach ( $source as $path => $css ) {
2015-02-20 16:50:56 +01:00
$this -> minifier -> add ( $css );
2015-05-13 17:43:23 +02:00
// $source also accepts an array where the key is a bogus path
if ( is_string ( $path )) {
$object = new ReflectionObject ( $this -> minifier );
$property = $object -> getProperty ( 'data' );
$property -> setAccessible ( true );
$data = $property -> getValue ( $this -> minifier );
// keep content, but make it appear from the given path
$data [ $path ] = array_pop ( $data );
$property -> setValue ( $this -> minifier , $data );
$property -> setAccessible ( false );
}
2015-02-20 16:50:56 +01:00
}
2015-05-13 17:43:23 +02:00
2014-10-30 10:43:48 +01:00
$result = $this -> minifier -> minify ( $target );
2013-12-01 23:47:40 +01:00
2013-12-26 20:39:10 +01:00
$this -> assertEquals ( $expected , $result );
2013-12-01 23:47:40 +01:00
}
2013-04-14 23:38:24 +02:00
/**
2014-10-12 21:10:12 +02:00
* Test minifier import configuration methods .
2013-04-14 23:38:24 +02:00
*
2014-10-12 21:10:12 +02:00
* @ test
*/
2015-02-12 13:34:48 +01:00
public function setConfig ()
{
2014-10-12 21:10:12 +02:00
$this -> minifier -> setMaxImportSize ( 10 );
$this -> minifier -> setImportExtensions ( array ( 'gif' => 'data:image/gif' ));
$object = new ReflectionObject ( $this -> minifier );
$property = $object -> getProperty ( 'maxImportSize' );
$property -> setAccessible ( true );
$this -> assertEquals ( $property -> getValue ( $this -> minifier ), 10 );
$property = $object -> getProperty ( 'importExtensions' );
$property -> setAccessible ( true );
$this -> assertEquals ( $property -> getValue ( $this -> minifier ), array ( 'gif' => 'data:image/gif' ));
}
/**
* @ return array [ input , expected result ]
2013-04-14 23:38:24 +02:00
*/
public function dataProvider ()
{
$tests = array ();
2014-10-12 21:55:30 +02:00
// try importing, with both @import syntax types & media queries
2013-04-14 23:38:24 +02:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
__DIR__ . '/sample/combine_imports/index.css' ,
2013-12-26 23:59:56 +01:00
'body{color:red}' ,
2013-04-14 23:38:24 +02:00
);
2014-10-12 21:10:12 +02:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
__DIR__ . '/sample/combine_imports/index2.css' ,
2014-10-12 21:10:12 +02:00
'body{color:red}' ,
);
2014-10-12 21:41:25 +02:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
__DIR__ . '/sample/combine_imports/index3.css' ,
2014-10-12 21:41:25 +02:00
'body{color:red}body{color:red}' ,
);
2014-10-12 21:55:30 +02:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
__DIR__ . '/sample/combine_imports/index4.css' ,
2014-10-12 21:55:30 +02:00
'@media only screen{body{color:red}}@media only screen{body{color:red}}' ,
);
2014-10-20 11:08:51 +02:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
__DIR__ . '/sample/combine_imports/index5.css' ,
2014-10-20 11:08:51 +02:00
'body{color:red}body{color:red}' ,
);
2014-10-30 10:16:29 +01:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
__DIR__ . '/sample/combine_imports/index6a.css' ,
2014-10-30 10:16:29 +01:00
'body{color:red}' ,
);
2013-04-14 23:38:24 +02:00
2014-10-12 22:00:18 +02:00
// shorthand hex color codes
2013-04-14 23:38:24 +02:00
$tests [] = array (
2013-12-26 23:59:56 +01:00
'color:#FF00FF;' ,
'color:#F0F;' ,
2013-04-14 23:38:24 +02:00
);
2014-10-12 22:00:18 +02:00
// import files
2013-04-14 23:38:24 +02:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
__DIR__ . '/sample/import_files/index.css' ,
'body{background:url(data:image/png;base64,' . base64_encode ( file_get_contents ( __DIR__ . '/sample/import_files/file.png' )) . ')}' ,
2013-04-14 23:38:24 +02:00
);
2014-10-12 22:00:18 +02:00
// strip comments
2013-04-14 23:38:24 +02:00
$tests [] = array (
'/* This is a CSS comment */' ,
'' ,
);
2014-10-12 22:00:18 +02:00
// strip whitespace
2013-04-14 23:38:24 +02:00
$tests [] = array (
'body { color: red; }' ,
'body{color:red}' ,
);
2014-10-12 22:00:18 +02:00
// whitespace inside strings shouldn't be replaced
$tests [] = array (
2014-10-30 10:16:29 +01:00
'content:"preserve whitespace"' ,
'content:"preserve whitespace"' ,
);
$tests [] = array (
' html
body {
color : red ;
} ' ,
2015-03-06 13:17:33 +01:00
'html body{color:red}' ,
2014-10-30 10:16:29 +01:00
);
$tests [] = array (
2015-02-20 17:24:53 +01:00
<<< 'JS'
2014-10-30 10:16:29 +01:00
p * i , html
/* remove spaces */
/* " comments have no escapes \*/
body /* keep */ /* space */ p ,
p [ remove ~= " spaces " ] : nth - child ( 3 + 2 n ) > b span i , div :: after
{
/* comment */
content : " escapes \" allowed \\ " ;
2015-02-20 17:24:53 +01:00
content : " /* string */ " ! important ;
2014-10-30 10:16:29 +01:00
width : calc ( 100 % - 3 em + 5 px ) ;
margin - top : 0 ;
margin - bottom : 0 ;
margin - left : 10 px ;
margin - right : 10 px ;
}
2015-02-20 17:24:53 +01:00
JS
,
2015-03-06 13:17:33 +01:00
'p * i,html body p,p [remove~=" spaces "] :nth-child(3+2n)>b span i,div::after{content:" escapes \\" allowed \\\\";content:" /* string */ "!important;width:calc(100% - 3em + 5px);margin-top:0;margin-bottom:0;margin-left:10px;margin-right:10px}' ,
2014-10-12 22:00:18 +02:00
);
2013-04-22 10:19:35 +02:00
/*
* https :// github . com / forkcms / forkcms / issues / 387
*
* CSS backslash .
* * Backslash escaped by backslash in CSS
* * Double CSS backslashed escaped twice for in PHP string
*/
$tests [] = array (
'.iconic.map-pin:before { content: "\\\\"; }' ,
'.iconic.map-pin:before{content:"\\\\"}' ,
);
2013-04-22 10:16:01 +02:00
2014-10-20 11:08:51 +02:00
// strip BOM
$tests [] = array (
2015-03-06 13:17:33 +01:00
__DIR__ . '/sample/bom/bom.css' ,
2014-10-20 11:08:51 +02:00
'body{color:red}' ,
);
2014-11-20 21:39:05 +01:00
// https://github.com/matthiasmullie/minify/issues/22
$tests [] = array (
'p { background-position: -0px -64px; }' ,
2014-11-20 21:42:49 +01:00
'p{background-position:0 -64px}' ,
2014-11-20 21:39:05 +01:00
);
2014-12-04 20:08:57 +01:00
// https://github.com/matthiasmullie/minify/issues/23
$tests [] = array (
' ul . pagination {
display : block ;
min - height : 1.5 rem ;
margin - left : - 0.3125 rem ;
} ' ,
2015-08-25 14:56:09 +02:00
'ul.pagination{display:block;min-height:1.5rem;margin-left:-.3125rem}' ,
2014-12-04 20:08:57 +01:00
);
// edge cases for stripping zeroes
$tests [] = array (
2014-12-04 20:09:49 +01:00
'p { margin: -0.0rem; }' ,
2015-08-25 14:43:28 +02:00
'p{margin:0rem}' ,
2014-12-04 20:09:49 +01:00
);
$tests [] = array (
'p { margin: -0.01rem; }' ,
2015-08-25 14:56:09 +02:00
'p{margin:-.01rem}' ,
2014-12-04 20:08:57 +01:00
);
$tests [] = array (
'p { margin: .0; }' ,
'p{margin:0}' ,
);
2015-01-09 13:24:48 +01:00
$tests [] = array (
'p { margin: .0%; }' ,
2015-08-25 14:43:28 +02:00
'p{margin:0%}' ,
2015-01-09 13:24:48 +01:00
);
$tests [] = array (
'p { margin: 1.0; }' ,
'p{margin:1}' ,
);
$tests [] = array (
'p { margin: 1.0px; }' ,
'p{margin:1px}' ,
);
$tests [] = array (
'p { margin: 1.1; }' ,
'p{margin:1.1}' ,
);
$tests [] = array (
'p { margin: 1.1em; }' ,
'p{margin:1.1em}' ,
);
2014-12-07 18:35:07 +01:00
$tests [] = array (
'p { margin: 00px; }' ,
'p{margin:0}' ,
);
2015-08-25 14:56:09 +02:00
$tests [] = array (
'p { margin: 0.1px; }' ,
'p{margin:.1px}' ,
);
$tests [] = array (
'p { margin: 01.1px; }' ,
'p{margin:1.1px}' ,
);
$tests [] = array (
'p { margin: 0.060px; }' ,
'p{margin:.06px}' ,
);
2014-12-07 18:35:07 +01:00
$tests [] = array (
'p.class00 { background-color: #000000; color: #000; }' ,
'p.class00{background-color:#000;color:#000}' ,
);
2014-12-04 20:08:57 +01:00
2014-12-05 14:28:07 +01:00
// https://github.com/matthiasmullie/minify/issues/24
$tests [] = array (
'.col-1-1 { width: 100.00%; }' ,
'.col-1-1{width:100%}' ,
);
2014-12-07 14:02:46 +01:00
// https://github.com/matthiasmullie/minify/issues/25
$tests [] = array (
'p { background-color: #000000; color: #000; }' ,
'p{background-color:#000;color:#000}' ,
);
2015-01-07 12:01:22 +01:00
// https://github.com/matthiasmullie/minify/issues/26
$tests [] = array (
'.hr > :first-child { width: 0.0001%; }' ,
2015-08-25 14:56:09 +02:00
'.hr>:first-child{width:.0001%}' ,
2015-01-07 12:01:22 +01:00
);
2015-01-09 13:24:48 +01:00
// https://github.com/matthiasmullie/minify/issues/28
$tests [] = array (
2015-09-05 21:49:18 +02:00
'@font-face { src: url(//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts/fontawesome-webfont.eot?v=4.2.0); }' ,
'@font-face{src:url(//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts/fontawesome-webfont.eot?v=4.2.0)}' ,
2015-01-09 13:24:48 +01:00
);
2015-01-23 09:13:48 -08:00
// https://github.com/matthiasmullie/minify/issues/31
$tests [] = array (
2015-09-07 21:47:18 +02:00
'dfn,em,img{color:red}' ,
'dfn,em,img{color:red}' ,
2015-01-23 09:13:48 -08:00
);
2015-05-05 14:52:16 +02:00
// https://github.com/matthiasmullie/minify/issues/49
$tests [] = array (
__DIR__ . '/sample/import_files/issue49.css' ,
2015-09-05 21:49:18 +02:00
'.social-btn a[href*="facebook"]{background-image:url(data:image/png;base64,' . base64_encode ( file_get_contents ( __DIR__ . '/sample/import_files/facebook.png' )) . ')}' .
'.social-btn a[href*="vimeo"]{background-image:url(data:image/png;base64,' . base64_encode ( file_get_contents ( __DIR__ . '/sample/import_files/vimeo.png' )) . ')}' .
'.social-btn a[href*="instagram"]{background-image:url(data:image/png;base64,' . base64_encode ( file_get_contents ( __DIR__ . '/sample/import_files/instagram.png' )) . ')}' ,
2015-05-05 14:52:16 +02:00
);
2015-09-02 17:33:56 +02:00
// https://github.com/matthiasmullie/minify/issues/68
2015-09-05 21:49:18 +02:00
$tests [] = array (
2015-09-02 17:33:56 +02:00
__DIR__ . '/sample/external_imports/issue68.css' ,
2015-09-05 21:49:18 +02:00
'@import url(http://localhost/file.css);body{background:green}' ,
2015-09-02 17:33:56 +02:00
);
2015-09-05 21:49:18 +02:00
2015-09-07 21:47:18 +02:00
// https://github.com/matthiasmullie/minify/issues/67
$tests [] = array (
' body { }
p { color : #fff; }',
'p{color:#fff}' ,
);
2015-09-08 12:40:02 +02:00
$tests [] = array (
' body {}
p { color : #fff; }
h1 { }
strong { color : red ; } ' ,
'p{color:#fff}strong{color:red}' ,
);
2015-09-07 21:47:18 +02:00
2015-09-21 21:21:48 +02:00
// https://github.com/matthiasmullie/minify/issues/74
$tests [] = array (
" @media only screen and (-webkit-min-device-pixel-ratio: 1.5),
only screen and ( min -- moz - device - pixel - ratio : 1.5 ),
only screen and ( min - device - pixel - ratio : 1.5 ) {
#fancybox-loading,.fancybox-close,.fancybox-prev span,.fancybox-next span {
background - image : url ( '/path/to/image.png' );
background - size : 44 px 152 px ;
}
#fancybox-loading div {
background - image : url ( '/path/to/image.gif' );
background - size : 24 px 24 px ;
}
} " ,
" @media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min--moz-device-pixel-ratio:1.5),only screen and (min-device-pixel-ratio:1.5) { #fancybox-loading,.fancybox-close,.fancybox-prev span,.fancybox-next span { background-image:url(/path/to/image.png);background-size:44px 152px}#fancybox-loading div { background-image:url(/path/to/image.gif);background-size:24px 24px}} " ,
);
2013-04-14 23:38:24 +02:00
return $tests ;
}
2013-12-01 23:47:40 +01:00
2014-10-12 21:10:12 +02:00
/**
* @ return array [ input , expected result ]
*/
2014-10-09 08:56:14 +02:00
public function dataProviderPaths ()
{
2013-12-01 23:47:40 +01:00
$tests = array ();
2015-03-06 13:17:33 +01:00
$source = __DIR__ . '/sample/convert_relative_path/source' ;
$target = __DIR__ . '/sample/convert_relative_path/target' ;
2013-12-01 23:47:40 +01:00
2014-10-12 22:00:18 +02:00
// external link
2013-12-01 23:47:40 +01:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/external.css' ,
$target . '/external.css' ,
file_get_contents ( $source . '/external.css' ),
2013-12-01 23:47:40 +01:00
);
2014-10-12 22:00:18 +02:00
// absolute path
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/absolute.css' ,
$target . '/absolute.css' ,
file_get_contents ( $source . '/absolute.css' ),
2014-10-12 22:00:18 +02:00
);
2014-10-12 22:07:59 +02:00
// relative paths
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/relative.css' ,
$target . '/relative.css' ,
2014-10-13 13:46:16 +02:00
'@import url(image.jpg);' ,
2014-10-12 22:07:59 +02:00
);
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/../source/relative.css' ,
$target . '/target/relative.css' ,
2014-10-13 13:46:16 +02:00
'@import url(../image.jpg);' ,
2014-10-30 10:43:48 +01:00
);
2015-02-20 16:50:56 +01:00
// https://github.com/matthiasmullie/minify/issues/29
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/issue29.css' ,
$target . '/issue29.css' ,
2015-02-20 16:50:56 +01:00
" @import url('http://myurl.de'); " ,
);
// https://github.com/matthiasmullie/minify/issues/38
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/relative.css' ,
2015-02-20 16:50:56 +01:00
null , // no output file
2015-03-06 13:17:33 +01:00
file_get_contents ( $source . '/relative.css' ),
2015-02-20 16:50:56 +01:00
);
2015-02-20 17:27:05 +01:00
// https://github.com/matthiasmullie/minify/issues/39
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/issue39.css' ,
2015-02-20 17:27:05 +01:00
null , // no output file
// relative paths should remain untouched
" @font-face { font-family:'blackcat';src:url(../webfont/blackcat.eot);src:url(../webfont/blackcat.eot?#iefix) format('embedded-opentype'),url(../webfont/blackcat.svg#blackcat) format('svg'),url(../webfont/blackcat.woff) format('woff'),url(../webfont/blackcat.ttf) format('truetype');font-weight:normal;font-style:normal} " ,
);
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/issue39.css' ,
$target . '/issue39.css' ,
2015-02-20 17:27:05 +01:00
// relative paths should remain untouched
" @font-face { font-family:'blackcat';src:url(../webfont/blackcat.eot);src:url(../webfont/blackcat.eot?#iefix) format('embedded-opentype'),url(../webfont/blackcat.svg#blackcat) format('svg'),url(../webfont/blackcat.woff) format('woff'),url(../webfont/blackcat.ttf) format('truetype');font-weight:normal;font-style:normal} " ,
);
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/issue39.css' ,
$target . '/target/issue39.css' ,
2015-02-20 17:27:05 +01:00
// relative paths should have changed
" @font-face { font-family:'blackcat';src:url(../../webfont/blackcat.eot);src:url(../../webfont/blackcat.eot?#iefix) format('embedded-opentype'),url(../../webfont/blackcat.svg#blackcat) format('svg'),url(../../webfont/blackcat.woff) format('woff'),url(../../webfont/blackcat.ttf) format('truetype');font-weight:normal;font-style:normal} " ,
);
2015-03-06 12:01:30 +01:00
// https://github.com/forkcms/forkcms/issues/1121
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/nested/nested.css' ,
$target . '/nested.css' ,
2015-03-06 12:01:30 +01:00
'@import url(image.jpg);' ,
);
2015-05-13 17:43:23 +02:00
// https://github.com/forkcms/forkcms/issues/1186
$tests [] = array (
array (
// key is a bogus path
'/Users/mathias/Documents/— Projecten/PROJECT_NAAM/Web/src/Backend/Core/Layout/Css/screen.css' => '@import url("imports/typography.css");' ,
),
'/Users/mathias/Documents/— Projecten/PROJECT_NAAM/Web/src/Backend/Cache/MinifiedCss/some-hash.css' ,
'@import url(../../Core/Layout/Css/imports/typography.css);' ,
);
2014-10-30 10:43:48 +01:00
$sourceRelative = 'tests/css/sample/convert_relative_path/source' ;
$targetRelative = 'tests/css/sample/convert_relative_path/target' ;
// from and/or to are relative links
$tests [] = array (
2015-03-06 13:17:33 +01:00
$sourceRelative . '/relative.css' ,
$target . '/relative.css' ,
2014-10-30 10:43:48 +01:00
'@import url(image.jpg);' ,
);
2015-05-13 18:03:44 +02:00
// note: relative target only works if the file already exists: it has
// to be able to realpath()
2014-10-30 10:43:48 +01:00
$tests [] = array (
2015-03-06 13:17:33 +01:00
$source . '/relative.css' ,
$targetRelative . '/relative.css' ,
2014-10-30 10:43:48 +01:00
'@import url(image.jpg);' ,
);
$tests [] = array (
2015-03-06 13:17:33 +01:00
$sourceRelative . '/relative.css' ,
$targetRelative . '/relative.css' ,
2014-10-30 10:43:48 +01:00
'@import url(image.jpg);' ,
2014-10-12 22:07:59 +02:00
);
2013-12-01 23:47:40 +01:00
return $tests ;
}
2013-04-14 23:38:24 +02:00
}