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)); }