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

import math

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


#### numberLength ####

def numberLength(x):
    return 42


#### containsOddDigits ####

def containsOddDigits(x):
    return False


#### printNumberTriangle ####

def printNumberTriangle(n):
    print(42)


#### longestDigitRun ####

def longestDigitRun(n):
    return 0


#### isPalindromicNumber ####

def isPalindromicNumber(n):
    return False

#### carrylessAdd ####

def carrylessAdd(x, y):
    return 42

#### nthCircularPrime ####

def rotateNumber(x):
    return 42


def isCircularPrime(x):
    return False


def nthCircularPrime(n):
    return 42

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

#### numberLength ####

def testNumberLength():
    print('Testing numberLength()... ', end='')
    assert(numberLength(12) == 2)
    assert(numberLength(3) == 1)
    assert(numberLength(89) == 2)
    assert(numberLength(12345) == 5)
    assert(numberLength(120021) == 6)
    assert(numberLength(5000) == 4)
    print('Passed!')


#### 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!')


#### longestDigitRun ####

def testLongestDigitRun():
    print('Testing longestDigitRun()... ', end='')
    assert(longestDigitRun(117773732) == 7)
    assert(longestDigitRun(-677886) == 7)
    assert(longestDigitRun(5544) == 4)
    assert(longestDigitRun(1) == 1)
    assert(longestDigitRun(0) == 0)
    assert(longestDigitRun(22222) == 2)
    assert(longestDigitRun(111222111) == 1)
    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.')

#### 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!')

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

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

def main():
    testAll()

if __name__ == '__main__':
    main()
