public function testAddingAFlagCreatesANewModifiedInstance()
{
$flag = new MutableFlag('flag0', new \stdClass());
$bag1 = new FlagBag('user0');
$bag2 = $bag1->withFlag($flag);
$this->assertInstanceOf(FlagBag::class, $bag1);
$this->assertNotSame($bag1, $bag2);
$this->assertCount(0, $bag1);
$this->assertCount(1, $bag2);
// Mutate injected value
$flag->setStringValue('flag1');
$flag->getObject()->injected = true;
// Mutate return value
foreach ($bag1 as $flag) {
/** @var MutableFlag $flag */
$flag->setStringValue('flag2');
$flag->getObject()->foo = 'bar';
}
$this->assertEquals((new FlagBag('user0'))->withFlag(new MutableFlag('flag0', new \stdClass())), $bag2);
}