def __init__(self, msg=None):
        TaskContainer.__init__(self, msg)

        # add some children
        self.add_task(StandaloneTask("child 1"))
        self.add_task(StandaloneTask("child 2"))
        self.add_task(StandaloneTask("child 3"))
    def test_status_all_subtask_complete(self):
        """
        Tests for TaskContainer that has all complete subtasks
        """
        task1 = StatusSimulatingTaskProxy()
        task2 = StatusSimulatingTaskProxy()

        ctask = TaskContainer("tester")
        ctask.add_task(task1)
        ctask.add_task(task2)

        self.verify_status(STATUS_COMPLETE, STATUS_COMPLETE, STATUS_COMPLETE, ctask)
    def test_status_not_started(self):
        """
        Test status for container task that has no started subtasks
        """
        task1 = StatusSimulatingTaskProxy()
        task2 = StatusSimulatingTaskProxy()

        ctask = TaskContainer("tester")
        ctask.add_task(task1)
        ctask.add_task(task2)

        self.verify_status(STATUS_STOPPED, STATUS_STOPPED, STATUS_STOPPED, ctask)
    def test_sequential_work(self):
        """
        Tests for verifying TaskContainer iterates through subtasks correctly 
        when run in sequential mode
        """
        task1 = StartupAndWaitTask()
        task2 = StartupAndWaitTask()

        ctask = TaskContainer("tester")
        ctask.parent = WorkerProxy()
        ctask.add_task(task1)
        ctask.add_task(task2)
        return threads.deferToThread(self.verify_sequential_work, task=ctask)
    def test_progress_auto_weighting(self):
        """
        Tests TaskContainer.progress() with auto weighting on all subtasks
        """
        task1 = StatusSimulatingTaskProxy()
        task2 = StatusSimulatingTaskProxy()

        ctask = TaskContainer("tester")
        ctask.add_task(task1)
        ctask.add_task(task2)

        self.assertEqual(ctask.progress(), 0, "Both task progresses are zero, container progress should be zero")

        task1.value = 50
        self.assertEqual(
            ctask.progress(), 25, "Values are [50,0] with auto weighting, container progress should be 25%"
        )

        task1.value = 100
        self.assertEqual(
            ctask.progress(), 50, "Values are [100,0] with auto weighting, container progress should be 50%"
        )

        task2.value = 50
        self.assertEqual(
            ctask.progress(), 75, "Values are [100,50] with auto weighting, container progress should be 75%"
        )

        task2.value = 100
        self.assertEqual(
            ctask.progress(), 100, "Values are [100,100] with auto weighting, container progress should be 100%"
        )
    def test_progress_when_status_is_completed(self):
        """
        Tests TaskContainer.progress when the tasks have STATUS_COMPLETE
        set as their status
        """
        task1 = StatusSimulatingTaskProxy()
        task2 = StatusSimulatingTaskProxy()

        task1._status = STATUS_COMPLETE
        task2._status = STATUS_COMPLETE

        ctask = TaskContainer("tester")
        ctask.add_task(task1)
        ctask.add_task(task2)

        self.assertEqual(ctask.progress(), 100, "Container task should report 100 because status is STATUS_COMPLETE")
    def test_status_any_subtask_paused(self):
        """
        Tests for TaskContainer that has any paused subtasks
        """
        task1 = StatusSimulatingTaskProxy()
        task2 = StatusSimulatingTaskProxy()

        ctask = TaskContainer("tester")
        ctask.add_task(task1)
        ctask.add_task(task2)

        self.verify_status(STATUS_PAUSED, STATUS_STOPPED, STATUS_PAUSED, ctask)
        self.verify_status(STATUS_STOPPED, STATUS_PAUSED, STATUS_PAUSED, ctask)

        self.verify_status(STATUS_COMPLETE, STATUS_PAUSED, STATUS_PAUSED, ctask)
        self.verify_status(STATUS_PAUSED, STATUS_COMPLETE, STATUS_PAUSED, ctask)

        self.verify_status(STATUS_PAUSED, STATUS_RUNNING, STATUS_RUNNING, ctask)
        self.verify_status(STATUS_RUNNING, STATUS_PAUSED, STATUS_RUNNING, ctask)
    def test_progress_with_one_weighted(self):
        """
        Tests TaskContainer.progress() with manual weighting on only 1 subtask
        """
        task1 = StatusSimulatingTaskProxy()
        task2 = StatusSimulatingTaskProxy()

        ctask = TaskContainer("tester")
        ctask.add_task(task1, 80)
        ctask.add_task(task2)

        self.assertEqual(ctask.progress(), 0, "Both task progresses are zero, container progress should be zero")

        task1.value = 50
        self.assertEqual(
            ctask.progress(),
            40,
            "Values are [50,0] with manual weighting 80% on task 1, container progress should be 40%",
        )

        task1.value = 100
        self.assertEqual(
            ctask.progress(),
            80,
            "Values are [100,0] with manual weighting 80% on task 1, container progress should be 80%",
        )

        task2.value = 50
        self.assertEqual(
            ctask.progress(),
            90,
            "Values are [100,50] with manual weighting 80% on task 1, container progress should be 90%",
        )

        task2.value = 100
        self.assertEqual(
            ctask.progress(),
            100,
            "Values are [100,100] with manual weighting 80% on task 1, container progress should be 100%",
        )
    def test_progress_with_one_weighted_multiple_auto(self):
        """
        Tests TaskContainer.progress() with manual weighting on only 1 subtask
        and multiple subtasks with automatic rating
        """
        task1 = StatusSimulatingTaskProxy()
        task2 = StatusSimulatingTaskProxy()
        task3 = StatusSimulatingTaskProxy()

        ctask = TaskContainer("tester")
        ctask.add_task(task1, 80)
        ctask.add_task(task2)  # should default to 10% of the overall progress
        ctask.add_task(task3)  # should default to 10% of the overall progress

        self.assertEqual(ctask.progress(), 0, "Both task progresses are zero, container progress should be zero")

        task1.value = 50
        self.assertEqual(
            ctask.progress(),
            40,
            "Values are [50,0,0] with manual weighting 80% on task 1, container progress should be 40%",
        )

        task1.value = 100
        self.assertEqual(
            ctask.progress(),
            80,
            "Values are [100,0,0] with manual weighting 80% on task 1, container progress should be 80%",
        )

        task2.value = 50
        self.assertEqual(
            ctask.progress(),
            85,
            "Values are [100,50,0] with manual weighting 80% on task 1, container progress should be 85%",
        )

        task2.value = 100
        self.assertEqual(
            ctask.progress(),
            90,
            "Values are [100,100,0] with manual weighting 80% on task 1, container progress should be 90%",
        )

        task3.value = 50
        self.assertEqual(
            ctask.progress(),
            95,
            "Values are [100,100,50] with manual weighting 80% on task 1, container progress should be 95%",
        )

        task3.value = 100
        self.assertEqual(
            ctask.progress(),
            100,
            "Values are [100,100,100] with manual weighting 80% on task 1, container progress should be 100%",
        )