예제 #1
0
    def testRentBook(self):
        client1 = Client(1, "Name1")
        client2 = Client(2, "Name2")

        book1 = Book(1, "Title", "Description", "Author")
        book2 = Book(2, "Title1", "Description1", "Author1")

        clientRepo = Repository()
        bookRepo = Repository()
        functions = ClientController(clientRepo, Statistics(clientRepo))
        functiom = BookController(bookRepo, Statistics(bookRepo))

        functions.addClient(client2.getId(), client2.getName())
        functions.addClient(client1.getId(), client1.getName())

        functiom.addBook(book1.getId(), book1.getTitle(), book1.getDescription(), book1.getAuthor())
        functiom.addBook(book2.getId(), book2.getTitle(), book2.getDescription(), book2.getAuthor())
        rentalRepo = Repository()
        functionsr = RentalController(bookRepo, clientRepo, rentalRepo, Statistics(rentalRepo))

        msg1 = functionsr.rentBook(book1.getId(), client1.getId(), createDateFromString("23.11.2017"), "30.11.2017")

        self.assertTrue(len(msg1) == 0)
        self.assertTrue(functionsr.getRentals()[0].getBookId() == book1.getId())
        self.assertTrue(functionsr.getRentals()[0].getClientId() == client1.getId())

        msg2 = functionsr.rentBook(book2.getId, client2.getId(), createDateFromString("20.11.2017"), "19.11.2017")
        self.assertTrue(msg2 == "Inconsistent dates")
예제 #2
0
    def testClientController(self):
        repo = Repository()
        contr = ClientController(repo)
        undoController = Undo()
        contr.addUndoController(undoController)

        self.assertEqual( contr.addClient(Client(1, "alice", 1111111111111)) ,  True )
예제 #3
0
 def setUp(self):
     self.repo = Repository()
     self.rentalRepo = Repository()
     self.Ucontroller = UndoController()
     self.client = Client(11, 'alex')
     self.client2 = Client(12, 'ana')
     self.controller = ClientController(self.repo, self.Ucontroller,
                                        self.rentalRepo)
예제 #4
0
    def testClientController(self):
        repo = Repository()
        contr = ClientController(repo)
        undoController = Undo()
        contr.addUndoController(undoController)

        self.assertEqual(contr.addClient(Client(1, "alice", 1111111111111)),
                         True)
예제 #5
0
def testClientController():
    repo = Repository()
    contr = ClientController(repo)
    undoController = Undo()
    contr.addUndoController(undoController)

    assert contr.addClient(Client(1, "alice", 1111111111111)) == True

    print("ClientController tests ran successfully!")
예제 #6
0
파일: tests.py 프로젝트: p0licat/university
def testClientController():
    repo = Repository()
    contr = ClientController(repo)
    undoController = Undo()
    contr.addUndoController(undoController)

    assert contr.addClient(Client(1, "alice", 1111111111111)) == True


    print ("ClientController tests ran successfully!")
예제 #7
0
def statisticsExample():
    """
    An example for the creation of statistics.
    Several cars, clients and rentals are created and then a statistics is calculated over them.
    
    Follow the code below and figure out how it works!
    """
    undoController = UndoController()
    '''
    Start client Controller
    '''
    clientRepo = FileClientRepository()
    clientValidator = ClientValidator()
    clientController = ClientController(undoController, clientValidator,
                                        clientRepo)
    '''
    Start car Controller
    '''
    carRepo = FileCarRepository()
    carValidator = CarValidator()
    carController = CarController(undoController, carValidator, carRepo)
    '''
    Start rental Controller
    '''
    rentRepo = FileRentalRepository(clientRepo, carRepo)
    rentValidator = RentalValidator()
    rentController = RentalController(undoController, rentValidator, rentRepo,
                                      carRepo, clientRepo)
    '''
    Print each statistics item
    '''
    for cr in rentController.mostRentedCars():
        print(cr)
