<no title>

import csv
import os
import datetime as dt

def correct(answer):
    pos = answer.find("correct")
    return pos >= 0

def addAnswer(userDict, user, timestamp, answer):
    answerDict = {}
    userDict[user] = answerDict
    answerDict["timestamp"] = timestamp
    answerDict["correct"] = correct(answer)


# function to gather the data on the mchoice questions
def mchoice_worker(inFileName, outFileName):

    # open the output file for writing
    dir = os.path.dirname(__file__)
    out_path = os.path.join(dir, outFileName)
    in_path= os.path.join(dir, inFileName)
    outFile = open(out_path, "w")

    # open the input and output files as csv files
    with open(in_path) as csv_file:
        csv_reader = csv.reader(csv_file)
        csv_writer = csv.writer(outFile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)

        # create an empty problem dictionary
        probDict = dict()

        # loop through the rows
        for cols in csv_reader:

            # get the event
            event = cols[4]

            # if event is mChoice
            if event == "mChoice":

                # get the divid, user, timestamp, and answer
                div = cols[7]
                user = cols[3]
                timestamp = cols[2]
                answer = cols[6]

                # if no dictionary for this problem create one and add this user and answer
                if div not in probDict:
                    userDict = {}
                    probDict[div] = userDict
                else:
                    userDict = probDict[div]

                # if user in dictionary
                if user in userDict:
                    continue
                else:
                    addAnswer(userDict, user, timestamp, answer)

        # for each multiple choice question total the number of correct responses
        for prob in probDict:

            total_correct = 0

            # loop through the users
            user_dict = probDict[prob]
            for user in user_dict:

                answerDict = user_dict[user]
                if answerDict["correct"] == True:
                    total_correct += 1

            # write out the problem id and percent who got it correct
            total_attempted = len(user_dict)
            percent_correct = total_correct / total_attempted 
            csv_writer.writerow([prob, total_correct, total_attempted, percent_correct])

    outFile.close()
    
    return len(probDict)

num = mchoice_worker("mChoiceSmall.csv", "mchoiceResults.csv")
print(f"The number of unique questions is {num}")

import unittest
class myTests(unittest.TestCase):
    
    def setUp(self):
        dir = os.path.dirname(__file__)
        inFile = open(os.path.join(dir, "mchoiceResults.csv"))
        csv_in = csv.reader(inFile)
        self.datad = {}
        for cols in csv_in:
            self.datad[cols[0]] = (int(cols[1]), int(cols[2]), float(cols[3]))

    def testLen(self):
        self.assertEqual(len(self.datad), 3, "num unique problems")
        
    def testData(self):
        self.assertEqual(self.datad["q2_2_1"][0], 7, "num attempted for q2_2_1")
        self.assertEqual(self.datad["q2_2_1"][1], 7, "num correct for q2_2_1")
        self.assertAlmostEqual(self.datad["q2_2_1"][2], 100, 2, "percent for q2_2_1")
        self.assertEqual(self.datad["q2_2_2"][0], 4, "num attempted for q2_2_2")
        self.assertEqual(self.datad["q2_2_2"][1], 7, "num correct for q2_2_2")
        self.assertAlmostEqual(self.datad["q2_2_2"][2], 57.14, 2, "percent for q2_2_2")

unittest.main(verbosity=3)