car4.setNumberOfFuelCylinders(3)
print('The number of fuel cylinders is ' + str(car4.getNumberOfFuelCylinders()))


# Car5 is calling a DieselCar objects and will implement its functions and variables.  Similar to other class'
# the car sets a model and returns it in this case Mercedes Benz, the colour is set as silver, the mileage is
# 1000 and increased by 40 to 1040 as the mileage returned, the engineSize is 3.2 and the car uses 5 cylinders.
car5 = DieselCar()
car5.setMake('Mercedes Benz')
print '\nOur diesel option is ' + car4.getMake()

car5.setColour('Silver')
print('The colour is ' + car5.getColour())

car5.setMileage(1000)
car5.move(40)
print('The mileage is ' + str(car5.getMileage())) + 'kms'
car5.engineSize = '3.2'
print 'The engine size is ' + car5.engineSize

car5.setNumberOfFuelCylinders(5)
print('The number of fuel cylinders is ' + str(car5.getNumberOfFuelCylinders()))


# Creating a Dealership class that inherits from object.  Creates a private function called init.  Basic naming
# functions for private functions is init or foo.  Next 4 lists are created 1 for each type of car.  Also a list
# is created called rental_cars for cars currently on rental.
class Dealership(object):

    def __init__(self):
        self.electric_cars = []
