def _register_bounds_validator_if_needed(parser, name, flag_values): """Enforces lower and upper bounds for numeric flags. Args: parser: NumericParser (either FloatParser or IntegerParser), provides lower and upper bounds, and help text to display. name: str, name of the flag flag_values: FlagValues. """ if parser.lower_bound is not None or parser.upper_bound is not None: def checker(value): if value is not None and parser.is_outside_bounds(value): message = '%s is not %s' % (value, parser.syntactic_help) raise _exceptions.ValidationError(message) return True _validators.register_validator(name, checker, flag_values=flag_values)
def test_error_message_when_checker_raises_exception_on_start(self): def checker(x): self.call_args.append(x) raise _exceptions.ValidationError('Specific message') _defines.DEFINE_integer('test_flag', None, 'Usual integer flag', flag_values=self.flag_values) _validators.register_validator('test_flag', checker, message='Errors happen', flag_values=self.flag_values) argv = ('./program', '--test_flag=1') with self.assertRaises(_exceptions.IllegalFlagValueError) as cm: self.flag_values(argv) self.assertEqual('flag --test_flag=1: Specific message', str(cm.exception)) self.assertEqual([1], self.call_args)
def test_success(self): def checker(x): self.call_args.append(x) return True _defines.DEFINE_integer('test_flag', None, 'Usual integer flag', flag_values=self.flag_values) _validators.register_validator('test_flag', checker, message='Errors happen', flag_values=self.flag_values) argv = ('./program', ) self.flag_values(argv) self.assertEqual(None, self.flag_values.test_flag) self.flag_values.test_flag = 2 self.assertEqual(2, self.flag_values.test_flag) self.assertEqual([None, 2], self.call_args)
def test_exception_raised_if_checker_fails(self): def checker(x): self.call_args.append(x) return x == 1 _defines.DEFINE_integer('test_flag', None, 'Usual integer flag', flag_values=self.flag_values) _validators.register_validator('test_flag', checker, message='Errors happen', flag_values=self.flag_values) argv = ('./program', '--test_flag=1') self.flag_values(argv) with self.assertRaises(_exceptions.IllegalFlagValueError) as cm: self.flag_values.test_flag = 2 self.assertEqual('flag --test_flag=2: Errors happen', str(cm.exception)) self.assertEqual([1, 2], self.call_args)
def test_error_message_when_checker_returns_false_on_start(self): def checker(x): self.call_args.append(x) return False _defines.DEFINE_integer('test_flag', None, 'Usual integer flag', flag_values=self.flag_values) _validators.register_validator('test_flag', checker, message='Errors happen', flag_values=self.flag_values) argv = ('./program', '--test_flag=1') try: self.flag_values(argv) raise AssertionError('IllegalFlagValueError expected') except _exceptions.IllegalFlagValueError as e: self.assertEqual('flag --test_flag=1: Errors happen', str(e)) self.assertEqual([1], self.call_args)
def test_validator_not_called_when_other_flag_is_changed(self): def checker(x): self.call_args.append(x) return True _defines.DEFINE_integer('test_flag', 1, 'Usual integer flag', flag_values=self.flag_values) _defines.DEFINE_integer('other_flag', 2, 'Other integer flag', flag_values=self.flag_values) _validators.register_validator('test_flag', checker, message='Errors happen', flag_values=self.flag_values) argv = ('./program', ) self.flag_values(argv) self.assertEqual(1, self.flag_values.test_flag) self.flag_values.other_flag = 3 self.assertEqual([1], self.call_args)
def test_fail_fast_multi_flag_and_skip_remaining_validators(self): def raise_expected_error(x): del x raise _exceptions.ValidationError('Expected error.') def raise_unexpected_error(x): del x raise _exceptions.ValidationError('Got unexpected error.') _defines.DEFINE_float('flag_1', 5.1, 'flag 1', flag_values=self.flag_values) _defines.DEFINE_float('flag_2', 10.0, 'flag 2', flag_values=self.flag_values) _validators.register_multi_flags_validator( ['flag_1', 'flag_2'], raise_expected_error, flag_values=self.flag_values) _validators.register_multi_flags_validator( ['flag_2', 'flag_1'], raise_unexpected_error, flag_values=self.flag_values) _validators.register_validator('flag_1', raise_unexpected_error, flag_values=self.flag_values) _validators.register_validator('flag_2', raise_unexpected_error, flag_values=self.flag_values) argv = ('./program', '') expected = ('flags flag_1=5.1, flag_2=10.0: Expected error.') with self.assertRaises(_exceptions.IllegalFlagValueError) as cm: self.flag_values(argv) self.assertEqual(expected, str(cm.exception))
def test_exception_raised_if_checker_raises_exception(self): def checker(x): self.call_args.append(x) if x == 1: return True raise _exceptions.ValidationError('Specific message') _defines.DEFINE_integer('test_flag', None, 'Usual integer flag', flag_values=self.flag_values) _validators.register_validator('test_flag', checker, message='Errors happen', flag_values=self.flag_values) argv = ('./program', '--test_flag=1') self.flag_values(argv) try: self.flag_values.test_flag = 2 raise AssertionError('IllegalFlagValueError expected') except _exceptions.IllegalFlagValueError as e: self.assertEqual('flag --test_flag=2: Specific message', str(e)) self.assertEqual([1, 2], self.call_args)