public function testBranchedWithMovedAndAddedAndRemovedInstances()
 {
     $newSeriesId = 10910;
     $newInstanceId1 = 2827;
     $newInstanceId2 = 2828;
     $userId = 10;
     $resourceId = 11;
     $title = "new title";
     $description = "new description";
     $allowParticipation = true;
     $dateRange = DateRange::Create('2010-01-10 05:30:00', '2010-01-10 08:30:00', 'UTC');
     $existingInstance1 = new TestReservation('123', $dateRange->AddDays(1));
     $existingInstance2 = new TestReservation('223', $dateRange->AddDays(2));
     $newInstance1 = new TestReservation('323', $dateRange->AddDays(3));
     $newInstance2 = new TestReservation('423', $dateRange->AddDays(4));
     $removedInstance1 = new TestReservation('523', $dateRange->AddDays(5));
     $removedInstance2 = new TestReservation('623', $dateRange->AddDays(6));
     $currentInstance = new TestReservation('999', $dateRange);
     $builder = new ExistingReservationSeriesBuilder();
     $builder->WithEvent(new InstanceAddedEvent($newInstance1, $builder->series));
     $builder->WithEvent(new InstanceAddedEvent($newInstance2, $builder->series));
     $builder->WithEvent(new InstanceRemovedEvent($removedInstance1, $builder->series));
     $builder->WithEvent(new InstanceRemovedEvent($removedInstance2, $builder->series));
     $builder->WithEvent(new SeriesBranchedEvent($builder->series));
     $builder->WithRequiresNewSeries(true);
     $builder->WithInstance($existingInstance1);
     $builder->WithInstance($existingInstance2);
     $builder->WithCurrentInstance($currentInstance);
     $existingReservation = $builder->BuildTestVersion();
     $existingReservation->Update($userId, new FakeBookableResource($resourceId), $title, $description, new FakeUserSession());
     $existingReservation->AllowParticipation($allowParticipation);
     $expectedRepeat = $existingReservation->RepeatOptions();
     $this->db->_ExpectedInsertIds[] = $newSeriesId;
     $this->db->_ExpectedInsertIds[] = $newInstanceId1;
     $this->db->_ExpectedInsertIds[] = $newInstanceId2;
     $this->repository->Update($existingReservation);
     $addNewSeriesCommand = new AddReservationSeriesCommand(Date::Now(), $title, $description, $expectedRepeat->RepeatType(), $expectedRepeat->ConfigurationString(), ReservationTypes::Reservation, ReservationStatus::Created, $userId, $allowParticipation);
     $updateReservationCommand1 = $this->GetUpdateReservationCommand($newSeriesId, $existingInstance1);
     $updateReservationCommand2 = $this->GetUpdateReservationCommand($newSeriesId, $existingInstance2);
     $updateReservationCommand3 = $this->GetUpdateReservationCommand($newSeriesId, $currentInstance);
     $addReservationCommand1 = $this->GetAddReservationCommand($newSeriesId, $newInstance1);
     $addReservationCommand2 = $this->GetAddReservationCommand($newSeriesId, $newInstance2);
     $insertReservationUser1 = $this->GetAddUserCommand($newInstanceId1, $userId, ReservationUserLevel::OWNER);
     $insertReservationUser2 = $this->GetAddUserCommand($newInstanceId2, $userId, ReservationUserLevel::OWNER);
     $removeReservationCommand1 = new RemoveReservationCommand($removedInstance1->ReferenceNumber());
     $removeReservationCommand2 = new RemoveReservationCommand($removedInstance2->ReferenceNumber());
     $this->assertEquals($addNewSeriesCommand, $this->db->_Commands[0]);
     $commands = $this->db->GetCommandsOfType('UpdateReservationCommand');
     $this->assertEquals(3, count($commands));
     $addUserCommands = $this->db->GetCommandsOfType('AddReservationUserCommand');
     $this->assertEquals(2, count($addUserCommands));
     $this->assertTrue(in_array($updateReservationCommand1, $this->db->_Commands));
     $this->assertTrue(in_array($updateReservationCommand2, $this->db->_Commands));
     $this->assertTrue(in_array($updateReservationCommand3, $this->db->_Commands));
     $this->assertTrue(in_array($addReservationCommand1, $this->db->_Commands));
     $this->assertTrue(in_array($addReservationCommand2, $this->db->_Commands));
     $this->assertTrue(in_array($insertReservationUser1, $this->db->_Commands));
     $this->assertTrue(in_array($insertReservationUser2, $this->db->_Commands));
     $this->assertTrue(in_array($removeReservationCommand1, $this->db->_Commands));
     $this->assertTrue(in_array($removeReservationCommand2, $this->db->_Commands));
 }