# Copyright 2016 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""This module is where all the test signal classes and related utilities live.
"""

import json


class TestSignalError(Exception):
  """Raised when an error occurs inside a test signal."""


class TestSignal(Exception):
  """Base class for all test result control signals. This is used to signal
  the result of a test.

  Attributes:
    details: A string that describes the reason for raising this signal.
    extras: A json-serializable data type to convey extra information about
      a test result.
  """

  def __init__(self, details, extras=None):
    super(TestSignal, self).__init__(details)
    self.details = details
    try:
      json.dumps(extras)
      self.extras = extras
    except TypeError:
      raise TestSignalError('Extras must be json serializable. %s '
                            'is not.' % extras)

  def __str__(self):
    return 'Details=%s, Extras=%s' % (self.details, self.extras)


class TestError(TestSignal):
  """Raised when a test has an unexpected error."""


class TestFailure(TestSignal):
  """Raised when a test has failed."""


class TestPass(TestSignal):
  """Raised when a test has passed."""


class TestSkip(TestSignal):
  """Raised when a test has been skipped."""


class TestAbortSignal(TestSignal):
  """Base class for abort signals.
  """


class TestAbortClass(TestAbortSignal):
  """Raised when all subsequent tests within the same test class should
  be aborted.
  """


class TestAbortAll(TestAbortSignal):
  """Raised when all subsequent tests should be aborted."""


class ControllerError(Exception):
  """Raised when an error occurred in controller classes."""
