# 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."""