예제 #8
0
def undoExampleMedium():
    undoController = UndoController()
    clientRepo = Repository()
    carRepo = Repository()
    '''
    Start rental Controller
    '''
    rentRepo = Repository()
    rentController = RentalController(undoController, rentRepo, carRepo,
                                      clientRepo)
    '''
    Start client Controller
    '''
    clientController = ClientController(undoController, rentController,
                                        clientRepo)
    '''
    We add 3 clients
    '''
    clientController.create(103, "2990511035588", "Sophia")
    clientController.create(104, "2670511035588", "Carol")
    clientController.create(105, "2590411035588", "Bob")
    printReposWithMessage("We added 3 clients", clientRepo, None, None)
    '''
    We delete 2 of the clients
    '''
    clientController.delete(103)
    clientController.delete(105)
    printReposWithMessage("Deleted Sophia and Bob", clientRepo, None, None)
    '''
    We undo twice
    '''
    undoController.undo()
    printReposWithMessage("1 undo, so Bob is back", clientRepo, None, None)
    undoController.undo()
    printReposWithMessage("Another undo, so Sophia is back too", clientRepo,
                          None, None)
    '''
    We redo once
    '''
    undoController.redo()
    printReposWithMessage("1 redo, so Sophia is again deleted", clientRepo,
                          None, None)
예제 #9
0
    def testRemoveClient(self):
        client1 = Client(1, "Name1")
        client2 = Client(2, "Name2")
        repo = Repository()
        functions = ClientController(repo, Statistics(repo))

        functions.addClient(client1.getId(), client1.getName())
        functions.addClient(client2.getId(), client2.getName())

        msg1 = functions.removeClient(1)

        self.assertTrue(len(msg1) == 0)
        self.assertTrue(functions.getClients()[0].getId() == client2.getId())
        self.assertTrue(functions.getClients()[0].getName() == client2.getName())

        msg2 = functions.removeClient(1)

        self.assertTrue(msg2 == "The provided ID does not exist")
        self.assertTrue(functions.getClients()[0].getId() == client2.getId())
        self.assertTrue(functions.getClients()[0].getName() == client2.getName())
예제 #10
0
def main():
    settings = readSettings()

    if settings["repository"] == "inmemory":
        undo = UndoController()
        rental = RentalController(RentalValidator(), Repository(),
                                  Repository(), Repository())
        client = ClientController(ClientValidator(), Repository(), rental,
                                  undo)
        movie = MovieController(MovieValidator(), Repository(), rental, undo)
        ui = UI(client, movie, rental, undo)
        ui.addClients()
        ui.addMovies()
        ui.run()
    elif settings["repository"] == "textfiles":
        undo = UndoController()
        rental = RentalController(RentalValidator(), RentalTextFileRepo(),
                                  MovieTextFileRepo(), ClientTextFileRepo())
        client = ClientController(ClientValidator(), ClientTextFileRepo(),
                                  rental, undo)
        movie = MovieController(MovieValidator(), MovieTextFileRepo(), rental,
                                undo)
        ui = UI(client, movie, rental, undo)
        ui.run()
    elif settings["repository"] == "binaryfiles":
        undo = UndoController()
        rental = RentalController(RentalValidator(), RentalPickleFileRepo(),
                                  MoviePickleFileRepo(),
                                  ClientPickleFileRepo())
        client = ClientController(ClientValidator(), ClientPickleFileRepo(),
                                  rental, undo)
        movie = MovieController(MovieValidator(), MoviePickleFileRepo(),
                                rental, undo)
        ui = UI(client, movie, rental, undo)
        ui.writeToBinaryFile()
        ui.run()
    else:
        return
예제 #11
0
    def testAddClient(self):
        client1 = Client(1, "Name1")
        client2 = Client(1, "Name2")
        repo = Repository()
        functions = ClientController(repo, Statistics(repo))

        msg1 = functions.addClient(client1.getId(), client1.getName())
        self.assertTrue(len(msg1) == 0)
        self.assertTrue(functions.getClients()[0].getId() == 1)

        msg2 = functions.addClient(client2.getId(), client2.getName())
        self.assertTrue(msg2 == "Cannot add an existing element")

        self.assertTrue(functions.getClients()[0].getId() == 1)
