# Copyright 2013 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This module defines the common mock tasks used by various unit tests.

Part of the Chrome build flags optimization.
"""

__author__ = "yuhenglong@google.com (Yuheng Long)"

# Pick an integer at random.
POISONPILL = 975


class MockTask(object):
    """This class emulates an actual task.

    It does not do the actual work, but simply returns the result as given when
    this task is constructed.
    """

    def __init__(self, stage, identifier, cost=0):
        """Set up the results for this task.

        Args:
          stage: the stage of this test is in.
          identifier: the identifier of this task.
          cost: the mock cost of this task.

          The _cost field stored the cost. Once this task is performed, i.e., by
          calling the work method or by setting the result from other task, the
          _cost field will have this cost. The stage field verifies that the module
          being tested and the unitest are in the same stage. If the unitest does
          not care about cost of this task, the cost parameter should be leaved
          blank.
        """

        self._identifier = identifier
        self._cost = cost
        self._stage = stage

        # Indicate that this method has not been performed yet.
        self._performed = False

    def __eq__(self, other):
        if isinstance(other, MockTask):
            return self._identifier == other.GetIdentifier(
                self._stage
            ) and self._cost == other.GetResult(self._stage)
        return False

    def GetIdentifier(self, stage):
        assert stage == self._stage
        return self._identifier

    def SetResult(self, stage, cost):
        assert stage == self._stage
        self._cost = cost
        self._performed = True

    def Work(self, stage):
        assert stage == self._stage
        self._performed = True

    def GetResult(self, stage):
        assert stage == self._stage
        return self._cost

    def Done(self, stage):
        """Indicates whether the task has been performed."""

        assert stage == self._stage
        return self._performed

    def LogSteeringCost(self):
        pass


class IdentifierMockTask(MockTask):
    """This class defines the mock task that does not consider the cost.

    The task instances will be inserted into a set. Therefore the hash and the
    equal methods are overridden. The unittests that compares identities of the
    tasks for equality can use this mock task instead of the base mock tack.
    """

    def __hash__(self):
        return self._identifier

    def __eq__(self, other):
        if isinstance(other, MockTask):
            return self._identifier == other.GetIdentifier(self._stage)
        return False
