public function testCanMergeTwoBagsWithoutOverridingExistingValues()
{
$firstBag = (new FlagBag('first'))->withFlag(new ElementWithToStringFlag('first_foo', 'foo'))->withFlag(new ElementFlag('foz'));
$secondBag = (new FlagBag('second'))->withFlag(new ElementWithToStringFlag('second_foo', 'foo'))->withFlag(new ElementFlag('baz'));
$mergeFirstWithSecondWithOverriding = $firstBag->mergeWith($secondBag);
$mergeFirstWithSecondWithoutOverriding = $firstBag->mergeWith($secondBag, false);
$mergeSecondWithFirstWithOverriding = $secondBag->mergeWith($firstBag);
$mergeSecondWithFirstWithoutOverriding = $secondBag->mergeWith($firstBag, false);
$this->assertEquals((new FlagBag('first'))->withFlag(new ElementWithToStringFlag('first_foo', 'foo'))->withFlag(new ElementFlag('foz')), $firstBag);
$this->assertEquals((new FlagBag('second'))->withFlag(new ElementWithToStringFlag('second_foo', 'foo'))->withFlag(new ElementFlag('baz')), $secondBag);
$this->assertEquals((new FlagBag('first'))->withFlag(new ElementWithToStringFlag('second_foo', 'foo'))->withFlag(new ElementFlag('foz'))->withFlag(new ElementFlag('baz')), $mergeFirstWithSecondWithOverriding);
$this->assertEquals((new FlagBag('first'))->withFlag(new ElementWithToStringFlag('first_foo', 'foo'))->withFlag(new ElementFlag('foz'))->withFlag(new ElementFlag('baz')), $mergeFirstWithSecondWithoutOverriding);
$this->assertEquals((new FlagBag('second'))->withFlag(new ElementFlag('baz'))->withFlag(new ElementWithToStringFlag('first_foo', 'foo'))->withFlag(new ElementFlag('foz')), $mergeSecondWithFirstWithOverriding);
$this->assertEquals((new FlagBag('second'))->withFlag(new ElementFlag('baz'))->withFlag(new ElementWithToStringFlag('second_foo', 'foo'))->withFlag(new ElementFlag('foz')), $mergeSecondWithFirstWithoutOverriding);
}