예제 #12
0
def undoExampleHard():
    undoController = UndoController()
    clientRepo = Repository()
    carRepo = Repository()

    '''
    Start rental Controller
    '''
    rentRepo = Repository()
    rentValidator = RentalValidator()
    rentController = RentalController(undoController, rentValidator, rentRepo, carRepo, clientRepo)
    
    '''
    Start client Controller
    '''
    clientValidator = ClientValidator()
    clientController = ClientController(undoController, rentController, clientValidator, clientRepo)
    
    '''
    Start car Controller
    '''
    carValidator = CarValidator()
    carController = CarController(undoController, rentController, carValidator, carRepo)

    '''
    We add 2 clients
    '''
    clientSophia = clientController.create(103, "2990511035588", "Sophia")
    clientCarol = clientController.create(104, "2670511035588", "Carol")
   
    '''
    We add 2 cars
    '''
    carHyundaiTucson = carController.create(201, "CJ 02 TWD", "Hyundai", "Tucson")
    carToyotaCorolla = carController.create(202, "CJ 02 FWD", "Toyota", "Corolla")
    printReposWithMessage("Added 2 clients and 2 cars", clientRepo, carRepo, None)


    '''
    We delete 1 client and 1 car
    '''
    clientController.delete(103)
    carController.delete(202)
    printReposWithMessage("Deleted Sophia and the Corolla", clientRepo, carRepo, None)

    '''
    We undo twice
    '''
    undoController.undo()
    printReposWithMessage("1 undo, the Corolla is back", clientRepo, carRepo, None)
    undoController.undo()
    printReposWithMessage("1 undo, Sophia is back", clientRepo, carRepo, None)
    
    '''
    Redo twice 
    '''
    undoController.redo()
    undoController.redo()
    printReposWithMessage("2 redos, Sophia and the Corolla are again deleted", clientRepo, carRepo, None)
    
    '''
    Last redo
    '''
    undoController.redo()
    printReposWithMessage("1 redo - but there are no more redos", clientRepo, carRepo, None)
예제 #13
0
    clientRepo = Repository()
    rentalRepo = Repository()
elif mode == "text":
    bookRepo = CSVRepository(path + "bookRepo.csv", Book)
    clientRepo = CSVRepository(path + "clientRepo.csv", Client)
    rentalRepo = CSVRepository(path + "rentalRepo.csv", Rental)
elif mode == "binary":
    bookRepo = PickleRepository(path + "binaryBookRepo.pickle")
    clientRepo = PickleRepository(path + "binaryClientRepo.pickle")
    rentalRepo = PickleRepository(path + "binaryRentalRepo.pickle")
elif mode == "custom":
    bookRepo = CustomRepository(Book)
    clientRepo = CustomRepository(Client)
    rentalRepo = CustomRepository(Rental)
else:
    raise ValueError("Invalid option")

validator = Validator()
stats = Statistics(bookRepo)
bookController = BookController(bookRepo, stats)
bookController.populateBookRepository()

clientController = ClientController(clientRepo, stats)
clientController.populateClientRepository()

rentalController = RentalController(bookRepo, clientRepo, rentalRepo, stats)
#rentalController.populateRentals()

ui = Ui(bookController, clientController, rentalController, validator, stats)

