def test_returns_arguments_based_on_matches(self): func = lambda x: -x matcher = ParseMatcher(func, 'foo') results = parse.Result([1, 2, 3], {'foo': 'bar', 'baz': -45.3}, { 0: (13, 14), 1: (16, 17), 2: (22, 23), 'foo': (32, 35), 'baz': (39, 44), }) expected = [ (13, 14, '1', 1, None), (16, 17, '2', 2, None), (22, 23, '3', 3, None), (32, 35, 'bar', 'bar', 'foo'), (39, 44, '-45.3', -45.3, 'baz'), ] with patch.object(matcher.parser, 'parse') as p: p.return_value = results m = matcher.match('some numbers 1, 2 and 3 and the bar is -45.3') assert m.func is func args = m.arguments have = [(a.start, a.end, a.original, a.value, a.name) for a in args] eq_(have, expected)
def test_returns_none_if_parser_does_not_match(self): # pylint: disable=redefined-outer-name # REASON: parse matcher = ParseMatcher(None, 'a string') with patch.object(matcher.parser, 'parse') as parse: parse.return_value = None assert matcher.match('just a random step') is None
def test_positional_arguments(self): text = "has a {}, an {:d} and a {:f}" matcher = ParseMatcher(self.record_args, text) context = runner.Context(Mock()) m = matcher.match("has a foo, an 11 and a 3.14159") m.run(context) eq_(self.recorded_args, ((context, 'foo', 11, 3.14159), {}))
def test_named_arguments(self): text = "has a {string}, an {integer:d} and a {decimal:f}" matcher = ParseMatcher(self.record_args, text) context = runner.Context(Mock()) m = matcher.match("has a foo, an 11 and a 3.14159") m.run(context) eq_(self.recorded_args, ((context,), { 'string': 'foo', 'integer': 11, 'decimal': 3.14159 }))