private FeesForVehicleFactory CreateSut(IFeeFactory factory = null)
        {
            if (factory == null)
            {
                factory = Substitute.For <IFeeFactory>();
            }

            var sut = new FeesForVehicleFactory(factory);

            return(sut);
        }
        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));
        }
        private static VehicleAndFeeFactory CreateSut(IVehicleFactory vehicleFactory    = null,
                                                      IFeesForVehicleFactory feeFactory = null)
        {
            if (vehicleFactory == null)
            {
                vehicleFactory = new TestIVehicleFactory();
            }

            if (feeFactory == null)
            {
                feeFactory = new FeesForVehicleFactory(new TestIFeeFactory());
            }

            var sut = new VehicleAndFeeFactory(vehicleFactory,
                                               feeFactory);

            return(sut);
        }
        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>());
        }