# from unitgrade.unitgrade import QuestionGroup, Report, QPrintItem
# from unitgrade.unitgrade_helpers import evaluate_report_student

from src.unitgrade2.unitgrade2 import UTestCase, cache
from unittest import TestCase
# from unitgrade2.unitgrade2 import cache
from src.unitgrade2.unitgrade2 import hide

import random
from cs202courseware.homework1 import my_sum

class TestPartial(TestCase):
    def test_a(self):
        self.assertEqual(2,2)

    def test_b(self):
        """ Question b """
        import numpy as np
        a = np.asarray(31)
        z = a * 23
        self.assertEqual(2,3)

    def test_c(self):
        self.assertEqual(2,2)

    # def test_d(self):
    #     self.assertEqual(2,2)



class GeneratorQuestion(UTestCase):
    def genTest(self, n):
        seq = [random.randint(1, 100000) for _ in range(n)]
        return my_sum(seq)

    @hide
    def test_sum(self):
        random.seed(42)
        self.assertEqualC(my_sum([1,1]))
        self.assertEqualC(my_sum([7, 2, 4, -3, 1, 1, 5, 4]))
        self.assertEqualC(self.genTest(10))
        self.assertEqualC(my_sum([1]))
        self.assertEqualC(my_sum([-5]))
        for s in [4]: # [5, 100, 1000, 10000, 100000, 500000]:
            self.assertEqualC(self.genTest(s))


class ListQuestion(UTestCase):
    """ Docstring at top """
    @classmethod
    def setUpClass(cls) -> None:
        z = 23424
        # print(" calling setUpClass()...")
        pass

    def test_integers(self):
        """ aa test_integers-short """
        self.__class__.a = "fun1"
        from cs101courseware_example.homework1 import reverse_list
        self.assertEqual(reverse_list([1, 2, 3]), [3, 2, 1])
        self.assertEqualC(reverse_list([1,2,3]))
        self.assertEqualC(reverse_list(["23", "asdfsadf"]))
        return dict(title="test integers...")

    @cache
    def my_funny_computation(self, a):
        return a*2

    def test_strings(self):
        """ xxxxtest_integers-short """
        # import time
        # time.sleep(1.1)
        a = self.my_funny_computation(2)

        from cs101courseware_example.homework1 import reverse_list
        l =  ["hello", "world", "summer", "dog"]
        self.assertEqual(reverse_list(l), list(reversed(l)))

    def test_more_integerrs(self):
        """ ccc test_integers-short """
        self.assertEqual(2,2)

from src.unitgrade2.unitgrade2 import Report

class Report1(Report):
    title = "CS 202 Report 1"
    questions = [
        # (GeneratorQuestion, 10),
        # (ListQuestion, 5),
        (TestPartial,100),
                ]

    import cs202courseware
    pack_imports = [cs202courseware]  # Include this file in .token file
    a = 234


if __name__ == "__main__":
    """
    Capture output in TestCase
    
    HTML test runner:
    https://awesomeopensource.com/project/oldani/HtmlTestRunner
    
    """
    # import inspect
    # ls = list(methodsWithDecorator(GeneratorQuestion, hide))
    # for f in ls:
    #     print(inspect.getsourcelines(f) ) # How to get all hidden questions.


    from src.unitgrade2 import evaluate_report_student
    # cov = coverage.Coverage()
    # cov.start()

    evaluate_report_student( Report1() )
    from modulefinder import ModuleFinder
    finder = ModuleFinder()
    finder.run_script()
    # unittest.main(verbosity=2)
    # cov.stop()
    # cov.html_report()
    z = 234
    # deploy the report
    # from unitgrade_private2.hidden_create_files import setup_grade_file_report
    # setup_grade_file_report(Report1, minify=False, obfuscate=False, execute=False)