class TestArgumentCoercer(unittest.TestCase): def setUp(self): self.lib = TestLibrary('ArgTypeCoercion', ['42', 'true']) def test_coercion_in_constructor(self): instance = self.lib.get_instance() assert_equals(instance.myInt, 42) assert_equals(instance.myBool, True) def test_coercing_to_integer(self): self._test_coercion(self._handler_named('intArgument'), ['1'], [1]) def test_coercing_to_boolean(self): handler = self._handler_named('booleanArgument') self._test_coercion(handler, ['True'], [True]) self._test_coercion(handler, ['FALSE'], [ False]) def test_coercing_to_real_number(self): self._test_coercion(self._handler_named('doubleArgument'), ['1.42'], [1.42]) self._test_coercion(self._handler_named('floatArgument'), ['-9991.098'], [-9991.098]) def test_coercion_with_compatible_types(self): self._test_coercion(self._handler_named('coercableKeywordWithCompatibleTypes'), ['9999', '-42', 'FaLsE', '31.31'], [9999, -42, False, 31.31]) def test_arguments_that_are_not_strings_are_not_coerced(self): self._test_coercion(self._handler_named('intArgument'), [self.lib], [self.lib]) self._test_coercion(self._handler_named('booleanArgument'), [42], [42]) def test_coercion_fails_with_reasonable_message(self): exp_msg = 'Argument at position 1 cannot be coerced to %s.' self._test_coercion_fails(self._handler_named('intArgument'), exp_msg % 'integer') self._test_coercion_fails(self._handler_named('booleanArgument'), exp_msg % 'boolean') self._test_coercion_fails(self._handler_named('floatArgument'), exp_msg % 'floating point number') def test_no_arg_no_coercion(self): self._test_coercion(self._handler_named('noArgument'), [], []) def test_coercing_multiple_arguments(self): self._test_coercion(self._handler_named('coercableKeyword'), ['10.0', '42', 'tRUe'], [10.0, 42, True]) def test_coercion_is_not_done_with_conflicting_signatures(self): self._test_coercion(self._handler_named('unCoercableKeyword'), ['True', '42'], ['True', '42']) def test_coercable_and_uncoercable_args_in_same_kw(self): self._test_coercion(self._handler_named('coercableAndUnCoercableArgs'), ['1', 'False', '-23', '0'], ['1', False, -23, '0']) def _handler_named(self, name): return self.lib.handlers[name] def _test_coercion(self, handler, args, expected): assert_equals(handler._arg_coercer.coerce(args, {}), expected) def _test_coercion_fails(self, handler, expected_message): assert_raises_with_msg(ValueError, expected_message, handler._arg_coercer.coerce, ['invalid'], {})