blob: 02b81db5e7a979956b44b9c1a438493cdf52c2be [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import unittest
from cros.factory.utils.arg_utils import Arg
from cros.factory.utils.arg_utils import Args
from cros.factory.utils.type_utils import Enum
class ArgsTest(unittest.TestCase):
def setUp(self):
self.parser = Args(
Arg('required', str, 'X'),
Arg('has_default', str, 'X', default='DEFAULT_VALUE'),
Arg('optional', str, 'X', default=None),
Arg('int_typed', int, 'X', default=None),
Arg('int_or_string_typed', (int, str), 'X', default=None),
Arg('enum_typed', Enum(['a', 'b']), 'X', default=None))
def Parse(self, dargs):
"""Parses dargs.
Returns:
A dictionary of attributes from the resultant object.
"""
values = self.parser.Parse(dargs)
return {k: v for k, v in values.__dict__.items() if not k.startswith('_')}
def testIntOrNone(self):
self.parser = Args(
Arg('int_or_none', (int, type(None)), 'X', default=5))
self.assertEqual(dict(int_or_none=5),
self.Parse(dict()))
self.assertEqual(dict(int_or_none=10),
self.Parse(dict(int_or_none=10)))
self.assertEqual(dict(int_or_none=None),
self.Parse(dict(int_or_none=None)))
def testRequired(self):
self.assertEqual({'has_default': 'DEFAULT_VALUE',
'required': 'x',
'optional': None,
'int_or_string_typed': None,
'int_typed': None,
'enum_typed': None},
self.Parse(dict(required='x')))
self.assertRaises(ValueError, lambda: self.Parse(dict()))
self.assertRaises(ValueError, lambda: self.Parse(dict(required=None)))
self.assertRaises(ValueError, lambda: self.Parse(dict(required=3)))
def testOptional(self):
self.assertEqual({'has_default': 'DEFAULT_VALUE',
'required': 'x',
'optional': 'y',
'int_or_string_typed': None,
'int_typed': None,
'enum_typed': None},
self.Parse(dict(required='x', optional='y')))
self.assertEqual({'has_default': 'DEFAULT_VALUE',
'required': 'x',
'optional': None,
'int_or_string_typed': None,
'int_typed': None,
'enum_typed': None},
self.Parse(dict(required='x', optional=None)))
def testInt(self):
self.assertEqual({'has_default': 'DEFAULT_VALUE',
'required': 'x',
'optional': None,
'int_or_string_typed': None,
'int_typed': 3,
'enum_typed': None},
self.Parse(dict(required='x', int_typed=3)))
self.assertRaises(ValueError, self.Parse, dict(required='x', int_typed='3'))
def testEnum(self):
self.assertEqual(
{'has_default': 'DEFAULT_VALUE',
'required': 'x',
'optional': None,
'int_or_string_typed': None,
'int_typed': 3,
'enum_typed': 'a'},
self.Parse(dict(required='x', int_typed=3, enum_typed='a')))
self.assertRaisesRegex(ValueError,
r'Argument enum_typed should have type \(Enum',
self.Parse, dict(required='x', enum_typed='c'))
def testIntOrString(self):
for value in (3, 'x'):
self.assertEqual({'has_default': 'DEFAULT_VALUE',
'required': 'x',
'optional': None,
'int_or_string_typed': value,
'int_typed': None,
'enum_typed': None},
self.Parse(dict(required='x',
int_or_string_typed=value)))
# Wrong type
self.assertRaises(
ValueError,
self.Parse, dict(required='x', int_or_string_typed=1.0))
if __name__ == '__main__':
unittest.main()