VERSION | 2 +- pyderasn.py | 31 +++++++++++++++++++++++-------- tests/test_pyderasn.py | 28 ++++++++++++++++++++++++++++ diff --git a/VERSION b/VERSION index b356b4eb9f710c5a9a6e8a6f3f1c8adba4ba8a1dcf1e9c1b8eda995a468e6d65..91ba13a0a9e06e15614e39ca55384ac58927378936352e477f595e722d856632 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1 +1.2 diff --git a/pyderasn.py b/pyderasn.py index 755cd2f20fb2ba96670f301249e326a89cf2c1537699b0567c43dee714d94ff8..3e50e027ca98ca02eb9038ff460a9b13dcba0e7306f6e6bdf1a170d83d858ecd 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -735,6 +735,24 @@ def __str__(self): # pragma: no cover return self.__bytes__() if PY2 else self.__unicode__() + def __eq__(self, their): # pragma: no cover + raise NotImplementedError() + + def __ne__(self, their): + return not(self == their) + + def __lt__(self, their): # pragma: no cover + raise NotImplementedError() + + def __gt__(self, their): # pragma: no cover + return not(self < their) + + def __le__(self, their): # pragma: no cover + return (self == their) or (self < their) + + def __ge__(self, their): # pragma: no cover + return (self == their) or (self > their) + def _encode(self): # pragma: no cover raise NotImplementedError() @@ -1327,10 +1345,7 @@ self._expl == their._expl ) def __lt__(self, their): - return self._value < their - - def __gt__(self, their): - return self._value > their + return self._value < their._value @property def named(self): @@ -1946,6 +1961,9 @@ self.tag == their.tag and self._expl == their._expl ) + def __lt__(self, their): + return self._value < their._value + def __call__( self, value=None, @@ -2313,10 +2331,7 @@ self._value == their._value ) def __lt__(self, their): - return self._value < their - - def __gt__(self, their): - return self._value > their + return self._value < their._value def __call__( self, diff --git a/tests/test_pyderasn.py b/tests/test_pyderasn.py index bece4639f5769574d34da2213245f997579e51174a305456b854b5fa8a10863a..7a59d28abc75bf6c9a6d3d0d12b55a2ceb90e396e5744e2ee3a6e58d19ee7362 100644 --- a/tests/test_pyderasn.py +++ b/tests/test_pyderasn.py @@ -372,10 +372,12 @@ for klass in (Boolean, BooleanInherited): obj1 = klass(value1) obj2 = klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == bool(obj2), value1 == value2) obj1 = klass(value1, impl=tag1) obj2 = klass(value1, impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) @given(data_strategy()) def test_call(self, d): @@ -677,10 +679,12 @@ for klass in (Integer, IntegerInherited): obj1 = klass(value1) obj2 = klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == int(obj2), value1 == value2) obj1 = klass(value1, impl=tag1) obj2 = klass(value1, impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) @given(lists(integers())) def test_sorted_works(self, values): @@ -1129,10 +1133,12 @@ for klass in (BitString, BitStringInherited): obj1 = klass(value1) obj2 = klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == bytes(obj2), value1[1] == value2[1]) obj1 = klass(value1, impl=tag1) obj2 = klass(value1, impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) @given(data_strategy()) def test_call(self, d): @@ -1434,10 +1440,19 @@ for klass in (OctetString, OctetStringInherited): obj1 = klass(value1) obj2 = klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == bytes(obj2), value1 == value2) obj1 = klass(value1, impl=tag1) obj2 = klass(value1, impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) + + @given(lists(binary())) + def test_sorted_works(self, values): + self.assertSequenceEqual( + [bytes(v) for v in sorted(OctetString(v) for v in values)], + sorted(values), + ) @given(data_strategy()) def test_bounds_satisfied(self, d): @@ -1698,6 +1713,7 @@ for klass in (Null, NullInherited): obj1 = klass(impl=tag1) obj2 = klass(impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) self.assertNotEqual(obj1, tag2) @given(data_strategy()) @@ -1910,11 +1926,13 @@ for klass in (ObjectIdentifier, ObjectIdentifierInherited): obj1 = klass(value1) obj2 = klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == tuple(obj2), value1 == value2) self.assertEqual(str(obj1) == str(obj2), value1 == value2) obj1 = klass(value1, impl=tag1) obj2 = klass(value1, impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) @given(lists(oid_strategy())) def test_sorted_works(self, values): @@ -2272,10 +2290,12 @@ for klass in (E, EInherited): obj1 = klass(value1) obj2 = klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == int(obj2), value1 == value2) obj1 = klass(value1, impl=tag1) obj2 = klass(value1, impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) @given(data_strategy()) def test_call(self, d): @@ -2486,11 +2506,13 @@ tag2 = d.draw(binary()) obj1 = self.base_klass(value1) obj2 = self.base_klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == bytes(obj2), value1 == value2) self.assertEqual(obj1 == text_type(obj2), value1 == value2) obj1 = self.base_klass(value1, impl=tag1) obj2 = self.base_klass(value1, impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) @given(data_strategy()) def test_bounds_satisfied(self, d): @@ -2846,11 +2868,13 @@ value2 = value2.replace(microsecond=0) obj1 = self.base_klass(value1) obj2 = self.base_klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == obj2.todatetime(), value1 == value2) self.assertEqual(obj1 == bytes(obj2), value1 == value2) obj1 = self.base_klass(value1, impl=tag1) obj2 = self.base_klass(value1, impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) @given(data_strategy()) def test_call(self, d): @@ -3173,6 +3197,7 @@ for klass in (Any, AnyInherited): obj1 = klass(value1) obj2 = klass(value2) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == bytes(obj2), value1 == value2) @given(data_strategy()) @@ -3412,6 +3437,7 @@ for klass in (self.base_klass, WahlInherited): obj1 = klass(("whatever", Boolean(value1))) obj2 = klass(("whatever", Boolean(value2))) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == obj2._value, value1 == value2) self.assertFalse(obj1 == obj2._value[1]) @@ -4270,11 +4296,13 @@ schema = Boolean() obj1 = SeqOf([Boolean(value1)]) obj2 = SeqOf([Boolean(value2)]) self.assertEqual(obj1 == obj2, value1 == value2) + self.assertEqual(obj1 != obj2, value1 != value2) self.assertEqual(obj1 == list(obj2), value1 == value2) self.assertEqual(obj1 == tuple(obj2), value1 == value2) obj1 = SeqOf([Boolean(value1)], impl=tag1) obj2 = SeqOf([Boolean(value1)], impl=tag2) self.assertEqual(obj1 == obj2, tag1 == tag2) + self.assertEqual(obj1 != obj2, tag1 != tag2) @given(lists(booleans())) def test_iter(self, values):