ui.runUi()
예제 #14
0
def main():
    '''
        This is the main() function and is the first thing that is ran by the program. It contains all the objects 
        necessary for execution and everything related to the UI.
    '''

    # repositories must be initialized with a string containing the type of the repository in order to use files
    clientRepository = Repository("Client")
    bookRepository = Repository("Book")
    rentalRepository = Repository("Rental")

    clientController = ClientController(clientRepository)
    bookController = BookController(bookRepository)
    rentalController = RentalController(rentalRepository, clientController,
                                        bookController)

    keepAlive = True
    while keepAlive:
        userInput = input(
            "Please choose the mode (memory/file). Insert 'x' to quit: ")
        if userInput == 'x':
            return
        elif userInput == 'memory':
            clientRepository.addElement(Client(0, 'Mircea', 1962353535353))
            clientRepository.addElement(Client(1, 'Dorin', 1962353535354))
            clientRepository.addElement(Client(3, 'Marius', 1962353335353))
            clientRepository.addElement(Client(6, 'Dacia', 1962353444353))
            bookRepository.addElement(
                Book(0, "Dorin Mateiu", "Viata pe un Stalp", "Mihaila"))
            bookRepository.addElement(Book(1, "Salutare", "Lume", "Viata"))
            bookRepository.addElement(Book(2, "Inca", "O Carte", "Buna"))

            ui_object = UserInterface(clientController, bookController,
                                      rentalController)
            ui_object.launchMainMenu()

            keepAlive = False
        elif userInput == 'file':
            print("Available files: ")

            files = listdir('resources')
            for i in files:
                if i[-4:] == '.txt':
                    print(i)
            print()

            print("Please choose the file you want to load.",
                  "If that file does not exist it will be created.")
            print("Insert 'x' at any time to quit.")
            chosenFile = input("Please insert file name: ")

            if chosenFile == 'x':
                continue

            alreadyExists = False
            existingFile = None
            for i in files:
                if i[:-4] == chosenFile:
                    alreadyExists = True
                    existingFile = i

            if alreadyExists == True:
                print("File found! Type again to load: ")
                confirmInput = input()
                if confirmInput == 'x':
                    continue
                if confirmInput == chosenFile:
                    # file was found and will be loaded
                    if '.txt' in chosenFile:
                        chosenFile = chosenFile[:-4]
                    filePath = 'resources/' + chosenFile + '.txt'

                    ui_object = UserInterface(clientController, bookController,
                                              rentalController, filePath)
                    ui_object.launchMainMenu()
                else:
                    print("Returning...")
                    continue
            else:
                print("Create file? Type again to confirm: ")
                confirmInput = input()
                if confirmInput == 'x':
                    continue
                if confirmInput == chosenFile:
                    filePath = 'resources/' + chosenFile + '.txt'

                    ui_object = UserInterface(clientController, bookController,
                                              rentalController, None)
                    ui_object.launchMainMenu(filePath)
                else:
                    print("Returning...")
                    continue

            keepAlive = False
        else:
            print("Error! Please insert 'file' or 'memory' ")
예제 #15
0
class TestClientController(unittest.TestCase):
    def setUp(self):
        self.repo = Repository()
        self.rentalRepo = Repository()
        self.Ucontroller = UndoController()
        self.client = Client(11, 'alex')
        self.client2 = Client(12, 'ana')
        self.controller = ClientController(self.repo, self.Ucontroller,
                                           self.rentalRepo)

    def test_something(self):
        self.assertRaises(Exception, self.Ucontroller.undo)
        self.assertRaises(Exception, self.Ucontroller.redo)
        self.Ucontroller.newOperation()
        self.controller.addClient(self.client)
        self.assertEqual(len(self.repo), 1)
        self.Ucontroller.newOperation()
        self.controller.removeClient(11)
        self.assertEqual(len(self.repo), 0)
        self.Ucontroller.newOperation()
        self.controller.addClient(self.client)
        self.Ucontroller.newOperation()
        self.controller.updateClient(self.client)
        self.Ucontroller.newOperation()
        self.controller.addClient(self.client2)
        self.assertEqual(len(self.controller.getAllClients()), 2)
        self.assertRaises(ControllerException, self.controller.searchClient,
                          'nu')
        self.assertRaises(ControllerException, self.controller.searchClient,
                          '')
        self.assertEqual(len(self.controller.searchClient('a')), 2)
        self.Ucontroller.newOperation()
        self.controller.removeClient(12)
        self.Ucontroller.undo()
        self.assertEqual(len(self.controller.getAllClients()), 2)
        self.Ucontroller.redo()
        self.assertEqual(len(self.controller.getAllClients()), 1)
