From f735bec5aafc8358c92588587a68b2f170dd5bf1 Mon Sep 17 00:00:00 2001 From: Eugeny Volobuev Date: Tue, 28 Jun 2016 16:00:28 +0300 Subject: [PATCH 1/4] minor refactoring --- simplepeg/tests/__init__.py | 0 simplepeg/tests/test_rd_parser_combo.py | 62 ----------------- simplepeg/tests/test_speg_exceptions.py | 41 ------------ simplepeg/tests/test_speg_fixtures.py | 29 -------- simplepeg/tests/test_speg_parser_fixtures.py | 34 ---------- .../grammar/simple_and_predicate.peg | 0 .../speg_fixtures/grammar/simple_eof.peg | 0 .../grammar/simple_not_predicate.peg | 0 .../grammar/simple_one_or_more.peg | 0 .../speg_fixtures/grammar/simple_optional.peg | 0 .../grammar/simple_ordered_choice.peg | 0 .../speg_fixtures/grammar/simple_regex.peg | 0 .../grammar/simple_rule_call.peg | 0 .../speg_fixtures/grammar/simple_sequence.peg | 0 .../speg_fixtures/grammar/simple_string.peg | 0 .../grammar/simple_zero_or_more.peg | 0 .../speg_fixtures/grammar/url.peg | 0 .../result/simple_and_predicate.peg.json | 0 .../speg_fixtures/result/simple_eof.peg.json | 0 .../result/simple_not_predicate.peg.json | 0 .../result/simple_one_or_more.peg.json | 0 .../result/simple_optional.peg.json | 0 .../result/simple_ordered_choice.peg.json | 0 .../result/simple_regex.peg.json | 0 .../result/simple_rule_call.peg.json | 0 .../result/simple_sequence.peg.json | 0 .../result/simple_string.peg.json | 0 .../result/simple_zero_or_more.peg.json | 0 .../speg_fixtures/result/url.peg.json | 0 .../text/simple_and_predicate.peg.txt | 0 .../speg_fixtures/text/simple_eof.peg.txt | 0 .../text/simple_not_predicate.peg.txt | 0 .../text/simple_one_or_more.peg.txt | 0 .../text/simple_optional.peg.txt | 0 .../text/simple_ordered_choice.peg.txt | 0 .../speg_fixtures/text/simple_regex.peg.txt | 0 .../text/simple_rule_call.peg.txt | 0 .../text/simple_sequence.peg.txt | 0 .../speg_fixtures/text/simple_string.peg.txt | 0 .../text/simple_zero_or_more.peg.txt | 0 .../speg_fixtures/text/url.peg.txt | 0 .../invalid/double_space_with_wrong_end.peg | 0 .../invalid/empty_and_predicate.peg | 0 .../invalid/empty_one_or_more.peg | 0 .../invalid/empty_optional.peg | 0 .../invalid/empty_zero_or_more.peg | 0 .../invalid/simple_regex_char_unescaped.peg | 0 .../invalid/simple_string_no_space.peg | 0 .../valid/and_predicate.peg | 0 .../valid/not_predicate.peg | 0 .../valid/one_or_more.peg | 0 .../speg_grammar_fixtures/valid/optional.peg | 0 .../valid/ordered_choice.peg | 0 .../speg_grammar_fixtures/valid/rule_call.peg | 0 .../speg_grammar_fixtures/valid/sequence.peg | 0 .../valid/simple_regex_char.peg | 0 .../valid/simple_string.peg | 0 .../valid/simple_string_no_space.peg | 0 .../simple_string_space_before_grammar.peg | 0 .../valid/single_char_rule_call.peg | 0 .../speg_grammar_fixtures/valid/url.peg | 0 .../valid/zero_or_more.peg | 0 tests/test_rd_parser_combo.py | 66 +++++++++++++++++++ tests/test_speg_exceptions.py | 35 ++++++++++ tests/test_speg_fixtures.py | 28 ++++++++ tests/test_speg_parser_fixtures.py | 40 +++++++++++ 66 files changed, 169 insertions(+), 166 deletions(-) delete mode 100644 simplepeg/tests/__init__.py delete mode 100644 simplepeg/tests/test_rd_parser_combo.py delete mode 100644 simplepeg/tests/test_speg_exceptions.py delete mode 100644 simplepeg/tests/test_speg_fixtures.py delete mode 100644 simplepeg/tests/test_speg_parser_fixtures.py rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_and_predicate.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_eof.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_not_predicate.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_one_or_more.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_optional.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_ordered_choice.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_regex.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_rule_call.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_sequence.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_string.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/simple_zero_or_more.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/grammar/url.peg (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_and_predicate.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_eof.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_not_predicate.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_one_or_more.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_optional.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_ordered_choice.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_regex.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_rule_call.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_sequence.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_string.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/simple_zero_or_more.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/result/url.peg.json (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_and_predicate.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_eof.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_not_predicate.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_one_or_more.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_optional.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_ordered_choice.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_regex.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_rule_call.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_sequence.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_string.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/simple_zero_or_more.peg.txt (100%) rename {simplepeg/tests => tests}/speg_fixtures/text/url.peg.txt (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/invalid/double_space_with_wrong_end.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/invalid/empty_and_predicate.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/invalid/empty_one_or_more.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/invalid/empty_optional.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/invalid/empty_zero_or_more.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/invalid/simple_regex_char_unescaped.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/invalid/simple_string_no_space.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/and_predicate.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/not_predicate.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/one_or_more.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/optional.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/ordered_choice.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/rule_call.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/sequence.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/simple_regex_char.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/simple_string.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/simple_string_no_space.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/simple_string_space_before_grammar.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/single_char_rule_call.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/url.peg (100%) rename {simplepeg/tests => tests}/speg_grammar_fixtures/valid/zero_or_more.peg (100%) create mode 100644 tests/test_rd_parser_combo.py create mode 100644 tests/test_speg_exceptions.py create mode 100644 tests/test_speg_fixtures.py create mode 100644 tests/test_speg_parser_fixtures.py diff --git a/simplepeg/tests/__init__.py b/simplepeg/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/simplepeg/tests/test_rd_parser_combo.py b/simplepeg/tests/test_rd_parser_combo.py deleted file mode 100644 index d2d1196..0000000 --- a/simplepeg/tests/test_rd_parser_combo.py +++ /dev/null @@ -1,62 +0,0 @@ -from unittest import TestCase - -from .. import rd_parser as rd -from .. import speg_visitor as sv - - -class TestRDParserCombinations(TestCase): - def test_simple_math_grammar(self): - def space(): - return rd.regex_char('[\\s]') - - def multiplicative(): - return rd.string('*') - - def additive(): - return rd.string('+') - - def factor(): - return rd.ordered_choice([ - rd.sequence([ - rd.string('('), - rd.rec(exp), - rd.string(')') - ]), - rd.regex_char('[0-9]') - ]) - - def term(): - return rd.sequence([ - factor(), - rd.zero_or_more(rd.sequence([ - space(), - multiplicative(), - space(), - factor() - ])) - ]) - - def exp(): - return rd.sequence([ - term(), - rd.zero_or_more(rd.sequence([ - space(), - additive(), - space(), - term() - ])) - ]) - - def math(): - return rd.sequence([ - exp(), - rd.end_of_file() - ]) - parser = math() - ast = parser(rd.State( - text='1 + 2' - )) - self.assertEqual(ast.match, '1 + 2') - visitor = sv.PegJsVisitor() - pegjs_ast = visitor.visit(ast) - self.assertEqual(pegjs_ast, [[[['1'], []], [[' ', '+', ' ', [['2'], []]]]], None]) diff --git a/simplepeg/tests/test_speg_exceptions.py b/simplepeg/tests/test_speg_exceptions.py deleted file mode 100644 index 7c8c263..0000000 --- a/simplepeg/tests/test_speg_exceptions.py +++ /dev/null @@ -1,41 +0,0 @@ -from unittest import TestCase - -from .. import speg as s - - -class TestSPEGExceptions(TestCase): - def test_grammar_parser_exception(self): - speg = s.SPEG() - try: - speg.parse_grammar('!!!') - except Exception as ex: - self.assertEqual(type(ex).__name__, 'GrammarParseError') - - def test_text_parser_exception(self): - speg = s.SPEG() - try: - speg.parse_grammar('GRAMMAR test a -> "A";') - speg.parse_text('B') - except Exception as ex: - self.assertEqual(type(ex).__name__, 'TextParseError') - - def test_grammar_before_text(self): - speg = s.SPEG() - try: - speg.parse_text('B') - except Exception as ex: - self.assertEqual(type(ex).__name__, 'Exception') - - def test_speg_parse_grammar_parser_exception(self): - speg = s.SPEG() - try: - speg.parse('!!!', 'B') - except Exception as ex: - self.assertEqual(type(ex).__name__, 'GrammarParseError') - - def test_speg_parse_text_parser_exception(self): - speg = s.SPEG() - try: - speg.parse('GRAMMAR test a -> "A";', 'B') - except Exception as ex: - self.assertEqual(type(ex).__name__, 'TextParseError') diff --git a/simplepeg/tests/test_speg_fixtures.py b/simplepeg/tests/test_speg_fixtures.py deleted file mode 100644 index b6793fe..0000000 --- a/simplepeg/tests/test_speg_fixtures.py +++ /dev/null @@ -1,29 +0,0 @@ -import os - -from unittest import TestCase - -from .. import speg as s - - -class TestSPEG(TestCase): - def test_speg(self): - self.maxDiff = None - grammar_path = './simplepeg/tests/speg_fixtures/grammar/' - text_path = './simplepeg/tests/speg_fixtures/text/' - result_path = './simplepeg/tests/speg_fixtures/result/' - file_names = [] - for (_, _, filenames) in os.walk(grammar_path): - file_names.extend(filenames) - for file_name in file_names: - gfn = grammar_path + file_name - tfn = text_path + file_name + '.txt' - rfn = result_path + file_name + '.json' - with open(gfn, 'r') as g_file, open(tfn, 'r') as t_file, open(rfn, 'r') as r_file: - grammar_content = g_file.read() - text_content = t_file.read() - result_content = r_file.read() - speg = s.SPEG() - ast = speg.parse(grammar_content, text_content) - ast_json_string = getattr(ast, 'to_json')() - self.assertMultiLineEqual(ast_json_string, result_content) - diff --git a/simplepeg/tests/test_speg_parser_fixtures.py b/simplepeg/tests/test_speg_parser_fixtures.py deleted file mode 100644 index 4842e47..0000000 --- a/simplepeg/tests/test_speg_parser_fixtures.py +++ /dev/null @@ -1,34 +0,0 @@ -import os - -from unittest import TestCase - -from .. import speg_parser as sp - - -class TestSPEGParser(TestCase): - def test_speg_parser_valid(self): - files_path = './simplepeg/tests/speg_grammar_fixtures/valid/' - file_names = [] - for (_, _, filenames) in os.walk(files_path): - file_names.extend(filenames) - for file_name in file_names: - with open(files_path + file_name, 'r') as content_file: - content = content_file.read() - speg = sp.SimplePegParser() - ast = speg.parse(content) - last_error = speg.get_last_error() - if last_error: - print last_error - self.assertNotEqual(ast, False, 'Failed to parse ' + file_name) - - def test_speg_parser_invalid(self): - files_path = './simplepeg/tests/speg_grammar_fixtures/invalid/' - file_names = [] - for (_, _, filenames) in os.walk(files_path): - file_names.extend(filenames) - for file_name in file_names: - with open(files_path + file_name, 'r') as content_file: - content = content_file.read() - speg = sp.SimplePegParser() - ast = speg.parse(content) - self.assertEqual(ast, False, 'Should fail to parse ' + file_name) diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_and_predicate.peg b/tests/speg_fixtures/grammar/simple_and_predicate.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_and_predicate.peg rename to tests/speg_fixtures/grammar/simple_and_predicate.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_eof.peg b/tests/speg_fixtures/grammar/simple_eof.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_eof.peg rename to tests/speg_fixtures/grammar/simple_eof.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_not_predicate.peg b/tests/speg_fixtures/grammar/simple_not_predicate.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_not_predicate.peg rename to tests/speg_fixtures/grammar/simple_not_predicate.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_one_or_more.peg b/tests/speg_fixtures/grammar/simple_one_or_more.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_one_or_more.peg rename to tests/speg_fixtures/grammar/simple_one_or_more.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_optional.peg b/tests/speg_fixtures/grammar/simple_optional.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_optional.peg rename to tests/speg_fixtures/grammar/simple_optional.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_ordered_choice.peg b/tests/speg_fixtures/grammar/simple_ordered_choice.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_ordered_choice.peg rename to tests/speg_fixtures/grammar/simple_ordered_choice.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_regex.peg b/tests/speg_fixtures/grammar/simple_regex.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_regex.peg rename to tests/speg_fixtures/grammar/simple_regex.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_rule_call.peg b/tests/speg_fixtures/grammar/simple_rule_call.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_rule_call.peg rename to tests/speg_fixtures/grammar/simple_rule_call.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_sequence.peg b/tests/speg_fixtures/grammar/simple_sequence.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_sequence.peg rename to tests/speg_fixtures/grammar/simple_sequence.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_string.peg b/tests/speg_fixtures/grammar/simple_string.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_string.peg rename to tests/speg_fixtures/grammar/simple_string.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/simple_zero_or_more.peg b/tests/speg_fixtures/grammar/simple_zero_or_more.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/simple_zero_or_more.peg rename to tests/speg_fixtures/grammar/simple_zero_or_more.peg diff --git a/simplepeg/tests/speg_fixtures/grammar/url.peg b/tests/speg_fixtures/grammar/url.peg similarity index 100% rename from simplepeg/tests/speg_fixtures/grammar/url.peg rename to tests/speg_fixtures/grammar/url.peg diff --git a/simplepeg/tests/speg_fixtures/result/simple_and_predicate.peg.json b/tests/speg_fixtures/result/simple_and_predicate.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_and_predicate.peg.json rename to tests/speg_fixtures/result/simple_and_predicate.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_eof.peg.json b/tests/speg_fixtures/result/simple_eof.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_eof.peg.json rename to tests/speg_fixtures/result/simple_eof.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_not_predicate.peg.json b/tests/speg_fixtures/result/simple_not_predicate.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_not_predicate.peg.json rename to tests/speg_fixtures/result/simple_not_predicate.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_one_or_more.peg.json b/tests/speg_fixtures/result/simple_one_or_more.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_one_or_more.peg.json rename to tests/speg_fixtures/result/simple_one_or_more.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_optional.peg.json b/tests/speg_fixtures/result/simple_optional.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_optional.peg.json rename to tests/speg_fixtures/result/simple_optional.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_ordered_choice.peg.json b/tests/speg_fixtures/result/simple_ordered_choice.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_ordered_choice.peg.json rename to tests/speg_fixtures/result/simple_ordered_choice.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_regex.peg.json b/tests/speg_fixtures/result/simple_regex.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_regex.peg.json rename to tests/speg_fixtures/result/simple_regex.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_rule_call.peg.json b/tests/speg_fixtures/result/simple_rule_call.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_rule_call.peg.json rename to tests/speg_fixtures/result/simple_rule_call.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_sequence.peg.json b/tests/speg_fixtures/result/simple_sequence.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_sequence.peg.json rename to tests/speg_fixtures/result/simple_sequence.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_string.peg.json b/tests/speg_fixtures/result/simple_string.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_string.peg.json rename to tests/speg_fixtures/result/simple_string.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/simple_zero_or_more.peg.json b/tests/speg_fixtures/result/simple_zero_or_more.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/simple_zero_or_more.peg.json rename to tests/speg_fixtures/result/simple_zero_or_more.peg.json diff --git a/simplepeg/tests/speg_fixtures/result/url.peg.json b/tests/speg_fixtures/result/url.peg.json similarity index 100% rename from simplepeg/tests/speg_fixtures/result/url.peg.json rename to tests/speg_fixtures/result/url.peg.json diff --git a/simplepeg/tests/speg_fixtures/text/simple_and_predicate.peg.txt b/tests/speg_fixtures/text/simple_and_predicate.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_and_predicate.peg.txt rename to tests/speg_fixtures/text/simple_and_predicate.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_eof.peg.txt b/tests/speg_fixtures/text/simple_eof.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_eof.peg.txt rename to tests/speg_fixtures/text/simple_eof.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_not_predicate.peg.txt b/tests/speg_fixtures/text/simple_not_predicate.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_not_predicate.peg.txt rename to tests/speg_fixtures/text/simple_not_predicate.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_one_or_more.peg.txt b/tests/speg_fixtures/text/simple_one_or_more.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_one_or_more.peg.txt rename to tests/speg_fixtures/text/simple_one_or_more.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_optional.peg.txt b/tests/speg_fixtures/text/simple_optional.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_optional.peg.txt rename to tests/speg_fixtures/text/simple_optional.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_ordered_choice.peg.txt b/tests/speg_fixtures/text/simple_ordered_choice.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_ordered_choice.peg.txt rename to tests/speg_fixtures/text/simple_ordered_choice.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_regex.peg.txt b/tests/speg_fixtures/text/simple_regex.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_regex.peg.txt rename to tests/speg_fixtures/text/simple_regex.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_rule_call.peg.txt b/tests/speg_fixtures/text/simple_rule_call.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_rule_call.peg.txt rename to tests/speg_fixtures/text/simple_rule_call.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_sequence.peg.txt b/tests/speg_fixtures/text/simple_sequence.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_sequence.peg.txt rename to tests/speg_fixtures/text/simple_sequence.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_string.peg.txt b/tests/speg_fixtures/text/simple_string.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_string.peg.txt rename to tests/speg_fixtures/text/simple_string.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/simple_zero_or_more.peg.txt b/tests/speg_fixtures/text/simple_zero_or_more.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/simple_zero_or_more.peg.txt rename to tests/speg_fixtures/text/simple_zero_or_more.peg.txt diff --git a/simplepeg/tests/speg_fixtures/text/url.peg.txt b/tests/speg_fixtures/text/url.peg.txt similarity index 100% rename from simplepeg/tests/speg_fixtures/text/url.peg.txt rename to tests/speg_fixtures/text/url.peg.txt diff --git a/simplepeg/tests/speg_grammar_fixtures/invalid/double_space_with_wrong_end.peg b/tests/speg_grammar_fixtures/invalid/double_space_with_wrong_end.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/invalid/double_space_with_wrong_end.peg rename to tests/speg_grammar_fixtures/invalid/double_space_with_wrong_end.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/invalid/empty_and_predicate.peg b/tests/speg_grammar_fixtures/invalid/empty_and_predicate.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/invalid/empty_and_predicate.peg rename to tests/speg_grammar_fixtures/invalid/empty_and_predicate.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/invalid/empty_one_or_more.peg b/tests/speg_grammar_fixtures/invalid/empty_one_or_more.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/invalid/empty_one_or_more.peg rename to tests/speg_grammar_fixtures/invalid/empty_one_or_more.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/invalid/empty_optional.peg b/tests/speg_grammar_fixtures/invalid/empty_optional.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/invalid/empty_optional.peg rename to tests/speg_grammar_fixtures/invalid/empty_optional.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/invalid/empty_zero_or_more.peg b/tests/speg_grammar_fixtures/invalid/empty_zero_or_more.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/invalid/empty_zero_or_more.peg rename to tests/speg_grammar_fixtures/invalid/empty_zero_or_more.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/invalid/simple_regex_char_unescaped.peg b/tests/speg_grammar_fixtures/invalid/simple_regex_char_unescaped.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/invalid/simple_regex_char_unescaped.peg rename to tests/speg_grammar_fixtures/invalid/simple_regex_char_unescaped.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/invalid/simple_string_no_space.peg b/tests/speg_grammar_fixtures/invalid/simple_string_no_space.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/invalid/simple_string_no_space.peg rename to tests/speg_grammar_fixtures/invalid/simple_string_no_space.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/and_predicate.peg b/tests/speg_grammar_fixtures/valid/and_predicate.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/and_predicate.peg rename to tests/speg_grammar_fixtures/valid/and_predicate.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/not_predicate.peg b/tests/speg_grammar_fixtures/valid/not_predicate.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/not_predicate.peg rename to tests/speg_grammar_fixtures/valid/not_predicate.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/one_or_more.peg b/tests/speg_grammar_fixtures/valid/one_or_more.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/one_or_more.peg rename to tests/speg_grammar_fixtures/valid/one_or_more.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/optional.peg b/tests/speg_grammar_fixtures/valid/optional.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/optional.peg rename to tests/speg_grammar_fixtures/valid/optional.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/ordered_choice.peg b/tests/speg_grammar_fixtures/valid/ordered_choice.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/ordered_choice.peg rename to tests/speg_grammar_fixtures/valid/ordered_choice.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/rule_call.peg b/tests/speg_grammar_fixtures/valid/rule_call.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/rule_call.peg rename to tests/speg_grammar_fixtures/valid/rule_call.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/sequence.peg b/tests/speg_grammar_fixtures/valid/sequence.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/sequence.peg rename to tests/speg_grammar_fixtures/valid/sequence.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/simple_regex_char.peg b/tests/speg_grammar_fixtures/valid/simple_regex_char.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/simple_regex_char.peg rename to tests/speg_grammar_fixtures/valid/simple_regex_char.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/simple_string.peg b/tests/speg_grammar_fixtures/valid/simple_string.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/simple_string.peg rename to tests/speg_grammar_fixtures/valid/simple_string.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/simple_string_no_space.peg b/tests/speg_grammar_fixtures/valid/simple_string_no_space.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/simple_string_no_space.peg rename to tests/speg_grammar_fixtures/valid/simple_string_no_space.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/simple_string_space_before_grammar.peg b/tests/speg_grammar_fixtures/valid/simple_string_space_before_grammar.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/simple_string_space_before_grammar.peg rename to tests/speg_grammar_fixtures/valid/simple_string_space_before_grammar.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/single_char_rule_call.peg b/tests/speg_grammar_fixtures/valid/single_char_rule_call.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/single_char_rule_call.peg rename to tests/speg_grammar_fixtures/valid/single_char_rule_call.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/url.peg b/tests/speg_grammar_fixtures/valid/url.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/url.peg rename to tests/speg_grammar_fixtures/valid/url.peg diff --git a/simplepeg/tests/speg_grammar_fixtures/valid/zero_or_more.peg b/tests/speg_grammar_fixtures/valid/zero_or_more.peg similarity index 100% rename from simplepeg/tests/speg_grammar_fixtures/valid/zero_or_more.peg rename to tests/speg_grammar_fixtures/valid/zero_or_more.peg diff --git a/tests/test_rd_parser_combo.py b/tests/test_rd_parser_combo.py new file mode 100644 index 0000000..8e6628f --- /dev/null +++ b/tests/test_rd_parser_combo.py @@ -0,0 +1,66 @@ +from simplepeg import ( + rd_parser as rd, + speg_visitor as sv) + + +def space(): + return rd.regex_char('[\\s]') + + +def multiplicative(): + return rd.string('*') + + +def additive(): + return rd.string('+') + + +def factor(): + return rd.ordered_choice([ + rd.sequence([ + rd.string('('), + rd.rec(exp), + rd.string(')') + ]), + rd.regex_char('[0-9]') + ]) + + +def term(): + return rd.sequence([ + factor(), + rd.zero_or_more(rd.sequence([ + space(), + multiplicative(), + space(), + factor() + ])) + ]) + + +def exp(): + return rd.sequence([ + term(), + rd.zero_or_more(rd.sequence([ + space(), + additive(), + space(), + term() + ])) + ]) + + +def math(): + return rd.sequence([ + exp(), + rd.end_of_file() + ]) + + +def test_simple_math_grammar(): + parser = math() + ast = parser(rd.State(text='1 + 2')) + assert ast.match == '1 + 2' + visitor = sv.PegJsVisitor() + pegjs_ast = visitor.visit(ast) + assert pegjs_ast == [[[['1'], []], [[' ', '+', ' ', [['2'], []]]]], None] diff --git a/tests/test_speg_exceptions.py b/tests/test_speg_exceptions.py new file mode 100644 index 0000000..c6497ed --- /dev/null +++ b/tests/test_speg_exceptions.py @@ -0,0 +1,35 @@ +import pytest + +from simplepeg.speg import SPEG +from simplepeg.exceptions import GrammarParseError, TextParseError + + +def test_grammar_parser_exception(): + speg = SPEG() + with pytest.raises(GrammarParseError): + speg.parse_grammar('!!!') + + +def test_text_parser_exception(): + speg = SPEG() + speg.parse_grammar('GRAMMAR test a -> "A";') + with pytest.raises(TextParseError): + speg.parse_text('B') + + +def test_grammar_before_text(): + speg = SPEG() + with pytest.raises(Exception): + speg.parse_text('B') + + +def test_speg_parse_grammar_parser_exception(): + speg = SPEG() + with pytest.raises(GrammarParseError): + speg.parse('!!!', 'B') + + +def test_speg_parse_text_parser_exception(): + speg = SPEG() + with pytest.raises(TextParseError): + speg.parse('GRAMMAR test a -> "A";', 'B') diff --git a/tests/test_speg_fixtures.py b/tests/test_speg_fixtures.py new file mode 100644 index 0000000..49876a8 --- /dev/null +++ b/tests/test_speg_fixtures.py @@ -0,0 +1,28 @@ +import os +from os import path as op + +from simplepeg.speg import SPEG + +FIXTURES_ROOT = op.join(op.dirname(__file__), 'speg_fixtures') + + +def test_speg(): + grammar_path = op.join(FIXTURES_ROOT, 'grammar') + text_path = op.join(FIXTURES_ROOT, 'text') + result_path = op.join(FIXTURES_ROOT, 'result') + + file_names = [] + for (_, _, filenames) in os.walk(grammar_path): + file_names.extend(filenames) + + for file_name in file_names: + gfn = op.join(grammar_path, file_name) + tfn = op.join(text_path, file_name + '.txt') + rfn = op.join(result_path, file_name + '.json') + with open(gfn, 'r') as g_file, open(tfn, 'r') as t_file, open(rfn, 'r') as r_file: + grammar_content = g_file.read() + text_content = t_file.read() + result_content = r_file.read() + speg = SPEG() + ast = speg.parse(grammar_content, text_content) + assert ast.to_json() == result_content diff --git a/tests/test_speg_parser_fixtures.py b/tests/test_speg_parser_fixtures.py new file mode 100644 index 0000000..c10dd09 --- /dev/null +++ b/tests/test_speg_parser_fixtures.py @@ -0,0 +1,40 @@ +from __future__ import print_function + +import os +from os import path as op + +from simplepeg import speg_parser as sp + +FIXTURES_ROOT = op.join(op.dirname(__file__), 'speg_grammar_fixtures') + + +def test_speg_parser_valid(): + files_path = op.join(FIXTURES_ROOT, 'valid') + + file_names = [] + for (_, _, filenames) in os.walk(files_path): + file_names.extend(filenames) + + for file_name in file_names: + with open(op.join(files_path, file_name), 'r') as content_file: + content = content_file.read() + speg = sp.SimplePegParser() + ast = speg.parse(content) + last_error = speg.get_last_error() + if last_error: + print(last_error) + assert ast + + +def test_speg_parser_invalid(): + files_path = op.join(FIXTURES_ROOT, 'invalid') + file_names = [] + for (_, _, filenames) in os.walk(files_path): + file_names.extend(filenames) + + for file_name in file_names: + with open(op.join(files_path, file_name), 'r') as content_file: + content = content_file.read() + speg = sp.SimplePegParser() + ast = speg.parse(content) + assert not ast From 6cce2c8bdf057590b7c940a52c8d5c2afa65be2c Mon Sep 17 00:00:00 2001 From: Eugeny Volobuev Date: Tue, 28 Jun 2016 16:57:02 +0300 Subject: [PATCH 2/4] switch to parametrized tests --- .../{grammar => }/simple_and_predicate.peg | 0 .../simple_and_predicate.peg.json | 0 .../{text => }/simple_and_predicate.peg.txt | 0 .../{grammar => }/simple_eof.peg | 0 .../{result => }/simple_eof.peg.json | 0 .../{text => }/simple_eof.peg.txt | 0 .../{grammar => }/simple_not_predicate.peg | 0 .../simple_not_predicate.peg.json | 0 .../{text => }/simple_not_predicate.peg.txt | 0 .../{grammar => }/simple_one_or_more.peg | 0 .../{result => }/simple_one_or_more.peg.json | 0 .../{text => }/simple_one_or_more.peg.txt | 0 .../{grammar => }/simple_optional.peg | 0 .../{result => }/simple_optional.peg.json | 0 .../{text => }/simple_optional.peg.txt | 0 .../{grammar => }/simple_ordered_choice.peg | 0 .../simple_ordered_choice.peg.json | 0 .../{text => }/simple_ordered_choice.peg.txt | 0 .../{grammar => }/simple_regex.peg | 0 .../{result => }/simple_regex.peg.json | 0 .../{text => }/simple_regex.peg.txt | 0 .../{grammar => }/simple_rule_call.peg | 0 .../{result => }/simple_rule_call.peg.json | 0 .../{text => }/simple_rule_call.peg.txt | 0 .../{grammar => }/simple_sequence.peg | 0 .../{result => }/simple_sequence.peg.json | 0 .../{text => }/simple_sequence.peg.txt | 0 .../{grammar => }/simple_string.peg | 0 .../{result => }/simple_string.peg.json | 0 .../{text => }/simple_string.peg.txt | 0 .../{grammar => }/simple_zero_or_more.peg | 0 .../{result => }/simple_zero_or_more.peg.json | 0 .../{text => }/simple_zero_or_more.peg.txt | 0 tests/speg_fixtures/{grammar => }/url.peg | 0 tests/speg_fixtures/{result => }/url.peg.json | 0 tests/speg_fixtures/{text => }/url.peg.txt | 0 tests/test_speg_fixtures.py | 34 +++++------ tests/test_speg_parser_fixtures.py | 56 ++++++++----------- tests/utils.py | 14 +++++ 39 files changed, 51 insertions(+), 53 deletions(-) rename tests/speg_fixtures/{grammar => }/simple_and_predicate.peg (100%) rename tests/speg_fixtures/{result => }/simple_and_predicate.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_and_predicate.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_eof.peg (100%) rename tests/speg_fixtures/{result => }/simple_eof.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_eof.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_not_predicate.peg (100%) rename tests/speg_fixtures/{result => }/simple_not_predicate.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_not_predicate.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_one_or_more.peg (100%) rename tests/speg_fixtures/{result => }/simple_one_or_more.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_one_or_more.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_optional.peg (100%) rename tests/speg_fixtures/{result => }/simple_optional.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_optional.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_ordered_choice.peg (100%) rename tests/speg_fixtures/{result => }/simple_ordered_choice.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_ordered_choice.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_regex.peg (100%) rename tests/speg_fixtures/{result => }/simple_regex.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_regex.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_rule_call.peg (100%) rename tests/speg_fixtures/{result => }/simple_rule_call.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_rule_call.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_sequence.peg (100%) rename tests/speg_fixtures/{result => }/simple_sequence.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_sequence.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_string.peg (100%) rename tests/speg_fixtures/{result => }/simple_string.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_string.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/simple_zero_or_more.peg (100%) rename tests/speg_fixtures/{result => }/simple_zero_or_more.peg.json (100%) rename tests/speg_fixtures/{text => }/simple_zero_or_more.peg.txt (100%) rename tests/speg_fixtures/{grammar => }/url.peg (100%) rename tests/speg_fixtures/{result => }/url.peg.json (100%) rename tests/speg_fixtures/{text => }/url.peg.txt (100%) create mode 100644 tests/utils.py diff --git a/tests/speg_fixtures/grammar/simple_and_predicate.peg b/tests/speg_fixtures/simple_and_predicate.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_and_predicate.peg rename to tests/speg_fixtures/simple_and_predicate.peg diff --git a/tests/speg_fixtures/result/simple_and_predicate.peg.json b/tests/speg_fixtures/simple_and_predicate.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_and_predicate.peg.json rename to tests/speg_fixtures/simple_and_predicate.peg.json diff --git a/tests/speg_fixtures/text/simple_and_predicate.peg.txt b/tests/speg_fixtures/simple_and_predicate.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_and_predicate.peg.txt rename to tests/speg_fixtures/simple_and_predicate.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_eof.peg b/tests/speg_fixtures/simple_eof.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_eof.peg rename to tests/speg_fixtures/simple_eof.peg diff --git a/tests/speg_fixtures/result/simple_eof.peg.json b/tests/speg_fixtures/simple_eof.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_eof.peg.json rename to tests/speg_fixtures/simple_eof.peg.json diff --git a/tests/speg_fixtures/text/simple_eof.peg.txt b/tests/speg_fixtures/simple_eof.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_eof.peg.txt rename to tests/speg_fixtures/simple_eof.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_not_predicate.peg b/tests/speg_fixtures/simple_not_predicate.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_not_predicate.peg rename to tests/speg_fixtures/simple_not_predicate.peg diff --git a/tests/speg_fixtures/result/simple_not_predicate.peg.json b/tests/speg_fixtures/simple_not_predicate.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_not_predicate.peg.json rename to tests/speg_fixtures/simple_not_predicate.peg.json diff --git a/tests/speg_fixtures/text/simple_not_predicate.peg.txt b/tests/speg_fixtures/simple_not_predicate.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_not_predicate.peg.txt rename to tests/speg_fixtures/simple_not_predicate.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_one_or_more.peg b/tests/speg_fixtures/simple_one_or_more.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_one_or_more.peg rename to tests/speg_fixtures/simple_one_or_more.peg diff --git a/tests/speg_fixtures/result/simple_one_or_more.peg.json b/tests/speg_fixtures/simple_one_or_more.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_one_or_more.peg.json rename to tests/speg_fixtures/simple_one_or_more.peg.json diff --git a/tests/speg_fixtures/text/simple_one_or_more.peg.txt b/tests/speg_fixtures/simple_one_or_more.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_one_or_more.peg.txt rename to tests/speg_fixtures/simple_one_or_more.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_optional.peg b/tests/speg_fixtures/simple_optional.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_optional.peg rename to tests/speg_fixtures/simple_optional.peg diff --git a/tests/speg_fixtures/result/simple_optional.peg.json b/tests/speg_fixtures/simple_optional.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_optional.peg.json rename to tests/speg_fixtures/simple_optional.peg.json diff --git a/tests/speg_fixtures/text/simple_optional.peg.txt b/tests/speg_fixtures/simple_optional.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_optional.peg.txt rename to tests/speg_fixtures/simple_optional.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_ordered_choice.peg b/tests/speg_fixtures/simple_ordered_choice.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_ordered_choice.peg rename to tests/speg_fixtures/simple_ordered_choice.peg diff --git a/tests/speg_fixtures/result/simple_ordered_choice.peg.json b/tests/speg_fixtures/simple_ordered_choice.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_ordered_choice.peg.json rename to tests/speg_fixtures/simple_ordered_choice.peg.json diff --git a/tests/speg_fixtures/text/simple_ordered_choice.peg.txt b/tests/speg_fixtures/simple_ordered_choice.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_ordered_choice.peg.txt rename to tests/speg_fixtures/simple_ordered_choice.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_regex.peg b/tests/speg_fixtures/simple_regex.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_regex.peg rename to tests/speg_fixtures/simple_regex.peg diff --git a/tests/speg_fixtures/result/simple_regex.peg.json b/tests/speg_fixtures/simple_regex.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_regex.peg.json rename to tests/speg_fixtures/simple_regex.peg.json diff --git a/tests/speg_fixtures/text/simple_regex.peg.txt b/tests/speg_fixtures/simple_regex.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_regex.peg.txt rename to tests/speg_fixtures/simple_regex.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_rule_call.peg b/tests/speg_fixtures/simple_rule_call.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_rule_call.peg rename to tests/speg_fixtures/simple_rule_call.peg diff --git a/tests/speg_fixtures/result/simple_rule_call.peg.json b/tests/speg_fixtures/simple_rule_call.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_rule_call.peg.json rename to tests/speg_fixtures/simple_rule_call.peg.json diff --git a/tests/speg_fixtures/text/simple_rule_call.peg.txt b/tests/speg_fixtures/simple_rule_call.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_rule_call.peg.txt rename to tests/speg_fixtures/simple_rule_call.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_sequence.peg b/tests/speg_fixtures/simple_sequence.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_sequence.peg rename to tests/speg_fixtures/simple_sequence.peg diff --git a/tests/speg_fixtures/result/simple_sequence.peg.json b/tests/speg_fixtures/simple_sequence.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_sequence.peg.json rename to tests/speg_fixtures/simple_sequence.peg.json diff --git a/tests/speg_fixtures/text/simple_sequence.peg.txt b/tests/speg_fixtures/simple_sequence.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_sequence.peg.txt rename to tests/speg_fixtures/simple_sequence.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_string.peg b/tests/speg_fixtures/simple_string.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_string.peg rename to tests/speg_fixtures/simple_string.peg diff --git a/tests/speg_fixtures/result/simple_string.peg.json b/tests/speg_fixtures/simple_string.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_string.peg.json rename to tests/speg_fixtures/simple_string.peg.json diff --git a/tests/speg_fixtures/text/simple_string.peg.txt b/tests/speg_fixtures/simple_string.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_string.peg.txt rename to tests/speg_fixtures/simple_string.peg.txt diff --git a/tests/speg_fixtures/grammar/simple_zero_or_more.peg b/tests/speg_fixtures/simple_zero_or_more.peg similarity index 100% rename from tests/speg_fixtures/grammar/simple_zero_or_more.peg rename to tests/speg_fixtures/simple_zero_or_more.peg diff --git a/tests/speg_fixtures/result/simple_zero_or_more.peg.json b/tests/speg_fixtures/simple_zero_or_more.peg.json similarity index 100% rename from tests/speg_fixtures/result/simple_zero_or_more.peg.json rename to tests/speg_fixtures/simple_zero_or_more.peg.json diff --git a/tests/speg_fixtures/text/simple_zero_or_more.peg.txt b/tests/speg_fixtures/simple_zero_or_more.peg.txt similarity index 100% rename from tests/speg_fixtures/text/simple_zero_or_more.peg.txt rename to tests/speg_fixtures/simple_zero_or_more.peg.txt diff --git a/tests/speg_fixtures/grammar/url.peg b/tests/speg_fixtures/url.peg similarity index 100% rename from tests/speg_fixtures/grammar/url.peg rename to tests/speg_fixtures/url.peg diff --git a/tests/speg_fixtures/result/url.peg.json b/tests/speg_fixtures/url.peg.json similarity index 100% rename from tests/speg_fixtures/result/url.peg.json rename to tests/speg_fixtures/url.peg.json diff --git a/tests/speg_fixtures/text/url.peg.txt b/tests/speg_fixtures/url.peg.txt similarity index 100% rename from tests/speg_fixtures/text/url.peg.txt rename to tests/speg_fixtures/url.peg.txt diff --git a/tests/test_speg_fixtures.py b/tests/test_speg_fixtures.py index 49876a8..b427113 100644 --- a/tests/test_speg_fixtures.py +++ b/tests/test_speg_fixtures.py @@ -1,28 +1,20 @@ -import os from os import path as op +import pytest + from simplepeg.speg import SPEG +from utils import collect_files, read_file FIXTURES_ROOT = op.join(op.dirname(__file__), 'speg_fixtures') -def test_speg(): - grammar_path = op.join(FIXTURES_ROOT, 'grammar') - text_path = op.join(FIXTURES_ROOT, 'text') - result_path = op.join(FIXTURES_ROOT, 'result') - - file_names = [] - for (_, _, filenames) in os.walk(grammar_path): - file_names.extend(filenames) - - for file_name in file_names: - gfn = op.join(grammar_path, file_name) - tfn = op.join(text_path, file_name + '.txt') - rfn = op.join(result_path, file_name + '.json') - with open(gfn, 'r') as g_file, open(tfn, 'r') as t_file, open(rfn, 'r') as r_file: - grammar_content = g_file.read() - text_content = t_file.read() - result_content = r_file.read() - speg = SPEG() - ast = speg.parse(grammar_content, text_content) - assert ast.to_json() == result_content +@pytest.mark.parametrize( + 'grammar_file', + collect_files(FIXTURES_ROOT, lambda f: f.endswith('.peg'))) +def test_speg(grammar_file): + grammar, text, result = [ + read_file(grammar_file + postfix) + for postfix in ('', '.txt', '.json')] + speg = SPEG() + ast = speg.parse(grammar, text) + assert ast.to_json() == result diff --git a/tests/test_speg_parser_fixtures.py b/tests/test_speg_parser_fixtures.py index c10dd09..1666173 100644 --- a/tests/test_speg_parser_fixtures.py +++ b/tests/test_speg_parser_fixtures.py @@ -1,40 +1,32 @@ from __future__ import print_function - -import os from os import path as op +import pytest + from simplepeg import speg_parser as sp +from utils import read_file, collect_files FIXTURES_ROOT = op.join(op.dirname(__file__), 'speg_grammar_fixtures') -def test_speg_parser_valid(): - files_path = op.join(FIXTURES_ROOT, 'valid') - - file_names = [] - for (_, _, filenames) in os.walk(files_path): - file_names.extend(filenames) - - for file_name in file_names: - with open(op.join(files_path, file_name), 'r') as content_file: - content = content_file.read() - speg = sp.SimplePegParser() - ast = speg.parse(content) - last_error = speg.get_last_error() - if last_error: - print(last_error) - assert ast - - -def test_speg_parser_invalid(): - files_path = op.join(FIXTURES_ROOT, 'invalid') - file_names = [] - for (_, _, filenames) in os.walk(files_path): - file_names.extend(filenames) - - for file_name in file_names: - with open(op.join(files_path, file_name), 'r') as content_file: - content = content_file.read() - speg = sp.SimplePegParser() - ast = speg.parse(content) - assert not ast +@pytest.mark.parametrize( + 'grammar_file', + collect_files(op.join(FIXTURES_ROOT, 'valid'))) +def test_speg_parser_valid(grammar_file): + content = read_file(grammar_file) + speg = sp.SimplePegParser() + ast = speg.parse(content) + last_error = speg.get_last_error() + if last_error: + print(last_error) + assert ast + + +@pytest.mark.parametrize( + 'grammar_file', + collect_files(op.join(FIXTURES_ROOT, 'invalid'))) +def test_speg_parser_invalid(grammar_file): + content = read_file(grammar_file) + speg = sp.SimplePegParser() + ast = speg.parse(content) + assert not ast diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..0b623da --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,14 @@ +import os +from os import path as op + + +def read_file(filename): + with open(filename, 'r') as fd: + return fd.read() + + +def collect_files(root, predicate=lambda x: True): + return [ + op.join(root, f) + for f in os.listdir(root) + if predicate(f)] From ea01d1c9ef840a675d31166da3abaa8de8f1764a Mon Sep 17 00:00:00 2001 From: Eugeny Volobuev Date: Tue, 28 Jun 2016 17:05:17 +0300 Subject: [PATCH 3/4] use tox --- setup.py | 28 ++++++++++++++++++++++++++-- tests/test_speg_fixtures.py | 3 ++- tox.ini | 7 +++++++ 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 tox.ini diff --git a/setup.py b/setup.py index 3e68811..5bd1c29 100644 --- a/setup.py +++ b/setup.py @@ -1,4 +1,8 @@ +#!/usr/bin/env python +import sys + from setuptools import setup +from setuptools.command.test import test as TestCommand def readme(): @@ -11,6 +15,26 @@ def license_text(): return f.read() +class Tox(TestCommand): + def initialize_options(self): + TestCommand.initialize_options(self) + self.tox_args = None + + def finalize_options(self): + TestCommand.finalize_options(self) + self.test_args = [] + self.test_suite = True + + def run_tests(self): + import tox + import shlex + args = self.tox_args + if args: + args = shlex.split(self.tox_args) + errno = tox.cmdline(args) + sys.exit(errno) + + setup(name='simplepeg', version='1.0.3', description='Python version of SimplePEG', @@ -26,8 +50,8 @@ def license_text(): author_email='ai_boy@live.ru', keywords='peg parser grammar', license=license_text(), - test_suite='nose.collector', - tests_require=['nose'], + tests_require=['pytest', 'tox'], + cmdclass={'test': Tox}, packages=['simplepeg'], include_package_data=True, zip_safe=False) diff --git a/tests/test_speg_fixtures.py b/tests/test_speg_fixtures.py index b427113..9c6067c 100644 --- a/tests/test_speg_fixtures.py +++ b/tests/test_speg_fixtures.py @@ -1,4 +1,5 @@ from os import path as op +import json import pytest @@ -17,4 +18,4 @@ def test_speg(grammar_file): for postfix in ('', '.txt', '.json')] speg = SPEG() ast = speg.parse(grammar, text) - assert ast.to_json() == result + assert json.loads(ast.to_json()) == json.loads(result) diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..d01f96d --- /dev/null +++ b/tox.ini @@ -0,0 +1,7 @@ +[tox] +envlist=py27 +[testenv] +changedir=tests +deps=pytest +commands=py.test --basetemp={envtmpdir} +setenv = PYTHONPATH = {toxinidir} From 409f9b2bb22104b9f629449d8621ea984e3a89b7 Mon Sep 17 00:00:00 2001 From: Eugeny Volobuev Date: Tue, 28 Jun 2016 17:17:29 +0300 Subject: [PATCH 4/4] update ci configs --- .coveragerc | 2 ++ .travis.yml | 11 ++--------- tox.ini | 8 ++++++-- 3 files changed, 10 insertions(+), 11 deletions(-) create mode 100644 .coveragerc diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..3dbfbb4 --- /dev/null +++ b/.coveragerc @@ -0,0 +1,2 @@ +[run] +omit = tests/* \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 9976c74..fce4e9f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,5 @@ language: python python: - "2.7" -# command to install dependencies -install: - - pip install . - - pip install coveralls -# command to run tests -script: - coverage run --omit=*/tests/* --source=simplepeg setup.py test -after_success: - coveralls \ No newline at end of file +install: pip install tox-travis +script: tox diff --git a/tox.ini b/tox.ini index d01f96d..6aeb7ac 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,11 @@ [tox] envlist=py27 + [testenv] changedir=tests -deps=pytest -commands=py.test --basetemp={envtmpdir} +deps= + pytest + pytest-cov + coveralls +commands=py.test --basetemp={envtmpdir} --cov-config .coveragerc --cov=simplepeg setenv = PYTHONPATH = {toxinidir}