# 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().__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."""