예제 #16
0
def statisticsExample():
    """
    An example for the creation of statistics.
    Several cars, clients and rentals are created and then a statistics is calculated over them.
    
    Follow the code below and figure out how it works!
    """
    undoController = UndoController()
    '''
    Start client Controller
    '''
    clientRepo = Repository()
    clientValidator = ClientValidator()
    clientController = ClientController(undoController, clientValidator,
                                        clientRepo)

    clientController.create(100, "1820203556699", "Aaron")
    clientController.create(101, "2750102885566", "Bob")
    clientController.create(102, "1820604536579", "Carol")

    # We name the instances so it's easier to create some test values later
    aaron = clientRepo.find(100)
    bob = clientRepo.find(101)
    carol = clientRepo.find(102)
    '''
    Start car Controller
    '''
    carRepo = Repository()
    carValidator = CarValidator()
    carController = CarController(undoController, carValidator, carRepo)

    carController.create(200, "CJ 01 AAA", "Audi", "A3")
    carController.create(201, "CJ 01 BBB", "Audi", "A4")
    carController.create(202, "CJ 01 CCC", "Audi", "A5")
    carController.create(203, "CJ 01 DDD", "Audi", "A6")

    audiA3 = carRepo.find(200)
    audiA4 = carRepo.find(201)
    audiA5 = carRepo.find(202)
    audiA6 = carRepo.find(203)
    '''
    Start rental Controller
    '''
    rentRepo = Repository()
    rentValidator = RentalValidator()
    rentController = RentalController(undoController, rentValidator, rentRepo,
                                      carRepo, clientRepo)

    rentController.createRental(300, aaron, audiA3,
                                datetime.strptime("2015-11-20", "%Y-%m-%d"),
                                datetime.strptime("2015-11-22", "%Y-%m-%d"))
    rentController.createRental(301, carol, audiA5,
                                datetime.strptime("2015-11-24", "%Y-%m-%d"),
                                datetime.strptime("2015-11-25", "%Y-%m-%d"))
    rentController.createRental(302, carol, audiA6,
                                datetime.strptime("2015-12-10", "%Y-%m-%d"),
                                datetime.strptime("2015-12-12", "%Y-%m-%d"))
    rentController.createRental(303, aaron, audiA4,
                                datetime.strptime("2015-11-21", "%Y-%m-%d"),
                                datetime.strptime("2015-11-25", "%Y-%m-%d"))
    rentController.createRental(304, aaron, audiA3,
                                datetime.strptime("2015-11-24", "%Y-%m-%d"),
                                datetime.strptime("2015-11-27", "%Y-%m-%d"))
    rentController.createRental(305, bob, audiA5,
                                datetime.strptime("2015-11-26", "%Y-%m-%d"),
                                datetime.strptime("2015-11-27", "%Y-%m-%d"))
    rentController.createRental(306, carol, audiA6,
                                datetime.strptime("2015-12-15", "%Y-%m-%d"),
                                datetime.strptime("2015-12-20", "%Y-%m-%d"))
    rentController.createRental(307, bob, audiA4,
                                datetime.strptime("2015-12-01", "%Y-%m-%d"),
                                datetime.strptime("2015-12-10", "%Y-%m-%d"))
    rentController.createRental(308, carol, audiA4,
                                datetime.strptime("2015-12-11", "%Y-%m-%d"),
                                datetime.strptime("2015-12-15", "%Y-%m-%d"))
    rentController.createRental(309, aaron, audiA5,
                                datetime.strptime("2015-11-28", "%Y-%m-%d"),
                                datetime.strptime("2015-12-02", "%Y-%m-%d"))

    for cr in rentController.mostRentedCars():
        print(cr)
