SKIP and NOTRUN are changed to a special class that when compared with =<, <, >, or >= will always return False. This is because we want to consider NOTRUN <-> * and SKIP <-> * as not regressions or fixes, instead we want to catch them and add them to special enabled and disabled lists.
Signed-off-by: Dylan Baker <[email protected]> --- framework/status.py | 57 +++++++++++++++++++++++++++++++++-------- framework/tests/status_tests.py | 17 ++++++++++++ 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/framework/status.py b/framework/status.py index d5e6b63..bb7c594 100644 --- a/framework/status.py +++ b/framework/status.py @@ -44,13 +44,14 @@ crash timeout SKIP and NOTRUN are not factored into regressions and fixes, they are counted -seperately. +seperately. They also derive from a sublcass of Status, which always returns +False The formula for determining regressions is: - max(PASS, old_status) < new_status + old_status < new_status The formula for determining fixes is: - max(PASS, old_status) > new_status + old_status > new_status """ @@ -125,6 +126,7 @@ class Status(object): __slots__ = ['__name', '__value', '__fraction'] def __init__(self, name, value, fraction=(0, 1)): + assert isinstance(value, int), type(value) # The object is immutable, so calling self.foo = foo will raise a # TypeError. Using setattr from the parrent object works around this. self.__name = name @@ -183,18 +185,51 @@ class Status(object): return self.value -NOTRUN = Status('Not Run', 0, (0, 0)) +class NoChangeStatus(Status): + """ Special sublcass of status that overides rich comparison methods -SKIP = Status('skip', 10, (0, 0)) + This special class of a Status is for use with NOTRUN and SKIP, it never + returns that it is a pass or regression -PASS = Status('pass', 20, (1, 1)) + """ + def __init__(self, name, value=0, fraction=(0, 0)): + super(NoChangeStatus, self).__init__(name, value, fraction) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + if isinstance(other, (str, unicode, Status)): + return unicode(self) == unicode(other) + raise TypeError("Cannot compare type: {}".format(type(other))) + + def __ne__(self, other): + if isinstance(other, (str, unicode, Status)): + return unicode(self) != unicode(other) + raise TypeError("Cannot compare type: {}".format(type(other))) + + def __ge__(self, other): + return False + + def __gt__(self, other): + return False + + +NOTRUN = NoChangeStatus('Not Run') + +SKIP = NoChangeStatus('skip') + +PASS = Status('pass', 0, (1, 1)) -DMESG_WARN = Status('dmesg-warn', 30) +DMESG_WARN = Status('dmesg-warn', 10) -WARN = Status('warn', 40) +WARN = Status('warn', 20) -DMESG_FAIL = Status('dmesg-fail', 50) +DMESG_FAIL = Status('dmesg-fail', 30) -FAIL = Status('fail', 60) +FAIL = Status('fail', 40) -CRASH = Status('crash', 70) +CRASH = Status('crash', 50) diff --git a/framework/tests/status_tests.py b/framework/tests/status_tests.py index 8ba11aa..ad0630a 100644 --- a/framework/tests/status_tests.py +++ b/framework/tests/status_tests.py @@ -48,6 +48,17 @@ def initialize_status(): assert test +def initialize_nochangestatus(): + """ NoChangeStatus initializes """ + nc = status.NoChangeStatus('test') + assert nc + + +def compare_status_nochangestatus(): + """ Status and NoChangeStatus can be compared with < """ + status.CRASH < status.PASS + + def check_lookup(stat): """ Lookup a status """ stt = status.status_lookup(stat) @@ -140,3 +151,9 @@ def test_not_change(): yieldable.description = "{0} -> {1} should not be a change".format( nochange, stat) yield yieldable, status.status_lookup(nochange), status.status_lookup(stat) + + +def test_compare_statuses(): + """ Compare NOTRUN -> PASS returns false """ + nt.assert_equal(False, status.NOTRUN < status.PASS, + msg="NOTRUN -> PASS returned True but should return False") -- 1.9.0 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
