summaryrefslogtreecommitdiff
path: root/tests/test_serial.py
blob: 8e6c43968c313216cfc8acbd11a4cd1dc98a7294 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license

import unittest

import dns.serial


def S2(v):
    return dns.serial.Serial(v, bits=2)


def S8(v):
    return dns.serial.Serial(v, bits=8)


class SerialTestCase(unittest.TestCase):
    def test_rfc_1982_2_bit_cases(self):
        self.assertEqual(S2(0) + S2(1), S2(1))
        self.assertEqual(S2(1) + S2(1), S2(2))
        self.assertEqual(S2(2) + S2(1), S2(3))
        self.assertEqual(S2(3) + S2(1), S2(0))
        self.assertTrue(S2(1) > S2(0))
        self.assertTrue(S2(2) > S2(1))
        self.assertTrue(S2(3) > S2(2))
        self.assertTrue(S2(0) > S2(3))
        self.assertFalse(S2(2) > S2(0))
        self.assertFalse(S2(0) > S2(2))
        self.assertFalse(S2(2) < S2(0))
        self.assertFalse(S2(0) < S2(2))

    def test_rfc_1982_8_bit_cases(self):
        self.assertEqual(S8(255) + S8(1), S8(0))
        self.assertEqual(S8(100) + S8(100), S8(200))
        self.assertEqual(S8(200) + S8(100), S8(44))
        self.assertTrue(S8(1) > S8(0))
        self.assertTrue(S8(44) > S8(0))
        self.assertTrue(S8(100) > S8(0))
        self.assertTrue(S8(100) > S8(44))
        self.assertTrue(S8(200) > S8(100))
        self.assertTrue(S8(255) > S8(200))
        self.assertTrue(S8(0) > S8(255))
        self.assertTrue(S8(255) < S8(0))
        self.assertTrue(S8(100) > S8(255))
        self.assertTrue(S8(0) > S8(200))
        self.assertTrue(S8(44) > S8(200))
        self.assertFalse(S8(0) > S8(128))
        self.assertFalse(S8(128) > S8(0))
        self.assertFalse(S8(0) < S8(128))
        self.assertFalse(S8(128) < S8(0))
        self.assertFalse(S8(1) > S8(129))
        self.assertFalse(S8(129) > S8(1))

    def test_incremental_ops(self):
        v = S8(255)
        v += 1
        self.assertEqual(v, 0)
        v = S8(255)
        v += S8(1)
        self.assertEqual(v, 0)
        v = S8(0)
        v -= 1
        self.assertEqual(v, 255)
        v = S8(0)
        v -= S8(1)
        self.assertEqual(v, 255)

    def test_sub(self):
        self.assertEqual(S8(0) - S8(1), S8(255))

    def test_addition_bounds(self):
        self.assertRaises(ValueError, lambda: S8(0) + 128)
        self.assertRaises(ValueError, lambda: S8(0) - 128)

        def bad1():
            v = S8(0)
            v += 128

        self.assertRaises(ValueError, bad1)

        def bad2():
            v = S8(0)
            v -= 128

        self.assertRaises(ValueError, bad2)

    def test_casting(self):
        self.assertTrue(S8(0) == 0)
        self.assertTrue(S8(0) != 1)
        self.assertTrue(S8(0) < 1)
        self.assertTrue(S8(0) <= 1)
        self.assertTrue(S8(0) > 255)
        self.assertTrue(S8(0) >= 255)

    def test_uncastable(self):
        self.assertRaises(ValueError, lambda: S8(0) + "a")
        self.assertRaises(ValueError, lambda: S8(0) - "a")

        def bad1():
            v = S8(0)
            v += "a"

        self.assertRaises(ValueError, bad1)

        def bad2():
            v = S8(0)
            v -= "a"

        self.assertRaises(ValueError, bad2)

    def test_uncomparable(self):
        self.assertFalse(S8(0) == S2(0))
        self.assertFalse(S8(0) == "a")
        self.assertTrue(S8(0) != "a")
        self.assertRaises(TypeError, lambda: S8(0) < "a")
        self.assertRaises(TypeError, lambda: S8(0) <= "a")
        self.assertRaises(TypeError, lambda: S8(0) > "a")
        self.assertRaises(TypeError, lambda: S8(0) >= "a")

    def test_modulo(self):
        self.assertEqual(S8(-1), 255)
        self.assertEqual(S8(257), 1)

    def test_repr(self):
        self.assertEqual(repr(S8(1)), "dns.serial.Serial(1, 8)")

    def test_not_equal(self):
        self.assertNotEqual(S8(0), S8(1))
        self.assertNotEqual(S8(0), S2(0))