From 5b46461879429375bd8ff22e6efbdc6f35835959 Mon Sep 17 00:00:00 2001 From: Aaron Carlino Date: Thu, 11 May 2017 10:17:54 +1200 Subject: [PATCH] Remove JSMinifier implementation --- src/View/JSMinifier.php | 30 - tests/php/View/SSViewerTest.php | 1665 +++++++++++++++---------------- 2 files changed, 832 insertions(+), 863 deletions(-) delete mode 100644 src/View/JSMinifier.php diff --git a/src/View/JSMinifier.php b/src/View/JSMinifier.php deleted file mode 100644 index d63be3dd2..000000000 --- a/src/View/JSMinifier.php +++ /dev/null @@ -1,30 +0,0 @@ -getMessage(); - user_error("Failed to minify {$filename}, exception: {$message}", E_USER_WARNING); - } finally { - return $content . ";\n"; - } - } -} diff --git a/tests/php/View/SSViewerTest.php b/tests/php/View/SSViewerTest.php index a3403719e..bb58fd184 100644 --- a/tests/php/View/SSViewerTest.php +++ b/tests/php/View/SSViewerTest.php @@ -8,7 +8,6 @@ use SilverStripe\Control\ContentNegotiator; use SilverStripe\Control\HTTPResponse; use SilverStripe\Core\Convert; use SilverStripe\Core\Injector\Injector; -use SilverStripe\Dev\Debug; use SilverStripe\Dev\SapphireTest; use SilverStripe\i18n\i18n; use SilverStripe\ORM\DataObject; @@ -31,7 +30,7 @@ use SilverStripe\View\SSTemplateParser; use SilverStripe\Assets\Tests\Storage\AssetStoreTest\TestAssetStore; use Exception; -classSSViewerTest extends SapphireTest +class SSViewerTest extends SapphireTest { /** @@ -39,90 +38,90 @@ classSSViewerTest extends SapphireTest * * @var array */ -protected $oldServer = array(); + protected $oldServer = array(); -protected static $extra_dataobjects = array( + protected static $extra_dataobjects = array( SSViewerTest\TestObject::class, ); -protected function setUp() -{ - parent::setUp(); - SSViewer::config()->update('source_file_comments', false); - SSViewer_FromString::config()->update('cache_template', false); - TestAssetStore::activate('SSViewerTest'); - $this->oldServer = $_SERVER; -} + protected function setUp() + { + parent::setUp(); + SSViewer::config()->update('source_file_comments', false); + SSViewer_FromString::config()->update('cache_template', false); + TestAssetStore::activate('SSViewerTest'); + $this->oldServer = $_SERVER; + } -protected function tearDown() -{ - $_SERVER = $this->oldServer; - TestAssetStore::reset(); - parent::tearDown(); -} + protected function tearDown() + { + $_SERVER = $this->oldServer; + TestAssetStore::reset(); + parent::tearDown(); + } /** * Tests for {@link Config::inst()->get('SSViewer', 'theme')} for different behaviour * of user defined themes via {@link SiteConfig} and default theme * when no user themes are defined. */ -public function testCurrentTheme() -{ - SSViewer::config()->update('theme', 'mytheme'); - $this->assertEquals( + public function testCurrentTheme() + { + SSViewer::config()->update('theme', 'mytheme'); + $this->assertEquals( 'mytheme', SSViewer::config()->uninherited('theme'), 'Current theme is the default - user has not defined one' - ); -} + ); + } /** * Test that a template without a tag still renders. */ -public function testTemplateWithoutHeadRenders() -{ - $data = new ArrayData( + public function testTemplateWithoutHeadRenders() + { + $data = new ArrayData( array( 'Var' => 'var value' ) - ); + ); - $result = $data->renderWith("SSViewerTestPartialTemplate"); - $this->assertEquals('Test partial template: var value', trim(preg_replace("//U", '', $result))); -} + $result = $data->renderWith("SSViewerTestPartialTemplate"); + $this->assertEquals('Test partial template: var value', trim(preg_replace("//U", '', $result))); + } -public function testIncludeScopeInheritance() -{ - $data = $this->getScopeInheritanceTestData(); - $expected = array( + public function testIncludeScopeInheritance() + { + $data = $this->getScopeInheritanceTestData(); + $expected = array( 'Item 1 - First-ODD top:Item 1', 'Item 2 - EVEN top:Item 2', 'Item 3 - ODD top:Item 3', 'Item 4 - EVEN top:Item 4', 'Item 5 - ODD top:Item 5', 'Item 6 - Last-EVEN top:Item 6', - ); + ); - $result = $data->renderWith('SSViewerTestIncludeScopeInheritance'); - $this->assertExpectedStrings($result, $expected); + $result = $data->renderWith('SSViewerTestIncludeScopeInheritance'); + $this->assertExpectedStrings($result, $expected); - // reset results for the tests that include arguments (the title is passed as an arg) - $expected = array( + // reset results for the tests that include arguments (the title is passed as an arg) + $expected = array( 'Item 1 _ Item 1 - First-ODD top:Item 1', 'Item 2 _ Item 2 - EVEN top:Item 2', 'Item 3 _ Item 3 - ODD top:Item 3', 'Item 4 _ Item 4 - EVEN top:Item 4', 'Item 5 _ Item 5 - ODD top:Item 5', 'Item 6 _ Item 6 - Last-EVEN top:Item 6', - ); + ); - $result = $data->renderWith('SSViewerTestIncludeScopeInheritanceWithArgs'); - $this->assertExpectedStrings($result, $expected); -} + $result = $data->renderWith('SSViewerTestIncludeScopeInheritanceWithArgs'); + $this->assertExpectedStrings($result, $expected); + } -public function testIncludeTruthyness() -{ - $data = new ArrayData( + public function testIncludeTruthyness() + { + $data = new ArrayData( array( 'Title' => 'TruthyTest', 'Items' => new ArrayList( @@ -137,11 +136,11 @@ public function testIncludeTruthyness() ) ) ) - ); - $result = $data->renderWith('SSViewerTestIncludeScopeInheritanceWithArgs'); + ); + $result = $data->renderWith('SSViewerTestIncludeScopeInheritanceWithArgs'); - // We should not end up with empty values appearing as empty - $expected = array( + // We should not end up with empty values appearing as empty + $expected = array( 'Item 1 _ Item 1 - First-ODD top:Item 1', 'Untitled - EVEN top:', '1 _ 1 - ODD top:1', @@ -149,13 +148,13 @@ public function testIncludeTruthyness() 'Untitled - ODD top:', 'Untitled - EVEN top:0', '7 _ 7 - Last-ODD top:7' - ); - $this->assertExpectedStrings($result, $expected); -} + ); + $this->assertExpectedStrings($result, $expected); + } -private function getScopeInheritanceTestData() -{ - return new ArrayData( + private function getScopeInheritanceTestData() + { + return new ArrayData( array( 'Title' => 'TopTitleValue', 'Items' => new ArrayList( @@ -169,18 +168,18 @@ private function getScopeInheritanceTestData() ) ) ) - ); -} - -private function assertExpectedStrings($result, $expected) -{ - foreach ($expected as $expectedStr) { - $this->assertTrue( - (boolean) preg_match("/{$expectedStr}/", $result), - "Didn't find '{$expectedStr}' in:\n{$result}" ); } -} + + private function assertExpectedStrings($result, $expected) + { + foreach ($expected as $expectedStr) { + $this->assertTrue( + (boolean) preg_match("/{$expectedStr}/", $result), + "Didn't find '{$expectedStr}' in:\n{$result}" + ); + } + } /** * Small helper to render templates from strings @@ -190,103 +189,103 @@ private function assertExpectedStrings($result, $expected) * @param bool $cacheTemplate * @return string */ -public function render($templateString, $data = null, $cacheTemplate = false) -{ - $t = SSViewer::fromString($templateString, $cacheTemplate); - if (!$data) { - $data = new SSViewerTest\TestFixture(); + public function render($templateString, $data = null, $cacheTemplate = false) + { + $t = SSViewer::fromString($templateString, $cacheTemplate); + if (!$data) { + $data = new SSViewerTest\TestFixture(); + } + return trim(''.$t->process($data)); } - return trim(''.$t->process($data)); -} -public function testRequirements() -{ - $requirements = $this->getMockBuilder(Requirements_Backend::class)->setMethods(array("javascript", "css")) + public function testRequirements() + { + $requirements = $this->getMockBuilder(Requirements_Backend::class)->setMethods(array("javascript", "css")) ->getMock(); - $jsFile = FRAMEWORK_DIR . '/tests/forms/a.js'; - $cssFile = FRAMEWORK_DIR . '/tests/forms/a.js'; + $jsFile = FRAMEWORK_DIR . '/tests/forms/a.js'; + $cssFile = FRAMEWORK_DIR . '/tests/forms/a.js'; - $requirements->expects($this->once())->method('javascript')->with($jsFile); - $requirements->expects($this->once())->method('css')->with($cssFile); + $requirements->expects($this->once())->method('javascript')->with($jsFile); + $requirements->expects($this->once())->method('css')->with($cssFile); - $origReq = Requirements::backend(); - Requirements::set_backend($requirements); - $template = $this->render( + $origReq = Requirements::backend(); + Requirements::set_backend($requirements); + $template = $this->render( "<% require javascript($jsFile) %> <% require css($cssFile) %>" - ); - Requirements::set_backend($origReq); + ); + Requirements::set_backend($origReq); - $this->assertFalse((bool)trim($template), "Should be no content in this return."); -} - -public function testRequirementsCombine() -{ - $testBackend = Injector::inst()->create(Requirements_Backend::class); - $testBackend->setSuffixRequirements(false); - //$combinedTestFilePath = BASE_PATH . '/' . $testBackend->getCombinedFilesFolder() . '/testRequirementsCombine.js'; - - $jsFile = $this->getCurrentRelativePath() . '/SSViewerTest/javascript/bad.js'; - $jsFileContents = file_get_contents(BASE_PATH . '/' . $jsFile); - $testBackend->combineFiles('testRequirementsCombine.js', array($jsFile)); - - // secondly, make sure that requirements is generated, even though minification failed - $testBackend->processCombinedFiles(); - $js = array_keys($testBackend->getJavascript()); - $combinedTestFilePath = BASE_PATH . reset($js); - $this->assertContains('_combinedfiles/testRequirementsCombine-4c0e97a.js', $combinedTestFilePath); - - // and make sure the combined content matches the input content, i.e. no loss of functionality - if (!file_exists($combinedTestFilePath)) { - $this->fail('No combined file was created at expected path: '.$combinedTestFilePath); + $this->assertFalse((bool)trim($template), "Should be no content in this return."); } - $combinedTestFileContents = file_get_contents($combinedTestFilePath); - $this->assertContains($jsFileContents, $combinedTestFileContents); -} -public function testRequirementsMinification() -{ - $testBackend = Injector::inst()->create(Requirements_Backend::class); - $testBackend->setSuffixRequirements(false); - $testBackend->setMinifyCombinedFiles(true); - $testFile = $this->getCurrentRelativePath() . '/SSViewerTest/javascript/RequirementsTest_a.js'; - $testFileContent = file_get_contents($testFile); + public function testRequirementsCombine() + { + $testBackend = Injector::inst()->create(Requirements_Backend::class); + $testBackend->setSuffixRequirements(false); + //$combinedTestFilePath = BASE_PATH . '/' . $testBackend->getCombinedFilesFolder() . '/testRequirementsCombine.js'; - $mockMinifier = $this->getMockBuilder(Requirements_Minifier::class) + $jsFile = $this->getCurrentRelativePath() . '/SSViewerTest/javascript/bad.js'; + $jsFileContents = file_get_contents(BASE_PATH . '/' . $jsFile); + $testBackend->combineFiles('testRequirementsCombine.js', array($jsFile)); + + // secondly, make sure that requirements is generated, even though minification failed + $testBackend->processCombinedFiles(); + $js = array_keys($testBackend->getJavascript()); + $combinedTestFilePath = BASE_PATH . reset($js); + $this->assertContains('_combinedfiles/testRequirementsCombine-4c0e97a.js', $combinedTestFilePath); + + // and make sure the combined content matches the input content, i.e. no loss of functionality + if (!file_exists($combinedTestFilePath)) { + $this->fail('No combined file was created at expected path: '.$combinedTestFilePath); + } + $combinedTestFileContents = file_get_contents($combinedTestFilePath); + $this->assertContains($jsFileContents, $combinedTestFileContents); + } + + public function testRequirementsMinification() + { + $testBackend = Injector::inst()->create(Requirements_Backend::class); + $testBackend->setSuffixRequirements(false); + $testBackend->setMinifyCombinedFiles(true); + $testFile = $this->getCurrentRelativePath() . '/SSViewerTest/javascript/RequirementsTest_a.js'; + $testFileContent = file_get_contents($testFile); + + $mockMinifier = $this->getMockBuilder(Requirements_Minifier::class) ->setMethods(['minify']) ->getMock(); - $mockMinifier->expects($this->once()) + $mockMinifier->expects($this->once()) ->method('minify') ->with( $testFileContent, 'js', $testFile ); - $testBackend->setMinifier($mockMinifier); - $testBackend->combineFiles('testRequirementsMinified.js', array($testFile)); - $testBackend->processCombinedFiles(); + $testBackend->setMinifier($mockMinifier); + $testBackend->combineFiles('testRequirementsMinified.js', array($testFile)); + $testBackend->processCombinedFiles(); - $testBackend->setMinifyCombinedFiles(false); - $mockMinifier->expects($this->never()) + $testBackend->setMinifyCombinedFiles(false); + $mockMinifier->expects($this->never()) ->method('minify'); - $testBackend->processCombinedFiles(); + $testBackend->processCombinedFiles(); - $this->setExpectedExceptionRegExp( + $this->setExpectedExceptionRegExp( Exception::class, '/minification service/' - ); + ); - $testBackend->setMinifyCombinedFiles(true); - $testBackend->setMinifier(null); - $testBackend->processCombinedFiles(); -} + $testBackend->setMinifyCombinedFiles(true); + $testBackend->setMinifier(null); + $testBackend->processCombinedFiles(); + } -public function testComments() -{ - $output = $this->render( + public function testComments() + { + $output = $this->render( <<This is some content<%-- this is another comment --%>Final content <%-- Alone multi @@ -296,8 +295,8 @@ Mixing content and <%-- multi line comment --%> Final final content SS - ); - $shouldbe = <<assertEquals($shouldbe, $output); -} + $this->assertEquals($shouldbe, $output); + } -public function testBasicText() -{ - $this->assertEquals('"', $this->render('"'), 'Double-quotes are left alone'); - $this->assertEquals("'", $this->render("'"), 'Single-quotes are left alone'); - $this->assertEquals('A', $this->render('\\A'), 'Escaped characters are unescaped'); - $this->assertEquals('\\A', $this->render('\\\\A'), 'Escaped back-slashed are correctly unescaped'); -} + public function testBasicText() + { + $this->assertEquals('"', $this->render('"'), 'Double-quotes are left alone'); + $this->assertEquals("'", $this->render("'"), 'Single-quotes are left alone'); + $this->assertEquals('A', $this->render('\\A'), 'Escaped characters are unescaped'); + $this->assertEquals('\\A', $this->render('\\\\A'), 'Escaped back-slashed are correctly unescaped'); + } -public function testBasicInjection() -{ - $this->assertEquals('[out:Test]', $this->render('$Test'), 'Basic stand-alone injection'); - $this->assertEquals('[out:Test]', $this->render('{$Test}'), 'Basic stand-alone wrapped injection'); - $this->assertEquals('A[out:Test]!', $this->render('A$Test!'), 'Basic surrounded injection'); - $this->assertEquals('A[out:Test]B', $this->render('A{$Test}B'), 'Basic surrounded wrapped injection'); + public function testBasicInjection() + { + $this->assertEquals('[out:Test]', $this->render('$Test'), 'Basic stand-alone injection'); + $this->assertEquals('[out:Test]', $this->render('{$Test}'), 'Basic stand-alone wrapped injection'); + $this->assertEquals('A[out:Test]!', $this->render('A$Test!'), 'Basic surrounded injection'); + $this->assertEquals('A[out:Test]B', $this->render('A{$Test}B'), 'Basic surrounded wrapped injection'); - $this->assertEquals('A$B', $this->render('A\\$B'), 'No injection as $ escaped'); - $this->assertEquals('A$ B', $this->render('A$ B'), 'No injection as $ not followed by word character'); - $this->assertEquals('A{$ B', $this->render('A{$ B'), 'No injection as {$ not followed by word character'); + $this->assertEquals('A$B', $this->render('A\\$B'), 'No injection as $ escaped'); + $this->assertEquals('A$ B', $this->render('A$ B'), 'No injection as $ not followed by word character'); + $this->assertEquals('A{$ B', $this->render('A{$ B'), 'No injection as {$ not followed by word character'); - $this->assertEquals('{$Test}', $this->render('{\\$Test}'), 'Escapes can be used to avoid injection'); - $this->assertEquals( + $this->assertEquals('{$Test}', $this->render('{\\$Test}'), 'Escapes can be used to avoid injection'); + $this->assertEquals( '{\\[out:Test]}', $this->render('{\\\\$Test}'), 'Escapes before injections are correctly unescaped' - ); -} + ); + } -public function testGlobalVariableCalls() -{ - $this->assertEquals('automatic', $this->render('$SSViewerTest_GlobalAutomatic')); - $this->assertEquals('reference', $this->render('$SSViewerTest_GlobalReferencedByString')); - $this->assertEquals('reference', $this->render('$SSViewerTest_GlobalReferencedInArray')); -} + public function testGlobalVariableCalls() + { + $this->assertEquals('automatic', $this->render('$SSViewerTest_GlobalAutomatic')); + $this->assertEquals('reference', $this->render('$SSViewerTest_GlobalReferencedByString')); + $this->assertEquals('reference', $this->render('$SSViewerTest_GlobalReferencedInArray')); + } -public function testGlobalVariableCallsWithArguments() -{ - $this->assertEquals('zz', $this->render('$SSViewerTest_GlobalThatTakesArguments')); - $this->assertEquals('zFooz', $this->render('$SSViewerTest_GlobalThatTakesArguments("Foo")')); - $this->assertEquals( + public function testGlobalVariableCallsWithArguments() + { + $this->assertEquals('zz', $this->render('$SSViewerTest_GlobalThatTakesArguments')); + $this->assertEquals('zFooz', $this->render('$SSViewerTest_GlobalThatTakesArguments("Foo")')); + $this->assertEquals( 'zFoo:Bar:Bazz', $this->render('$SSViewerTest_GlobalThatTakesArguments("Foo", "Bar", "Baz")') - ); - $this->assertEquals( + ); + $this->assertEquals( 'zreferencez', $this->render('$SSViewerTest_GlobalThatTakesArguments($SSViewerTest_GlobalReferencedByString)') - ); -} + ); + } -public function testGlobalVariablesAreEscaped() -{ - $this->assertEquals('
', $this->render('$SSViewerTest_GlobalHTMLFragment')); - $this->assertEquals('<div></div>', $this->render('$SSViewerTest_GlobalHTMLEscaped')); + public function testGlobalVariablesAreEscaped() + { + $this->assertEquals('
', $this->render('$SSViewerTest_GlobalHTMLFragment')); + $this->assertEquals('<div></div>', $this->render('$SSViewerTest_GlobalHTMLEscaped')); - $this->assertEquals( + $this->assertEquals( 'z
z', $this->render('$SSViewerTest_GlobalThatTakesArguments($SSViewerTest_GlobalHTMLFragment)') - ); - $this->assertEquals( + ); + $this->assertEquals( 'z<div></div>z', $this->render('$SSViewerTest_GlobalThatTakesArguments($SSViewerTest_GlobalHTMLEscaped)') - ); -} + ); + } -public function testCoreGlobalVariableCalls() -{ - $this->assertEquals( + public function testCoreGlobalVariableCalls() + { + $this->assertEquals( Director::absoluteBaseURL(), $this->render('{$absoluteBaseURL}'), 'Director::absoluteBaseURL can be called from within template' - ); - $this->assertEquals( + ); + $this->assertEquals( Director::absoluteBaseURL(), $this->render('{$AbsoluteBaseURL}'), 'Upper-case %AbsoluteBaseURL can be called from within template' - ); + ); - $this->assertEquals( + $this->assertEquals( Director::is_ajax(), $this->render('{$isAjax}'), 'All variations of is_ajax result in the correct call' - ); - $this->assertEquals( + ); + $this->assertEquals( Director::is_ajax(), $this->render('{$IsAjax}'), 'All variations of is_ajax result in the correct call' - ); - $this->assertEquals( + ); + $this->assertEquals( Director::is_ajax(), $this->render('{$is_ajax}'), 'All variations of is_ajax result in the correct call' - ); - $this->assertEquals( + ); + $this->assertEquals( Director::is_ajax(), $this->render('{$Is_ajax}'), 'All variations of is_ajax result in the correct call' - ); + ); - $this->assertEquals( + $this->assertEquals( i18n::get_locale(), $this->render('{$i18nLocale}'), 'i18n template functions result correct result' - ); - $this->assertEquals( + ); + $this->assertEquals( i18n::get_locale(), $this->render('{$get_locale}'), 'i18n template functions result correct result' - ); + ); - $this->assertEquals( + $this->assertEquals( (string)Member::currentUser(), $this->render('{$CurrentMember}'), 'Member template functions result correct result' - ); - $this->assertEquals( + ); + $this->assertEquals( (string)Member::currentUser(), $this->render('{$CurrentUser}'), 'Member template functions result correct result' - ); - $this->assertEquals( + ); + $this->assertEquals( (string)Member::currentUser(), $this->render('{$currentMember}'), 'Member template functions result correct result' - ); - $this->assertEquals( + ); + $this->assertEquals( (string)Member::currentUser(), $this->render('{$currentUser}'), 'Member template functions result correct result' - ); + ); - $this->assertEquals( + $this->assertEquals( SecurityToken::getSecurityID(), $this->render('{$getSecurityID}'), 'SecurityToken template functions result correct result' - ); - $this->assertEquals( + ); + $this->assertEquals( SecurityToken::getSecurityID(), $this->render('{$SecurityID}'), 'SecurityToken template functions result correct result' - ); + ); - $this->assertEquals( + $this->assertEquals( Permission::check("ADMIN"), (bool)$this->render('{$HasPerm(\'ADMIN\')}'), 'Permissions template functions result correct result' - ); - $this->assertEquals( + ); + $this->assertEquals( Permission::check("ADMIN"), (bool)$this->render('{$hasPerm(\'ADMIN\')}'), 'Permissions template functions result correct result' - ); -} + ); + } -public function testNonFieldCastingHelpersNotUsedInHasValue() -{ - // check if Link without $ in front of variable - $result = $this->render( + public function testNonFieldCastingHelpersNotUsedInHasValue() + { + // check if Link without $ in front of variable + $result = $this->render( 'A<% if Link %>$Link<% end_if %>B', new SSViewerTest\TestObject() - ); - $this->assertEquals('Asome/url.htmlB', $result, 'casting helper not used for <% if Link %>'); + ); + $this->assertEquals('Asome/url.htmlB', $result, 'casting helper not used for <% if Link %>'); - // check if Link with $ in front of variable - $result = $this->render( + // check if Link with $ in front of variable + $result = $this->render( 'A<% if $Link %>$Link<% end_if %>B', new SSViewerTest\TestObject() - ); - $this->assertEquals('Asome/url.htmlB', $result, 'casting helper not used for <% if $Link %>'); -} + ); + $this->assertEquals('Asome/url.htmlB', $result, 'casting helper not used for <% if $Link %>'); + } -public function testLocalFunctionsTakePriorityOverGlobals() -{ - $data = new ArrayData( + public function testLocalFunctionsTakePriorityOverGlobals() + { + $data = new ArrayData( array( 'Page' => new SSViewerTest\TestObject() ) - ); + ); - //call method with lots of arguments - $result = $this->render( + //call method with lots of arguments + $result = $this->render( '<% with Page %>$lotsOfArguments11("a","b","c","d","e","f","g","h","i","j","k")<% end_with %>', $data - ); - $this->assertEquals("abcdefghijk", $result, "public function can accept up to 11 arguments"); + ); + $this->assertEquals("abcdefghijk", $result, "public function can accept up to 11 arguments"); - //call method that does not exist - $result = $this->render('<% with Page %><% if IDoNotExist %>hello<% end_if %><% end_with %>', $data); - $this->assertEquals("", $result, "Method does not exist - empty result"); + //call method that does not exist + $result = $this->render('<% with Page %><% if IDoNotExist %>hello<% end_if %><% end_with %>', $data); + $this->assertEquals("", $result, "Method does not exist - empty result"); - //call if that does not exist - $result = $this->render('<% with Page %>$IDoNotExist("hello")<% end_with %>', $data); - $this->assertEquals("", $result, "Method does not exist - empty result"); + //call if that does not exist + $result = $this->render('<% with Page %>$IDoNotExist("hello")<% end_with %>', $data); + $this->assertEquals("", $result, "Method does not exist - empty result"); - //call method with same name as a global method (local call should take priority) - $result = $this->render('<% with Page %>$absoluteBaseURL<% end_with %>', $data); - $this->assertEquals( + //call method with same name as a global method (local call should take priority) + $result = $this->render('<% with Page %>$absoluteBaseURL<% end_with %>', $data); + $this->assertEquals( "testLocalFunctionPriorityCalled", $result, "Local Object's public function called. Did not return the actual baseURL of the current site" - ); -} + ); + } -public function testCurrentScopeLoopWith() -{ - // Data to run the loop tests on - one sequence of three items, each with a subitem - $data = new ArrayData( + public function testCurrentScopeLoopWith() + { + // Data to run the loop tests on - one sequence of three items, each with a subitem + $data = new ArrayData( array( 'Foo' => new ArrayList( array( @@ -544,41 +543,41 @@ public function testCurrentScopeLoopWith() ) ) ) - ); + ); - $result = $this->render( + $result = $this->render( '<% loop Foo %>$Number<% if Sub %><% with Sub %>$Name<% end_with %><% end_if %><% end_loop %>', $data - ); - $this->assertEquals("SubKid1SubKid2Number6", $result, "Loop works"); + ); + $this->assertEquals("SubKid1SubKid2Number6", $result, "Loop works"); - $result = $this->render( + $result = $this->render( '<% loop Foo %>$Number<% if Sub %><% with Sub %>$Name<% end_with %><% end_if %><% end_loop %>', $data - ); - $this->assertEquals("SubKid1SubKid2Number6", $result, "Loop works"); + ); + $this->assertEquals("SubKid1SubKid2Number6", $result, "Loop works"); - $result = $this->render('<% with Foo %>$Count<% end_with %>', $data); - $this->assertEquals("4", $result, "4 items in the DataObjectSet"); + $result = $this->render('<% with Foo %>$Count<% end_with %>', $data); + $this->assertEquals("4", $result, "4 items in the DataObjectSet"); - $result = $this->render( + $result = $this->render( '<% with Foo %><% loop Up.Foo %>$Number<% if Sub %><% with Sub %>$Name<% end_with %>' . '<% end_if %><% end_loop %><% end_with %>', $data - ); - $this->assertEquals("SubKid1SubKid2Number6", $result, "Loop in with Up.Foo scope works"); + ); + $this->assertEquals("SubKid1SubKid2Number6", $result, "Loop in with Up.Foo scope works"); - $result = $this->render( + $result = $this->render( '<% with Foo %><% loop %>$Number<% if Sub %><% with Sub %>$Name<% end_with %>' . '<% end_if %><% end_loop %><% end_with %>', $data - ); - $this->assertEquals("SubKid1SubKid2Number6", $result, "Loop in current scope works"); -} + ); + $this->assertEquals("SubKid1SubKid2Number6", $result, "Loop in current scope works"); + } -public function testObjectDotArguments() -{ - $this->assertEquals( + public function testObjectDotArguments() + { + $this->assertEquals( '[out:TestObject.methodWithOneArgument(one)] [out:TestObject.methodWithTwoArguments(one,two)] [out:TestMethod(Arg1,Arg2).Bar.Val] @@ -597,12 +596,12 @@ public function testObjectDotArguments() $TestMethod(Arg1).Bar $TestMethod(Arg1)' ) - ); -} + ); + } -public function testEscapedArguments() -{ - $this->assertEquals( + public function testEscapedArguments() + { + $this->assertEquals( '[out:Foo(Arg1,Arg2).Bar.Val].Suffix [out:Foo(Arg1,Arg2).Val]_Suffix [out:Foo(Arg1,Arg2)]/Suffix @@ -623,24 +622,24 @@ public function testEscapedArguments() {$Foo.Bar}.Suffix {$Foo}.Suffix' ) - ); -} + ); + } -public function testLoopWhitespace() -{ - $this->assertEquals( + public function testLoopWhitespace() + { + $this->assertEquals( 'before[out:SingleItem.Test]after beforeTestafter', $this->render( 'before<% loop SingleItem %>$Test<% end_loop %>after before<% loop SingleItem %>Test<% end_loop %>after' ) - ); + ); - // The control tags are removed from the output, but no whitespace - // This is a quirk that could be changed, but included in the test to make the current - // behaviour explicit - $this->assertEquals( + // The control tags are removed from the output, but no whitespace + // This is a quirk that could be changed, but included in the test to make the current + // behaviour explicit + $this->assertEquals( 'before [out:SingleItem.ItemOnItsOwnLine] @@ -653,12 +652,12 @@ $ItemOnItsOwnLine <% end_loop %> after' ) - ); + ); - // The whitespace within the control tags is preserve in a loop - // This is a quirk that could be changed, but included in the test to make the current - // behaviour explicit - $this->assertEquals( + // The whitespace within the control tags is preserve in a loop + // This is a quirk that could be changed, but included in the test to make the current + // behaviour explicit + $this->assertEquals( 'before [out:Loop3.ItemOnItsOwnLine] @@ -675,13 +674,13 @@ $ItemOnItsOwnLine <% end_loop %> after' ) - ); -} + ); + } -public function testControls() -{ - // Single item controls - $this->assertEquals( + public function testControls() + { + // Single item controls + $this->assertEquals( 'a[out:Foo.Bar.Item]b [out:Foo.Bar(Arg1).Item] [out:Foo(Arg1).Item] @@ -694,309 +693,309 @@ public function testControls() <% with Foo(Arg1, Arg2) %>$Item<% end_with %> <% with Foo(Arg1, Arg2, Arg3) %>$Item<% end_with %>' ) - ); + ); - // Loop controls - $this->assertEquals( + // Loop controls + $this->assertEquals( 'a[out:Foo.Loop2.Item]ba[out:Foo.Loop2.Item]b', $this->render('<% loop Foo.Loop2 %>a{$Item}b<% end_loop %>') - ); + ); - $this->assertEquals( + $this->assertEquals( '[out:Foo.Loop2(Arg1).Item][out:Foo.Loop2(Arg1).Item]', $this->render('<% loop Foo.Loop2(Arg1) %>$Item<% end_loop %>') - ); + ); - $this->assertEquals( + $this->assertEquals( '[out:Loop2(Arg1).Item][out:Loop2(Arg1).Item]', $this->render('<% loop Loop2(Arg1) %>$Item<% end_loop %>') - ); + ); - $this->assertEquals( + $this->assertEquals( '[out:Loop2(Arg1,Arg2).Item][out:Loop2(Arg1,Arg2).Item]', $this->render('<% loop Loop2(Arg1, Arg2) %>$Item<% end_loop %>') - ); + ); - $this->assertEquals( + $this->assertEquals( '[out:Loop2(Arg1,Arg2,Arg3).Item][out:Loop2(Arg1,Arg2,Arg3).Item]', $this->render('<% loop Loop2(Arg1, Arg2, Arg3) %>$Item<% end_loop %>') - ); -} + ); + } -public function testIfBlocks() -{ - // Basic test - $this->assertEquals( + public function testIfBlocks() + { + // Basic test + $this->assertEquals( 'AC', $this->render('A<% if NotSet %>B$NotSet<% end_if %>C') - ); + ); - // Nested test - $this->assertEquals( + // Nested test + $this->assertEquals( 'AB1C', $this->render('A<% if IsSet %>B$NotSet<% if IsSet %>1<% else %>2<% end_if %><% end_if %>C') - ); + ); - // else_if - $this->assertEquals( + // else_if + $this->assertEquals( 'ACD', $this->render('A<% if NotSet %>B<% else_if IsSet %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'AD', $this->render('A<% if NotSet %>B<% else_if AlsoNotset %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ADE', $this->render('A<% if NotSet %>B<% else_if AlsoNotset %>C<% else_if IsSet %>D<% end_if %>E') - ); + ); - $this->assertEquals( + $this->assertEquals( 'ADE', $this->render('A<% if NotSet %>B<% else_if AlsoNotset %>C<% else_if IsSet %>D<% end_if %>E') - ); + ); - // Dot syntax - $this->assertEquals( + // Dot syntax + $this->assertEquals( 'ACD', $this->render('A<% if Foo.NotSet %>B<% else_if Foo.IsSet %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ACD', $this->render('A<% if Foo.Bar.NotSet %>B<% else_if Foo.Bar.IsSet %>C<% end_if %>D') - ); + ); - // Params - $this->assertEquals( + // Params + $this->assertEquals( 'ACD', $this->render('A<% if NotSet(Param) %>B<% else %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ABD', $this->render('A<% if IsSet(Param) %>B<% else %>C<% end_if %>D') - ); + ); - // Negation - $this->assertEquals( + // Negation + $this->assertEquals( 'AC', $this->render('A<% if not IsSet %>B<% end_if %>C') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ABC', $this->render('A<% if not NotSet %>B<% end_if %>C') - ); + ); - // Or - $this->assertEquals( + // Or + $this->assertEquals( 'ABD', $this->render('A<% if IsSet || NotSet %>B<% else_if A %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ACD', $this->render('A<% if NotSet || AlsoNotSet %>B<% else_if IsSet %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'AD', $this->render('A<% if NotSet || AlsoNotSet %>B<% else_if NotSet3 %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ACD', $this->render('A<% if NotSet || AlsoNotSet %>B<% else_if IsSet || NotSet %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'AD', $this->render('A<% if NotSet || AlsoNotSet %>B<% else_if NotSet2 || NotSet3 %>C<% end_if %>D') - ); + ); - // Negated Or - $this->assertEquals( + // Negated Or + $this->assertEquals( 'ACD', $this->render('A<% if not IsSet || AlsoNotSet %>B<% else_if A %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ABD', $this->render('A<% if not NotSet || AlsoNotSet %>B<% else_if A %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ABD', $this->render('A<% if NotSet || not AlsoNotSet %>B<% else_if A %>C<% end_if %>D') - ); + ); - // And - $this->assertEquals( + // And + $this->assertEquals( 'ABD', $this->render('A<% if IsSet && AlsoSet %>B<% else_if A %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ACD', $this->render('A<% if IsSet && NotSet %>B<% else_if IsSet %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'AD', $this->render('A<% if NotSet && NotSet2 %>B<% else_if NotSet3 %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ACD', $this->render('A<% if IsSet && NotSet %>B<% else_if IsSet && AlsoSet %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'AD', $this->render('A<% if NotSet && NotSet2 %>B<% else_if IsSet && NotSet3 %>C<% end_if %>D') - ); + ); - // Equality - $this->assertEquals( + // Equality + $this->assertEquals( 'ABC', $this->render('A<% if RawVal == RawVal %>B<% end_if %>C') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ACD', $this->render('A<% if Right == Wrong %>B<% else_if RawVal == RawVal %>C<% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'ABC', $this->render('A<% if Right != Wrong %>B<% end_if %>C') - ); - $this->assertEquals( + ); + $this->assertEquals( 'AD', $this->render('A<% if Right == Wrong %>B<% else_if RawVal != RawVal %>C<% end_if %>D') - ); + ); - // test inequalities with simple numbers - $this->assertEquals('ABD', $this->render('A<% if 5 > 3 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ABD', $this->render('A<% if 5 >= 3 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ACD', $this->render('A<% if 3 > 5 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ACD', $this->render('A<% if 3 >= 5 %>B<% else %>C<% end_if %>D')); + // test inequalities with simple numbers + $this->assertEquals('ABD', $this->render('A<% if 5 > 3 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ABD', $this->render('A<% if 5 >= 3 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ACD', $this->render('A<% if 3 > 5 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ACD', $this->render('A<% if 3 >= 5 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ABD', $this->render('A<% if 3 < 5 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ABD', $this->render('A<% if 3 <= 5 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ACD', $this->render('A<% if 5 < 3 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ACD', $this->render('A<% if 5 <= 3 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ABD', $this->render('A<% if 3 < 5 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ABD', $this->render('A<% if 3 <= 5 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ACD', $this->render('A<% if 5 < 3 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ACD', $this->render('A<% if 5 <= 3 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ABD', $this->render('A<% if 4 <= 4 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ABD', $this->render('A<% if 4 >= 4 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ACD', $this->render('A<% if 4 > 4 %>B<% else %>C<% end_if %>D')); - $this->assertEquals('ACD', $this->render('A<% if 4 < 4 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ABD', $this->render('A<% if 4 <= 4 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ABD', $this->render('A<% if 4 >= 4 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ACD', $this->render('A<% if 4 > 4 %>B<% else %>C<% end_if %>D')); + $this->assertEquals('ACD', $this->render('A<% if 4 < 4 %>B<% else %>C<% end_if %>D')); - // empty else_if and else tags, if this would not be supported, - // the output would stop after A, thereby failing the assert - $this->assertEquals('AD', $this->render('A<% if IsSet %><% else %><% end_if %>D')); - $this->assertEquals( + // empty else_if and else tags, if this would not be supported, + // the output would stop after A, thereby failing the assert + $this->assertEquals('AD', $this->render('A<% if IsSet %><% else %><% end_if %>D')); + $this->assertEquals( 'AD', $this->render('A<% if NotSet %><% else_if IsSet %><% else %><% end_if %>D') - ); - $this->assertEquals( + ); + $this->assertEquals( 'AD', $this->render('A<% if NotSet %><% else_if AlsoNotSet %><% else %><% end_if %>D') - ); + ); - // Bare words with ending space - $this->assertEquals( + // Bare words with ending space + $this->assertEquals( 'ABC', $this->render('A<% if "RawVal" == RawVal %>B<% end_if %>C') - ); + ); - // Else - $this->assertEquals( + // Else + $this->assertEquals( 'ADE', $this->render('A<% if Right == Wrong %>B<% else_if RawVal != RawVal %>C<% else %>D<% end_if %>E') - ); + ); - // Empty if with else - $this->assertEquals( + // Empty if with else + $this->assertEquals( 'ABC', $this->render('A<% if NotSet %><% else %>B<% end_if %>C') - ); -} + ); + } -public function testBaseTagGeneration() -{ - // XHTML wil have a closed base tag - $tmpl1 = ' + public function testBaseTagGeneration() + { + // XHTML wil have a closed base tag + $tmpl1 = ' <% base_tag %>

test

'; - $this->assertRegExp('/<\/head>/', $this->render($tmpl1)); + $this->assertRegExp('/<\/head>/', $this->render($tmpl1)); - // HTML4 and 5 will only have it for IE - $tmpl2 = ' + // HTML4 and 5 will only have it for IE + $tmpl2 = ' <% base_tag %>

test

'; - $this->assertRegExp( + $this->assertRegExp( '/<\/head>/', $this->render($tmpl2) - ); + ); - $tmpl3 = ' + $tmpl3 = ' <% base_tag %>

test

'; - $this->assertRegExp( + $this->assertRegExp( '/<\/head>/', $this->render($tmpl3) - ); + ); - // Check that the content negotiator converts to the equally legal formats - $negotiator = new ContentNegotiator(); + // Check that the content negotiator converts to the equally legal formats + $negotiator = new ContentNegotiator(); - $response = new HTTPResponse($this->render($tmpl1)); - $negotiator->html($response); - $this->assertRegExp( + $response = new HTTPResponse($this->render($tmpl1)); + $negotiator->html($response); + $this->assertRegExp( '/<\/head>/', $response->getBody() - ); + ); - $response = new HTTPResponse($this->render($tmpl1)); - $negotiator->xhtml($response); - $this->assertRegExp('/<\/head>/', $response->getBody()); -} + $response = new HTTPResponse($this->render($tmpl1)); + $negotiator->xhtml($response); + $this->assertRegExp('/<\/head>/', $response->getBody()); + } -public function testIncludeWithArguments() -{ - $this->assertEquals( + public function testIncludeWithArguments() + { + $this->assertEquals( $this->render('<% include SSViewerTestIncludeWithArguments %>'), '

[out:Arg1]

[out:Arg2]

' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render('<% include SSViewerTestIncludeWithArguments Arg1=A %>'), '

A

[out:Arg2]

' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render('<% include SSViewerTestIncludeWithArguments Arg1=A, Arg2=B %>'), '

A

B

' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render('<% include SSViewerTestIncludeWithArguments Arg1=A Bare String, Arg2=B Bare String %>'), '

A Bare String

B Bare String

' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render( '<% include SSViewerTestIncludeWithArguments Arg1="A", Arg2=$B %>', new ArrayData(array('B' => 'Bar')) ), '

A

Bar

' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render( '<% include SSViewerTestIncludeWithArguments Arg1="A" %>', new ArrayData(array('Arg1' => 'Foo', 'Arg2' => 'Bar')) ), '

A

Bar

' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render( '<% include SSViewerTestIncludeScopeInheritanceWithArgsInLoop Title="SomeArg" %>', new ArrayData( @@ -1009,17 +1008,17 @@ public function testIncludeWithArguments() ) ), 'SomeArg - Foo - Bar - SomeArg' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render( '<% include SSViewerTestIncludeScopeInheritanceWithArgsInWith Title="A" %>', new ArrayData(array('Item' => new ArrayData(array('Title' =>'B')))) ), 'A - B - A' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render( '<% include SSViewerTestIncludeScopeInheritanceWithArgsInNestedWith Title="A" %>', new ArrayData( @@ -1032,9 +1031,9 @@ public function testIncludeWithArguments() ) ), 'A - B - C - B - A' - ); + ); - $this->assertEquals( + $this->assertEquals( $this->render( '<% include SSViewerTestIncludeScopeInheritanceWithUpAndTop Title="A" %>', new ArrayData( @@ -1047,9 +1046,9 @@ public function testIncludeWithArguments() ) ), 'A - A - A' - ); + ); - $data = new ArrayData( + $data = new ArrayData( array( 'Nested' => new ArrayData( array( @@ -1058,36 +1057,36 @@ public function testIncludeWithArguments() ), 'Object' => new ArrayData(array('Key' => 'B')) ) - ); + ); - $tmpl = SSViewer::fromString('<% include SSViewerTestIncludeObjectArguments A=$Nested.Object, B=$Object %>'); - $res = $tmpl->process($data); - $this->assertEqualIgnoringWhitespace('A B', $res, 'Objects can be passed as named arguments'); -} + $tmpl = SSViewer::fromString('<% include SSViewerTestIncludeObjectArguments A=$Nested.Object, B=$Object %>'); + $res = $tmpl->process($data); + $this->assertEqualIgnoringWhitespace('A B', $res, 'Objects can be passed as named arguments'); + } -public function testNamespaceInclude() -{ - $data = new ArrayData([]); + public function testNamespaceInclude() + { + $data = new ArrayData([]); - $this->assertEquals( + $this->assertEquals( "tests:( NamespaceInclude\n )", $this->render('tests:( <% include Namespace\NamespaceInclude %> )', $data), 'Backslashes work for namespace references in includes' - ); + ); - $this->assertEquals( + $this->assertEquals( "tests:( NamespaceInclude\n )", $this->render('tests:( <% include Namespace/NamespaceInclude %> )', $data), 'Forward slashes work for namespace references in includes' - ); -} + ); + } -public function testRecursiveInclude() -{ - $view = new SSViewer(array('Includes/SSViewerTestRecursiveInclude')); + public function testRecursiveInclude() + { + $view = new SSViewer(array('Includes/SSViewerTestRecursiveInclude')); - $data = new ArrayData( + $data = new ArrayData( array( 'Title' => 'A', 'Children' => new ArrayList( @@ -1108,79 +1107,79 @@ public function testRecursiveInclude() ) ), ) - ); + ); - $result = $view->process($data); - // We don't care about whitespace - $rationalisedResult = trim(preg_replace('/\s+/', ' ', $result)); + $result = $view->process($data); + // We don't care about whitespace + $rationalisedResult = trim(preg_replace('/\s+/', ' ', $result)); - $this->assertEquals('A A1 A1 i A1 ii A2 A3', $rationalisedResult); -} + $this->assertEquals('A A1 A1 i A1 ii A2 A3', $rationalisedResult); + } -public function assertEqualIgnoringWhitespace($a, $b, $message = '') -{ - $this->assertEquals(preg_replace('/\s+/', '', $a), preg_replace('/\s+/', '', $b), $message); -} + public function assertEqualIgnoringWhitespace($a, $b, $message = '') + { + $this->assertEquals(preg_replace('/\s+/', '', $a), preg_replace('/\s+/', '', $b), $message); + } /** * See {@link ViewableDataTest} for more extensive casting tests, * this test just ensures that basic casting is correctly applied during template parsing. */ -public function testCastingHelpers() -{ - $vd = new SSViewerTest\TestViewableData(); - $vd->TextValue = 'html'; - $vd->HTMLValue = 'html'; - $vd->UncastedValue = 'html'; + public function testCastingHelpers() + { + $vd = new SSViewerTest\TestViewableData(); + $vd->TextValue = 'html'; + $vd->HTMLValue = 'html'; + $vd->UncastedValue = 'html'; - // Value casted as "Text" - $this->assertEquals( + // Value casted as "Text" + $this->assertEquals( '<b>html</b>', $t = SSViewer::fromString('$TextValue')->process($vd) - ); - $this->assertEquals( + ); + $this->assertEquals( 'html', $t = SSViewer::fromString('$TextValue.RAW')->process($vd) - ); - $this->assertEquals( + ); + $this->assertEquals( '<b>html</b>', $t = SSViewer::fromString('$TextValue.XML')->process($vd) - ); + ); - // Value casted as "HTMLText" - $this->assertEquals( + // Value casted as "HTMLText" + $this->assertEquals( 'html', $t = SSViewer::fromString('$HTMLValue')->process($vd) - ); - $this->assertEquals( + ); + $this->assertEquals( 'html', $t = SSViewer::fromString('$HTMLValue.RAW')->process($vd) - ); - $this->assertEquals( + ); + $this->assertEquals( '<b>html</b>', $t = SSViewer::fromString('$HTMLValue.XML')->process($vd) - ); + ); - // Uncasted value (falls back to ViewableData::$default_cast="Text") - $vd = new SSViewerTest\TestViewableData(); - $vd->UncastedValue = 'html'; - $this->assertEquals( + // Uncasted value (falls back to ViewableData::$default_cast="Text") + $vd = new SSViewerTest\TestViewableData(); + $vd->UncastedValue = 'html'; + $this->assertEquals( '<b>html</b>', $t = SSViewer::fromString('$UncastedValue')->process($vd) - ); - $this->assertEquals( + ); + $this->assertEquals( 'html', $t = SSViewer::fromString('$UncastedValue.RAW')->process($vd) - ); - $this->assertEquals( + ); + $this->assertEquals( '<b>html</b>', $t = SSViewer::fromString('$UncastedValue.XML')->process($vd) - ); -} + ); + } -public function testSSViewerBasicIteratorSupport() -{ - $data = new ArrayData( + public function testSSViewerBasicIteratorSupport() + { + $data = new ArrayData( array( 'Set' => new ArrayList( array( @@ -1197,129 +1196,129 @@ public function testSSViewerBasicIteratorSupport() ) ) ) - ); + ); - //base test - $result = $this->render('<% loop Set %>$Number<% end_loop %>', $data); - $this->assertEquals("12345678910", $result, "Numbers rendered in order"); + //base test + $result = $this->render('<% loop Set %>$Number<% end_loop %>', $data); + $this->assertEquals("12345678910", $result, "Numbers rendered in order"); - //test First - $result = $this->render('<% loop Set %><% if First %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("1", $result, "Only the first number is rendered"); + //test First + $result = $this->render('<% loop Set %><% if First %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("1", $result, "Only the first number is rendered"); - //test Last - $result = $this->render('<% loop Set %><% if Last %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("10", $result, "Only the last number is rendered"); + //test Last + $result = $this->render('<% loop Set %><% if Last %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("10", $result, "Only the last number is rendered"); - //test Even - $result = $this->render('<% loop Set %><% if Even() %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("246810", $result, "Even numbers rendered in order"); + //test Even + $result = $this->render('<% loop Set %><% if Even() %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("246810", $result, "Even numbers rendered in order"); - //test Even with quotes - $result = $this->render('<% loop Set %><% if Even("1") %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("246810", $result, "Even numbers rendered in order"); + //test Even with quotes + $result = $this->render('<% loop Set %><% if Even("1") %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("246810", $result, "Even numbers rendered in order"); - //test Even without quotes - $result = $this->render('<% loop Set %><% if Even(1) %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("246810", $result, "Even numbers rendered in order"); + //test Even without quotes + $result = $this->render('<% loop Set %><% if Even(1) %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("246810", $result, "Even numbers rendered in order"); - //test Even with zero-based start index - $result = $this->render('<% loop Set %><% if Even("0") %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("13579", $result, "Even (with zero-based index) numbers rendered in order"); + //test Even with zero-based start index + $result = $this->render('<% loop Set %><% if Even("0") %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("13579", $result, "Even (with zero-based index) numbers rendered in order"); - //test Odd - $result = $this->render('<% loop Set %><% if Odd %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("13579", $result, "Odd numbers rendered in order"); + //test Odd + $result = $this->render('<% loop Set %><% if Odd %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("13579", $result, "Odd numbers rendered in order"); - //test FirstLast - $result = $this->render('<% loop Set %><% if FirstLast %>$Number$FirstLast<% end_if %><% end_loop %>', $data); - $this->assertEquals("1first10last", $result, "First and last numbers rendered in order"); + //test FirstLast + $result = $this->render('<% loop Set %><% if FirstLast %>$Number$FirstLast<% end_if %><% end_loop %>', $data); + $this->assertEquals("1first10last", $result, "First and last numbers rendered in order"); - //test Middle - $result = $this->render('<% loop Set %><% if Middle %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("23456789", $result, "Middle numbers rendered in order"); + //test Middle + $result = $this->render('<% loop Set %><% if Middle %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("23456789", $result, "Middle numbers rendered in order"); - //test MiddleString - $result = $this->render( + //test MiddleString + $result = $this->render( '<% loop Set %><% if MiddleString == "middle" %>$Number$MiddleString<% end_if %>' . '<% end_loop %>', $data - ); - $this->assertEquals( + ); + $this->assertEquals( "2middle3middle4middle5middle6middle7middle8middle9middle", $result, "Middle numbers rendered in order" - ); + ); - //test EvenOdd - $result = $this->render('<% loop Set %>$EvenOdd<% end_loop %>', $data); - $this->assertEquals( + //test EvenOdd + $result = $this->render('<% loop Set %>$EvenOdd<% end_loop %>', $data); + $this->assertEquals( "oddevenoddevenoddevenoddevenoddeven", $result, "Even and Odd is returned in sequence numbers rendered in order" - ); + ); - //test Pos - $result = $this->render('<% loop Set %>$Pos<% end_loop %>', $data); - $this->assertEquals("12345678910", $result, '$Pos is rendered in order'); + //test Pos + $result = $this->render('<% loop Set %>$Pos<% end_loop %>', $data); + $this->assertEquals("12345678910", $result, '$Pos is rendered in order'); - //test Pos - $result = $this->render('<% loop Set %>$Pos(0)<% end_loop %>', $data); - $this->assertEquals("0123456789", $result, '$Pos(0) is rendered in order'); + //test Pos + $result = $this->render('<% loop Set %>$Pos(0)<% end_loop %>', $data); + $this->assertEquals("0123456789", $result, '$Pos(0) is rendered in order'); - //test FromEnd - $result = $this->render('<% loop Set %>$FromEnd<% end_loop %>', $data); - $this->assertEquals("10987654321", $result, '$FromEnd is rendered in order'); + //test FromEnd + $result = $this->render('<% loop Set %>$FromEnd<% end_loop %>', $data); + $this->assertEquals("10987654321", $result, '$FromEnd is rendered in order'); - //test FromEnd - $result = $this->render('<% loop Set %>$FromEnd(0)<% end_loop %>', $data); - $this->assertEquals("9876543210", $result, '$FromEnd(0) rendered in order'); + //test FromEnd + $result = $this->render('<% loop Set %>$FromEnd(0)<% end_loop %>', $data); + $this->assertEquals("9876543210", $result, '$FromEnd(0) rendered in order'); - //test Total - $result = $this->render('<% loop Set %>$TotalItems<% end_loop %>', $data); - $this->assertEquals("10101010101010101010", $result, "10 total items X 10 are returned"); + //test Total + $result = $this->render('<% loop Set %>$TotalItems<% end_loop %>', $data); + $this->assertEquals("10101010101010101010", $result, "10 total items X 10 are returned"); - //test Modulus - $result = $this->render('<% loop Set %>$Modulus(2,1)<% end_loop %>', $data); - $this->assertEquals("1010101010", $result, "1-indexed pos modular divided by 2 rendered in order"); + //test Modulus + $result = $this->render('<% loop Set %>$Modulus(2,1)<% end_loop %>', $data); + $this->assertEquals("1010101010", $result, "1-indexed pos modular divided by 2 rendered in order"); - //test MultipleOf 3 - $result = $this->render('<% loop Set %><% if MultipleOf(3) %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("369", $result, "Only numbers that are multiples of 3 are returned"); + //test MultipleOf 3 + $result = $this->render('<% loop Set %><% if MultipleOf(3) %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("369", $result, "Only numbers that are multiples of 3 are returned"); - //test MultipleOf 4 - $result = $this->render('<% loop Set %><% if MultipleOf(4) %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("48", $result, "Only numbers that are multiples of 4 are returned"); + //test MultipleOf 4 + $result = $this->render('<% loop Set %><% if MultipleOf(4) %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("48", $result, "Only numbers that are multiples of 4 are returned"); - //test MultipleOf 5 - $result = $this->render('<% loop Set %><% if MultipleOf(5) %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("510", $result, "Only numbers that are multiples of 5 are returned"); + //test MultipleOf 5 + $result = $this->render('<% loop Set %><% if MultipleOf(5) %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("510", $result, "Only numbers that are multiples of 5 are returned"); - //test MultipleOf 10 - $result = $this->render('<% loop Set %><% if MultipleOf(10,1) %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("10", $result, "Only numbers that are multiples of 10 (with 1-based indexing) are returned"); + //test MultipleOf 10 + $result = $this->render('<% loop Set %><% if MultipleOf(10,1) %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("10", $result, "Only numbers that are multiples of 10 (with 1-based indexing) are returned"); - //test MultipleOf 9 zero-based - $result = $this->render('<% loop Set %><% if MultipleOf(9,0) %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals( + //test MultipleOf 9 zero-based + $result = $this->render('<% loop Set %><% if MultipleOf(9,0) %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals( "110", $result, "Only numbers that are multiples of 9 with zero-based indexing are returned. (The first and last item)" - ); + ); - //test MultipleOf 11 - $result = $this->render('<% loop Set %><% if MultipleOf(11) %>$Number<% end_if %><% end_loop %>', $data); - $this->assertEquals("", $result, "Only numbers that are multiples of 11 are returned. I.e. nothing returned"); -} + //test MultipleOf 11 + $result = $this->render('<% loop Set %><% if MultipleOf(11) %>$Number<% end_if %><% end_loop %>', $data); + $this->assertEquals("", $result, "Only numbers that are multiples of 11 are returned. I.e. nothing returned"); + } /** * Test $Up works when the scope $Up refers to was entered with a "with" block */ -public function testUpInWith() -{ + public function testUpInWith() + { - // Data to run the loop tests on - three levels deep - $data = new ArrayData( + // Data to run the loop tests on - three levels deep + $data = new ArrayData( array( 'Name' => 'Top', 'Foo' => new ArrayData( @@ -1343,71 +1342,71 @@ public function testUpInWith() ) ) ) - ); + ); - // Basic functionality - $this->assertEquals( + // Basic functionality + $this->assertEquals( 'BarFoo', $this->render('<% with Foo %><% with Bar %>{$Name}{$Up.Name}<% end_with %><% end_with %>', $data) - ); + ); - // Two level with block, up refers to internally referenced Bar - $this->assertEquals( + // Two level with block, up refers to internally referenced Bar + $this->assertEquals( 'BarFoo', $this->render('<% with Foo.Bar %>{$Name}{$Up.Name}<% end_with %>', $data) - ); + ); - // Stepping up & back down the scope tree - $this->assertEquals( + // Stepping up & back down the scope tree + $this->assertEquals( 'BazBarQux', $this->render('<% with Foo.Bar.Baz %>{$Name}{$Up.Name}{$Up.Qux.Name}<% end_with %>', $data) - ); + ); - // Using $Up in a with block - $this->assertEquals( + // Using $Up in a with block + $this->assertEquals( 'BazBarQux', $this->render( '<% with Foo.Bar.Baz %>{$Name}<% with $Up %>{$Name}{$Qux.Name}<% end_with %>' .'<% end_with %>', $data ) - ); + ); - // Stepping up & back down the scope tree with with blocks - $this->assertEquals( + // Stepping up & back down the scope tree with with blocks + $this->assertEquals( 'BazBarQuxBarBaz', $this->render( '<% with Foo.Bar.Baz %>{$Name}<% with $Up %>{$Name}<% with Qux %>{$Name}<% end_with %>' . '{$Name}<% end_with %>{$Name}<% end_with %>', $data ) - ); + ); - // Using $Up.Up, where first $Up points to a previous scope entered using $Up, thereby skipping up to Foo - $this->assertEquals( + // Using $Up.Up, where first $Up points to a previous scope entered using $Up, thereby skipping up to Foo + $this->assertEquals( 'Foo', $this->render( '<% with Foo.Bar.Baz %><% with Up %><% with Qux %>{$Up.Up.Name}<% end_with %><% end_with %>' . '<% end_with %>', $data ) - ); + ); - // Using $Up.Up, where first $Up points to an Up used in a local scope lookup, should still skip to Foo - $this->assertEquals( + // Using $Up.Up, where first $Up points to an Up used in a local scope lookup, should still skip to Foo + $this->assertEquals( 'Foo', $this->render('<% with Foo.Bar.Baz.Up.Qux %>{$Up.Up.Name}<% end_with %>', $data) - ); -} + ); + } /** * Test $Up works when the scope $Up refers to was entered with a "loop" block */ -public function testUpInLoop() -{ + public function testUpInLoop() + { - // Data to run the loop tests on - one sequence of three items, each with a subitem - $data = new ArrayData( + // Data to run the loop tests on - one sequence of three items, each with a subitem + $data = new ArrayData( array( 'Name' => 'Top', 'Foo' => new ArrayList( @@ -1445,20 +1444,20 @@ public function testUpInLoop() ) ) ) - ); + ); - // Make sure inside a loop, $Up refers to the current item of the loop - $this->assertEqualIgnoringWhitespace( + // Make sure inside a loop, $Up refers to the current item of the loop + $this->assertEqualIgnoringWhitespace( '111 222 333', $this->render( '<% loop $Foo %>$Name<% with $Sub %>$Up.Name<% end_with %>$Name<% end_loop %>', $data ) - ); + ); - // Make sure inside a loop, looping over $Up uses a separate iterator, - // and doesn't interfere with the original iterator - $this->assertEqualIgnoringWhitespace( + // Make sure inside a loop, looping over $Up uses a separate iterator, + // and doesn't interfere with the original iterator + $this->assertEqualIgnoringWhitespace( '1Bar123Bar1 2Baz123Baz2 3Qux123Qux3', $this->render( '<% loop $Foo %> @@ -1472,11 +1471,11 @@ public function testUpInLoop() <% end_loop %>', $data ) - ); + ); - // Make sure inside a loop, looping over $Up uses a separate iterator, - // and doesn't interfere with the original iterator or local lookups - $this->assertEqualIgnoringWhitespace( + // Make sure inside a loop, looping over $Up uses a separate iterator, + // and doesn't interfere with the original iterator or local lookups + $this->assertEqualIgnoringWhitespace( '1 Bar1 123 1Bar 1 2 Baz2 123 2Baz 2 3 Qux3 123 3Qux 3', $this->render( '<% loop $Foo %> @@ -1490,18 +1489,18 @@ public function testUpInLoop() <% end_loop %>', $data ) - ); -} + ); + } /** * Test that nested loops restore the loop variables correctly when pushing and popping states */ -public function testNestedLoops() -{ + public function testNestedLoops() + { - // Data to run the loop tests on - one sequence of three items, one with child elements - // (of a different size to the main sequence) - $data = new ArrayData( + // Data to run the loop tests on - one sequence of three items, one with child elements + // (of a different size to the main sequence) + $data = new ArrayData( array( 'Foo' => new ArrayList( array( @@ -1539,23 +1538,23 @@ public function testNestedLoops() ) ), ) - ); + ); - // Make sure that including a loop inside a loop will not destroy the internal count of - // items, checked by using "Last" - $this->assertEqualIgnoringWhitespace( + // Make sure that including a loop inside a loop will not destroy the internal count of + // items, checked by using "Last" + $this->assertEqualIgnoringWhitespace( '1ab23last', $this->render( '<% loop $Foo %>$Name<% loop Children %>$Name<% end_loop %><% if Last %>last<% end_if %>' . '<% end_loop %>', $data ) - ); -} + ); + } -public function testLayout() -{ - $this->useTestTheme( + public function testLayout() + { + $this->useTestTheme( __DIR__.'/SSViewerTest', 'layouttest', function () { @@ -1565,15 +1564,15 @@ public function testLayout() $template = new SSViewer(array('Shortcodes', 'Page')); $this->assertEquals("[file_link]\n\n", $template->process(new ArrayData(array()))); } - ); -} + ); + } /** * @covers \SilverStripe\View\SSViewer::get_templates_by_class() */ -public function testGetTemplatesByClass() -{ - $this->useTestTheme( + public function testGetTemplatesByClass() + { + $this->useTestTheme( __DIR__ . '/SSViewerTest', 'layouttest', function () { @@ -1644,25 +1643,25 @@ public function testGetTemplatesByClass() $this->setExpectedException('InvalidArgumentException'); SSViewer::get_templates_by_class(array()); } - ); -} + ); + } -public function testRewriteHashlinks() -{ - SSViewer::config()->update('rewrite_hash_links', true); + public function testRewriteHashlinks() + { + SSViewer::config()->update('rewrite_hash_links', true); - $_SERVER['HTTP_HOST'] = 'www.mysite.com'; - $_SERVER['REQUEST_URI'] = '//file.com?foo"onclick="alert(\'xss\')""'; + $_SERVER['HTTP_HOST'] = 'www.mysite.com'; + $_SERVER['REQUEST_URI'] = '//file.com?foo"onclick="alert(\'xss\')""'; - // Emulate SSViewer::process() - // Note that leading double slashes have been rewritten to prevent these being mis-interepreted - // as protocol-less absolute urls - $base = Convert::raw2att('/file.com?foo"onclick="alert(\'xss\')""'); + // Emulate SSViewer::process() + // Note that leading double slashes have been rewritten to prevent these being mis-interepreted + // as protocol-less absolute urls + $base = Convert::raw2att('/file.com?foo"onclick="alert(\'xss\')""'); - $tmplFile = TEMP_FOLDER . '/SSViewerTest_testRewriteHashlinks_' . sha1(rand()) . '.ss'; + $tmplFile = TEMP_FOLDER . '/SSViewerTest_testRewriteHashlinks_' . sha1(rand()) . '.ss'; - // Note: SSViewer_FromString doesn't rewrite hash links. - file_put_contents( + // Note: SSViewer_FromString doesn't rewrite hash links. + file_put_contents( $tmplFile, ' @@ -1675,51 +1674,51 @@ public function testRewriteHashlinks() ' - ); - $tmpl = new SSViewer($tmplFile); - $obj = new ViewableData(); - $obj->InsertedLink = DBField::create_field( + ); + $tmpl = new SSViewer($tmplFile); + $obj = new ViewableData(); + $obj->InsertedLink = DBField::create_field( 'HTMLFragment', 'InsertedLink' - ); - $obj->ExternalInsertedLink = DBField::create_field( + ); + $obj->ExternalInsertedLink = DBField::create_field( 'HTMLFragment', 'ExternalInsertedLink' - ); - $result = $tmpl->process($obj); - $this->assertContains( + ); + $result = $tmpl->process($obj); + $this->assertContains( 'InsertedLink', $result - ); - $this->assertContains( + ); + $this->assertContains( 'ExternalInsertedLink', $result - ); - $this->assertContains( + ); + $this->assertContains( 'InlineLink', $result - ); - $this->assertContains( + ); + $this->assertContains( 'ExternalInlineLink', $result - ); - $this->assertContains( + ); + $this->assertContains( '', $result, 'SSTemplateParser should only rewrite anchor hrefs' - ); + ); - unlink($tmplFile); -} + unlink($tmplFile); + } -public function testRewriteHashlinksInPhpMode() -{ - SSViewer::config()->update('rewrite_hash_links', 'php'); + public function testRewriteHashlinksInPhpMode() + { + SSViewer::config()->update('rewrite_hash_links', 'php'); - $tmplFile = TEMP_FOLDER . '/SSViewerTest_testRewriteHashlinksInPhpMode_' . sha1(rand()) . '.ss'; + $tmplFile = TEMP_FOLDER . '/SSViewerTest_testRewriteHashlinksInPhpMode_' . sha1(rand()) . '.ss'; - // Note: SSViewer_FromString doesn't rewrite hash links. - file_put_contents( + // Note: SSViewer_FromString doesn't rewrite hash links. + file_put_contents( $tmplFile, ' @@ -1730,40 +1729,40 @@ public function testRewriteHashlinksInPhpMode() ' - ); - $tmpl = new SSViewer($tmplFile); - $obj = new ViewableData(); - $obj->InsertedLink = DBField::create_field( + ); + $tmpl = new SSViewer($tmplFile); + $obj = new ViewableData(); + $obj->InsertedLink = DBField::create_field( 'HTMLFragment', 'InsertedLink' - ); - $result = $tmpl->process($obj); + ); + $result = $tmpl->process($obj); - $code = <<<'EOC' + $code = <<<'EOC' #anchor">InsertedLink EOC; - $this->assertContains($code, $result); - // TODO Fix inline links in PHP mode - // $this->assertContains( - // '', $result, 'SSTemplateParser should only rewrite anchor hrefs' - ); + ); - unlink($tmplFile); -} + unlink($tmplFile); + } -public function testRenderWithSourceFileComments() -{ - Director::set_environment_type('dev'); - SSViewer::config()->update('source_file_comments', true); - $i = __DIR__ . '/SSViewerTest/templates/Includes'; - $f = __DIR__ . '/SSViewerTest/templates/SSViewerTestComments'; - $templates = array( + public function testRenderWithSourceFileComments() + { + Director::set_environment_type('dev'); + SSViewer::config()->update('source_file_comments', true); + $i = __DIR__ . '/SSViewerTest/templates/Includes'; + $f = __DIR__ . '/SSViewerTest/templates/SSViewerTestComments'; + $templates = array( array( 'name' => 'SSViewerTestCommentsFullSource', 'expected' => "" @@ -1840,81 +1839,81 @@ public function testRenderWithSourceFileComments() . "" . "", ), - ); - foreach ($templates as $template) { - $this->_renderWithSourceFileComments('SSViewerTestComments/'.$template['name'], $template['expected']); + ); + foreach ($templates as $template) { + $this->_renderWithSourceFileComments('SSViewerTestComments/'.$template['name'], $template['expected']); + } + } + private function _renderWithSourceFileComments($name, $expected) + { + $viewer = new SSViewer(array($name)); + $data = new ArrayData(array()); + $result = $viewer->process($data); + $expected = str_replace(array("\r", "\n"), '', $expected); + $result = str_replace(array("\r", "\n"), '', $result); + $this->assertEquals($result, $expected); } -} -private function _renderWithSourceFileComments($name, $expected) -{ - $viewer = new SSViewer(array($name)); - $data = new ArrayData(array()); - $result = $viewer->process($data); - $expected = str_replace(array("\r", "\n"), '', $expected); - $result = str_replace(array("\r", "\n"), '', $result); - $this->assertEquals($result, $expected); -} -public function testLoopIteratorIterator() -{ - $list = new PaginatedList(new ArrayList()); - $viewer = new SSViewer_FromString('<% loop List %>$ID - $FirstName
<% end_loop %>'); - $result = $viewer->process(new ArrayData(array('List' => $list))); - $this->assertEquals($result, ''); -} + public function testLoopIteratorIterator() + { + $list = new PaginatedList(new ArrayList()); + $viewer = new SSViewer_FromString('<% loop List %>$ID - $FirstName
<% end_loop %>'); + $result = $viewer->process(new ArrayData(array('List' => $list))); + $this->assertEquals($result, ''); + } -public function testProcessOnlyIncludesRequirementsOnce() -{ - $template = new SSViewer(array('SSViewerTestProcess')); - $basePath = $this->getCurrentRelativePath() . '/SSViewerTest'; + public function testProcessOnlyIncludesRequirementsOnce() + { + $template = new SSViewer(array('SSViewerTestProcess')); + $basePath = $this->getCurrentRelativePath() . '/SSViewerTest'; - $backend = Injector::inst()->create(Requirements_Backend::class); - $backend->setCombinedFilesEnabled(false); - $backend->combineFiles( + $backend = Injector::inst()->create(Requirements_Backend::class); + $backend->setCombinedFilesEnabled(false); + $backend->combineFiles( 'RequirementsTest_ab.css', array( $basePath . '/css/RequirementsTest_a.css', $basePath . '/css/RequirementsTest_b.css' ) - ); + ); - Requirements::set_backend($backend); + Requirements::set_backend($backend); - $this->assertEquals(1, substr_count($template->process(array()), "a.css")); - $this->assertEquals(1, substr_count($template->process(array()), "b.css")); + $this->assertEquals(1, substr_count($template->process(array()), "a.css")); + $this->assertEquals(1, substr_count($template->process(array()), "b.css")); - // if we disable the requirements then we should get nothing - $template->includeRequirements(false); - $this->assertEquals(0, substr_count($template->process(array()), "a.css")); - $this->assertEquals(0, substr_count($template->process(array()), "b.css")); -} + // if we disable the requirements then we should get nothing + $template->includeRequirements(false); + $this->assertEquals(0, substr_count($template->process(array()), "a.css")); + $this->assertEquals(0, substr_count($template->process(array()), "b.css")); + } -public function testRequireCallInTemplateInclude() -{ - //TODO undo skip test on the event that templates ever obtain the ability to reference MODULE_DIR (or something to that effect) - if (FRAMEWORK_DIR === 'framework') { - $template = new SSViewer(array('SSViewerTestProcess')); + public function testRequireCallInTemplateInclude() + { + //TODO undo skip test on the event that templates ever obtain the ability to reference MODULE_DIR (or something to that effect) + if (FRAMEWORK_DIR === 'framework') { + $template = new SSViewer(array('SSViewerTestProcess')); - Requirements::set_suffix_requirements(false); + Requirements::set_suffix_requirements(false); - $this->assertEquals( + $this->assertEquals( 1, substr_count( $template->process(array()), "tests/php/View/SSViewerTest/javascript/RequirementsTest_a.js" ) - ); - } else { - $this->markTestSkipped( + ); + } else { + $this->markTestSkipped( 'Requirement will always fail if the framework dir is not '. 'named \'framework\', since templates require hard coded paths' - ); + ); + } } -} -public function testCallsWithArguments() -{ - $data = new ArrayData( + public function testCallsWithArguments() + { + $data = new ArrayData( array( 'Set' => new ArrayList( array( @@ -1930,9 +1929,9 @@ public function testCallsWithArguments() 'Level' => new SSViewerTest\LevelTestData(2), ), ) - ); + ); - $tests = array( + $tests = array( '$Level.output(1)' => '1-1', '$Nest.Level.output($Set.First.Number)' => '2-1', '<% with $Set %>$Up.Level.output($First.Number)<% end_with %>' => '1-1', @@ -1949,17 +1948,17 @@ public function testCallsWithArguments() '<% with $Nest %> <% loop $Level.forLoop($Top.Set.Last.Number) %>$Number<% end_loop %> <% end_with %>' => '!0!1!2!3!4', - ); + ); - foreach ($tests as $template => $expected) { - $this->assertEquals($expected, trim($this->render($template, $data))); + foreach ($tests as $template => $expected) { + $this->assertEquals($expected, trim($this->render($template, $data))); + } } -} -public function testRepeatedCallsAreCached() -{ - $data = new SSViewerTest\CacheTestData(); - $template = ' + public function testRepeatedCallsAreCached() + { + $data = new SSViewerTest\CacheTestData(); + $template = ' <% if $TestWithCall %> <% with $TestWithCall %> {$Message} @@ -1968,89 +1967,89 @@ public function testRepeatedCallsAreCached() {$TestWithCall.Message} <% end_if %>'; - $this->assertEquals('HiHi', preg_replace('/\s+/', '', $this->render($template, $data))); - $this->assertEquals( + $this->assertEquals('HiHi', preg_replace('/\s+/', '', $this->render($template, $data))); + $this->assertEquals( 1, $data->testWithCalls, 'SSViewerTest_CacheTestData::TestWithCall() should only be called once. Subsequent calls should be cached' - ); + ); - $data = new SSViewerTest\CacheTestData(); - $template = ' + $data = new SSViewerTest\CacheTestData(); + $template = ' <% if $TestLoopCall %> <% loop $TestLoopCall %> {$Message} <% end_loop %> <% end_if %>'; - $this->assertEquals('OneTwo', preg_replace('/\s+/', '', $this->render($template, $data))); - $this->assertEquals( + $this->assertEquals('OneTwo', preg_replace('/\s+/', '', $this->render($template, $data))); + $this->assertEquals( 1, $data->testLoopCalls, 'SSViewerTest_CacheTestData::TestLoopCall() should only be called once. Subsequent calls should be cached' - ); -} + ); + } -public function testClosedBlockExtension() -{ - $count = 0; - $parser = new SSTemplateParser(); - $parser->addClosedBlock( + public function testClosedBlockExtension() + { + $count = 0; + $parser = new SSTemplateParser(); + $parser->addClosedBlock( 'test', function ($res) use (&$count) { $count++; } - ); + ); - $template = new SSViewer_FromString("<% test %><% end_test %>", $parser); - $template->process(new SSViewerTest\TestFixture()); + $template = new SSViewer_FromString("<% test %><% end_test %>", $parser); + $template->process(new SSViewerTest\TestFixture()); - $this->assertEquals(1, $count); -} + $this->assertEquals(1, $count); + } -public function testOpenBlockExtension() -{ - $count = 0; - $parser = new SSTemplateParser(); - $parser->addOpenBlock( + public function testOpenBlockExtension() + { + $count = 0; + $parser = new SSTemplateParser(); + $parser->addOpenBlock( 'test', function ($res) use (&$count) { $count++; } - ); + ); - $template = new SSViewer_FromString("<% test %>", $parser); - $template->process(new SSViewerTest\TestFixture()); + $template = new SSViewer_FromString("<% test %>", $parser); + $template->process(new SSViewerTest\TestFixture()); - $this->assertEquals(1, $count); -} + $this->assertEquals(1, $count); + } /** * Tests if caching for SSViewer_FromString is working */ -public function testFromStringCaching() -{ - $content = 'Test content'; - $cacheFile = TEMP_FOLDER . '/.cache.' . sha1($content); - if (file_exists($cacheFile)) { + public function testFromStringCaching() + { + $content = 'Test content'; + $cacheFile = TEMP_FOLDER . '/.cache.' . sha1($content); + if (file_exists($cacheFile)) { + unlink($cacheFile); + } + + // Test global behaviors + $this->render($content, null, null); + $this->assertFalse(file_exists($cacheFile), 'Cache file was created when caching was off'); + + SSViewer_FromString::config()->update('cache_template', true); + $this->render($content, null, null); + $this->assertTrue(file_exists($cacheFile), 'Cache file wasn\'t created when it was meant to'); + unlink($cacheFile); + + // Test instance behaviors + $this->render($content, null, false); + $this->assertFalse(file_exists($cacheFile), 'Cache file was created when caching was off'); + + $this->render($content, null, true); + $this->assertTrue(file_exists($cacheFile), 'Cache file wasn\'t created when it was meant to'); unlink($cacheFile); } - - // Test global behaviors - $this->render($content, null, null); - $this->assertFalse(file_exists($cacheFile), 'Cache file was created when caching was off'); - - SSViewer_FromString::config()->update('cache_template', true); - $this->render($content, null, null); - $this->assertTrue(file_exists($cacheFile), 'Cache file wasn\'t created when it was meant to'); - unlink($cacheFile); - - // Test instance behaviors - $this->render($content, null, false); - $this->assertFalse(file_exists($cacheFile), 'Cache file was created when caching was off'); - - $this->render($content, null, true); - $this->assertTrue(file_exists($cacheFile), 'Cache file wasn\'t created when it was meant to'); - unlink($cacheFile); -} }