Skip to content

Commit dc17776

Browse files
committed
Add tests for default slots
1 parent a57825e commit dc17776

2 files changed

Lines changed: 72 additions & 3 deletions

File tree

src/Phug/Component/ComponentExtension.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,31 @@ public static function disable(): void
5555
public static function slot(string $name, array $definedVariables)
5656
{
5757
$children = $definedVariables['__pug_children'] ?? null;
58+
$callbackName = static::PUG_SLOT_NAME_VARIABLE.'_'.$name;
5859

5960
if (is_object($children) && $children instanceof Closure) {
60-
$children(array_merge([static::PUG_SLOT_NAME_VARIABLE => $name ?: '__main__'], $definedVariables));
61+
$called = false;
62+
$children(array_merge([
63+
static::PUG_SLOT_NAME_VARIABLE => $name ?: '__main__',
64+
$callbackName => static function () use (&$called) {
65+
$called = true;
66+
}
67+
], $definedVariables));
68+
69+
return !$called;
70+
}
71+
72+
if (($definedVariables[static::PUG_SLOT_NAME_VARIABLE] ?? null) === $name) {
73+
$callback = $definedVariables[$callbackName] ?? null;
74+
75+
if ($callback && $callback instanceof Closure) {
76+
$callback();
77+
}
6178

62-
return false;
79+
return true;
6380
}
6481

65-
return ($definedVariables[static::PUG_SLOT_NAME_VARIABLE] ?? null) === $name;
82+
return false;
6683
}
6784

6885
public function getKeywords(): array

tests/Phug/Component/ComponentExtensionTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,60 @@ public function testSlot()
176176
$this->assertTrue(ComponentExtension::slot('foo', ['pug_component_slot' => 'foo']));
177177
$this->assertTrue(ComponentExtension::slot('__main__', ['pug_component_slot' => '__main__']));
178178

179+
$called = false;
180+
$callback = function () use (&$called) {
181+
$called = true;
182+
};
183+
184+
$this->assertTrue(ComponentExtension::slot('foo', ['pug_component_slot' => 'foo', 'pug_component_slot_foo' => $callback]));
185+
$this->assertTrue($called);
186+
187+
$called = false;
188+
$this->assertTrue(ComponentExtension::slot('__main__', ['pug_component_slot' => '__main__', 'pug_component_slot_foo' => $callback]));
189+
$this->assertFalse($called);
190+
191+
$called = false;
192+
$this->assertTrue(ComponentExtension::slot('foo', ['pug_component_slot' => 'foo', 'pug_component_slot___main__' => $callback]));
193+
$this->assertFalse($called);
194+
195+
$called = false;
196+
$this->assertTrue(ComponentExtension::slot('__main__', ['pug_component_slot' => '__main__', 'pug_component_slot___main__' => $callback]));
197+
$this->assertTrue($called);
198+
199+
$arguments = [];
200+
$children = static function (...$args) use (&$arguments) {
201+
if (isset($args[0]['pug_component_slot_foo'])) {
202+
unset($args[0]['pug_component_slot_foo']);
203+
}
204+
205+
if (isset($args[0]['pug_component_slot___main__'])) {
206+
unset($args[0]['pug_component_slot___main__']);
207+
}
208+
209+
$arguments = $args;
210+
};
211+
212+
$this->assertTrue(ComponentExtension::slot('foo', ['pug_component_slot' => 'foo', '__pug_children' => $children]));
213+
$this->assertSame([['pug_component_slot' => 'foo', '__pug_children' => $children]], $arguments);
214+
$this->assertTrue(ComponentExtension::slot('__main__', ['pug_component_slot' => '__main__', '__pug_children' => $children]));
215+
$this->assertSame([['pug_component_slot' => '__main__', '__pug_children' => $children]], $arguments);
216+
$this->assertTrue(ComponentExtension::slot('foo', ['__pug_children' => $children]));
217+
$this->assertSame([['pug_component_slot' => 'foo', '__pug_children' => $children]], $arguments);
218+
$this->assertTrue(ComponentExtension::slot('__main__', ['__pug_children' => $children]));
219+
$this->assertSame([['pug_component_slot' => '__main__', '__pug_children' => $children]], $arguments);
220+
179221
$arguments = [];
180222
$children = static function (...$args) use (&$arguments) {
223+
if (isset($args[0]['pug_component_slot_foo'])) {
224+
$args[0]['pug_component_slot_foo']();
225+
unset($args[0]['pug_component_slot_foo']);
226+
}
227+
228+
if (isset($args[0]['pug_component_slot___main__'])) {
229+
$args[0]['pug_component_slot___main__']();
230+
unset($args[0]['pug_component_slot___main__']);
231+
}
232+
181233
$arguments = $args;
182234
};
183235

0 commit comments

Comments
 (0)