예제 #17
0
def undoExample():
    """
    An example for doing multiple undo operations. 
    This is a bit more difficult than in Lab2-4 due to the fact that there are now several controllers, 
    and each of them can perform operations that require undo support.
     
    Follow the code below and figure out how it works!
    """
    
    undoController = UndoController()
    
    '''
    Start client Controller
    '''
    clientRepo = Repository()
    clientValidator = ClientValidator()
    clientController = ClientController(undoController, clientValidator, clientRepo)
    
    '''
    Start car Controller
    '''
    carRepo = Repository()
    carValidator = CarValidator()
    carController = CarController(undoController, carValidator, carRepo)
    
    '''
    Start rental Controller
    '''
    rentRepo = Repository()
    rentValidator = RentalValidator()
    rentController = RentalController(undoController, rentValidator, rentRepo, carRepo, clientRepo)
    
    print("---> Initial state of repositories")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)
    
    '''
    We add a client, a new car as well as a rental
    '''
    clientController.create(103, "1900102035588", "Dale")
    carController.create(201, "CJ 02 ZZZ", "Dacia", "Sandero")
    
    rentStart = datetime.strptime("2015-11-26", "%Y-%m-%d")
    rentEnd = datetime.strptime("2015-11-30", "%Y-%m-%d")
    rentController.createRental(301, clientRepo.find(103), carRepo.find(201), rentStart, rentEnd)
    
    print("---> We added a client, a new car and a rental")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)
    
    '''
    Now undo the performed operations, one by one
    '''
    undoController.undo()
    print("---> After 1 undo")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)
    
    
    undoController.undo()
    print("---> After 2 undos")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)
    
    undoController.undo()
    print("---> After 3 undos")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)
예제 #18
0
def statisticsExample():
    """
    An example for the creation of statistics.
    Several cars, clients and rentals are created and then a statistics is calculated over them.
    
    Follow the code below and figure out how it works!
    """
    undoController = UndoController()
    
    '''
    Start client Controller
    '''
    clientRepo = Repository()
    clientValidator = ClientValidator()
    clientController = ClientController(undoController, clientValidator, clientRepo)
    
    clientController.create(100, "1820203556699", "Aaron")
    clientController.create(101, "2750102885566", "Bob")
    clientController.create(102, "1820604536579", "Carol")

    # We name the instances so it's easier to create some test values later
    aaron = clientRepo.find(100)
    bob = clientRepo.find(101)
    carol = clientRepo.find(102)

    '''
    Start car Controller
    '''
    carRepo = Repository()
    carValidator = CarValidator()
    carController = CarController(undoController, carValidator, carRepo)

    carController.create(200, "CJ 01 AAA", "Audi", "A3")
    carController.create(201, "CJ 01 BBB", "Audi", "A4")
    carController.create(202, "CJ 01 CCC", "Audi", "A5")
    carController.create(203, "CJ 01 DDD", "Audi", "A6")

    audiA3 = carRepo.find(200)
    audiA4 = carRepo.find(201)
    audiA5 = carRepo.find(202)
    audiA6 = carRepo.find(203)

    '''
    Start rental Controller
    '''
    rentRepo = Repository()
    rentValidator = RentalValidator()
    rentController = RentalController(undoController, rentValidator, rentRepo, carRepo, clientRepo)

    rentController.createRental(300, aaron, audiA3, datetime.strptime("2015-11-20", "%Y-%m-%d"), datetime.strptime("2015-11-22", "%Y-%m-%d"))
    rentController.createRental(301, carol, audiA5, datetime.strptime("2015-11-24", "%Y-%m-%d"), datetime.strptime("2015-11-25", "%Y-%m-%d"))
    rentController.createRental(302, carol, audiA6, datetime.strptime("2015-12-10", "%Y-%m-%d"), datetime.strptime("2015-12-12", "%Y-%m-%d"))
    rentController.createRental(303, aaron, audiA4, datetime.strptime("2015-11-21", "%Y-%m-%d"), datetime.strptime("2015-11-25", "%Y-%m-%d"))
    rentController.createRental(304, aaron, audiA3, datetime.strptime("2015-11-24", "%Y-%m-%d"), datetime.strptime("2015-11-27", "%Y-%m-%d"))
    rentController.createRental(305, bob, audiA5, datetime.strptime("2015-11-26", "%Y-%m-%d"), datetime.strptime("2015-11-27", "%Y-%m-%d"))
    rentController.createRental(306, carol, audiA6, datetime.strptime("2015-12-15", "%Y-%m-%d"), datetime.strptime("2015-12-20", "%Y-%m-%d"))
    rentController.createRental(307, bob, audiA4, datetime.strptime("2015-12-01", "%Y-%m-%d"), datetime.strptime("2015-12-10", "%Y-%m-%d"))
    rentController.createRental(308, carol, audiA4, datetime.strptime("2015-12-11", "%Y-%m-%d"), datetime.strptime("2015-12-15", "%Y-%m-%d"))
    rentController.createRental(309, aaron, audiA5, datetime.strptime("2015-11-28", "%Y-%m-%d"), datetime.strptime("2015-12-02", "%Y-%m-%d"))

    for cr in rentController.mostRentedCars(): 
        print (cr)
