Reading INT parameter class should respect radix prefix

This modifies the original patch by including a unit test, handling floats
when passed as unicode, and handling large magnitude values beyond maxint.

The INT parameter class was not respecting any radix prefix (e.g. 0x) the user
may have supplied. This patch implements _convert_scalar method for the Int
class so that we can pass the special radix base of zero to the int constructor
telling it to determine the radix from the prefix (if present).
This commit is contained in:
John Dennis
2009-11-20 13:41:44 -05:00
committed by Rob Crittenden
parent 55422cb7b9
commit 5d2bbf5325
2 changed files with 56 additions and 0 deletions

View File

@@ -22,6 +22,7 @@ Test the `ipalib.parameters` module.
"""
import re
import sys
from types import NoneType
from inspect import isclass
from tests.util import raises, ClassChecker, read_only
@@ -1225,6 +1226,32 @@ class test_Int(ClassChecker):
assert dummy.called() is True
dummy.reset()
def test_convert_scalar(self):
"""
Test the `ipalib.parameters.Int._convert_scalar` method.
Assure radix prefixes work, str objects fail,
floats (native & string) are truncated,
large magnitude values are promoted to long,
empty strings & invalid numerical representations fail
"""
o = self.cls('my_number')
# Assure invalid inputs raise error
for bad in ['hello', u'hello', True, None, '10', u'', u'.']:
e = raises(errors.ConversionError, o._convert_scalar, bad)
assert e.name == 'my_number'
assert e.index is None
# Assure large magnatude values are handled correctly
assert type(o._convert_scalar(sys.maxint*2)) == long
assert o._convert_scalar(sys.maxint*2) == sys.maxint*2
assert o._convert_scalar(unicode(sys.maxint*2)) == sys.maxint*2
assert o._convert_scalar(long(16)) == 16
# Assure normal conversions produce expected result
assert o._convert_scalar(u'16.99') == 16
assert o._convert_scalar(16.99) == 16
assert o._convert_scalar(u'16') == 16
assert o._convert_scalar(u'0x10') == 16
assert o._convert_scalar(u'020') == 16
class test_Float(ClassChecker):
"""
Test the `ipalib.parameters.Float` class.