def test_AddingLabel(self): # Arrange parser = cmb.parse_any(label='Parser: lor') parser_default_label = cmb.parse_any() # Assert self.assertEqual(parser.label, 'Parser: lor') self.assertEqual(parser_default_label.label, '.?')
def test_CorrectlyHandlesDifferentNumberOfArguments(self): # Arrange txt = 'lorem ipsum' parser_l = bpr.LParser('l') parser_o = bpr.LParser('o') parser_r = bpr.LParser('r') parser_e = bpr.LParser('e') parser1 = cmb.and_then(parser_l) parser2 = cmb.and_then(parser_l, parser_o) parser3 = cmb.and_then(parser_l, parser_o, parser_r) parser4 = cmb.and_then(parser_l, parser_o, parser_r, parser_e) # Act result1 = parser1(txt) result2 = parser2(txt) result3 = parser3(txt) result4 = parser4(txt) expected1 = res.Success(('l', 'orem ipsum')) expected2 = res.Success(('lo', 'rem ipsum')) expected3 = res.Success(('lor', 'em ipsum')) expected4 = res.Success(('lore', 'm ipsum')) # Assert self.assertEqual(result1, expected1) self.assertEqual(result2, expected2) self.assertEqual(result3, expected3) self.assertEqual(result4, expected4)
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.many1(parser_a) parser2 = cmb.many1(parser_a, parser_b) parser3 = cmb.many1(parser_a, parser_b, parser_c) parser4 = cmb.many1(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 parse_character(*chars, **kwargs): """ returns parser that match one of the strings given """ label = kwargs.get('label', None) if len(chars) == 1 and len(chars[0]) > 1: return cmb.or_else(*[bp.LParser(char) for char in chars[0]], label=label) return cmb.or_else(*[bp.LParser(char) for char in chars], label=label)
def test_AddingLabel(self): # Arrange parser1 = bpr.LParser('l') parser2 = bpr.LParser('o') parser = cmb.rightparser(parser1, parser2, label='Parser: lor') parser_default_label = cmb.rightparser(parser1, parser2) # Assert self.assertEqual(parser.label, 'Parser: lor') self.assertEqual(parser_default_label.label, 'lo')
def test_AddingLabel(self): # Arrange parser1 = bpr.LParser('x') parser2 = bpr.LParser(',') parser = cmb.sep_by1(parser1, parser2, label='Parser: lor') parser_default_label = cmb.sep_by1(parser1, parser2) # Assert self.assertEqual(parser.label, 'Parser: lor') self.assertEqual(parser_default_label.label, 'x[,x]+')
def test_AddingLabel(self): # Arrange parser1 = bpr.LParser('l') parser2 = bpr.LParser('o') parser3 = bpr.LParser('r') parser = cmb.and_then(parser1, parser2, parser3, label='Parser: lor') parser_default_label = cmb.and_then(parser1, parser2, parser3) # Assert self.assertEqual(parser.label, 'Parser: lor') self.assertEqual(parser_default_label.label, 'lor')
def parse_string(string, label=None): """ returns parser of a given string """ if not isinstance(string, str): raise Exception('Expected string') return cmb.and_then(*[bp.LParser(char) for char in string], label=label)
def test_CorrectlyHandlesDifferentNumberOfArguments(self): # Arrange txt1 = 'lorem ipsum dolor sit amet' txt2 = 'ipsum dolor sit amet' txt3 = 'dolor sit amet' txt4 = 'sit amet' parser_l = bpr.LParser('l') parser_o = bpr.LParser('i') parser_r = bpr.LParser('d') parser_e = bpr.LParser('s') parser = cmb.or_else(parser_l, parser_o, parser_r, parser_e) # Act result1 = parser(txt1) result2 = parser(txt2) result3 = parser(txt3) result4 = parser(txt4) expected1 = res.Success(('l', 'orem ipsum dolor sit amet')) expected2 = res.Success(('i', 'psum dolor sit amet')) expected3 = res.Success(('d', 'olor sit amet')) expected4 = res.Success(('s', 'it amet')) # Assert self.assertEqual(result1, expected1) self.assertEqual(result2, expected2) self.assertEqual(result3, expected3) self.assertEqual(result4, expected4)
def test_FailureCase(self): # Arrange txt = '' parser = cmb.parse_any() # Act result = parser(txt) expected = res.Failure('No more input') # Assert self.assertEqual(result, expected)
def test_Failure(self): # Arrange txt = '112345' parser = bpr.LParser('1') # Act parser = cmb.opt(parser) result = parser(txt) expected = res.Failure('error') # Assert self.assertEqual(result, expected)
def test_SuccessCase(self): # Arrange txt = 'abc123 lorem ipsum' parser_l = stp.parse_lowercases() parser_r = stp.parse_digits() parser = cmb.rightparser(parser_l, parser_r) # Act result = parser(txt) expected = res.Success(('123', ' lorem ipsum')) # Assert self.assertEqual(result, expected)
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_FailureCase(self): # Arrange txt = 'Lorem' parser_1 = bpr.LParser('1') # Act parser = cmb.until(parser_1) result = parser(txt) expected = res.Failure('No more input') # Assert self.assertEqual(result, expected)
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_Failure(self): # Arrange txt = 'aabbaccca1234' parser1 = bpr.LParser('x') parser2 = bpr.LParser('y') # Act parser = cmb.many1(parser1, parser2) result = parser(txt) expected = res.Failure('error') # Assert self.assertEqual(result, expected)
def test_FailureCase(self): # Arrange txt = '123abc lorem ipsum' parser_l = stp.parse_lowercases() parser_r = stp.parse_digits() parser = cmb.rightparser(parser_l, parser_r) # Act result = parser(txt) expected = res.Failure('error') # Assert self.assertEqual(result, expected)
def test_FailureCase(self): # Arrange txt1 = 'ABC' sep = bpr.LParser(",") item = stp.parse_lowercases() parser = cmb.sep_by(item, sep) # Act result1 = parser(txt1) expected1 = res.Failure('error') # Assert self.assertEqual(result1, expected1)
def test_SuccessCase(self): # Arrange txt = 'aabbaccca1234' parser1 = bpr.LParser('a') parser2 = bpr.LParser('b') parser3 = bpr.LParser('c') # Act parser = cmb.many1(parser1, parser2, parser3) result = parser(txt) expected = res.Success(('aabbaccca', '1234')) # Assert self.assertEqual(result, expected)
def test_WhenFirstLettersAreIncorrect_ReturnFailure(self): # Arrange txt = 'lorem ipsum' parser1 = bpr.LParser('l') parser2 = bpr.LParser('x') parser3 = bpr.LParser('r') parser = cmb.and_then(parser1, parser2, parser3) # Act result = parser(txt) expected = res.Failure('error') # Assert self.assertEqual(result, expected)
def test_SuccessCase(self): # Arrange txt = 'ABCabc123 lorem ipsum' parser_l = stp.parse_uppercases() parser_m = stp.parse_lowercases() parser_r = stp.parse_digits() parser = cmb.betweenparsers(parser_l, parser_m, parser_r) # Act result = parser(txt) expected = res.Success(('abc', ' lorem ipsum')) # Assert self.assertEqual(result, expected)
def test_WhenFirstLettersAreCorrect_ReturnSuccess(self): # Arrange txt = 'lorem ipsum' parser1 = bpr.LParser('l') parser2 = bpr.LParser('o') parser3 = bpr.LParser('r') parser = cmb.and_then(parser1, parser2, parser3) # Act result = parser(txt) expected = res.Success(('lor', 'em ipsum')) # Assert self.assertEqual(result, expected)
def test_CorrectlyHandlesDifferentNumberOfArguments_Failure(self): # Arrange txt = 'Lorem' parser_1 = bpr.LParser('1') parser_2 = bpr.LParser('2') parser_3 = bpr.LParser('3') parser = cmb.until(parser_1, parser_2, parser_3) # Act result = parser(txt) expected = res.Failure.unit('No more input') # Arrange self.assertEqual(result, expected)
def test_FailureCase(self): # Arrange txt = 'Lorem' parser1 = bpr.LParser('l') parser2 = bpr.LParser('x') parser3 = bpr.LParser('i') # Act parser = cmb.or_else(parser1, parser2, parser3) result = parser(txt) expected = res.Failure('error') # Assert self.assertEqual(result, expected)
def test_FailureCase(self): # Arrange txt = 'ABCabc123 lorem ipsum' parser_l = stp.parse_uppercases() parser_m = stp.parse_digits() parser_r = stp.parse_lowercases() parser = cmb.betweenparsers(parser_l, parser_m, parser_r) # Act result = parser(txt) expected = res.Failure('error') # Assert self.assertEqual(result, expected)
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.many1(parser_a, parser_b, parser_c, parser_d) result = parser(txt) expected = res.Success(('aabbaccca', '')) # 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_SuccessCase(self): # Arrange txt1 = '2345' txt2 = '12345' parser = bpr.LParser('1') # Act parser = cmb.opt(parser) result1 = parser(txt1) result2 = parser(txt2) expected1 = res.Success(('', '2345')) expected2 = res.Success(('1', '2345')) # Assert self.assertEqual(result1, expected1) self.assertEqual(result2, expected2)
def parse_float(label='FLOAT'): """ returns parser for floating point number """ sign = cmb.opt(bp.LParser('-')) coma = bp.LParser('.') e = cmb.or_else(bp.LParser('e'), bp.LParser('E')) exponent = cmb.opt(cmb.and_then(e, parse_integer())) integer = parse_integer() return cmb.and_then(sign, cmb.opt(integer), coma, parse_digits(), exponent, label=label)
def test_SuccessCase(self): # Arrange txt1 = 'Lorem' txt2 = 'ipsum' parser1 = bpr.LParser('L') parser2 = bpr.LParser('x') parser3 = bpr.LParser('i') # Act parser = cmb.or_else(parser1, parser2, parser3) result1 = parser(txt1) result2 = parser(txt2) expected1 = res.Success(('L', 'orem')) expected2 = res.Success(('i', 'psum')) # Assert self.assertEqual(result1, expected1) self.assertEqual(result2, expected2)