public void Not_reserve_seats_when_it_exceed_max_capacity_threshold()
        {
            const int seatsRequestedCount    = 3;
            var       bookingReferenceClient = new BookingReferenceClientStub(BookingReference);
            var       service = BuildTicketOfficeService(TrainTopologies.With_10_seats_and_6_already_reserved(), bookingReferenceClient);

            var reservation = service.MakeReservation(new ReservationRequestDto(TrainId, seatsRequestedCount));

            Assert.Equal("{\"train_id\": \"" + TrainId + "\", \"booking_reference\": \"\", \"seats\": []}", reservation);
            Assert.False(bookingReferenceClient.Booked);
        }
        public void Reserve_all_seats_in_the_same_coach()
        {
            const int seatsRequestedCount    = 2;
            var       bookingReferenceClient = new BookingReferenceClientStub(BookingReference);
            var       trainDataService       = BuildTicketOfficeService(TrainTopologies.With_2_coaches_and_9_seats_already_reserved_in_the_first_coach(), bookingReferenceClient);

            var reservation = trainDataService.MakeReservation(new ReservationRequestDto(TrainId, seatsRequestedCount));

            Assert.Equal("{\"train_id\": \"" + TrainId + "\", \"booking_reference\": \"" + BookingReference + "\", \"seats\": [\"1B\", \"2B\"]}", reservation);
            Assert.True(bookingReferenceClient.Booked);
        }
        public void Cannot_Reserve_When_Train_Is_Not_Full_But_Not_Coach_Is_Available()
        {
            const int seatsRequestedCount    = 2;
            var       bookingReferenceClient = new BookingReferenceClientStub(BookingReference);
            var       trainDataService       = BuildTicketOfficeService(TrainTopologies.With_10_coaches_half_available(), bookingReferenceClient);

            var reservation = trainDataService.MakeReservation(new ReservationRequestDto(TrainId, seatsRequestedCount));

            Assert.Equal("{\"train_id\": \"" + TrainId + "\", \"booking_reference\": \"\", \"seats\": []}", reservation);
            Assert.False(bookingReferenceClient.Booked);
        }
        public void Reserve_seats_when_train_is_empty()
        {
            const int seatsRequestedCount    = 3;
            var       bookingReferenceClient = new BookingReferenceClientStub(BookingReference);
            var       service = BuildTicketOfficeService(TrainTopologies.With_10_available_seats(), bookingReferenceClient);

            var reservation = service.MakeReservation(new ReservationRequestDto(TrainId, seatsRequestedCount));

            Assert.Equal("{\"train_id\": \"" + TrainId + "\", \"booking_reference\": \"" + BookingReference + "\", \"seats\": [\"1A\", \"2A\", \"3A\"]}", reservation);
            Assert.Equal(TrainId, bookingReferenceClient.TrainIdBooked);
            Assert.Equal(BookingReference, bookingReferenceClient.ReferenceBooked);
            Assert.Equal(3, bookingReferenceClient.SeatsBooked.Count);
            Assert.Equal(new Seat("A", 1), bookingReferenceClient.SeatsBooked[0]);
            Assert.Equal(new Seat("A", 2), bookingReferenceClient.SeatsBooked[1]);
            Assert.Equal(new Seat("A", 3), bookingReferenceClient.SeatsBooked[2]);
        }