getFiles(), __DIR__); $files->shouldReceive('exists')->once()->with(__DIR__.'/'.md5('foo'))->andReturn(false); $this->assertTrue($compiler->isExpired('foo')); } public function testIsExpiredReturnsTrueIfCachePathIsNull() { $compiler = new BladeCompiler($files = $this->getFiles(), null); $files->shouldReceive('exists')->never(); $this->assertTrue($compiler->isExpired('foo')); } public function testIsExpiredReturnsTrueWhenModificationTimesWarrant() { $compiler = new BladeCompiler($files = $this->getFiles(), __DIR__); $files->shouldReceive('exists')->once()->with(__DIR__.'/'.md5('foo'))->andReturn(true); $files->shouldReceive('lastModified')->once()->with('foo')->andReturn(100); $files->shouldReceive('lastModified')->once()->with(__DIR__.'/'.md5('foo'))->andReturn(0); $this->assertTrue($compiler->isExpired('foo')); } public function testCompilePathIsProperlyCreated() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals(__DIR__.'/'.md5('foo'), $compiler->getCompiledPath('foo')); } public function testCompileCompilesFileAndReturnsContents() { $compiler = new BladeCompiler($files = $this->getFiles(), __DIR__); $files->shouldReceive('get')->once()->with('foo')->andReturn('Hello World'); $files->shouldReceive('put')->once()->with(__DIR__.'/'.md5('foo'), 'Hello World'); $compiler->compile('foo'); } public function testCompileDoesntStoreFilesWhenCachePathIsNull() { $compiler = new BladeCompiler($files = $this->getFiles(), null); $files->shouldReceive('get')->once()->with('foo')->andReturn('Hello World'); $files->shouldReceive('put')->never(); $compiler->compile('foo'); } public function testEchosAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('', $compiler->compileString('{{{$name}}}')); $this->assertEquals('', $compiler->compileString('{{$name}}')); $this->assertEquals('', $compiler->compileString('{{ $name }}')); $this->assertEquals('', $compiler->compileString('{{ $name }}')); $this->assertEquals('', $compiler->compileString('{{ $name or "foo" }}')); $this->assertEquals('name) ? $user->name : "foo"; ?>', $compiler->compileString('{{ $user->name or "foo" }}')); $this->assertEquals('', $compiler->compileString('{{$name or "foo"}}')); $this->assertEquals('', $compiler->compileString('{{ $name or "foo" }}')); $this->assertEquals('', $compiler->compileString('{{ $name or \'foo\' }}')); $this->assertEquals('', $compiler->compileString('{{$name or \'foo\'}}')); $this->assertEquals('', $compiler->compileString('{{ $name or \'foo\' }}')); $this->assertEquals('', $compiler->compileString('{{ $age or 90 }}')); $this->assertEquals('', $compiler->compileString('{{$age or 90}}')); $this->assertEquals('', $compiler->compileString('{{ $age or 90 }}')); $this->assertEquals('', $compiler->compileString('{{ "Hello world or foo" }}')); $this->assertEquals('', $compiler->compileString('{{"Hello world or foo"}}')); $this->assertEquals('', $compiler->compileString('{{$foo + $or + $baz}}')); $this->assertEquals('', $compiler->compileString('{{ "Hello world or foo" }}')); $this->assertEquals('', $compiler->compileString('{{ \'Hello world or foo\' }}')); $this->assertEquals('', $compiler->compileString('{{\'Hello world or foo\'}}')); $this->assertEquals('', $compiler->compileString('{{ \'Hello world or foo\' }}')); $this->assertEquals('', $compiler->compileString('{{ myfunc(\'foo or bar\') }}')); $this->assertEquals('', $compiler->compileString('{{ myfunc("foo or bar") }}')); $this->assertEquals('', $compiler->compileString('{{ myfunc("$name or \'foo\'") }}')); } public function testEscapedWithAtEchosAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('{{$name}}', $compiler->compileString('@{{$name}}')); $this->assertEquals('{{ $name }}', $compiler->compileString('@{{ $name }}')); $this->assertEquals('{{ $name }}', $compiler->compileString('@{{ $name }}')); } public function testReversedEchosAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $compiler->setEscapedContentTags('{{', '}}'); $compiler->setContentTags('{{{', '}}}'); $this->assertEquals('', $compiler->compileString('{{$name}}')); $this->assertEquals('', $compiler->compileString('{{{$name}}}')); $this->assertEquals('', $compiler->compileString('{{{ $name }}}')); $this->assertEquals('', $compiler->compileString('{{{ $name }}}')); } public function testExtendsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $string = '@extends(\'foo\') test'; $expected = "test\r\n".'make(\'foo\', array_except(get_defined_vars(), array(\'__data\', \'__path\')))->render(); ?>'; $this->assertEquals($expected, $compiler->compileString($string)); $compiler = new BladeCompiler($this->getFiles(), __DIR__); $string = '@extends(name(foo)) test'; $expected = "test\r\n".'make(name(foo), array_except(get_defined_vars(), array(\'__data\', \'__path\')))->render(); ?>'; $this->assertEquals($expected, $compiler->compileString($string)); } public function testCommentsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $string = '{{--this is a comment--}}'; $expected = ''; $this->assertEquals($expected, $compiler->compileString($string)); $string = '{{-- this is a comment --}}'; $expected = ''; $this->assertEquals($expected, $compiler->compileString($string)); } public function testIfStatementsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $string = '@if (name(foo(bar))) breeze @endif'; $expected = ' breeze '; $this->assertEquals($expected, $compiler->compileString($string)); } public function testElseStatementsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $string = '@if (name(foo(bar))) breeze @else boom @endif'; $expected = ' breeze boom '; $this->assertEquals($expected, $compiler->compileString($string)); } public function testElseIfStatementsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $string = '@if (name(foo(bar))) breeze @elseif (boom(breeze)) boom @endif'; $expected = ' breeze boom '; $this->assertEquals($expected, $compiler->compileString($string)); } public function testUnlessStatementsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $string = '@unless (name(foo(bar))) breeze @endunless'; $expected = ' breeze '; $this->assertEquals($expected, $compiler->compileString($string)); } public function testStatementThatContainsNonConsecutiveParanthesisAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $string = "Foo @lang(function_call('foo(blah)')) bar"; $expected = "Foo bar"; $this->assertEquals($expected, $compiler->compileString($string)); } public function testIncludesAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('make(\'foo\', array_except(get_defined_vars(), array(\'__data\', \'__path\')))->render(); ?>', $compiler->compileString('@include(\'foo\')')); $this->assertEquals('make(name(foo), array_except(get_defined_vars(), array(\'__data\', \'__path\')))->render(); ?>', $compiler->compileString('@include(name(foo))')); } public function testShowEachAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('renderEach(\'foo\', \'bar\'); ?>', $compiler->compileString('@each(\'foo\', \'bar\')')); $this->assertEquals('renderEach(name(foo)); ?>', $compiler->compileString('@each(name(foo))')); } public function testYieldsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('yieldContent(\'foo\'); ?>', $compiler->compileString('@yield(\'foo\')')); $this->assertEquals('yieldContent(\'foo\', \'bar\'); ?>', $compiler->compileString('@yield(\'foo\', \'bar\')')); $this->assertEquals('yieldContent(name(foo)); ?>', $compiler->compileString('@yield(name(foo))')); } public function testShowsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('yieldSection(); ?>', $compiler->compileString('@show')); } public function testLanguageAndChoicesAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('', $compiler->compileString("@lang('foo')")); $this->assertEquals('', $compiler->compileString("@choice('foo', 1)")); } public function testSectionStartsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('startSection(\'foo\'); ?>', $compiler->compileString('@section(\'foo\')')); $this->assertEquals('startSection(name(foo)); ?>', $compiler->compileString('@section(name(foo))')); } public function testStopSectionsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('stopSection(); ?>', $compiler->compileString('@stop')); } public function testAppendSectionsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $this->assertEquals('appendSection(); ?>', $compiler->compileString('@append')); } public function testCustomExtensionsAreCompiled() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $compiler->extend(function($value) { return str_replace('foo', 'bar', $value); }); $this->assertEquals('bar', $compiler->compileString('foo')); } public function testConfiguringContentTags() { $compiler = new BladeCompiler($this->getFiles(), __DIR__); $compiler->setContentTags('[[', ']]'); $compiler->setEscapedContentTags('[[[', ']]]'); $this->assertEquals('', $compiler->compileString('[[[ $name ]]]')); $this->assertEquals('', $compiler->compileString('[[ $name ]]')); $this->assertEquals('', $compiler->compileString('[[ $name ]]')); } protected function getFiles() { return m::mock('Illuminate\Filesystem\Filesystem'); } }