class TestDieselCar(unittest.TestCase):
    def setUp(self):
        # The DieselCar calls itself using self.
        self.diesel_car = DieselCar()

    def test_DieselCar_fuel_cylinders(self):
        # This tests fuel_cylinders for a DieselCar class similar to a petrol car however the default value for
        # number of cylinders is higher for diesel.  Then setNumberOfFuelCylinders method calls the function
        # from the base class DieselCar to change the value to 8.  This is tested and confirmed to be true.
        # The next tests test cylinders for the values 2 and 4 which are confirmed in the test cases as true.
        self.assertEqual(5, self.diesel_car.getNumberOfFuelCylinders())
        self.diesel_car.setNumberOfFuelCylinders(8)
        self.assertEqual(8, self.diesel_car.getNumberOfFuelCylinders())
        self.diesel_car.setNumberOfFuelCylinders(2)
        self.assertEqual(2, self.diesel_car.getNumberOfFuelCylinders())
        self.diesel_car.setNumberOfFuelCylinders(4)
        self.assertEqual(4, self.diesel_car.getNumberOfFuelCylinders())

    def test_DieselCar_mileage_and_move(self):
        # Function for testing the mileage of a DieselCar class.  As with other cars the default value is 0.
        # The move function is called taking the value 8.  This moves the car by 8km's.  Next it is increased
        # by 20 to make 28, tested with increasing by 0 and remains 28.  The setMileage function calls the function
        # in the DieselCar class which inherits the function from the Car class.  This sets mileage at 30 which is
        # tested and is true and lastly move by 7.5 to increase mileage to 37.5 which is tested and is true.
        self.assertEqual(0, self.diesel_car.getMileage())
        self.diesel_car.move(8)
        self.assertEqual(8, self.diesel_car.getMileage())
        self.diesel_car.move(20)
        self.assertEqual(28, self.diesel_car.getMileage())
        self.diesel_car.move(0)
        self.assertEqual(28, self.diesel_car.getMileage())
        self.diesel_car.setMileage(30)
        self.assertEqual(30, self.diesel_car.getMileage())
        self.diesel_car.move(7.5)
        self.assertEqual(37.5, self.diesel_car.getMileage())

    def test_DieselCar_make(self):
        # Testing make function for DieselCar.
        self.assertEqual(' ', self.diesel_car.getMake())
        self.diesel_car.setMake('Chevy')
        self.assertEqual('Chevy', self.diesel_car.getMake())
        self.diesel_car.setMake('Chevy Impala')
        self.assertEqual('Chevy Impala', self.diesel_car.getMake())
        self.diesel_car.setMake('Chevrolet Silverado 2500 HD')
        self.assertEqual('Chevrolet Silverado 2500 HD', self.diesel_car.getMake())

    def test_DieselCar_engineSize(self):
        # Testing engineSize for DieselCar class.
        self.assertEqual(' ', self.diesel_car.getEngineSize())
        self.diesel_car.setEngineSize(3.3)
        self.assertEqual(3.3, self.diesel_car.getEngineSize())
        self.diesel_car.setEngineSize(3.5)
        self.assertEqual(3.5, self.diesel_car.getEngineSize())

    def test_DieselCar_colour_and_paint(self):
        # Testing colour and paint for DieselCar Class.
        self.assertEqual(' ', self.diesel_car.getColour())
        self.diesel_car.paint('silver')
        self.assertEqual('silver', self.diesel_car.getColour())
        self.diesel_car.setColour('white')
        self.assertEqual('white', self.diesel_car.getColour())

    class TestHybridCar(unittest.TestCase):
        def setUp(self):
            # The HybridCar calls itself using self.
            self.hybrid_car = HybridCar()

        def test_HybridCar_fuel_cylinders(self):
            # Similar to petrol and diesel except default value is 1.  The default value is tested as well as 4, 6
            # and 3 which all result in true.
            self.assertEqual(1, self.hybrid_car.getNumberOfFuelCylinders())
            self.hybrid_car.setNumberOfFuelCylinders(4)
            self.assertEqual(4, self.hybrid_car.getNumberOfFuelCylinders())
            self.hybrid_car.setNumberOfFuelCylinders(6)
            self.assertEqual(6, self.hybrid_car.getNumberOfFuelCylinders())
            self.hybrid_car.setNumberOfFuelCylinders(3)
            self.assertEqual(3, self.hybrid_car.getNumberOfFuelCylinders())

        def test_HybridCar_fuel_cells(self):
            # Similar to ElectricCar test_car_fuel_cells.  The default value 1 is tested as well as 4 and 2.
            self.assertEqual(1, self.hybrid_car.getNumberOfFuelCells())
            self.hybrid_car.setNumberOfFuelCells(4)
            self.assertEqual(4, self.hybrid_car.getNumberOfFuelCells())
            self.hybrid_car.setNumberOfFuelCells(2)
            self.assertEqual(2, self.hybrid_car.getNumberOfFuelCells())

        def test_HybridCar_mileage_and_move(self):
            # As in other cases testing the mileage default value.  Then entering a value for move to ensure
            # it moves that amount to test the mileage of a car.  The car is moved by 7.7 to make 19.7 moved 0
            # output stays the same and lastly setMileage is tested with a value of 15 which is true.
            self.assertEqual(0, self.hybrid_car.getMileage())
            self.hybrid_car.move(12)
            self.assertEqual(12, self.hybrid_car.getMileage())
            self.hybrid_car.move(7.7)
            self.assertEqual(19.7, self.hybrid_car.getMileage())
            self.hybrid_car.move(0)
            self.assertEqual(19.7, self.hybrid_car.getMileage())
            self.hybrid_car.setMileage(15)
            self.assertEqual(15, self.hybrid_car.getMileage())

        def test_HybridCar_make(self):
            # Testing make function for HybridCar.
            self.assertEqual(' ', self.hybrid_car.getMake())
            self.hybrid_car.setMake('Chevrolet Malibu')
            self.assertEqual('Chevrolet Malibu', self.hybrid_car.getMake())
            self.hybrid_car.setMake('Chevrolet Cruz')
            self.assertEqual('Chevrolet Cruz', self.hybrid_car.getMake())

        def test_HybridCar_engineSize(self):
            # Testing engineSize for HybridCar.
            self.assertEqual(' ', self.hybrid_car.getEngineSize())
            self.hybrid_car.setEngineSize(1.6)
            self.assertEqual(1.6, self.hybrid_car.getEngineSize())
            self.hybrid_car.setEngineSize(1.8)
            self.assertEqual(1.8, self.hybrid_car.getEngineSize())

        def test_HybridCar_colour_and_paint(self):
            # Testing colour and paint for HybridCar.
            self.assertEqual(' ', self.hybrid_car.getColour())
            self.hybrid_car.paint('red')
            self.assertEqual('red', self.hybrid_car.getColour())
            self.hybrid_car.setColour('light blue')
            self.assertEqual('light blue', self.hybrid_car.getColour())