except ValueError:
return float(value)
+ def _validate_integer(self, value):
+ if value is None:
+ value = self.has_default() and self.default() or 0
+ if not isinstance(value, int):
+ raise TypeError('value is not an integer')
+ return self._validate_number(value)
+
def _validate_number(self, value):
+ if value is None:
+ value = self.has_default() and self.default() or 0
self._check_allowed(value)
num = self.str_to_num(value)
return value
def _validate_string(self, value):
+ if value is None:
+ value = self.has_default() and self.default() or ''
if not isinstance(value, basestring):
raise ValueError('Value must be a string')
return value
def _validate_map(self, value):
+ if value is None:
+ value = self.has_default() and self.default() or {}
if not isinstance(value, collections.Mapping):
raise TypeError('"%s" is not a map' % value)
return children
def _validate_list(self, value):
+ if value is None:
+ value = self.has_default() and self.default() or []
if (not isinstance(value, collections.Sequence) or
isinstance(value, basestring)):
raise TypeError('"%s" is not a list' % repr(value))
return children
def _validate_bool(self, value):
+ if value is None:
+ value = self.has_default() and self.default() or False
if isinstance(value, bool):
return value
normalised = value.lower()
if t == STRING:
return self._validate_string(value)
elif t == INTEGER:
- if not isinstance(value, int):
- raise TypeError('value is not an integer')
- return self._validate_number(value)
+ return self._validate_integer(value)
elif t == NUMBER:
return self._validate_number(value)
elif t == MAP:
def test_bad_key(self):
self.assertEqual(self.props.get('foo', 'wibble'), 'wibble')
+ def test_none_string(self):
+ schema = {'foo': {'Type': 'String'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual('', props['foo'])
+
+ def test_none_integer(self):
+ schema = {'foo': {'Type': 'Integer'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(0, props['foo'])
+
+ def test_none_number(self):
+ schema = {'foo': {'Type': 'Number'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(0, props['foo'])
+
+ def test_none_boolean(self):
+ schema = {'foo': {'Type': 'Boolean'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(False, props['foo'])
+
+ def test_none_map(self):
+ schema = {'foo': {'Type': 'Map'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual({}, props['foo'])
+
+ def test_none_list(self):
+ schema = {'foo': {'Type': 'List'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual([], props['foo'])
+
+ def test_none_default_string(self):
+ schema = {'foo': {'Type': 'String', 'Default': 'bar'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual('bar', props['foo'])
+
+ def test_none_default_integer(self):
+ schema = {'foo': {'Type': 'Integer', 'Default': 42}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(42, props['foo'])
+
+ schema = {'foo': {'Type': 'Integer', 'Default': 0}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(0, props['foo'])
+
+ schema = {'foo': {'Type': 'Integer', 'Default': -273}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(-273, props['foo'])
+
+ def test_none_default_number(self):
+ schema = {'foo': {'Type': 'Number', 'Default': 42.0}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(42.0, props['foo'])
+
+ schema = {'foo': {'Type': 'Number', 'Default': 0.0}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(0.0, props['foo'])
+
+ schema = {'foo': {'Type': 'Number', 'Default': -273.15}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(-273.15, props['foo'])
+
+ def test_none_default_boolean(self):
+ schema = {'foo': {'Type': 'Boolean', 'Default': True}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(True, props['foo'])
+
+ def test_none_default_map(self):
+ schema = {'foo': {'Type': 'Map', 'Default': {'bar': 'baz'}}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual({'bar': 'baz'}, props['foo'])
+
+ def test_none_default_list(self):
+ schema = {'foo': {'Type': 'List', 'Default': ['one', 'two']}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(['one', 'two'], props['foo'])
+
class PropertiesValidationTest(testtools.TestCase):
def test_required(self):
schema = {'foo': {'Type': 'String'}}
props = properties.Properties(schema, {'food': 42})
self.assertRaises(exception.StackValidationFailed, props.validate)
+
+ def test_none_string(self):
+ schema = {'foo': {'Type': 'String'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_integer(self):
+ schema = {'foo': {'Type': 'Integer'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_number(self):
+ schema = {'foo': {'Type': 'Number'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_boolean(self):
+ schema = {'foo': {'Type': 'Boolean'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_map(self):
+ schema = {'foo': {'Type': 'Map'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_list(self):
+ schema = {'foo': {'Type': 'List'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_default_string(self):
+ schema = {'foo': {'Type': 'String', 'Default': 'bar'}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_default_integer(self):
+ schema = {'foo': {'Type': 'Integer', 'Default': 42}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_default_number(self):
+ schema = {'foo': {'Type': 'Number', 'Default': 42.0}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_default_boolean(self):
+ schema = {'foo': {'Type': 'Boolean', 'Default': True}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_default_map(self):
+ schema = {'foo': {'Type': 'Map', 'Default': {'bar': 'baz'}}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)
+
+ def test_none_default_list(self):
+ schema = {'foo': {'Type': 'List', 'Default': ['one', 'two']}}
+ props = properties.Properties(schema, {'foo': None})
+ self.assertEqual(props.validate(), None)