#################################################
# 15-112-n18 hw13
# Your Name:
# Your Andrew ID:
# Your Section:

#################################################
import os

def findLargestFile(path):
    return 42

def friendsOfFriends(d):
    return 42

######################################################################
# ignore_rest: The autograder will ignore all code below here
######################################################################

#Don't forget to write test cases!
def testFindLargestFile():
    print("Testing findLargestFile()...", end="")
    assert(findLargestFile("sampleFiles"+os.sep+"folderA") ==
                       "sampleFiles"+os.sep+"folderA"+ \
                       os.sep+"folderC"+os.sep+"giftwrap.txt")
    assert(findLargestFile("sampleFiles"+os.sep+"folderB") ==
                       "sampleFiles"+os.sep+"folderB"+  \
                       os.sep+"folderH"+os.sep+"driving.txt")
    assert(findLargestFile("sampleFiles"+os.sep+"folderB"+ \
                       os.sep+"folderF") == "")
    #Write more test cases here!
    print("Passed!")

def testFriendsOfFriends():
    print("Testing friendsOfFriends()...", end="")
    d = { }
    d["spongebob"] = set(["sandy", "patrick", "mr.krabs", "squidward"])
    d["mr.krabs"] = set(["pearl", "spongebob", "squidward"])
    d["pearl"] = set(["mr.krabs"])
    d["sandy"] = set(["spongebob", "patrick"])
    d["patrick"] = set(["spongebob", "sandy"])
    d["squidward"] = set()

    assert(friendsOfFriends(d) == {
     'spongebob': {'pearl'}, 
     'mr.krabs': {'patrick', 'sandy'}, 
     'pearl': {'spongebob', 'squidward'}, 
     'sandy': {'mr.krabs', 'squidward'}, 
     'patrick': {'mr.krabs', 'squidward'}, 
     'squidward': set(), 
    }
    )
    #Write more test cases here!
    print("Passed!")


testFindLargestFile()
testFriendsOfFriends()

from tkinter import *
import math

#########################################
# customize these functions for HFractal
#########################################

def init(data):
    # load data.xyz as appropriate
    pass

def mousePressed(event, data):
    # use event.x and event.y
    pass

def keyPressed(event, data):
    # use event.char and event.keysym
    pass

def timerFired(data):
    pass

def redrawAll(canvas, data):
    # draw in canvas
    canvas.create_text(data.width//2, data.height//2, text="Write HFractal!")


####################################
# use the run function as-is
####################################

def runHFractal(width=300, height=300):
    def redrawAllWrapper(canvas, data):
        canvas.delete(ALL)
        canvas.create_rectangle(0, 0, data.width, data.height,
                                fill='white', width=0)
        redrawAll(canvas, data)
        canvas.update()

    def mousePressedWrapper(event, canvas, data):
        mousePressed(event, data)
        redrawAllWrapper(canvas, data)

    def keyPressedWrapper(event, canvas, data):
        keyPressed(event, data)
        redrawAllWrapper(canvas, data)

    def timerFiredWrapper(canvas, data):
        timerFired(data)
        redrawAllWrapper(canvas, data)
        # pause, then call timerFired again
        canvas.after(data.timerDelay, timerFiredWrapper, canvas, data)
    # Set up data and call init
    class Struct(object): pass
    data = Struct()
    data.width = width
    data.height = height
    data.timerDelay = 100 # milliseconds
    root = Tk()
    init(data)
    # create the root and the canvas
    canvas = Canvas(root, width=data.width, height=data.height)
    canvas.configure(bd=0, highlightthickness=0)
    canvas.pack()
    # set up events
    root.bind("<Button-1>", lambda event:
                            mousePressedWrapper(event, canvas, data))
    root.bind("<Key>", lambda event:
                            keyPressedWrapper(event, canvas, data))
    timerFiredWrapper(canvas, data)
    # and launch the app
    root.mainloop()  # blocks until window is closed
    print("bye!")

runHFractal(400, 200)


##############################################
# customize these functions for dotsGalore 2.0
##############################################

def init(data):
    # load data.xyz as appropriate
    pass

def mousePressed(event, data):
    # use event.x and event.y
    pass

def keyPressed(event, data):
    # use event.char and event.keysym
    pass

def timerFired(data):
    pass

def redrawAll(canvas, data):
    # draw in canvas
    canvas.create_text(data.width//2, data.height//2, text="Write dotsGalore!")

####################################
# use the run function as-is
####################################

def runDotsGalore(width=300, height=300):
    def redrawAllWrapper(canvas, data):
        canvas.delete(ALL)
        canvas.create_rectangle(0, 0, data.width, data.height,
                                fill='white', width=0)
        redrawAll(canvas, data)
        canvas.update()

    def mousePressedWrapper(event, canvas, data):
        mousePressed(event, data)
        redrawAllWrapper(canvas, data)

    def keyPressedWrapper(event, canvas, data):
        keyPressed(event, data)
        redrawAllWrapper(canvas, data)

    def timerFiredWrapper(canvas, data):
        timerFired(data)
        redrawAllWrapper(canvas, data)
        # pause, then call timerFired again
        canvas.after(data.timerDelay, timerFiredWrapper, canvas, data)
    # Set up data and call init
    class Struct(object): pass
    data = Struct()
    data.width = width
    data.height = height
    data.timerDelay = 100 # milliseconds
    root = Tk()
    init(data)
    # create the root and the canvas
    canvas = Canvas(root, width=data.width, height=data.height)
    canvas.configure(bd=0, highlightthickness=0)
    canvas.pack()
    # set up events
    root.bind("<Button-1>", lambda event:
                            mousePressedWrapper(event, canvas, data))
    root.bind("<Key>", lambda event:
                            keyPressedWrapper(event, canvas, data))
    timerFiredWrapper(canvas, data)
    # and launch the app
    root.mainloop()  # blocks until window is closed
    print("bye!")

runDotsGalore(600, 600)