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

import math
import string

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


def consonantCount(s):
    return 42

#### isFloat ####

def isFloat(s):
    return False

#### applyVigenereCipher ####

def applyVigenereCipher(msg, key):
    return ""

#### topScorer ####

def topScorer(data):
    return ""

#### mostFrequentSubstring ####

def mostFrequentSubstring(text, n):
    return ""

#### patternedMessage ####

def patternedMessage(msg, pattern):
    return ""

#### BONUS/OPTIONAL: bonusGetEvalSteps ####

def bonusGetEvalSteps(expr):
    return ""

#### BONUS/OPTIONAL: crack112code ####

def bonusEncode112(s):
    return "42"

def bonusDecode112(s):
    return "42"


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


def testConsonantCount():
    print("Testing consonantCount()...", end="")
    print('Failed. This testcode needs to be written by you.')

#### isFloat ####

def testIsFloat():
    print("Testing isFloat()...", end="")
    print('Failed. This testcode needs to be written by you.')


#### applyVigenereCipher ####

def testApplyVigenereCipher():
    print("Testing applyVigenereCipher()...", end="")
    print('Failed. This testcode needs to be written by you.')


#### topScorer ####

def testTopScorer():
    print("Testing topScorer()...", end="")
    print('Failed. This testcode needs to be written by you.')

#### mostFrequentSubstring ####

def testMostFrequentSubstring():
    print("Testing mostFrequentSubstring()...", end="")
    assert(mostFrequentSubstring("baababacb", 3) == "aba")
    assert(mostFrequentSubstring("thequickbrownfoxjumpsoverthelazydog", 1) == "o")
    assert(mostFrequentSubstring("testingthecodetofindtheerrortestandtestagain", 4) == "test")
    print("Passed!")


#### patternedMessage ####

def testPatternedMessage():
    print("Testing patternedMessage()...", end="")
    parms = [
        ("Go Pirates!!!", """
***************
******   ******
***************
"""),
        ("Three Diamonds!", """
    *     *     *
   ***   ***   ***
  ***** ***** *****
   ***   ***   ***
    *     *     *
"""),
        ("Go Steelers!", """
                          oooo$$$$$$$$$$$$oooo
                      oo$$$$$$$$$$$$$$$$$$$$$$$$o
                   oo$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o         o$   $$ o$
   o $ oo        o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o       $$ $$ $$o$
oo $ $ '$      o$$$$$$$$$    $$$$$$$$$$$$$    $$$$$$$$$o       $$$o$$o$
'$$$$$$o$     o$$$$$$$$$      $$$$$$$$$$$      $$$$$$$$$$o    $$$$$$$$
  $$$$$$$    $$$$$$$$$$$      $$$$$$$$$$$      $$$$$$$$$$$$$$$$$$$$$$$
  $$$$$$$$$$$$$$$$$$$$$$$    $$$$$$$$$$$$$    $$$$$$$$$$$$$$  '$$$
   '$$$'$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$     '$$$
    $$$   o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$     '$$$o
   o$$'   $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$       $$$o
   $$$    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$' '$$$$$$ooooo$$$$o
  o$$$oooo$$$$$  $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$   o$$$$$$$$$$$$$$$$$
  $$$$$$$$'$$$$   $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$     $$$$'
 ''''       $$$$    '$$$$$$$$$$$$$$$$$$$$$$$$$$$$'      o$$$
            '$$$o     '$$$$$$$$$$$$$$$$$$'$$'         $$$
              $$$o          '$$'$$$$$$'           o$$$
               $$$$o                                o$$$'
                '$$$$o      o$$$$$$o'$$$$o        o$$$$
                  '$$$$$oo     '$$$$o$$$$$o   o$$$$'
                     '$$$$$oooo  '$$$o$$$$$$$$$'
                        '$$$$$$$oo $$$$$$$$$$
                                '$$$$$$$$$$$
                                    $$$$$$$$$$$$
                                     $$$$$$$$$$'
                                      '$$$'
""")]
    solns = [
        """
GoPirates!!!GoP
irates   !!!GoP
irates!!!GoPira
""",
        """
    T     h     r
   eeD   iam   ond
  s!Thr eeDia monds
   !Th   ree   Dia
    m     o     n
""",
        """
                          GoSteelers!GoSteeler
                      s!GoSteelers!GoSteelers!GoS
                   teelers!GoSteelers!GoSteelers!GoS         te   el er
   s ! Go        Steelers!GoSteelers!GoSteelers!GoSteel       er s! GoSt
ee l e rs      !GoSteeler    s!GoSteelers!    GoSteelers       !GoSteel
ers!GoSte     elers!GoSt      eelers!GoSt      eelers!GoSt    eelers!G
  oSteele    rs!GoSteele      rs!GoSteele      rs!GoSteelers!GoSteeler
  s!GoSteelers!GoSteelers    !GoSteelers!G    oSteelers!GoSt  eele
   rs!GoSteelers!GoSteelers!GoSteelers!GoSteelers!GoSteel     ers!
    GoS   teelers!GoSteelers!GoSteelers!GoSteelers!GoSteelers     !GoSt
   eele   rs!GoSteelers!GoSteelers!GoSteelers!GoSteelers!GoSt       eele
   rs!    GoSteelers!GoSteelers!GoSteelers!GoSteelers!Go Steelers!GoSteele
  rs!GoSteelers  !GoSteelers!GoSteelers!GoSteelers!GoS   teelers!GoSteelers
  !GoSteelers!G   oSteelers!GoSteelers!GoSteelers!Go     Steel
 ers!       GoSt    eelers!GoSteelers!GoSteelers!G      oSte
            elers     !GoSteelers!GoSteelers!         GoS
              teel          ers!GoSteel           ers!
               GoSte                                elers
                !GoSte      elers!GoSteele        rs!Go
                  Steelers     !GoSteelers!   GoStee
                     lers!GoSte  elers!GoSteeler
                        s!GoSteele rs!GoSteel
                                ers!GoSteele
                                    rs!GoSteeler
                                     s!GoSteeler
                                      s!GoS
"""
    ]
    parms = [("A-C D?", """
*** *** ***
** ** ** **
"""),
             ("A", "x y z"),
             ("The pattern is empty!", "")
             ]
    solns = [
        """
A-C D?A -CD
?A -C D? A-
""",
        "A A A",
        ""
    ]
    for i in range(len(parms)):
        msg, pattern = parms[i]
        soln = solns[i]
        soln = soln.strip("\n")
        observed = patternedMessage(msg, pattern)
        assert(observed == soln)
    print("Passed!")


