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))