#################################################
# hw2.py
#
# Your name:
# Your andrew id:
#################################################

import math

#################################################
# Functions (for you to write)
#################################################


#### containsOddDigits ####

def containsOddDigits(x):
    return False


#### printNumberTriangle ####

def printNumberTriangle(n):
    print("42")


#### hasConsecutiveDigits ####

def hasConsecutiveDigits(n):
    return False

#### isPalindromicNumber ####

def isPalindromicNumber(n):
    return False

#### longestCommonDigitStart ####

def longestCommonDigitStart(x, y):
    return 42

#### carrylessAdd ####

def carrylessAdd(x, y):
    return 42

#### nthCircularPrime ####

def rotateNumber(x):
    return x

def isCircularPrime(x):
    return False

def nthCircularPrime(n):
    return 42


#### BONUS/OPTIONAL: bonusCarrylessMultiply ####

def bonusCarrylessMultiply(x, y):
    return 42


#################################################
# Test Functions
#################################################

#### containsOddDigits ####

def testContainsOddDigits():
    print('Testing containsOddDigits()... ', end='')
    assert(containsOddDigits(1246))
    assert(containsOddDigits(8663))
    assert(containsOddDigits(224) == False)
    assert(containsOddDigits(115))
    assert(containsOddDigits(8) == False)
    assert(containsOddDigits(9))
    print('Passed!')


#### printNumberTriangle ####

def testPrintNumberTriangle():
    import sys
    import io
    print('Testing printNumberTriangle()... ', end='')
    tmpOut = sys.stdout

    oneOutput = io.StringIO()
    sys.stdout = oneOutput
    printNumberTriangle(1)
    oneCheck = oneOutput.getvalue()

    fourOutput = io.StringIO()
    sys.stdout = fourOutput
    printNumberTriangle(4)
    fourCheck = fourOutput.getvalue()

    sevenOutput = io.StringIO()
    sys.stdout = sevenOutput
    printNumberTriangle(7)
    sevenCheck = sevenOutput.getvalue()

    sys.stdout = tmpOut

    assert(oneCheck == "1\n")
    assert(fourCheck == "1\n21\n321\n4321\n")
    assert(sevenCheck == "1\n21\n321\n4321\n54321\n654321\n7654321\n")
    print('Passed!')


#### hasConsecutiveDigits ####

def testHasConsecutiveDigits():
    print('Testing hasConsecutiveDigits()...', end='')
    assert(hasConsecutiveDigits(0) == False)
    assert(hasConsecutiveDigits(123456789) == False)
    assert(hasConsecutiveDigits(1212) == False)
    assert(hasConsecutiveDigits(1212111212) == True)
    assert(hasConsecutiveDigits(33) == True)
    assert(hasConsecutiveDigits(-1212111212) == True)
    print('Passed.')

#### isPalindromicNumber ####

def testIsPalindromicNumber():
    print('Testing isPalindromicNumber()...', end='')
    assert isPalindromicNumber(0) == True
    assert isPalindromicNumber(4) == True
    assert isPalindromicNumber(10) == False
    assert isPalindromicNumber(101) == True
    assert isPalindromicNumber(1001) == True
    assert isPalindromicNumber(10010) == False
    print('Passed.')

#### longestCommonDigitStart ####

def testLongestCommonDigitStart():
    print('Testing longestCommonDigitStart()... ', end='')
    assert(longestCommonDigitStart(1234, 2134) == 34)
    assert(longestCommonDigitStart(2223, 23) == 23)
    assert(longestCommonDigitStart(15112, 15112) == 15112)
    assert(longestCommonDigitStart(763426548, 7346548) == 6548)
    assert(longestCommonDigitStart(973492739487234, 1) == None)
    assert(longestCommonDigitStart(10, 20) == 0)
    print('Passed!')


#### carrylessAdd ####

def testCarrylessAdd():
    print('Testing carrylessAdd()... ', end='')
    assert (carrylessAdd(785, 376) == 51)
    assert (carrylessAdd(0, 376) == 376)
    assert (carrylessAdd(785, 0) == 785)
    assert (carrylessAdd(30, 376) == 306)
    assert (carrylessAdd(785, 30) == 715)
    assert (carrylessAdd(12345678900, 38984034003) == 40229602903)
    print('Passed.')


#### nthCircularPrime ####

def testRotateNumber():
    print('Testing rotateNumber()... ', end='')
    assert(rotateNumber(1234) == 4123)
    assert(rotateNumber(4123) == 3412)
    assert(rotateNumber(3412) == 2341)
    assert(rotateNumber(2341) == 1234)
    assert(rotateNumber(5) == 5)
    assert(rotateNumber(111) == 111)
    print('Passed!')


def testIsCircularPrime():
    print('Testing isCircularPrime()... ', end='')
    assert(isCircularPrime(2))
    assert(isCircularPrime(11))
    assert(isCircularPrime(13))
    assert(isCircularPrime(79))
    assert(isCircularPrime(197))
    assert(isCircularPrime(1193))
    print('Passed!')


def testNthCircularPrime():
    print('Testing nthCircularPrime()... ', end='')
    assert(nthCircularPrime(0) == 2)
    assert(nthCircularPrime(4) == 11)
    assert(nthCircularPrime(5) == 13)
    assert(nthCircularPrime(11) == 79)
    assert(nthCircularPrime(15) == 197)
    assert(nthCircularPrime(25) == 1193)
    print('Passed!')


#### bonusCarrylessMultiply ####

def testBonusCarrylessMultiply():
    print('Testing bonusCarrylessMultiply()... ', end='')
    print("This is a bonus/optional problem: You should create your own test cases")

#################################################
# testAll and main
#################################################

def testAll():
    # comment out the tests you do not wish to run!
    testContainsOddDigits()
    testPrintNumberTriangle()
    testHasConsecutiveDigits()
    testIsPalindromicNumber()
    testLongestCommonDigitStart()
    testCarrylessAdd()
    testRotateNumber()
    testIsCircularPrime()
    testNthCircularPrime()
    testBonusCarrylessMultiply()

def main():
    testAll()

if __name__ == '__main__':
    main()
