diff options
author | ptmcg <ptmcg@austin.rr.com> | 2018-09-19 23:10:10 -0500 |
---|---|---|
committer | ptmcg <ptmcg@austin.rr.com> | 2018-09-19 23:10:10 -0500 |
commit | c701a87b1f3c938ae34c3f06ee4566dcf560768e (patch) | |
tree | 1c596df6503ceb89610ae57014f97adc1d998c80 /simple_unit_tests.py | |
parent | c3f9da6d27c6ca3a0b92723055561f26c4c6bcbc (diff) | |
download | pyparsing-git-c701a87b1f3c938ae34c3f06ee4566dcf560768e.tar.gz |
Add to simple_unit_tests more examples, including groups, repetition, and
parse conditions
Diffstat (limited to 'simple_unit_tests.py')
-rw-r--r-- | simple_unit_tests.py | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/simple_unit_tests.py b/simple_unit_tests.py index 4fb698f..f28c8ca 100644 --- a/simple_unit_tests.py +++ b/simple_unit_tests.py @@ -11,6 +11,7 @@ import unittest import pyparsing as pp from collections import namedtuple +from datetime import datetime # Test spec data class for specifying simple pyparsing test cases PpTestSpec = namedtuple("PpTestSpec", "desc expr text expected_list expected_dict expected_fail_locn") @@ -126,6 +127,36 @@ class TestWord(PyparsingExpressionTestCase): ] +class TestRepetition(PyparsingExpressionTestCase): + tests = [ + PpTestSpec( + desc = "Match several words", + expr = pp.OneOrMore(pp.Word("x") | pp.Word("y")), + text = "xxyxxyyxxyxyxxxy", + expected_list = ['xx', 'y', 'xx', 'yy', 'xx', 'y', 'x', 'y', 'xxx', 'y'], + ), + PpTestSpec( + desc = "Match words and numbers - show use of results names to collect types of tokens", + expr = pp.OneOrMore(pp.Word(pp.alphas)("alpha*") | pp.pyparsing_common.integer("int*")), + text = "sdlfj23084ksdfs08234kjsdlfkjd0934", + expected_list = ['sdlfj', 23084, 'ksdfs', 8234, 'kjsdlfkjd', 934], + expected_dict = { 'alpha': ['sdlfj', 'ksdfs', 'kjsdlfkjd'], 'int': [23084, 8234, 934] } + ), + PpTestSpec( + desc = "Using delimitedList (comma is the default delimiter)", + expr = pp.delimitedList(pp.Word(pp.alphas)), + text = "xxyx,xy,y,xxyx,yxx, xy", + expected_list = ['xxyx', 'xy', 'y', 'xxyx', 'yxx', 'xy'], + ), + PpTestSpec( + desc = "Using delimitedList, with ':' delimiter", + expr = pp.delimitedList(pp.Word(pp.hexnums, exact=2), delim=':', combine=True), + text = "0A:4B:73:21:FE:76", + expected_list = ['0A:4B:73:21:FE:76'], + ), + ] + + class TestResultsName(PyparsingExpressionTestCase): tests = [ PpTestSpec( @@ -142,8 +173,26 @@ class TestResultsName(PyparsingExpressionTestCase): expected_dict = {'value': 'xyz'}, expected_list = ['xyz'], ), + PpTestSpec( + desc = "Define multiple results names", + expr = pp.Word(pp.alphas, pp.alphanums)("key") + '=' + pp.pyparsing_common.integer("value"), + text = "range=5280", + expected_dict = {'key': 'range', 'value': 5280}, + expected_list = ['range', '=', 5280], + ), ] +class TestGroups(PyparsingExpressionTestCase): + tests = [ + PpTestSpec( + desc = "Define multiple results names in groups", + expr = pp.OneOrMore(pp.Group(pp.Word(pp.alphas, pp.alphanums)("key") + + pp.Suppress('=') + + pp.pyparsing_common.number("value"))), + text = "range=5280 long=-138.52 lat=46.91", + expected_list = [['range', 5280], ['long', -138.52], ['lat', 46.91]], + ), + ] class TestParseAction(PyparsingExpressionTestCase): tests = [ @@ -153,8 +202,31 @@ class TestParseAction(PyparsingExpressionTestCase): text = "12345", expected_list = [12345], # note - result is type int, not str ), + PpTestSpec( + desc = "Use two parse actions to convert numeric string, then convert to datetime", + expr = pp.Word(pp.nums).addParseAction(lambda t: int(t[0]), + lambda t: datetime.fromtimestamp(t[0])), + text = "1537415628", + expected_list = [datetime(2018, 9, 19, 22, 53, 48)], + ), + PpTestSpec( + desc = "Use tokenMap for parse actions that operate on a single-length token", + expr = pp.Word(pp.nums).addParseAction(pp.tokenMap(int), pp.tokenMap(datetime.fromtimestamp)), + text = "1537415628", + expected_list = [datetime(2018, 9, 19, 22, 53, 48)], + ), ] - + +class TestParseCondition(PyparsingExpressionTestCase): + tests = [ + PpTestSpec( + desc = "Define a condition to only match numeric values that are multiples of 7", + expr = pp.OneOrMore(pp.Word(pp.nums).addCondition(lambda t: int(t[0]) % 7 == 0)), + text = "14 35 77 12 28", + expected_list = ['14', '35', '77'], + ), + ] + if __name__ == '__main__': # we use unittest features that are in Py3 only, bail out if run on Py2 |