#### bonusGetEvalSteps ####

def testBonusGetEvalSteps():
    print("Testing bonusGetEvalSteps()...", end="")
    assert(bonusGetEvalSteps("3+2") == "3+2 = 5")
    assert(bonusGetEvalSteps("3-2") == 42)  # TODO: fill in 42
    assert(bonusGetEvalSteps("3**2") == "3**2 = 9")
    assert(bonusGetEvalSteps("31%16") == 42)  # TODO: fill in 42
    assert(bonusGetEvalSteps("31*16") == "31*16 = 496")
    assert(bonusGetEvalSteps("32//16") == "32//16 = 2")
    assert(bonusGetEvalSteps("2+3*4") == "2+3*4 = 2+12\n      = 14")
    assert(bonusGetEvalSteps("2*3+4") == 42
            )  # TODO: fill in 42 (hint: look at previous line!)
    assert(bonusGetEvalSteps("2+3*4-8**3%3") == """\
2+3*4-8**3%3 = 2+3*4-512%3
             = 2+12-512%3
             = 2+12-2
             = 14-2
             = 12""")
    assert(bonusGetEvalSteps("2+3**4%2**4+15//3-8") == """\
2+3**4%2**4+15//3-8 = 2+81%2**4+15//3-8
                    = 2+81%16+15//3-8
                    = 2+1+15//3-8
                    = 2+1+5-8
                    = 3+5-8
                    = 8-8
                    = 0""")
    print("Passed!")


#### crack112code ####

def testBonusEncode112():
    print("Testing bonusEncode112()...", end="")
    print('Failed. This testcode needs to be written by you.')

def testBonusDecode112():
    print("Testing bonusDecode112()...", end="")
    print('Failed. This testcode needs to be written by you.')


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

def testAll():
    # comment out the tests you do not wish to run!
    testIsFloat()
    testApplyVigenereCipher()
    testTopScorer()
    testMostFrequentSubstring()
    testPatternedMessage()
    testBonusGetEvalSteps()
    testBonusDecode112()
    testBonusEncode112()

def main():
    testAll()

if __name__ == '__main__':
    main()
