car2.setColour('White')
print('The colour is ' + car2.getColour())

# Similar functionality in mileage, move and engineSize except in this case Mileage is at 300 instead of the
# default value of 0.  This results in the mileage starting at 300 and becoming 320 after the move function.
# Unlike petrol and diesel cars which have fuel cylinders electric cars require fuel cells to run.  The function
# setNumberOfFuelCells takes in 2 values self and the value for fuel cells in this case 2.  The next line prints
# an appropriate message and uses the getNumberOfFuelCells which returns the value held in the variable which is 2.
car2.setMileage(300)
car2.move(20)
print('The mileage is ' + str(car2.getMileage())) + 'kms'
car2.engineSize = '2.1'
print 'The engine size is ' + car2.engineSize

car2.setNumberOfFuelCells(2)
print('The number of fuel cells is ' + str(car2.getNumberOfFuelCells()))


# A HybridCar Class is called by car3 allowing it to use the functions and variables of the class.  A hybrid is
# 1 part standard motor car and 1 part electric car so it will use a cylinder and a cell function.  The make
# takes in the value Toyota Prius and prints a message to the user.  The colour is set at blue and printed.
# Same functionality as other mileage in this case 100 is the value that is set, next 17 is added using move
# resulting in a value of 117kms.  The engineSize variable is set as 3.1.  Hybrid cars require both cells and
# cylinders so it will use both functions.
car3 = HybridCar()
car3.setMake('Toyota Prius')
print '\nOur hybrid option is ' + car3.getMake()

car3.setColour('Blue')
print('The colour is ' + car3.getColour())
class TestElectricCar(unittest.TestCase):
    # The ElectricCar calls itself using self.
    def setUp(self):
        self.electric_car = ElectricCar()

    def test_electricCar_fuel_cells(self):
        # The default value for an electric car is called from the ElectricCar class which is 2 which is tested to
        #  make sure the base class ElectricCar functions are being correctly implemented.  The setNumberOfFuelCells
        # is used to change the default value from 2 to 8, this is tested and it has become 8 so is true.  5 and 7
        # are then placed as testing values for getNumberofFuelCells.  Note set doesn't change default values held
        # in base class.
        self.assertEqual(2, self.electric_car.getNumberOfFuelCells())
        self.electric_car.setNumberOfFuelCells(8)
        self.assertEqual(8, self.electric_car.getNumberOfFuelCells())
        self.electric_car.setNumberOfFuelCells(5)
        self.assertEqual(5, self.electric_car.getNumberOfFuelCells())
        self.electric_car.setNumberOfFuelCells(7)
        self.assertEqual(7, self.electric_car.getNumberOfFuelCells())

    def test_electricCar_mileage_and_move(self):
        # I am testing mileage and move for all cars to ensure correct implementation and because mileage is
        # an important factor for NCT tests and how many kilometers are on the clock.
        # As in the test_car_mileage 1st the default value is called this time from the ElectricCar class.
        # Move is then called using the value 15 is this is tested against the value retrieved from getMileage
        # which is 15 as well so it's true.  Mileage is then increased by 6.5 to 21.5.  Next the setMileage function
        # calls the function from the ElectricCar class which has inherited all the functions of the base class Car.
        # All the types of cars have inherited all the functions of Car.  In this case SetMileage is called and
        # takes the value 40.  This is tested using the getMileage function to ensure it's changed to 40 and it has.
        # The value 0 is tested and mileage variable remains 40.
        self.assertEqual(0, self.electric_car.getMileage())
        self.electric_car.move(15)
        self.assertEqual(15, self.electric_car.getMileage())
        self.electric_car.move(6.5)
        self.assertEqual(21.5, self.electric_car.getMileage())
        self.electric_car.setMileage(40)
        self.assertEqual(40, self.electric_car.getMileage())
        self.electric_car.move(0)
        self.assertEqual(40, self.electric_car.getMileage())

    def test_electricCar_make(self):
        # Even though make, engineSize, colour and paint are tested in the base class I feel it's important to
        # have test cases for the subclass' that implement the functions to ensure they are correctly inherited
        # with the same functionality so the default value ' ' is tested, a string with 1 word and a string with
        # 2 words.  Also i'm not using car.getMake but electric_car.getMake this will be the case in the other
        # subclass' where the functions are implemented from the subclass not the superclass/base class.
        self.assertEqual(' ', self.electric_car.getMake())
        self.electric_car.setMake('Charger')
        self.assertEqual('Charger', self.electric_car.getMake())
        self.electric_car.setMake('Super Charger')
        self.assertEqual('Super Charger', self.electric_car.getMake())

    def test_electricCar_engineSize(self):
        # Testing engineSize for ElectricCar class.
        self.assertEqual(' ', self.electric_car.getEngineSize())
        self.electric_car.setEngineSize(1.2)
        self.assertEqual(1.2, self.electric_car.getEngineSize())
        self.electric_car.setEngineSize(0.8)
        self.assertEqual(0.8, self.electric_car.getEngineSize())

    def test_electricCar_colour_and_paint(self):
        # Testing colour and paint for ElectricCar
        self.assertEqual(' ', self.electric_car.getColour())
        self.electric_car.paint('pink')
        self.assertEqual('pink', self.electric_car.getColour())
        self.electric_car.paint('orange')
        self.assertEqual('orange', self.electric_car.getColour())
        self.electric_car.setColour('yellow')
        self.assertEqual('yellow', self.electric_car.getColour())