You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
4.7 KiB
161 lines
4.7 KiB
# Copyright (C) Jean-Paul Calderone
|
|
# Copyright (C) Twisted Matrix Laboratories.
|
|
# See LICENSE for details.
|
|
"""
|
|
Helpers for the OpenSSL test suite, largely copied from
|
|
U{Twisted<http://twistedmatrix.com/>}.
|
|
"""
|
|
|
|
from six import PY2
|
|
|
|
|
|
# This is the UTF-8 encoding of the SNOWMAN unicode code point.
|
|
NON_ASCII = b"\xe2\x98\x83".decode("utf-8")
|
|
|
|
|
|
def is_consistent_type(theType, name, *constructionArgs):
|
|
"""
|
|
Perform various assertions about *theType* to ensure that it is a
|
|
well-defined type. This is useful for extension types, where it's
|
|
pretty easy to do something wacky. If something about the type is
|
|
unusual, an exception will be raised.
|
|
|
|
:param theType: The type object about which to make assertions.
|
|
:param name: A string giving the name of the type.
|
|
:param constructionArgs: Positional arguments to use with
|
|
*theType* to create an instance of it.
|
|
"""
|
|
assert theType.__name__ == name
|
|
assert isinstance(theType, type)
|
|
instance = theType(*constructionArgs)
|
|
assert type(instance) is theType
|
|
return True
|
|
|
|
|
|
class EqualityTestsMixin(object):
|
|
"""
|
|
A mixin defining tests for the standard implementation of C{==} and C{!=}.
|
|
"""
|
|
|
|
def anInstance(self):
|
|
"""
|
|
Return an instance of the class under test. Each call to this method
|
|
must return a different object. All objects returned must be equal to
|
|
each other.
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
def anotherInstance(self):
|
|
"""
|
|
Return an instance of the class under test. Each call to this method
|
|
must return a different object. The objects must not be equal to the
|
|
objects returned by C{anInstance}. They may or may not be equal to
|
|
each other (they will not be compared against each other).
|
|
"""
|
|
raise NotImplementedError()
|
|
|
|
def test_identicalEq(self):
|
|
"""
|
|
An object compares equal to itself using the C{==} operator.
|
|
"""
|
|
o = self.anInstance()
|
|
assert o == o
|
|
|
|
def test_identicalNe(self):
|
|
"""
|
|
An object doesn't compare not equal to itself using the C{!=} operator.
|
|
"""
|
|
o = self.anInstance()
|
|
assert not (o != o)
|
|
|
|
def test_sameEq(self):
|
|
"""
|
|
Two objects that are equal to each other compare equal to each other
|
|
using the C{==} operator.
|
|
"""
|
|
a = self.anInstance()
|
|
b = self.anInstance()
|
|
assert a == b
|
|
|
|
def test_sameNe(self):
|
|
"""
|
|
Two objects that are equal to each other do not compare not equal to
|
|
each other using the C{!=} operator.
|
|
"""
|
|
a = self.anInstance()
|
|
b = self.anInstance()
|
|
assert not (a != b)
|
|
|
|
def test_differentEq(self):
|
|
"""
|
|
Two objects that are not equal to each other do not compare equal to
|
|
each other using the C{==} operator.
|
|
"""
|
|
a = self.anInstance()
|
|
b = self.anotherInstance()
|
|
assert not (a == b)
|
|
|
|
def test_differentNe(self):
|
|
"""
|
|
Two objects that are not equal to each other compare not equal to each
|
|
other using the C{!=} operator.
|
|
"""
|
|
a = self.anInstance()
|
|
b = self.anotherInstance()
|
|
assert a != b
|
|
|
|
def test_anotherTypeEq(self):
|
|
"""
|
|
The object does not compare equal to an object of an unrelated type
|
|
(which does not implement the comparison) using the C{==} operator.
|
|
"""
|
|
a = self.anInstance()
|
|
b = object()
|
|
assert not (a == b)
|
|
|
|
def test_anotherTypeNe(self):
|
|
"""
|
|
The object compares not equal to an object of an unrelated type (which
|
|
does not implement the comparison) using the C{!=} operator.
|
|
"""
|
|
a = self.anInstance()
|
|
b = object()
|
|
assert a != b
|
|
|
|
def test_delegatedEq(self):
|
|
"""
|
|
The result of comparison using C{==} is delegated to the right-hand
|
|
operand if it is of an unrelated type.
|
|
"""
|
|
|
|
class Delegate(object):
|
|
def __eq__(self, other):
|
|
# Do something crazy and obvious.
|
|
return [self]
|
|
|
|
a = self.anInstance()
|
|
b = Delegate()
|
|
assert (a == b) == [b]
|
|
|
|
def test_delegateNe(self):
|
|
"""
|
|
The result of comparison using C{!=} is delegated to the right-hand
|
|
operand if it is of an unrelated type.
|
|
"""
|
|
|
|
class Delegate(object):
|
|
def __ne__(self, other):
|
|
# Do something crazy and obvious.
|
|
return [self]
|
|
|
|
a = self.anInstance()
|
|
b = Delegate()
|
|
assert (a != b) == [b]
|
|
|
|
|
|
# The type name expected in warnings about using the wrong string type.
|
|
if PY2:
|
|
WARNING_TYPE_EXPECTED = "unicode"
|
|
else:
|
|
WARNING_TYPE_EXPECTED = "str"
|