예제 #19
0
def undoExample():
    """
    An example for doing multiple undo operations. 
    This is a bit more difficult than in Lab2-4 due to the fact that there are now several controllers, 
    and each of them can perform operations that require undo support.
     
    Follow the code below and figure out how it works!
    """

    undoController = UndoController()
    '''
    Start client Controller
    '''
    clientRepo = Repository()
    clientValidator = ClientValidator()
    clientController = ClientController(undoController, clientValidator,
                                        clientRepo)
    '''
    Start car Controller
    '''
    carRepo = Repository()
    carValidator = CarValidator()
    carController = CarController(undoController, carValidator, carRepo)
    '''
    Start rental Controller
    '''
    rentRepo = Repository()
    rentValidator = RentalValidator()
    rentController = RentalController(undoController, rentValidator, rentRepo,
                                      carRepo, clientRepo)

    print("---> Initial state of repositories")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)
    '''
    We add a client, a new car as well as a rental
    '''
    clientController.create(103, "1900102035588", "Dale")
    carController.create(201, "CJ 02 ZZZ", "Dacia", "Sandero")

    rentStart = datetime.strptime("2015-11-26", "%Y-%m-%d")
    rentEnd = datetime.strptime("2015-11-30", "%Y-%m-%d")
    rentController.createRental(301, clientRepo.find(103), carRepo.find(201),
                                rentStart, rentEnd)

    print("---> We added a client, a new car and a rental")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)
    '''
    Now undo the performed operations, one by one
    '''
    undoController.undo()
    print("---> After 1 undo")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)

    undoController.undo()
    print("---> After 2 undos")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)

    undoController.undo()
    print("---> After 3 undos")
    print(clientRepo)
    print(carRepo)
    print(rentRepo)
def undoExampleHardest():
    undoController = UndoController()
    clientRepo = Repository()
    carRepo = Repository()
    '''
    Start rental Controller
    '''
    rentRepo = Repository()
    rentController = RentalController(undoController, rentRepo, carRepo,
                                      clientRepo)
    '''
    Start client Controller
    '''
    clientController = ClientController(undoController, rentController,
                                        clientRepo)
    '''
    Start car Controller
    '''
    carController = CarController(undoController, rentController, carRepo)
    '''
    We add 1 client, 1 car and 2 rentals
    '''
    clientSophia = clientController.create(103, "2990511035588", "Sophia")
    carHyundaiTucson = carController.create(201, "CJ 02 TWD", "Hyundai",
                                            "Tucson")
    rentController.createRental(301, clientSophia, carHyundaiTucson,
                                date(2016, 11, 1), date(2016, 11, 30))
    rentController.createRental(302, clientSophia, carHyundaiTucson,
                                date(2016, 12, 1), date(2016, 12, 31))

    printReposWithMessage("We added Sophia, the Hyundai and its 2 rentals",
                          clientRepo, carRepo, rentRepo)

    carController.delete(201)
    printReposWithMessage("Delete the Hyundai (also deletes its rentals)",
                          clientRepo, carRepo, rentRepo)
    '''
    Now undo the performed operations, one by one
    '''
    undoController.undo()
    printReposWithMessage("1 undo, the Hyundai and its rentals are back",
                          clientRepo, carRepo, rentRepo)

    undoController.undo()
    printReposWithMessage("1 undo deletes the second rental", clientRepo,
                          carRepo, rentRepo)

    undoController.undo()
    printReposWithMessage("1 undo deletes the first rental", clientRepo,
                          carRepo, rentRepo)

    undoController.undo()
    printReposWithMessage("1 undo deletes the Hyundai", clientRepo, carRepo,
                          rentRepo)
    '''
    After 5 undos, all repos should be empty, as we did 5 operations in total
    '''
    undoController.undo()
    printReposWithMessage("1 undo deletes Sophia (no more undos)", clientRepo,
                          carRepo, rentRepo)
    '''
    Redos start here
    '''
    undoController.redo()
    printReposWithMessage("1 redo and Sophia is added", clientRepo, carRepo,
                          rentRepo)

    undoController.redo()
    printReposWithMessage("1 redo adds the Hyundai", clientRepo, carRepo,
                          rentRepo)

    undoController.redo()
    printReposWithMessage("1 redo adds the first rental", clientRepo, carRepo,
                          rentRepo)

    undoController.redo()
    printReposWithMessage("1 redo adds the second rental", clientRepo, carRepo,
                          rentRepo)

    undoController.redo()
    printReposWithMessage("1 redo deletes the Hyundai and its rentals (again)",
                          clientRepo, carRepo, rentRepo)
    '''
    Let's do a few undos again...
    '''
    undoController.undo()
    undoController.undo()
    undoController.undo()

    printReposWithMessage("3 undos later, we have Sophia and the Hyundai",
                          clientRepo, carRepo, rentRepo)
    '''
    Now we try something new - let's add another car!
    
    NB!
        A new operation must invalidate the history for redo() operations
    '''
    carController.create(202, "CJ 02 SSE", "Dacia", "Sandero")
    print("\n Do we have a redo? -", undoController.redo(), "\n")
    '''
    Now we should have 2 cars
    '''
    printReposWithMessage("After adding the Dacia, there is no redo ",
                          clientRepo, carRepo, rentRepo)
    '''
    However, undos is still available !
    '''
    undoController.undo()
    printReposWithMessage("1 undo deletes the Dacia", clientRepo, carRepo,
                          rentRepo)

    undoController.undo()
    printReposWithMessage("1 undo deletes the Hyundai", clientRepo, carRepo,
                          rentRepo)
