summaryrefslogtreecommitdiff
path: root/Mailman/testing/test_enum.py
blob: a8c389bb408a858f8151357c86884928ecd460d1 (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
# Copyright (C) 2007 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.

"""Unit tests for Enums."""

import operator
import unittest

from Mailman.enum import Enum



class Colors(Enum):
    red     = 1
    green   = 2
    blue    = 3


class MoreColors(Colors):
    pink    = 4
    cyan    = 5


class OtherColors(Enum):
    red     = 1
    blue    = 2
    yellow  = 3



class TestEnum(unittest.TestCase):
    def test_enum_basics(self):
        unless = self.failUnless
        raises = self.assertRaises
        # Cannot compare by equality
        raises(NotImplementedError, operator.eq, Colors.red, Colors.red)
        raises(NotImplementedError, operator.ne, Colors.red, Colors.red)
        raises(NotImplementedError, operator.lt, Colors.red, Colors.red)
        raises(NotImplementedError, operator.gt, Colors.red, Colors.red)
        raises(NotImplementedError, operator.le, Colors.red, Colors.red)
        raises(NotImplementedError, operator.ge, Colors.red, Colors.red)
        raises(NotImplementedError, operator.eq, Colors.red, 1)
        raises(NotImplementedError, operator.ne, Colors.red, 1)
        raises(NotImplementedError, operator.lt, Colors.red, 1)
        raises(NotImplementedError, operator.gt, Colors.red, 1)
        raises(NotImplementedError, operator.le, Colors.red, 1)
        raises(NotImplementedError, operator.ge, Colors.red, 1)
        # Comparison by identity
        unless(Colors.red is Colors.red)
        unless(Colors.red is MoreColors.red)
        unless(Colors.red is not OtherColors.red)
        unless(Colors.red is not Colors.blue)

    def test_enum_conversions(self):
        eq = self.assertEqual
        unless = self.failUnless
        raises = self.assertRaises
        unless(Colors.red is Colors['red'])
        unless(Colors.red is Colors[1])
        unless(Colors.red is Colors('red'))
        unless(Colors.red is Colors(1))
        unless(Colors.red is not Colors['blue'])
        unless(Colors.red is not Colors[2])
        unless(Colors.red is not Colors('blue'))
        unless(Colors.red is not Colors(2))
        unless(Colors.red is MoreColors['red'])
        unless(Colors.red is MoreColors[1])
        unless(Colors.red is MoreColors('red'))
        unless(Colors.red is MoreColors(1))
        unless(Colors.red is not OtherColors['red'])
        unless(Colors.red is not OtherColors[1])
        unless(Colors.red is not OtherColors('red'))
        unless(Colors.red is not OtherColors(1))
        raises(ValueError, Colors.__getitem__, 'magenta')
        raises(ValueError, Colors.__getitem__, 99)
        raises(ValueError, Colors.__call__, 'magenta')
        raises(ValueError, Colors.__call__, 99)
        eq(int(Colors.red), 1)
        eq(int(Colors.blue), 3)
        eq(int(MoreColors.red), 1)
        eq(int(OtherColors.blue), 2)

    def test_enum_duplicates(self):
        try:
            # This is bad because kyle and kenny have the same integer value.
            class Bad(Enum):
                cartman = 1
                stan    = 2
                kyle    = 3
                kenny   = 3
                butters = 4
        except TypeError:
            got_error = True
        else:
            got_error = False
        self.failUnless(got_error)

    def test_enum_iteration(self):
        eq = self.assertEqual
        # Iteration sorts on the int value of the enum
        values = [str(v) for v in MoreColors]
        eq(values, ['red', 'green', 'blue', 'pink', 'cyan'])
        values = [int(v) for v in MoreColors]
        eq(values, [1, 2, 3, 4, 5])



def test_suite():
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(TestEnum))
    return suite