class TestProgressState(unittest.TestCase):

    sut = None

    def setUp(self):
        self.sut = ProgressState()
        self.p = 0.0

    def test_declare_task(self):
        r = self.sut.declare_task()
        self.assertEqual(r, 1)

    def test_subtask_check_standard_weights(self):
        r = self.sut.declare_task()

        a = self.sut.declare_task(r)
        b = self.sut.declare_task(r)
        c = self.sut.declare_task(r)

        aa = self.sut.declare_task(a)
        ab = self.sut.declare_task(a)
        ac = self.sut.declare_task(a)

        ca = self.sut.declare_task(c)
        cb = self.sut.declare_task(c)

        self.sut.set_task_done(ca)
        self.assertEqual(self.sut.get_progress(), 1./6.)

        self.sut.set_task_done(ab)
        self.assertEqual(self.sut.get_progress(), 1./6. + 1./9.)
        

    def test_subtask_check_custom_weights(self):
        r = self.sut.declare_task()

        a = self.sut.declare_task(r, 1)
        b = self.sut.declare_task(r, 1)
        c = self.sut.declare_task(r, 1)

        aa = self.sut.declare_task(a, 1)
        ab = self.sut.declare_task(a, 1)
        ac = self.sut.declare_task(a, 2)

        self.sut.set_task_done(ac)
        self.assertEqual(self.sut.get_progress(), 1./3.*1./2.)


    def test_subtask_check_never_come_back(self):
        r = self.sut.declare_task()

        a = self.sut.declare_task(r, 1)
        b = self.sut.declare_task(r, 1)
        c = self.sut.declare_task(r, 1)

        self.sut.set_task_done(a)
        self.sut.set_task_progress(b, 0.5)
        self.assertEqual(self.sut.get_progress(), 1./3 + 1./6)

        # Decrease task b progress:
        self.sut.set_task_progress(b, 0.1)

        # Result must not be decreased:
        self.assertEqual(self.sut.get_progress(), 1./3 + 1./6)
 def setUp(self):
     self.sut = ProgressState()
     self.p = 0.0