예제 #21
0
Brepo = FileRepository('books.txt', Book.readBookFromLine, Book.writeBookToLine)

Crepo = FileRepository('clients.txt', Client.readClientFromLine, Client.writeClientToLine)

Rrepo = Repository()
Rrepo.add(Rental(16675, 16, 67, date(2017, 11, 10), date(2017, 12, 11)))
Rrepo.add(Rental(12675, 12, 67, date(2017, 11, 1), date(2017, 11, 11)))
Rrepo.add(Rental(13115, 13, 11, date(2017, 11, 21), date(2017, 11, 11)))
Rrepo.add(Rental(13678, 13, 67, date(2017, 11, 7), date(2017, 11, 20)))
Rrepo.add(Rental(12622, 12, 62, date(2017, 11, 18), date(2017, 1, 11)))
Rrepo.add(Rental(14675, 14, 67, date(2017, 11, 5), date(2017, 11, 24)))
Rrepo.add(Rental(14637, 14, 63, date(2017, 11, 10), date(2017, 10, 11)))
Rrepo.add(Rental(14671, 14, 67, date(2017, 11, 9), date(2017, 12, 11)))
Rrepo.add(Rental(16652, 16, 65, date(2017, 11, 4), date(2017, 11, 16)))
Rrepo.add(Rental(15661, 15, 66, date(2017, 11, 12), date(2017, 10, 30)))
Rrepo.add(Rental(12629, 12, 62, date(2017, 11, 13), date(2017, 11, 25)))
Rrepo.add(Rental(15695, 15, 69, date(2017, 11, 19), date(2017, 11, 24)))
Rrepo.add(Rental(16770, 16, 77, date(2017, 11, 2), date(2017, 11, 24)))

Ucontroller = UndoController()
Bcontroller = BookController(Brepo, Ucontroller, Rrepo)
Ccontroller = ClientController(Crepo, Ucontroller, Rrepo)
Rcontroller = RentalController(Rrepo, Brepo, Crepo, Ucontroller)

ui = UI(Bcontroller, Ccontroller, Rcontroller, Ucontroller)
# ui.mainMenu()

root = Tk()
gui = GUI(root, Bcontroller, Ccontroller, Rcontroller, Ucontroller)
root.mainloop()