def test_parses_mixed(self): # Test that we can parse both a version 13 and earlier version files # using the same parser. Make sure that parsing works regardless of # the order of the incoming documents. sample_version_13 = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing version 13 test --- test: sample yaml ... not ok 2 A failing version 13 test""" ) sample_pre_13 = inspect.cleandoc( """1..2 ok 1 A passing pre-13 test not ok 2 A failing pre-13 test""" ) parser = Parser() lines = [] lines.extend(parser.parse_text(sample_version_13)) lines.extend(parser.parse_text(sample_pre_13)) if have_yaml: self.assertEqual(13, lines[0].version) self.assertEqual("A passing version 13 test", lines[2].description) self.assertEqual("A failing version 13 test", lines[3].description) self.assertEqual("A passing pre-13 test", lines[5].description) self.assertEqual("A failing pre-13 test", lines[6].description) else: self.assertEqual(13, lines[0].version) self.assertEqual("A passing version 13 test", lines[2].description) self.assertEqual("A failing version 13 test", lines[6].description) self.assertEqual("A passing pre-13 test", lines[8].description) self.assertEqual("A failing pre-13 test", lines[9].description) # Test parsing documents in reverse order parser = Parser() lines = [] lines.extend(parser.parse_text(sample_pre_13)) lines.extend(parser.parse_text(sample_version_13)) if have_yaml: self.assertEqual("A passing pre-13 test", lines[1].description) self.assertEqual("A failing pre-13 test", lines[2].description) self.assertEqual(13, lines[3].version) self.assertEqual("A passing version 13 test", lines[5].description) self.assertEqual("A failing version 13 test", lines[6].description) else: self.assertEqual("A passing pre-13 test", lines[1].description) self.assertEqual("A failing pre-13 test", lines[2].description) self.assertEqual(13, lines[3].version) self.assertEqual("A passing version 13 test", lines[5].description) self.assertEqual("A failing version 13 test", lines[9].description)
def test_parses_yaml_no_end(self): sample = inspect.cleandoc(u"""TAP version 13 1..2 ok 1 A passing test --- test: sample yaml not ok 2 A failing test""") parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) if have_yaml: converted_yaml = yaml.safe_load(u"""test: sample yaml""") self.assertEqual(4, len(lines)) self.assertEqual(13, lines[0].version) self.assertEqual(converted_yaml, lines[2].yaml_block) self.assertEqual("test", lines[3].category) self.assertIsNone(lines[3].yaml_block) else: self.assertEqual(6, len(lines)) self.assertEqual(13, lines[0].version) for l in list(range(3, 5)): self.assertEqual("unknown", lines[l].category) self.assertEqual("test", lines[5].category)
def test_parses_yaml_no_end(self): sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test --- test: sample yaml not ok 2 A failing test""" ) parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) try: import yaml from more_itertools import peekable # noqa converted_yaml = yaml.load(u"""test: sample yaml""") self.assertEqual(4, len(lines)) self.assertEqual(13, lines[0].version) self.assertEqual(converted_yaml, lines[2].yaml_block) self.assertEqual("test", lines[3].category) self.assertIsNone(lines[3].yaml_block) except ImportError: self.assertEqual(6, len(lines)) self.assertEqual(13, lines[0].version) for l in list(range(3, 5)): self.assertEqual("unknown", lines[l].category) self.assertEqual("test", lines[5].category)
def test_parses_yaml_no_end(self): sample = inspect.cleandoc(u"""TAP version 13 1..2 ok 1 A passing test --- test: sample yaml not ok 2 A failing test""") parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) try: import yaml from more_itertools import peekable # noqa converted_yaml = yaml.load(u"""test: sample yaml""") self.assertEqual(4, len(lines)) self.assertEqual(13, lines[0].version) self.assertEqual(converted_yaml, lines[2].yaml_block) self.assertEqual('test', lines[3].category) self.assertIsNone(lines[3].yaml_block) except ImportError: self.assertEqual(6, len(lines)) self.assertEqual(13, lines[0].version) for l in list(range(3, 5)): self.assertEqual('unknown', lines[l].category) self.assertEqual('test', lines[5].category)
def test_parses_yaml_more_complex(self): sample = inspect.cleandoc(u"""TAP version 13 1..2 ok 1 A passing test --- message: test severity: fail data: got: - foo expect: - bar""") parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) if have_yaml: converted_yaml = yaml.safe_load(u""" message: test severity: fail data: got: - foo expect: - bar""") self.assertEqual(3, len(lines)) self.assertEqual(13, lines[0].version) self.assertEqual(converted_yaml, lines[2].yaml_block) else: self.assertEqual(11, len(lines)) self.assertEqual(13, lines[0].version) for l in list(range(3, 11)): self.assertEqual("unknown", lines[l].category)
def test_parses_text(self): sample = inspect.cleandoc(u"""1..2 ok 1 A passing test not ok 2 A failing test""") parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) self.assertEqual(3, len(lines)) self.assertEqual('plan', lines[0].category) self.assertEqual('test', lines[1].category) self.assertTrue(lines[1].ok) self.assertEqual('test', lines[2].category) self.assertFalse(lines[2].ok)
def test_parses_text(self): sample = inspect.cleandoc( u"""1..2 ok 1 A passing test not ok 2 A failing test""") parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) self.assertEqual(3, len(lines)) self.assertEqual('plan', lines[0].category) self.assertEqual('test', lines[1].category) self.assertTrue(lines[1].ok) self.assertEqual('test', lines[2].category) self.assertFalse(lines[2].ok)
def test_parses_yaml_more_complex(self): sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test --- message: test severity: fail data: got: - foo expect: - bar output: |- a multiline string must be handled properly even with | pipes | here > and: there""" ) parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) if have_yaml: converted_yaml = yaml.safe_load( u''' message: test severity: fail data: got: - foo expect: - bar output: "a multiline string\\nmust be handled properly\\neven with | pipes\\n| here > and: there"''' # noqa ) self.assertEqual(3, len(lines)) self.assertEqual(13, lines[0].version) self.assertEqual(converted_yaml, lines[2].yaml_block) else: self.assertEqual(16, len(lines)) self.assertEqual(13, lines[0].version) for line_index in list(range(3, 11)): self.assertEqual("unknown", lines[line_index].category)
def test_malformed_yaml(self): self.maxDiff = None sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test --- test: sample yaml \tfail: tabs are not allowed! ... not ok 2 A failing test""" ) yaml_err = inspect.cleandoc( u""" WARNING: Optional imports not found, TAP 13 output will be ignored. To parse yaml, see requirements in docs: https://tappy.readthedocs.io/en/latest/consumers.html#tap-version-13""" ) parser = Parser() lines = [] with captured_output() as (parse_out, _): for line in parser.parse_text(sample): lines.append(line) try: import yaml # noqa from more_itertools import peekable # noqa self.assertEqual(4, len(lines)) self.assertEqual(13, lines[0].version) with captured_output() as (out, _): self.assertIsNone(lines[2].yaml_block) self.assertEqual( "Error parsing yaml block. Check formatting.", out.getvalue().strip() ) self.assertEqual("test", lines[3].category) self.assertIsNone(lines[3].yaml_block) except ImportError: self.assertEqual(8, len(lines)) self.assertEqual(13, lines[0].version) for l in list(range(3, 7)): self.assertEqual("unknown", lines[l].category) self.assertEqual("test", lines[7].category) self.assertEqual(yaml_err, parse_out.getvalue().strip())
def test_parses_yaml_no_start(self): sample = inspect.cleandoc(u"""TAP version 13 1..2 ok 1 A passing test test: sample yaml ... not ok 2 A failing test""") parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) self.assertEqual(6, len(lines)) self.assertEqual(13, lines[0].version) self.assertIsNone(lines[2].yaml_block) for l in list(range(3, 5)): self.assertEqual('unknown', lines[l].category) self.assertEqual('test', lines[5].category)
def test_parses_yaml_more_complex(self): sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test --- message: test severity: fail data: got: - foo expect: - bar""" ) parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) try: import yaml from more_itertools import peekable # noqa converted_yaml = yaml.load( u""" message: test severity: fail data: got: - foo expect: - bar""" ) self.assertEqual(3, len(lines)) self.assertEqual(13, lines[0].version) self.assertEqual(converted_yaml, lines[2].yaml_block) except ImportError: self.assertEqual(11, len(lines)) self.assertEqual(13, lines[0].version) for l in list(range(3, 11)): self.assertEqual("unknown", lines[l].category)
def test_parses_yaml_no_start(self): sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test test: sample yaml ... not ok 2 A failing test""" ) parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) self.assertEqual(6, len(lines)) self.assertEqual(13, lines[0].version) self.assertIsNone(lines[2].yaml_block) for l in list(range(3, 5)): self.assertEqual("unknown", lines[l].category) self.assertEqual("test", lines[5].category)
def get_first_error(text): try: parser = Parser() tap_lines = parser.parse_text(text) # TODO: refactor lines = text.split("\n") output = [] seeking = False for ix, tap_line in enumerate(tap_lines): if seeking and (tap_line.category == "test" or "Backtrace:" in lines[ix]): break if not seeking and tap_line.category == "test" and not tap_line.ok: seeking = True if seeking: output.append(lines[ix]) if message := "\n".join(output): return message else:
def test_parses_yaml_no_association(self): sample = inspect.cleandoc(u"""TAP version 13 1..2 ok 1 A passing test # Diagnostic line --- test: sample yaml ... not ok 2 A failing test""") parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) self.assertEqual(8, len(lines)) self.assertEqual(13, lines[0].version) self.assertIsNone(lines[2].yaml_block) self.assertEqual('diagnostic', lines[3].category) for l in list(range(4, 7)): self.assertEqual('unknown', lines[l].category) self.assertEqual('test', lines[7].category)
def test_parses_yaml_no_association(self): sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test # Diagnostic line --- test: sample yaml ... not ok 2 A failing test""" ) parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) self.assertEqual(8, len(lines)) self.assertEqual(13, lines[0].version) self.assertIsNone(lines[2].yaml_block) self.assertEqual("diagnostic", lines[3].category) for l in list(range(4, 7)): self.assertEqual("unknown", lines[l].category) self.assertEqual("test", lines[7].category)
from tap.parser import Parser output = """ TAP version 13 1..3 DsMakeSpn: HTTP/LAB1-W2K8R2-GW.lab1.awake.local ok 1 - TestDsMakeSpn # 0.004000 ok 2 - TestDsCrackNames # 0.000000 ok 3 - TestDsCrackNames # SKIP [100%] Built target kos-qemu-image-TestDsParse-sim """ lines = [] parser = Parser() for line in parser.parse_text(output): if line.category == "test": d = line.directive print(line.ok, line.description, line.skip, d.text) if line.category == "plan": print(line.expected_tests)
def test_parses_yaml_more_complex(self): sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test --- message: test severity: fail data: got: - foo expect: - bar output: |- a multiline string must be handled properly even with | pipes | here > and: there""" ) parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) if have_yaml: converted_yaml = yaml.safe_load( u''' message: test severity: fail data: got: - foo expect: - bar output: |- a multiline string must be handled properly even with | pipes | here > and: there""" ) self.assertEqual(3, len(lines)) self.assertEqual(13, lines[0].version) self.assertEqual(converted_yaml, lines[2].yaml_block) else: self.assertEqual(16, len(lines)) self.assertEqual(13, lines[0].version) for l in list(range(3, 11)): self.assertEqual("unknown", lines[l].category) def test_parses_yaml_no_association(self): sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test # Diagnostic line --- test: sample yaml ... not ok 2 A failing test""" ) parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) self.assertEqual(8, len(lines)) self.assertEqual(13, lines[0].version) self.assertIsNone(lines[2].yaml_block) self.assertEqual("diagnostic", lines[3].category) for l in list(range(4, 7)): self.assertEqual("unknown", lines[l].category) self.assertEqual("test", lines[7].category) def test_parses_yaml_no_start(self): sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test test: sample yaml ... not ok 2 A failing test""" ) parser = Parser() lines = [] for line in parser.parse_text(sample): lines.append(line) self.assertEqual(6, len(lines)) self.assertEqual(13, lines[0].version) self.assertIsNone(lines[2].yaml_block) for l in list(range(3, 5)): self.assertEqual("unknown", lines[l].category) self.assertEqual("test", lines[5].category) def test_malformed_yaml(self): self.maxDiff = None sample = inspect.cleandoc( u"""TAP version 13 1..2 ok 1 A passing test --- test: sample yaml \tfail: tabs are not allowed! ... not ok 2 A failing test""" ) yaml_err = inspect.cleandoc( u""" WARNING: Optional imports not found, TAP 13 output will be ignored. To parse yaml, see requirements in docs: https://tappy.readthedocs.io/en/latest/consumers.html#tap-version-13""" ) parser = Parser() lines = [] with captured_output() as (parse_out, _): for line in parser.parse_text(sample): lines.append(line) if have_yaml: self.assertEqual(4, len(lines)) self.assertEqual(13, lines[0].version) with captured_output() as (out, _): self.assertIsNone(lines[2].yaml_block) self.assertEqual( "Error parsing yaml block. Check formatting.", out.getvalue().strip() ) self.assertEqual("test", lines[3].category) self.assertIsNone(lines[3].yaml_block) else: self.assertEqual(8, len(lines)) self.assertEqual(13, lines[0].version) for l in list(range(3, 7)): self.assertEqual("unknown", lines[l].category) self.assertEqual("test", lines[7].category) self.assertEqual(yaml_err, parse_out.getvalue().strip())
def get_score(text): parser = Parser() lines = text.split("\n") gen = parser.parse_text(text) return sum(test.ok for ix, test in enumerate(gen) if test.category == "test" and "WARNING" not in lines[ix])