def test_CorrectlyHandlesDifferentNumberOfArguments(self): # Arrange txt = 'aabbacccadd1234' parser_a = bpr.LParser('a') parser_b = bpr.LParser('b') parser_c = bpr.LParser('c') parser_d = bpr.LParser('d') # Act parser1 = cmb.many(parser_a) parser2 = cmb.many(parser_a, parser_b) parser3 = cmb.many(parser_a, parser_b, parser_c) parser4 = cmb.many(parser_a, parser_b, parser_c, parser_d) result1 = parser1(txt) result2 = parser2(txt) result3 = parser3(txt) result4 = parser4(txt) expected1 = res.Success(('aa', 'bbacccadd1234')) expected2 = res.Success(('aabba', 'cccadd1234')) expected3 = res.Success(('aabbaccca', 'dd1234')) expected4 = res.Success(('aabbacccadd', '1234')) # Assert self.assertEqual(result1, expected1) self.assertEqual(result2, expected2) self.assertEqual(result3, expected3) self.assertEqual(result4, expected4)
def test_AddingLabel(self): # Arrange parser1 = bpr.LParser('l') parser2 = bpr.LParser('o') parser3 = bpr.LParser('r') parser = cmb.many(parser1, parser2, parser3, label='Parser: lor') parser_default_label = cmb.many(parser1, parser2, parser3) # Assert self.assertEqual(parser.label, 'Parser: lor') self.assertEqual(parser_default_label.label, '(lor)*')
def test_NoMatch(self): # Arrange txt = 'aabbaccca1234' parser1 = bpr.LParser('x') parser2 = bpr.LParser('y') # Act parser = cmb.many(parser1, parser2) result = parser(txt) expected = res.Success(('', 'aabbaccca1234')) # Assert self.assertEqual(result, expected)
def test_SuccessCase(self): # Arrange txt = 'aabbaccca1234' parser1 = bpr.LParser('a') parser2 = bpr.LParser('b') parser3 = bpr.LParser('c') # Act parser = cmb.many(parser1, parser2, parser3) result = parser(txt) expected = res.Success(('aabbaccca', '1234')) # Assert self.assertEqual(result, expected)
def lstrip(parser, ignored_lst=None): """ Strips ignored characters from left side """ if ignored_lst is None: ignored_lst = [' ', '\t', '\n'] ignored_parser = cmb.many(parse_one_of_strings(*ignored_lst)) def internal(txt): stripping = ignored_parser(txt) return parser(stripping.value[1]) return bp.LParser(internal, parser.label)
def test_ParserParseEverything_ReturnsSuccess(self): # Arrange txt = 'aabbaccca' parser_a = bpr.LParser('a') parser_b = bpr.LParser('b') parser_c = bpr.LParser('c') parser_d = bpr.LParser('d') # Act parser = cmb.many(parser_a, parser_b, parser_c, parser_d) result = parser(txt) expected = res.Success(('aabbaccca', '')) # Assert self.assertEqual(result, expected)
def rstrip(parser, ignored_lst=None): """ Strips ignored characters from right side """ if ignored_lst is None: ignored_lst = [' ', '\t', '\n'] ignored_parser = cmb.many(parse_one_of_strings(*ignored_lst)) def internal(txt): result = parser(txt) if result.isFailure: return result _, remaining = ignored_parser(result.value[1]).value return res.Success((result.value[0], remaining)) return bp.LParser(internal, parser.label)
def parse_unsignedinteger(label='UINTEGER'): """ returns parser for unsigned integer """ digits_09 = parse_digit('0123456789') digits_19 = parse_character('123456789') nonzero = cmb.and_then(digits_19, cmb.many(digits_09)) zero = bp.LParser('0') def internal(txt): fst_digit = zero(txt) if fst_digit.isSuccess: snd = digits_09(fst_digit.value[1]) if snd.isSuccess: return res.Failure('error') else: return fst_digit return nonzero(txt) return bp.LParser(internal, label)
def test_WhenNoParserGivenRaisesException(self): # Act with self.assertRaises(Exception) as context: cmb.many() # Assert self.assertEqual('Expected parser', str(context.exception))