#!usr/bin/env python3

"""
atds_tester.py
Runs a series of tests on the atds module, including looking at 
    * Stack
    * Queue
    * Deque
@author Richard White
@version 2017-03-13
"""

from atds import *

def main():

#################################################################

    print("Testing the Stack class")
    tests_passed = 0
    try:
        s = Stack()
        tests_passed += 1
        print("Test passed: stack created")
    except:
        print("Test failed: couldn't initialize stack")

    try:
        s.push("hello")
        s.push(3)
        tests_passed += 1
        print("Test passed: items pushed")
    except:
        print("Test failed: couldn't push onto stack")

    try:
        result = s.peek()
        if (result == 3): 
            tests_passed += 1
            print("Test passed: peeked at item")
        else: 
            print("Test failed: incorrect peek value")
    except:
        print("Test failed: couldn't peek at stack")

    try:
        result = s.pop()
        if (result == 3): 
            tests_passed += 1
            print("Test passed: item popped")
        else: 
            print("Test failed: incorrect pop result")
    except:
        print("Test failed: couldn't pop")

    try:
        result = s.is_empty()
        if (not result): 
            tests_passed += 1
            print("Test passed: is_empty returned correct result")
        else: 
            print("Test failed: stack has items, but indicated empty")
    except:
        print("Test failed: is_empty() method unavailable")

    try: 
        result = s.size()
        if (result == 1): 
            tests_passed += 1
            print("Test passed: correct size returned")
        else: 
            print("Test failed: incorrect size returned")
    except:
        print("Test failed: .size() method unavailable")

    try:
        s.pop()
    except:
        pass

    try: 
        result = s.is_empty()
        if (result): 
            tests_passed += 1
            print("Test passed: .is_empty() correctly indicating empty status")
        else: 
            print("Test failed: stack failed to indicate empty status")
    except:
        print("Test failed: is_empty() unavailable")

    print(str(tests_passed) + "/7 tests passed on the Stack class")

#################################################################

    print("Testing the Queue class")
    try:
        q = Queue()
        tests_passed += 1
        print("Test passed: queue created")
    except:
        print("Test failed: couldn't initialize queue")

    try:
        q.enqueue(5)
        q.enqueue(7)
        tests_passed += 1
        print("Test passed: items enqueued")
    except:
        print("Test failed: couldn't enqueue onto queue")

    try:
        result = q.dequeue()
        if (result == 5): 
            tests_passed += 1
            print("Test passed: dequeued correct value")
        else: 
            print("Test failed: incorrect value dequeued")
    except:
        print("Test failed: couldn't dequeue")

    try: 
        result = q.size()
        if (result == 1): 
            tests_passed += 1
            print("Test passed: correct size returned")
        else: 
            print("Test failed: incorrect size returned")
    except:
        print("Test failed: .size() method unavailable")

    try:
        result = q.is_empty()
        if (not result): 
            tests_passed += 1
            print("Test passed: is_empty correctly returned false on queue")
        else: 
            print("Test failed: queue has items, but indicated empty")
    except:
        print("Test failed: is_empty() method unavailable")

    try: 
        tmp = q.dequeue() # just emptying the queue
        result = q.is_empty()
        if (result): 
            tests_passed += 1
            print("Test passed: .is_empty() correctly indicating empty status")
        else: 
            print("Test failed: queue failed to indicate empty status")
    except:
        print("Test failed: is_empty() unavailable")

    print(str(tests_passed) + "/13 tests passed on the Stack and Queue classes")

#################################################################

    print("Testing the Deque class")
    try:
        d = Deque()
        tests_passed += 1
        print("Test passed: deque created")
    except:
        print("Test failed: couldn't initialize deque")

    try:
        d.add_front(1)
        d.add_front(0)
        tests_passed += 1
        print("Test passed: items added to front")
    except:
        print("Test failed: couldn't add to front")

    try:
        d.add_rear(2)
        d.add_rear(3)
        print("Test passed: items added to rear")
    except:
        print("Test failed: couldn't add to rear")
   
    try:
        result = d.remove_front()
        if result == 0:
            tests_passed += 1
            print("Test passed: remove_front retrieved correct value")
        else: 
            print("Test failed: incorrect value remove_fronted")
    except:
        print("Test failed: couldn't use remove_front method")

    try: 
        result = d.remove_rear()
        if (result == 3): 
            tests_passed += 1
            print("Test passed: correct value removed from rear")
        else: 
            print("Test failed: incorrect value removed from rear")
    except:
        print("Test failed: .remove_rear() method unavailable")

    try:
        result = d.is_empty()
        if (not result): 
            tests_passed += 1
            print("Test passed: is_empty correctly returned false on deque")
        else: 
            print("Test failed: deque has items, but indicated empty")
    except:
        print("Test failed: is_empty() method unavailable")

    try: 
        if d.size() == 2:
            tests_passed += 1
            print("Test passed: .size() returned correct value")
        else: 
            print("Test failed: .size() return incorrect value") 
    except:
        print("Test failed: .size() unavailable")

    try:
        tmp = d.remove_front()
        tmp = d.remove_front()
        result = d.is_empty()
        if (result): 
            tests_passed += 1
            print("Test passed: is_empty correctly returned True on deque")
        else: 
            print("Test failed: deque empty, but indicated notEmpty")
    except:
        print("Test failed: is_empty() method unavailable")

    print(str(tests_passed) + "/20 tests passed on the Stack, Queue, and Deque classes") 
    

if __name__ == "__main__":
    main()
