summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
authorJason Gerard DeRose <jderose@redhat.com>2008-08-28 06:56:45 +0000
committerJason Gerard DeRose <jderose@redhat.com>2008-08-28 06:56:45 +0000
commitc83c478ae17991391ad5431062dd987ea5640469 (patch)
tree65a715884f33b1b185a10c88cf7195bf2c0a423a /ipalib
parent07ac867ed39b9539c4667bf51ef32778e5fb01df (diff)
downloadfreeipa.git-c83c478ae17991391ad5431062dd987ea5640469.tar.gz
freeipa.git-c83c478ae17991391ad5431062dd987ea5640469.tar.xz
freeipa.git-c83c478ae17991391ad5431062dd987ea5640469.zip
215: Added basics of ipa_types.Enum class; added corresponding unit tests
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/ipa_types.py16
-rw-r--r--ipalib/tests/test_ipa_types.py31
2 files changed, 47 insertions, 0 deletions
diff --git a/ipalib/ipa_types.py b/ipalib/ipa_types.py
index 670c4dd6..19950ead 100644
--- a/ipalib/ipa_types.py
+++ b/ipalib/ipa_types.py
@@ -155,3 +155,19 @@ class Unicode(Type):
if self.max_length is not None and len(value) > self.max_length:
return 'Can be at most %d characters long' % self.max_length
+
+
+class Enum(Type):
+ def __init__(self, *values):
+ if len(values) < 1:
+ raise ValueError('%s requires at least one value' % self.name)
+ type_ = type(values[0])
+ if type_ not in (unicode, int, float):
+ raise TypeError(
+ '%r: %r not unicode, int, nor float' % (values[0], type_)
+ )
+ for val in values[1:]:
+ if type(val) is not type_:
+ raise TypeError('%r: %r is not %r' % (val, type(val), type_))
+ self.values = values
+ super(Enum, self).__init__(type_)
diff --git a/ipalib/tests/test_ipa_types.py b/ipalib/tests/test_ipa_types.py
index 5d31b844..6ae94c41 100644
--- a/ipalib/tests/test_ipa_types.py
+++ b/ipalib/tests/test_ipa_types.py
@@ -331,3 +331,34 @@ class test_Unicode(ClassChecker):
assert o.validate(u'a___b') == 'Can be at most 4 characters long'
assert o.validate(u'a-b') == 'Must match %r' % pat
assert o.validate(u'a--b') == 'Must match %r' % pat
+
+
+class test_Enum(ClassChecker):
+ _cls = ipa_types.Enum
+
+ def test_class(self):
+ assert self.cls.__bases__ == (ipa_types.Type,)
+
+ def test_init(self):
+ for t in (unicode, int, float):
+ vals = (t(1),)
+ o = self.cls(*vals)
+ assert o.__islocked__() is True
+ assert read_only(o, 'type') is t
+ assert read_only(o, 'name') is 'Enum'
+ assert read_only(o, 'values') == vals
+
+ # Check that ValueError is raised when no values are given:
+ e = raises(ValueError, self.cls)
+ assert str(e) == 'Enum requires at least one value'
+
+ # Check that TypeError is raised when type of first value is not
+ # allowed:
+ e = raises(TypeError, self.cls, 'hello')
+ assert str(e) == '%r: %r not unicode, int, nor float' % ('hello', str)
+ #self.cls('hello')
+
+ # Check that TypeError is raised when subsequent values aren't same
+ # type as first:
+ e = raises(TypeError, self.cls, u'hello', 'world')
+ assert str(e) == '%r: %r is not %r' % ('world', str, unicode)