minify/tests/js/JSTest.php

379 lines
9.4 KiB
PHP
Raw Normal View History

<?php
use MatthiasMullie\Minify;
/**
* JS minifier test case.
*/
class JSTest extends PHPUnit_Framework_TestCase
{
private $minifier;
/**
* Prepares the environment before running a test.
*/
protected function setUp()
{
parent::setUp();
$this->minifier = new Minify\JS();
}
/**
* Cleans up the environment after running a test.
*/
protected function tearDown()
{
$this->minifier = null;
parent::tearDown();
}
/**
* Test JS minifier rules, provided by dataProvider
*
* @test
* @dataProvider dataProvider
*/
2014-10-07 18:21:22 +02:00
public function minify($input, $expected, $debug = false)
{
2014-10-07 18:21:22 +02:00
$this->minifier->debug((bool) $debug);
$this->minifier->add($input);
2014-10-07 18:21:22 +02:00
$result = $this->minifier->minify();
$this->assertEquals($expected, $result);
}
/**
* Test cases [input, expected result, options]
*
* @return array
*/
public function dataProvider()
{
$tests = array();
2014-10-07 18:21:22 +02:00
// escaped quotes should not terminate string
$tests[] = array(
'alert("Escaped quote which is same as string quotes: \"; should not match")',
'alert("Escaped quote which is same as string quotes: \"; should not match")',
);
2014-10-07 18:21:22 +02:00
// regex delimiters need to be treated as strings
// (two forward slashes could look like a comment)
$tests[] = array(
'/abc\/def\//.test("abc")',
'/abc\/def\//.test("abc")',
);
$tests[] = array(
'var a = /abc\/def\//.test("abc")',
'var a=/abc\/def\//.test("abc")',
);
2014-10-10 08:18:47 +02:00
// don't confuse multiple slashes for regexes
$tests[] = array(
'a = b / c; d = e / f',
'a=b/c;d=e/f',
);
2014-10-07 18:21:22 +02:00
// mixture of quotes starting in comment/regex, to make sure strings are
// matched correctly, not inside comment/regex.
$tests[] = array(
'/abc"def/.test("abc")',
'/abc"def/.test("abc")',
);
$tests[] = array(
'/* Bogus " */var test="test";',
'var test="test"',
);
2013-12-27 02:12:30 +01:00
// replace comments
$tests[] = array(
'/* This is a JS comment */',
'',
);
2014-10-07 18:21:22 +02:00
// make sure no ; is added in places it shouldn't
$tests[] = array(
'if(true){}else{}',
'if(true){}else{}',
);
$tests[] = array(
'do{i++}while(i<1)',
'do{i++}while(i<1)',
);
2014-10-07 18:21:22 +02:00
$tests[] = array(
'if(true)statement;else statement',
'if(true)statement;else statement',
);
2014-10-07 18:21:22 +02:00
$tests[] = array(
'for (i = 0; (i < 10); i++) statement',
2014-10-09 09:08:21 +02:00
'for(i=0;(i<10);i++)statement',
2014-10-07 18:21:22 +02:00
);
$tests[] = array(
'-1
+2',
'-1+2',
);
$tests[] = array(
'alert("this is a test");',
'alert("this is a test")',
);
2014-10-09 09:08:21 +02:00
// test where newline should be preserved (for ASI) or semicolon added
2014-10-07 18:21:22 +02:00
$tests[] = array(
'function(){console.log("this is a test");}',
'function(){console.log("this is a test")}',
);
$tests[] = array(
2013-12-27 02:12:30 +01:00
'alert("this is a test")
alert("this is another test")',
'alert("this is a test")
alert("this is another test")',
);
$tests[] = array(
2013-12-27 02:12:30 +01:00
'a=b+c
d=e+f',
'a=b+c
d=e+f',
);
2014-10-07 18:21:22 +02:00
$tests[] = array(
'a++
2014-10-07 18:21:22 +02:00
++b',
'a++
++b',
2014-10-07 18:21:22 +02:00
);
$tests[] = array(
2014-10-07 18:21:22 +02:00
'!a
!b',
'!a
!b',
);
$tests[] = array(
2014-10-07 18:21:22 +02:00
// don't confuse with 'if'
'digestif
(true)
statement',
'digestif(true)
statement',
);
2013-12-27 02:12:30 +01:00
$tests[] = array(
2014-10-07 18:21:22 +02:00
'if
(
(
true
)
&&
(
true
)
)
statement',
'if((true)&&(true))
statement',
2013-12-27 02:12:30 +01:00
);
2014-10-07 18:21:22 +02:00
$tests[] = array(
'if
(
true
)
{
}
else
{
}',
'if(true){}
else{}',
2014-10-07 18:21:22 +02:00
);
$tests[] = array(
'do
{
i++
}
while
(
i<1
)',
'do{i++}
while(i<1)',
2014-10-07 18:21:22 +02:00
);
$tests[] = array(
'if ( true )
statement
else
statement',
'if(true)
statement
else statement',
);
2014-10-09 09:08:21 +02:00
// test if whitespace around keywords is properly collapsed
$tests[] = array(
'var
variable
=
"value";',
'var variable="value"',
);
$tests[] = array(
'var variable = {
test:
{
}
}',
'var variable={test:{}}',
);
$tests[] = array(
'if ( true ) {
} else {
}',
'if(true){}else{}',
);
2013-12-27 02:12:30 +01:00
// remove whitespace around operators
$tests[] = array(
'a = 1 + 2',
'a=1+2',
);
2014-10-07 18:21:22 +02:00
$tests[] = array(
'object . property',
'object.property',
);
$tests[] = array(
'object
.property',
'object.property',
);
2013-12-27 02:12:30 +01:00
$tests[] = array(
'alert ( "this is a test" );',
'alert("this is a test")',
);
2014-10-10 08:38:18 +02:00
// mix of ++ and +: three consecutive +es will be interpreted as ++ +
$tests[] = array(
'a++ +b',
'a+++b',
);
$tests[] = array(
'a+ ++b',
'a+ ++b',
);
// SyntaxError: identifier starts immediately after numeric literal
$tests[] = array(
'42 .toString()',
'42 .toString()',
);
2014-10-07 18:21:22 +02:00
// add comment in between whitespace that needs to be stripped
$tests[] = array(
2014-10-07 18:21:22 +02:00
'object
// haha, some comment, just to make things harder!
.property',
'object.property',
);
2014-10-09 09:08:21 +02:00
// random bits of code that tripped errors during development
$tests[] = array(
'
2013-12-27 02:12:30 +01:00
// check if it isn\'t a text-element
if(currentElement.attr(\'type\') != \'text\')
{
// remove the current one
currentElement.remove();
}
// already a text element
else newElement = currentElement;
',
'if(currentElement.attr(\'type\')!=\'text\'){currentElement.remove()}
else newElement=currentElement',
);
2014-10-07 19:49:16 +02:00
$tests[] = array(
'var jsBackend =
{
debug: false,
current: {}
}',
2014-10-08 10:19:33 +02:00
'var jsBackend={debug:false,current:{}}',
2014-10-07 19:49:16 +02:00
);
$tests[] = array(
'var utils =
{
debug: false
}
utils.array =
{
}',
'var utils={debug:false}
2014-10-08 10:19:33 +02:00
utils.array={}',
);
$tests[] = array(
'rescape = /\'|\\\\/g,
// blablabla here was some more code but the point was that somewhere
// down below, there would be a closing quote which would cause the
// regex (confused for escaped closing tag) not to be recognized,
// taking the opening single quote & looking for a string.
// So here\'s <-- the closing quote
runescape = \'blabla\'',
'rescape=/\'|\\\\/g,runescape=\'blabla\'',
);
$tests[] = array(
'var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/)',
'var rsingleTag=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/)',
);
2014-10-08 10:19:33 +02:00
2014-10-09 09:08:21 +02:00
// https://github.com/matthiasmullie/minify/issues/10
2014-10-08 10:19:33 +02:00
$tests[] = array(
2014-10-09 09:08:21 +02:00
'// first mutation patch
// second mutation patch
// third mutation patch
// fourth mutation patch',
'',
2014-10-08 10:19:33 +02:00
);
$tests[] = array(
2014-10-09 09:08:21 +02:00
'/////////////////////////
// first mutation patch
// second mutation patch
// third mutation patch
// fourth mutation patch
/////////////////////////',
'',
);
// https://github.com/matthiasmullie/minify/issues/14
$tests[] = array(
2014-10-09 08:56:14 +02:00
'function foo (a, b)
{
return a / b;
}
2014-10-09 08:56:14 +02:00
function foo (a, b)
{
return a / b;
}',
'function foo(a,b){return a/b}
function foo(a,b){return a/b}',
);
2014-10-09 09:08:21 +02:00
// https://github.com/matthiasmullie/minify/issues/15
$tests[] = array(
'if ( !data.success )
deferred.reject(); else
deferred.resolve(data);',
'if(!data.success)
deferred.reject();else deferred.resolve(data)',
);
$tests[] = array(
"if ( typeof jQuery === 'undefined' )
throw new Error('.editManager.js: jQuery is required and must be loaded first');",
"if(typeof jQuery==='undefined')
throw new Error('.editManager.js: jQuery is required and must be loaded first')",
);
return $tests;
}
}