# Copyright (c) 2013 The ChromiumOS Authors. All rights reserved.
# 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
