public void BookParking_WhenParkingPeriodIsAlreadyTaken_ShouldNotBookParking( Garage sut, Car car) { var parkingPeriod = new ParkingPeriod(car, new DateTime(2020, 1, 10, 14, 10, 0), new DateTime(2020, 1, 10, 14, 50, 0)); var result = sut.BookParking(parkingPeriod); result.Should().BeNull(); }
public void BookParking_WhenParkingPeriodIsAvailable_ShouldBookParking( Garage sut, Car car) { var parkingPeriod = new ParkingPeriod(car, new DateTime(2020, 1, 10, 13, 0, 0), new DateTime(2020, 1, 10, 13, 30, 0)); var result = sut.BookParking(parkingPeriod); result.Reference.Should().Be("30A"); result.ReservedPeriod.Should().Contain(parkingPeriod); }
public void ConflictsWith_WhenParkingPeriodIsEqualToAnotherParkingPeriod_ShouldReturnTrue( Car car1, Car car2) { var initialDate = new DateTime(2020, 1, 1, 14, 0, 0); var endDate = new DateTime(2020, 1, 1, 15, 0, 0); var sut = new ParkingPeriod(car1, initialDate, endDate); var result = sut.ConflictsWith(new ParkingPeriod(car2, initialDate, endDate)); result.Should().BeTrue(); }
public void ParkingPeriod_WhenDataProvidedIsValid_ShouldConstructTheObject( Car car) { var initialDate = new DateTime(2020, 1, 1, 14, 0, 0); var endDate = new DateTime(2020, 1, 1, 15, 0, 0); var parkingPeriod = new ParkingPeriod(car, initialDate, endDate); parkingPeriod.Should().NotBeNull(); parkingPeriod.Car.Should().Be(car); parkingPeriod.InitialDate.Should().Be(initialDate); parkingPeriod.EndDate.Should().Be(endDate); }
public ParkingSpot BookParking(ParkingPeriod parkingPeriod) { var availableParkSpot = ParkingSpots.FirstOrDefault(x => x.ReservedPeriod.Any(y => !y.ConflictsWith(parkingPeriod))); if (availableParkSpot == null) { return(null); } availableParkSpot.ReservedPeriod.Add(parkingPeriod); return(availableParkSpot); }
public void ConflictsWith_WhenParkingPeriodInitialDateIsBetweenAnotherParkingPeriod_ShouldReturnTrue( Car car1, Car car2) { var initialDate1 = new DateTime(2020, 1, 1, 14, 0, 0); var endDate1 = new DateTime(2020, 1, 1, 15, 0, 0); var initialDate2 = new DateTime(2020, 1, 1, 14, 59, 0); var endDate2 = new DateTime(2020, 1, 1, 15, 30, 0); var sut = new ParkingPeriod(car1, initialDate1, endDate1); var result = sut.ConflictsWith(new ParkingPeriod(car2, initialDate2, endDate2)); result.Should().BeTrue(); }
public void ConflictsWith_WhenParkingPeriodInitialDateIsTheSameAsAnotherParkingPeriodEndDate_ShouldReturnFalse( Car car1, Car car2) { var initialDate1 = new DateTime(2020, 1, 1, 14, 0, 0); var endDate1 = new DateTime(2020, 1, 1, 15, 0, 0); var initialDate2 = new DateTime(2020, 1, 1, 15, 0, 0); var endDate2 = new DateTime(2020, 1, 1, 16, 0, 0); var sut = new ParkingPeriod(car1, initialDate1, endDate1); var result = sut.ConflictsWith(new ParkingPeriod(car2, initialDate2, endDate2)); result.Should().BeFalse("Because I assume there is no problem in having a parking booked from 14h to 15h and another one from 15h to 16h for example."); }
public AutoNSubstituteDataAttribute() : base(() => { var fixture = new Fixture().Customize(new AutoNSubstituteCustomization()); var parkingPeriod1 = new ParkingPeriod( new Car() { LicensePlate = "jw3221" }, new DateTime(2020, 1, 10, 13, 0, 0), new DateTime(2020, 1, 10, 15, 0, 0)); var parkingPeriod2 = new ParkingPeriod( new Car() { LicensePlate = "cb1234" }, new DateTime(2020, 1, 10, 13, 30, 0), new DateTime(2020, 1, 10, 14, 30, 0)); var parkingSpot1 = new ParkingSpot { Reference = "25B" }; var parkingSpot2 = new ParkingSpot { Reference = "30A" }; parkingSpot1.ReservedPeriod.Add(parkingPeriod1); parkingSpot2.ReservedPeriod.Add(parkingPeriod2); var garage = new Garage(); garage.ParkingSpots.Add(parkingSpot1); garage.ParkingSpots.Add(parkingSpot2); fixture.Register(() => garage); return(fixture); }) { }
public async Task <bool> Handle(BookParkingCommand request, CancellationToken cancellationToken) { var garage = await _garageRepository.GetById(request.GarageId); if (garage == null) { _logger?.LogWarning($"Garage {request.GarageId} not found."); return(true); } var parkingPeriod = new ParkingPeriod( new Car() { LicensePlate = request.LicensePlate }, request.From, request.To); var parkingSpot = garage.BookParking(parkingPeriod); if (parkingSpot == null) { await _bus.RaiseEvent(new ParkingAlreadyTaken( request.GarageId, request.LicensePlate, request.From, request.To), _bookingReslutTopicKey); return(true); } await _bus.RaiseEvent(new ParkingBooked( request.GarageId, request.LicensePlate, request.From, request.To, parkingSpot.Reference), _bookingReslutTopicKey); return(true); }
public static Garage CreateGarage() { var garage = new Garage(Guid.Parse("b8766e1b-2b3f-43fd-b31c-e0667df469d0")); var parkingPeriod1 = new ParkingPeriod( new Car() { LicensePlate = "jw3221" }, new DateTime(2020, 1, 10, 13, 0, 0), new DateTime(2020, 1, 10, 15, 0, 0)); var parkingPeriod2 = new ParkingPeriod( new Car() { LicensePlate = "cb1234" }, new DateTime(2020, 1, 10, 13, 30, 0), new DateTime(2020, 1, 10, 14, 30, 0)); var parkingSpot1 = new ParkingSpot { Reference = "25B" }; var parkingSpot2 = new ParkingSpot { Reference = "30A" }; parkingSpot1.ReservedPeriod.Add(parkingPeriod1); parkingSpot2.ReservedPeriod.Add(parkingPeriod2); garage.ParkingSpots.Add(parkingSpot1); garage.ParkingSpots.Add(parkingSpot2); return(garage); }