summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gerard DeRose <jderose@redhat.com>2008-08-28 04:54:48 +0000
committerJason Gerard DeRose <jderose@redhat.com>2008-08-28 04:54:48 +0000
commitb865b30511316f2874de6c95b648e6f653f5a46c (patch)
treea9558a12c455987995dc39ac84dd7d31c79d4af1
parentd121a729aa1b0e97dcf927bfc66eb86a73529863 (diff)
downloadfreeipa.git-b865b30511316f2874de6c95b648e6f653f5a46c.tar.gz
freeipa.git-b865b30511316f2874de6c95b648e6f653f5a46c.tar.xz
freeipa.git-b865b30511316f2874de6c95b648e6f653f5a46c.zip
213: Added ipa_type.Bool class; added corresponding unit tests
-rw-r--r--ipalib/ipa_types.py22
-rw-r--r--ipalib/tests/test_ipa_types.py39
2 files changed, 61 insertions, 0 deletions
diff --git a/ipalib/ipa_types.py b/ipalib/ipa_types.py
index fe35a9ac..ff62af22 100644
--- a/ipalib/ipa_types.py
+++ b/ipalib/ipa_types.py
@@ -81,6 +81,28 @@ class Type(ReadOnly):
return self.convert(value)
+class Bool(Type):
+ def __init__(self, true='Yes', false='No'):
+ if true is None:
+ raise TypeError('`true` cannot be None')
+ if false is None:
+ raise TypeError('`false` cannot be None')
+ if true == false:
+ raise ValueError(
+ 'cannot be equal: true=%r, false=%r' % (true, false)
+ )
+ self.true = true
+ self.false = false
+ super(Bool, self).__init__(bool)
+
+ def convert(self, value):
+ if value == self.true:
+ return True
+ if value == self.false:
+ return False
+ return None
+
+
class Int(Type):
def __init__(self, min_value=None, max_value=None):
check_min_max(min_value, max_value, 'min_value', 'max_value')
diff --git a/ipalib/tests/test_ipa_types.py b/ipalib/tests/test_ipa_types.py
index f594aabf..37546d9e 100644
--- a/ipalib/tests/test_ipa_types.py
+++ b/ipalib/tests/test_ipa_types.py
@@ -88,6 +88,45 @@ class test_Type(ClassChecker):
assert str(e) == 'not an allowed type: %r' % t
+class test_Bool(ClassChecker):
+ _cls = ipa_types.Bool
+
+ def test_class(self):
+ assert self.cls.__bases__ == (ipa_types.Type,)
+
+ def test_init(self):
+ o = self.cls()
+ assert o.__islocked__() is True
+ assert read_only(o, 'type') is bool
+ assert read_only(o, 'name') == 'Bool'
+ assert read_only(o, 'true') == 'Yes'
+ assert read_only(o, 'false') == 'No'
+
+ keys = ('true', 'false')
+ val = 'some value'
+ for key in keys:
+ # Check that kwarg sets appropriate attribute:
+ o = self.cls(**{key: val})
+ assert read_only(o, key) is val
+ # Check that None raises TypeError:
+ e = raises(TypeError, self.cls, **{key: None})
+ assert str(e) == '`%s` cannot be None' % key
+
+ # Check that ValueError is raise if true == false:
+ e = raises(ValueError, self.cls, true=1L, false=1.0)
+ assert str(e) == 'cannot be equal: true=1L, false=1.0'
+
+ def test_call(self):
+ o = self.cls()
+ assert o(True) is True
+ assert o('Yes') is True
+ assert o(False) is False
+ assert o('No') is False
+ for value in (0, 1, 'True', 'False', 'yes', 'no'):
+ # value is not be converted, so None is returned
+ assert o(value) is None
+
+
class test_Int(ClassChecker):
_cls = ipa_types.Int