OLD | NEW |
---|---|
1 # Copyright (C) 2010 Google Inc. All rights reserved. | 1 # Copyright (C) 2010 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
98 else: | 98 else: |
99 self._all_tests = set() | 99 self._all_tests = set() |
100 | 100 |
101 self._is_lint_mode = is_lint_mode | 101 self._is_lint_mode = is_lint_mode |
102 | 102 |
103 def parse(self, filename, expectations_string): | 103 def parse(self, filename, expectations_string): |
104 expectation_lines = [] | 104 expectation_lines = [] |
105 line_number = 0 | 105 line_number = 0 |
106 for line in expectations_string.split("\n"): | 106 for line in expectations_string.split("\n"): |
107 line_number += 1 | 107 line_number += 1 |
108 test_expectation = self._tokenize_line(filename, line, line_number) | 108 test_expectation = TestExpectationLine.tokenize_line(filename, line, line_number) |
109 self._parse_line(test_expectation) | 109 self._parse_line(test_expectation) |
110 expectation_lines.append(test_expectation) | 110 expectation_lines.append(test_expectation) |
111 return expectation_lines | 111 return expectation_lines |
112 | 112 |
113 def _create_expectation_line(self, test_name, expectations, file_name): | 113 def _create_expectation_line(self, test_name, expectations, file_name): |
114 expectation_line = TestExpectationLine() | 114 expectation_line = TestExpectationLine() |
115 expectation_line.original_string = test_name | 115 expectation_line.original_string = test_name |
116 expectation_line.name = test_name | 116 expectation_line.name = test_name |
117 expectation_line.filename = file_name | 117 expectation_line.filename = file_name |
118 expectation_line.expectations = expectations | 118 expectation_line.expectations = expectations |
119 return expectation_line | 119 return expectation_line |
120 | 120 |
121 def expectation_line_for_test(self, test_name, expectations): | 121 def expectation_line_for_test(self, test_name, expectations): |
122 expectation_line = self._create_expectation_line(test_name, expectations , '<Bot TestExpectations>') | 122 expectation_line = self._create_expectation_line(test_name, expectations , '<Bot TestExpectations>') |
123 self._parse_line(expectation_line) | 123 self._parse_line(expectation_line) |
124 return expectation_line | 124 return expectation_line |
125 | 125 |
126 def expectation_for_skipped_test(self, test_name): | 126 def expectation_for_skipped_test(self, test_name): |
127 if not self._port.test_exists(test_name): | 127 if not self._port.test_exists(test_name): |
128 _log.warning('The following test %s from the Skipped list doesn\'t e xist', test_name) | 128 _log.warning('The following test %s from the Skipped list doesn\'t e xist', test_name) |
129 expectation_line = self._create_expectation_line(test_name, [TestExpecta tionParser.PASS_EXPECTATION], '<Skipped file>') | 129 expectation_line = self._create_expectation_line(test_name, [TestExpecta tionParser.PASS_EXPECTATION], '<Skipped file>') |
130 expectation_line.expectations = [TestExpectationParser.SKIP_MODIFIER, Te stExpectationParser.WONTFIX_MODIFIER] | 130 expectation_line.expectations = [TestExpectationParser.SKIP_MODIFIER, Te stExpectationParser.WONTFIX_MODIFIER] |
131 expectation_line.is_skipped_outside_expectations_file = True | 131 expectation_line.is_extra_skipped_test = True |
132 self._parse_line(expectation_line) | 132 self._parse_line(expectation_line) |
133 return expectation_line | 133 return expectation_line |
134 | 134 |
135 def _parse_line(self, expectation_line): | 135 def _parse_line(self, expectation_line): |
136 if not expectation_line.name: | 136 if not expectation_line.name: |
137 return | 137 return |
138 | 138 |
139 if not self._check_test_exists(expectation_line): | 139 if not self._check_test_exists(expectation_line): |
140 return | 140 return |
141 | 141 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
214 if not expectation_line.is_file: | 214 if not expectation_line.is_file: |
215 # this is a test category, return all the tests of the category. | 215 # this is a test category, return all the tests of the category. |
216 expectation_line.matching_tests = [test for test in self._all_tests if test.startswith(expectation_line.path)] | 216 expectation_line.matching_tests = [test for test in self._all_tests if test.startswith(expectation_line.path)] |
217 return | 217 return |
218 | 218 |
219 # this is a test file, do a quick check if it's in the | 219 # this is a test file, do a quick check if it's in the |
220 # full test suite. | 220 # full test suite. |
221 if expectation_line.path in self._all_tests: | 221 if expectation_line.path in self._all_tests: |
222 expectation_line.matching_tests.append(expectation_line.path) | 222 expectation_line.matching_tests.append(expectation_line.path) |
223 | 223 |
224 | |
225 class TestExpectationLine(object): | |
226 """Represents a line in test expectations file.""" | |
227 | |
228 def __init__(self): | |
229 """Initializes a blank-line equivalent of an expectation.""" | |
230 self.original_string = None | |
231 self.filename = None # this is the path to the expectations file for th is line | |
232 self.line_numbers = "0" | |
233 self.name = None # this is the path in the line itself | |
234 self.path = None # this is the normpath of self.name | |
235 self.bugs = [] | |
236 self.specifiers = [] | |
237 self.parsed_specifiers = [] | |
238 self.matching_configurations = set() | |
239 self.expectations = [] | |
240 self.parsed_expectations = set() | |
241 self.comment = None | |
242 self.matching_tests = [] | |
243 self.warnings = [] | |
244 self.is_extra_skipped_test = False | |
245 | |
246 def __str__(self): | |
247 return "TestExpectationLine{name=%s, matching_configurations=%s, origina l_string=%s}" % ( | |
248 self.name, self.matching_configurations, self.original_string) | |
249 | |
250 def __eq__(self, other): | |
251 return (self.original_string == other.original_string | |
252 and self.filename == other.filename | |
253 and self.line_numbers == other.line_numbers | |
254 and self.name == other.name | |
255 and self.path == other.path | |
256 and self.bugs == other.bugs | |
257 and self.specifiers == other.specifiers | |
258 and self.parsed_specifiers == other.parsed_specifiers | |
259 and self.matching_configurations == other.matching_configuration s | |
260 and self.expectations == other.expectations | |
261 and self.parsed_expectations == other.parsed_expectations | |
262 and self.comment == other.comment | |
263 and self.matching_tests == other.matching_tests | |
264 and self.warnings == other.warnings | |
265 and self.is_extra_skipped_test == other.is_extra_skipped_test) | |
266 | |
267 def is_invalid(self): | |
268 return bool(self.warnings and self.warnings != [TestExpectationParser.MI SSING_BUG_WARNING]) | |
269 | |
270 def is_flaky(self): | |
271 return len(self.parsed_expectations) > 1 | |
272 | |
273 def is_comment(self): | |
274 return bool(re.match(r"^\s*#.*$", self.original_string)) | |
275 | |
276 def is_whitespace(self): | |
277 return not self.original_string.strip() | |
278 | |
279 | |
224 # FIXME: Update the original specifiers and remove this once the old syntax is gone. | 280 # FIXME: Update the original specifiers and remove this once the old syntax is gone. |
225 _configuration_tokens_list = [ | 281 _configuration_tokens_list = [ |
226 'Mac', 'Mac10.9', 'Mac10.10', 'Mac10.11', 'Retina', | 282 'Mac', 'Mac10.9', 'Mac10.10', 'Mac10.11', 'Retina', |
227 'Win', 'Win7', 'Win10', | 283 'Win', 'Win7', 'Win10', |
228 'Linux', 'Precise', 'Trusty', | 284 'Linux', 'Precise', 'Trusty', |
229 'Android', | 285 'Android', |
230 'Release', | 286 'Release', |
231 'Debug', | 287 'Debug', |
232 ] | 288 ] |
233 | 289 |
234 _configuration_tokens = dict((token, token.upper()) for token in _configurat ion_tokens_list) | 290 _configuration_tokens = dict((token, token.upper()) for token in _configurat ion_tokens_list) |
235 _inverted_configuration_tokens = dict((value, name) for name, value in _conf iguration_tokens.iteritems()) | 291 _inverted_configuration_tokens = dict((value, name) for name, value in _conf iguration_tokens.iteritems()) |
236 | 292 |
237 # FIXME: Update the original specifiers list and remove this once the old sy ntax is gone. | 293 # FIXME: Update the original specifiers list and remove this once the old sy ntax is gone. |
238 _expectation_tokens = { | 294 _expectation_tokens = { |
239 'Crash': 'CRASH', | 295 'Crash': 'CRASH', |
240 'Leak': 'LEAK', | 296 'Leak': 'LEAK', |
241 'Failure': 'FAIL', | 297 'Failure': 'FAIL', |
242 MISSING_KEYWORD: 'MISSING', | 298 MISSING_KEYWORD: 'MISSING', |
243 'Pass': 'PASS', | 299 'Pass': 'PASS', |
244 'Rebaseline': 'REBASELINE', | 300 'Rebaseline': 'REBASELINE', |
245 NEEDS_REBASELINE_KEYWORD: 'NEEDSREBASELINE', | 301 NEEDS_REBASELINE_KEYWORD: 'NEEDSREBASELINE', |
246 NEEDS_MANUAL_REBASELINE_KEYWORD: 'NEEDSMANUALREBASELINE', | 302 NEEDS_MANUAL_REBASELINE_KEYWORD: 'NEEDSMANUALREBASELINE', |
247 'Skip': 'SKIP', | 303 'Skip': 'SKIP', |
248 'Slow': 'SLOW', | 304 'Slow': 'SLOW', |
249 'Timeout': 'TIMEOUT', | 305 'Timeout': 'TIMEOUT', |
250 'WontFix': 'WONTFIX', | 306 'WontFix': 'WONTFIX', |
251 } | 307 } |
252 | 308 |
253 _inverted_expectation_tokens = dict( | 309 inverted_expectation_tokens = dict( |
254 [(value, name) for name, value in _expectation_tokens.iteritems()] + | 310 [(value, name) for name, value in _expectation_tokens.iteritems()] + |
255 [('TEXT', 'Failure'), ('IMAGE', 'Failure'), ('IMAGE+TEXT', 'Failure'), ( 'AUDIO', 'Failure')]) | 311 [('TEXT', 'Failure'), ('IMAGE', 'Failure'), ('IMAGE+TEXT', 'Failure'), ( 'AUDIO', 'Failure')]) |
256 | 312 |
257 # FIXME: Seems like these should be classmethods on TestExpectationLine inst ead of TestExpectationParser. | |
258 @classmethod | 313 @classmethod |
259 def _tokenize_line(cls, filename, expectation_string, line_number): | 314 def tokenize_line(cls, filename, expectation_string, line_number): |
260 """Tokenizes a line from TestExpectations and returns an unparsed TestEx pectationLine instance using the old format. | 315 """Tokenizes a line from TestExpectations and returns an unparsed TestEx pectationLine instance using the old format. |
261 | 316 |
262 The new format for a test expectation line is: | 317 The new format for a test expectation line is: |
263 | 318 |
264 [[bugs] [ "[" <configuration specifiers> "]" <name> [ "[" <expectations> "]" ["#" <comment>] | 319 [[bugs] [ "[" <configuration specifiers> "]" <name> [ "[" <expectations> "]" ["#" <comment>] |
265 | 320 |
266 Any errant whitespace is not preserved. | 321 Any errant whitespace is not preserved. |
267 """ | 322 """ |
268 expectation_line = TestExpectationLine() | 323 expectation_line = TestExpectationLine() |
269 expectation_line.original_string = expectation_string | 324 expectation_line.original_string = expectation_string |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
380 if not expectations and not has_unrecognized_expectation: | 435 if not expectations and not has_unrecognized_expectation: |
381 warnings.append('Missing expectations.') | 436 warnings.append('Missing expectations.') |
382 | 437 |
383 expectation_line.bugs = bugs | 438 expectation_line.bugs = bugs |
384 expectation_line.specifiers = specifiers | 439 expectation_line.specifiers = specifiers |
385 expectation_line.expectations = expectations | 440 expectation_line.expectations = expectations |
386 expectation_line.name = name | 441 expectation_line.name = name |
387 expectation_line.warnings = warnings | 442 expectation_line.warnings = warnings |
388 return expectation_line | 443 return expectation_line |
389 | 444 |
390 @classmethod | |
391 def _split_space_separated(cls, space_separated_string): | |
392 """Splits a space-separated string into an array.""" | |
393 return [part.strip() for part in space_separated_string.strip().split(' ')] | |
qyearsley
2016/09/15 21:02:31
Note: This CL removes this method which appears un
| |
394 | |
395 | |
396 class TestExpectationLine(object): | |
397 """Represents a line in test expectations file.""" | |
398 | |
399 def __init__(self): | |
400 """Initializes a blank-line equivalent of an expectation.""" | |
401 self.original_string = None | |
402 self.filename = None # this is the path to the expectations file for th is line | |
403 self.line_numbers = "0" | |
404 self.name = None # this is the path in the line itself | |
405 self.path = None # this is the normpath of self.name | |
406 self.bugs = [] | |
407 self.specifiers = [] | |
408 self.parsed_specifiers = [] | |
409 self.matching_configurations = set() | |
410 self.expectations = [] | |
411 self.parsed_expectations = set() | |
412 self.comment = None | |
413 self.matching_tests = [] | |
414 self.warnings = [] | |
415 self.is_skipped_outside_expectations_file = False | |
qyearsley
2016/09/15 21:02:31
Note: This CL renames this variable to is_extra_sk
| |
416 | |
417 def __str__(self): | |
418 return "TestExpectationLine{name=%s, matching_configurations=%s, origina l_string=%s}" % ( | |
419 self.name, self.matching_configurations, self.original_string) | |
420 | |
421 def __eq__(self, other): | |
422 return (self.original_string == other.original_string | |
423 and self.filename == other.filename | |
424 and self.line_numbers == other.line_numbers | |
425 and self.name == other.name | |
426 and self.path == other.path | |
427 and self.bugs == other.bugs | |
428 and self.specifiers == other.specifiers | |
429 and self.parsed_specifiers == other.parsed_specifiers | |
430 and self.matching_configurations == other.matching_configuration s | |
431 and self.expectations == other.expectations | |
432 and self.parsed_expectations == other.parsed_expectations | |
433 and self.comment == other.comment | |
434 and self.matching_tests == other.matching_tests | |
435 and self.warnings == other.warnings | |
436 and self.is_skipped_outside_expectations_file == other.is_skippe d_outside_expectations_file) | |
437 | |
438 def is_invalid(self): | |
439 return bool(self.warnings and self.warnings != [TestExpectationParser.MI SSING_BUG_WARNING]) | |
440 | |
441 def is_flaky(self): | |
442 return len(self.parsed_expectations) > 1 | |
443 | |
444 def is_comment(self): | |
445 return bool(re.match(r"^\s*#.*$", self.original_string)) | |
446 | |
447 def is_whitespace(self): | |
448 return not self.original_string.strip() | |
449 | |
450 @staticmethod | 445 @staticmethod |
451 def create_passing_expectation(test): | 446 def create_passing_expectation(test): |
452 expectation_line = TestExpectationLine() | 447 expectation_line = TestExpectationLine() |
453 expectation_line.name = test | 448 expectation_line.name = test |
454 expectation_line.path = test | 449 expectation_line.path = test |
455 expectation_line.parsed_expectations = set([PASS]) | 450 expectation_line.parsed_expectations = set([PASS]) |
456 expectation_line.expectations = set(['PASS']) | 451 expectation_line.expectations = set(['PASS']) |
457 expectation_line.matching_tests = [test] | 452 expectation_line.matching_tests = [test] |
458 return expectation_line | 453 return expectation_line |
459 | 454 |
(...skipping 17 matching lines...) Expand all Loading... | |
477 result.name = line1.name | 472 result.name = line1.name |
478 result.path = line1.path | 473 result.path = line1.path |
479 result.parsed_expectations = set(line1.parsed_expectations) | set(line2. parsed_expectations) | 474 result.parsed_expectations = set(line1.parsed_expectations) | set(line2. parsed_expectations) |
480 result.expectations = list(set(line1.expectations) | set(line2.expectati ons)) | 475 result.expectations = list(set(line1.expectations) | set(line2.expectati ons)) |
481 result.bugs = list(set(line1.bugs) | set(line2.bugs)) | 476 result.bugs = list(set(line1.bugs) | set(line2.bugs)) |
482 result.specifiers = list(set(line1.specifiers) | set(line2.specifiers)) | 477 result.specifiers = list(set(line1.specifiers) | set(line2.specifiers)) |
483 result.parsed_specifiers = list(set(line1.parsed_specifiers) | set(line2 .parsed_specifiers)) | 478 result.parsed_specifiers = list(set(line1.parsed_specifiers) | set(line2 .parsed_specifiers)) |
484 result.matching_configurations = set(line1.matching_configurations) | se t(line2.matching_configurations) | 479 result.matching_configurations = set(line1.matching_configurations) | se t(line2.matching_configurations) |
485 result.matching_tests = list(list(set(line1.matching_tests) | set(line2. matching_tests))) | 480 result.matching_tests = list(list(set(line1.matching_tests) | set(line2. matching_tests))) |
486 result.warnings = list(set(line1.warnings) | set(line2.warnings)) | 481 result.warnings = list(set(line1.warnings) | set(line2.warnings)) |
487 result.is_skipped_outside_expectations_file = (line1.is_skipped_outside_ expectations_file or | 482 result.is_extra_skipped_test = line1.is_extra_skipped_test or line2.is_e xtra_skipped_test |
488 line2.is_skipped_outside_ expectations_file) | |
489 return result | 483 return result |
490 | 484 |
491 def to_string(self, test_configuration_converter=None, include_specifiers=Tr ue, | 485 def to_string(self, test_configuration_converter=None, include_specifiers=Tr ue, |
492 include_expectations=True, include_comment=True): | 486 include_expectations=True, include_comment=True): |
493 parsed_expectation_to_string = dict( | 487 parsed_expectation_to_string = dict( |
494 [[parsed_expectation, expectation_string] | 488 [[parsed_expectation, expectation_string] |
495 for expectation_string, parsed_expectation in TestExpectations.EXPE CTATIONS.items()]) | 489 for expectation_string, parsed_expectation in TestExpectations.EXPE CTATIONS.items()]) |
496 | 490 |
497 if self.is_invalid(): | 491 if self.is_invalid(): |
498 return self.original_string or '' | 492 return self.original_string or '' |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
531 return ' '.join(result) | 525 return ' '.join(result) |
532 | 526 |
533 @staticmethod | 527 @staticmethod |
534 def _filter_redundant_expectations(expectations): | 528 def _filter_redundant_expectations(expectations): |
535 if set(expectations) == set(['Pass', 'Skip']): | 529 if set(expectations) == set(['Pass', 'Skip']): |
536 return ['Skip'] | 530 return ['Skip'] |
537 if set(expectations) == set(['Pass', 'Slow']): | 531 if set(expectations) == set(['Pass', 'Slow']): |
538 return ['Slow'] | 532 return ['Slow'] |
539 return expectations | 533 return expectations |
540 | 534 |
541 @staticmethod | 535 @classmethod |
542 def _format_line(bugs, specifiers, name, expectations, comment, include_spec ifiers=True, | 536 def _format_line(cls, bugs, specifiers, name, expectations, comment, include _specifiers=True, |
543 include_expectations=True, include_comment=True): | 537 include_expectations=True, include_comment=True): |
544 new_specifiers = [] | 538 new_specifiers = [] |
545 new_expectations = [] | 539 new_expectations = [] |
546 for specifier in specifiers: | 540 for specifier in specifiers: |
547 # FIXME: Make this all work with the mixed-cased specifiers (e.g. Wo ntFix, Slow, etc). | 541 # FIXME: Make this all work with the mixed-cased specifiers (e.g. Wo ntFix, Slow, etc). |
548 specifier = specifier.upper() | 542 specifier = specifier.upper() |
549 new_specifiers.append(TestExpectationParser._inverted_configuration_ tokens.get(specifier, specifier)) | 543 new_specifiers.append(cls._inverted_configuration_tokens.get(specifi er, specifier)) |
qyearsley
2016/09/15 21:02:31
Note: This CL changes this to a classmethod to ind
| |
550 | 544 |
551 for expectation in expectations: | 545 for expectation in expectations: |
552 expectation = expectation.upper() | 546 expectation = expectation.upper() |
553 new_expectations.append(TestExpectationParser._inverted_expectation_ tokens.get(expectation, expectation)) | 547 new_expectations.append(cls.inverted_expectation_tokens.get(expectat ion, expectation)) |
554 | 548 |
555 result = '' | 549 result = '' |
556 if include_specifiers and (bugs or new_specifiers): | 550 if include_specifiers and (bugs or new_specifiers): |
557 if bugs: | 551 if bugs: |
558 result += ' '.join(bugs) + ' ' | 552 result += ' '.join(bugs) + ' ' |
559 if new_specifiers: | 553 if new_specifiers: |
560 result += '[ %s ] ' % ' '.join(new_specifiers) | 554 result += '[ %s ] ' % ' '.join(new_specifiers) |
561 result += name | 555 result += name |
562 if include_expectations and new_expectations: | 556 if include_expectations and new_expectations: |
563 new_expectations = TestExpectationLine._filter_redundant_expectation s(new_expectations) | 557 new_expectations = TestExpectationLine._filter_redundant_expectation s(new_expectations) |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
664 def get_expectation_line(self, test): | 658 def get_expectation_line(self, test): |
665 return self._test_to_expectation_line.get(test) | 659 return self._test_to_expectation_line.get(test) |
666 | 660 |
667 def get_expectations(self, test): | 661 def get_expectations(self, test): |
668 return self._test_to_expectations[test] | 662 return self._test_to_expectations[test] |
669 | 663 |
670 def get_expectations_string(self, test): | 664 def get_expectations_string(self, test): |
671 """Returns the expectations for the given test as an uppercase string. | 665 """Returns the expectations for the given test as an uppercase string. |
672 If there are no expectations for the test, then "PASS" is returned. | 666 If there are no expectations for the test, then "PASS" is returned. |
673 """ | 667 """ |
674 if self.get_expectation_line(test).is_skipped_outside_expectations_file: | 668 if self.get_expectation_line(test).is_extra_skipped_test: |
675 return 'NOTRUN' | 669 return 'NOTRUN' |
676 | 670 |
677 expectations = self.get_expectations(test) | 671 expectations = self.get_expectations(test) |
678 retval = [] | 672 retval = [] |
679 | 673 |
680 # FIXME: WontFix should cause the test to get skipped without artificial ly adding SKIP to the expectations list. | 674 # FIXME: WontFix should cause the test to get skipped without artificial ly adding SKIP to the expectations list. |
681 if WONTFIX in expectations and SKIP in expectations: | 675 if WONTFIX in expectations and SKIP in expectations: |
682 expectations.remove(SKIP) | 676 expectations.remove(SKIP) |
683 | 677 |
684 for expectation in expectations: | 678 for expectation in expectations: |
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1203 # If reconstitute_only_these is an empty list, we want to return ori ginal_string. | 1197 # If reconstitute_only_these is an empty list, we want to return ori ginal_string. |
1204 # So we need to compare reconstitute_only_these to None, not just ch eck if it's falsey. | 1198 # So we need to compare reconstitute_only_these to None, not just ch eck if it's falsey. |
1205 if reconstitute_only_these is None or expectation_line in reconstitu te_only_these: | 1199 if reconstitute_only_these is None or expectation_line in reconstitu te_only_these: |
1206 return expectation_line.to_string(test_configuration_converter) | 1200 return expectation_line.to_string(test_configuration_converter) |
1207 return expectation_line.original_string | 1201 return expectation_line.original_string |
1208 | 1202 |
1209 def nones_out(expectation_line): | 1203 def nones_out(expectation_line): |
1210 return expectation_line is not None | 1204 return expectation_line is not None |
1211 | 1205 |
1212 return "\n".join(filter(nones_out, map(serialize, expectation_lines))) | 1206 return "\n".join(filter(nones_out, map(serialize, expectation_lines))) |
OLD | NEW |