Skip to content

Commit bc028ba

Browse files
committed
fix(Container) unset when-needs-give chains correctly
1 parent c629a19 commit bc028ba

File tree

5 files changed

+142
-2
lines changed

5 files changed

+142
-2
lines changed

src/Builders/Resolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public function isBound($id)
111111
*/
112112
public function unbind($id)
113113
{
114-
unset($this->bindings[$id]);
114+
unset($this->bindings[$id], $this->whenNeedsGive[$id], $this->singletons[$id]);
115115
}
116116

117117
/**

src/Container.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -730,7 +730,8 @@ public function give($implementation)
730730
$id = "{$this->whenClass}::{$this->needsClass}";
731731
$builder = $this->builders->getBuilder($id, $implementation);
732732
$this->resolver->setWhenNeedsGive($this->whenClass, $this->needsClass, $builder);
733-
unset($this->whenClass, $this->needsClass);
733+
// @phpstan-ignore unset.possiblyHookedProperty
734+
unset($this->whenClass, $this->needsClass); // @phpstan-ignore unset.possiblyHookedProperty
734735
}
735736

736737
/**

tests/unit/UnsetTest.php

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<?php
2+
3+
namespace unit;
4+
5+
use lucatume\DI52\Container;
6+
use lucatume\DI52\ContainerException;
7+
use PHPUnit\Framework\TestCase;
8+
use unit\data\MySingletonClass;
9+
use unit\data\MySingletonClassTwo;
10+
11+
require_once __DIR__ . '/data/MySingletonClass.php';
12+
require_once __DIR__ . '/data/MySingletonClassTwo.php';
13+
14+
class UnsetTest extends TestCase
15+
{
16+
public function test_unset_binding_with_bind_default():void
17+
{
18+
$container = new Container(false);
19+
20+
$container->bind(MySingletonClass::class, MySingletonClass::class);
21+
22+
$this->assertInstanceOf(MySingletonClass::class, $container->get(MySingletonClass::class));
23+
$this->assertNotSame($container->get(MySingletonClass::class), $container->get(MySingletonClass::class));
24+
$previousInstance = $container->get(MySingletonClass::class);
25+
26+
$container->offsetUnset(MySingletonClass::class);
27+
28+
$this->assertInstanceOf(MySingletonClass::class, $container->get(MySingletonClass::class));
29+
$this->assertNotSame($container->get(MySingletonClass::class), $container->get(MySingletonClass::class));
30+
$this->assertNotSame($previousInstance, $container->get(MySingletonClass::class));
31+
}
32+
33+
public function test_unset_binding_with_singleton_default():void
34+
{
35+
$container = new Container(true);
36+
37+
$container->bind(MySingletonClass::class, MySingletonClass::class);
38+
39+
$this->assertInstanceOf(MySingletonClass::class, $container->get(MySingletonClass::class));
40+
$this->assertNotSame($container->get(MySingletonClass::class), $container->get(MySingletonClass::class));
41+
$previousInstance = $container->get(MySingletonClass::class);
42+
43+
$container->offsetUnset(MySingletonClass::class);
44+
45+
$this->assertInstanceOf(MySingletonClass::class, $container->get(MySingletonClass::class));
46+
$this->assertSame($container->get(MySingletonClass::class), $container->get(MySingletonClass::class));
47+
$this->assertNotSame($previousInstance, $container->get(MySingletonClass::class));
48+
}
49+
50+
public function test_unset_singleton_with_bind_default(): void
51+
{
52+
$container = new Container(false);
53+
54+
$container->singleton(MySingletonClass::class, MySingletonClass::class);
55+
56+
$this->assertInstanceOf(MySingletonClass::class, $container->get(MySingletonClass::class));
57+
$this->assertSame($container->get(MySingletonClass::class), $container->get(MySingletonClass::class));
58+
$previousInstance = $container->get(MySingletonClass::class);
59+
60+
$container->offsetUnset(MySingletonClass::class);
61+
62+
$this->assertInstanceOf(MySingletonClass::class, $container->get(MySingletonClass::class));
63+
$this->assertNotSame($container->get(MySingletonClass::class), $container->get(MySingletonClass::class));
64+
$this->assertNotSame($previousInstance, $container->get(MySingletonClass::class));
65+
}
66+
67+
public function test_unset_singleton_with_singleton_default(): void
68+
{
69+
$container = new Container(true);
70+
71+
$container->singleton(MySingletonClass::class, MySingletonClass::class);
72+
$this->assertInstanceOf(MySingletonClass::class, $container->get(MySingletonClass::class));
73+
$this->assertSame($container->get(MySingletonClass::class), $container->get(MySingletonClass::class));
74+
$previousInstance = $container->get(MySingletonClass::class);
75+
76+
$container->offsetUnset(MySingletonClass::class);
77+
78+
$this->assertInstanceOf(MySingletonClass::class, $container->get(MySingletonClass::class));
79+
$this->assertSame($container->get(MySingletonClass::class), $container->get(MySingletonClass::class));
80+
$this->assertNotSame($previousInstance, $container->get(MySingletonClass::class));
81+
}
82+
83+
public function test_unset_given_when_then_with_bind_default(): void
84+
{
85+
$container = new Container(false);
86+
87+
$container->when(MySingletonClassTwo::class)
88+
->needs('$number')
89+
->give(10);
90+
91+
$this->assertInstanceOf(MySingletonClassTwo::class, $container->get(MySingletonClassTwo::class));
92+
$this->assertNotSame($container->get(MySingletonClassTwo::class), $container->get(MySingletonClassTwo::class));
93+
94+
$container->offsetUnset(MySingletonClassTwo::class);
95+
96+
$this->expectException(ContainerException::class);
97+
98+
$container->get(MySingletonClassTwo::class);
99+
}
100+
101+
public function test_unset_given_when_then_with_singleton_default(): void
102+
{
103+
$container = new Container(true);
104+
105+
$container->when(MySingletonClassTwo::class)
106+
->needs('$number')
107+
->give(10);
108+
109+
$this->assertInstanceOf(MySingletonClassTwo::class, $container->get(MySingletonClassTwo::class));
110+
$this->assertSame($container->get(MySingletonClassTwo::class), $container->get(MySingletonClassTwo::class));
111+
112+
$container->offsetUnset(MySingletonClassTwo::class);
113+
114+
$this->expectException(ContainerException::class);
115+
116+
$container->get(MySingletonClassTwo::class);
117+
}
118+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace unit\data;
4+
5+
class MySingletonClass
6+
{
7+
8+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace unit\data;
4+
5+
class MySingletonClassTwo
6+
{
7+
private $number;
8+
9+
public function __construct(int $number)
10+
{
11+
$this->number = $number;
12+
}
13+
}

0 commit comments

Comments
 (0)