public void Create_ReturnsVehicleWithVehicleFee_ForVehicleTypeLuxuryCar()
        {
            // Arrange
            var vehicle = Substitute.For <ILuxuryCar>();
            FeesForVehicleFactory sut = CreateSut();

            // Act
            IEnumerable <IFee> actual = sut.Create(vehicle);

            // Assert
            Assert.True(actual.Any(x => x is IVehicleFee));
        }
        public void ThrowsException_ForUnknowVehicleType()
        {
            // Arrange
            var vehicle = Substitute.For <IVehicle>();

            vehicle.WeightInKilogram.Returns(MinWeightInKilogramToForceWeightFee);
            FeesForVehicleFactory sut = CreateSut();

            // Act
            // Assert
            Assert.Throws <ArgumentException>(() => sut.Create(vehicle));
        }
        public void Create_ReturnsVehicleWithWeightFee_ForTruckAndHeavyVehicle()
        {
            // Arrange
            var vehicle = Substitute.For <ITruck>();

            vehicle.WeightInKilogram.Returns(MinWeightInKilogramToForceWeightFee);
            FeesForVehicleFactory sut = CreateSut();

            // Act
            IEnumerable <IFee> actual = sut.Create(vehicle);

            // Assert
            Assert.True(actual.Any(x => x is IWeightFee));
        }
        public void Release_CallsFactory_ForFees()
        {
            // Arrange
            var truckFee   = Substitute.For <ITruckFee>();
            var vehicleFee = Substitute.For <IVehicleFee>();
            var vehicle    = Substitute.For <ITruck>();
            var factory    = Substitute.For <IFeeFactory>();

            factory.Create <IVehicleFee>().Returns(vehicleFee);
            factory.Create <ITruckFee>().Returns(truckFee);
            FeesForVehicleFactory sut  = CreateSut(factory);
            IEnumerable <IFee>    fees = sut.Create(vehicle);

            // Act
            sut.Release(fees);

            // Assert
            factory.Received(2).Release(Arg.Any <IFee>());
        }