| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'package:expect/expect.dart'; |
| import 'package:status_file/canonical_status_file.dart'; |
| import 'package:status_file/status_file_linter.dart'; |
| |
| void main() { |
| testCommentLinesInSection_invalidCommentInSection(); |
| testCommentLinesInSection_invalidCommentInSectionAfterEntries(); |
| testCommentLinesInSection_okSectionEntryComment(); |
| testCommentLinesInSection_okSectionComment(); |
| |
| testCheckForDisjunctions_notAllowedDisjunction(); |
| testCheckForDisjunctions_shouldBeAllowedInComments(); |
| |
| testCheckForAlphabeticalOrderingOfPaths_invalidOrdering(); |
| testCheckForAlphabeticalOrderingOfPaths_okOrdering(); |
| |
| testCheckForDuplicateEntries_hasDuplicates(); |
| |
| testCheckForCorrectOrderingInSections_invalidRuntimeBeforeCompiler(); |
| testCheckForCorrectOrderingInSections_invalidRuntimeBeforeMode(); |
| testCheckForCorrectOrderingInSections_invalidSystemBeforeMode(); |
| testCheckForCorrectOrderingInSections_invalidStrongBeforeKernel(); |
| testCheckForCorrectOrderingInSections_invalidOrdering(); |
| testCheckForCorrectOrderingInSections_okOrdering(); |
| |
| checkLintNormalizedSection_invalidAlphabeticalOrderingVariables(); |
| checkLintNormalizedSection_invalidAlphabeticalOrderingVariableArguments(); |
| checkLintNormalizedSection_invalidOrderingWithNotEqual(); |
| checkLintNormalizedSection_invalidOrderingWithNegation(); |
| |
| checkLintSectionHeaderDuplicates_invalidDuplicateSections(); |
| } |
| |
| StatusFile createFromString(String text) { |
| return new StatusFile.parse("test", text.split('\n')); |
| } |
| |
| expectError(String text, String expectedError, {bool disjunctions = false}) { |
| var statusFile = createFromString(text); |
| var errors = lint(statusFile, checkForDisjunctions: disjunctions).toList(); |
| Expect.equals(expectedError, errors.first.toString()); |
| } |
| |
| expectNoError(String text, {bool disjunctions = true}) { |
| var errors = |
| lint(createFromString(text), checkForDisjunctions: disjunctions).toList(); |
| Expect.listEquals([], errors); |
| } |
| |
| void testEmptyLinesInHeader() { |
| expectNoError(r"""# LICENSE |
| |
| # valid comment after empty line on default section |
| suite/tests: Skip |
| |
| # valid comment |
| [ $mode == debug ] |
| """); |
| } |
| |
| void testCommentLinesInSection_invalidCommentInSection() { |
| expectError(r"""[ $mode == debug ] |
| # this comment is invalid |
| """, "Error at line 2: Comment is on a line by itself."); |
| } |
| |
| void testCommentLinesInSection_invalidCommentInSectionAfterEntries() { |
| expectError(r"""[ $mode == debug ] |
| vm/tests: Skip |
| # this comment is invalid |
| """, "Error at line 3: Comment is on a line by itself."); |
| } |
| |
| void testCommentLinesInSection_okSectionEntryComment() { |
| expectNoError(r"""[ $mode == debug ] |
| vm/tests: Skip # this comment is valid |
| vm/tests2: Timeout # this comment is also valid |
| """); |
| } |
| |
| void testCommentLinesInSection_okSectionComment() { |
| expectNoError(r""" |
| recursive_mixin_test: Crash |
| |
| # These comment lines belong to the section header. These are alright to have. |
| # Even having multiple lines of these should not be a problem. |
| [ $mode == debug ] |
| vm/tests: Skip |
| vm/tests2: Timeout # this comment is also valid |
| """); |
| } |
| |
| void testCheckForDisjunctions_notAllowedDisjunction() { |
| expectError( |
| r"""[ $mode == debug || $mode == release ] |
| vm/tests: Skip # this comment is valid |
| """, |
| "Error at line 1: Expression contains '||'. Please split the expression " |
| "into multiple separate sections.", |
| disjunctions: true); |
| } |
| |
| void testCheckForDisjunctions_shouldBeAllowedInComments() { |
| expectNoError(r"""# This should allow || in comments |
| [ $mode == debug ] |
| vm/tests: Skip # this comment is valid |
| """, disjunctions: true); |
| } |
| |
| void testCheckForAlphabeticalOrderingOfPaths_invalidOrdering() { |
| expectError( |
| r"""[ $mode == debug ] |
| vm/tests: Skip # this should come after a_test |
| a_test: Pass |
| """, |
| "Error at line 1: Test paths are not alphabetically ordered in " |
| "section. a_test should come before vm/tests."); |
| } |
| |
| void testCheckForAlphabeticalOrderingOfPaths_okOrdering() { |
| expectNoError(r"""[ $mode == debug ] |
| a_test: Pass |
| b_test: Pass |
| bc_test: Pass |
| xyz_test: Skip |
| """); |
| } |
| |
| void testCheckForDuplicateEntries_hasDuplicates() { |
| expectError( |
| r"""[ $mode == debug ] |
| a_test: Pass |
| a_test: Pass |
| bc_test: Pass |
| xyz_test: Skip |
| """, |
| "Error at line 1: The status entry 'a_test: Pass' is duplicated on lines " |
| "2 and 3."); |
| } |
| |
| void testCheckForCorrectOrderingInSections_invalidRuntimeBeforeCompiler() { |
| expectError( |
| r"""[ $runtime == ff && $compiler == dart2js] |
| a_test: Pass |
| """, |
| r"Error at line 1: Condition expression should be '$compiler == dart2js " |
| r"&& $runtime == ff' but was '$runtime == ff && $compiler == dart2js'."); |
| } |
| |
| void testCheckForCorrectOrderingInSections_invalidRuntimeBeforeMode() { |
| expectError( |
| r"""[ $runtime == ff && $mode == debug ] |
| a_test: Pass |
| """, |
| r"Error at line 1: Condition expression should be '$mode == debug && " |
| r"$runtime == ff' but was '$runtime == ff && $mode == debug'."); |
| } |
| |
| void testCheckForCorrectOrderingInSections_invalidSystemBeforeMode() { |
| expectError( |
| r"""[ $system == win && $mode == debug ] |
| a_test: Pass |
| """, |
| r"Error at line 1: Condition expression should be '$mode == debug && " |
| r"$system == win' but was '$system == win && $mode == debug'."); |
| } |
| |
| void testCheckForCorrectOrderingInSections_invalidStrongBeforeKernel() { |
| expectError( |
| r"""[ !$strong && !$kernel ] |
| a_test: Pass |
| """, |
| r"Error at line 1: Condition expression should be '!$kernel && !$strong' " |
| r"but was '!$strong && !$kernel'."); |
| } |
| |
| void testCheckForCorrectOrderingInSections_invalidOrdering() { |
| expectError( |
| r"""[ $compiler == dart2js && $builder_tag == strong && !$browser ] |
| a_test: Pass |
| """, |
| r"Error at line 1: Condition expression should be '$builder_tag == " |
| r"strong && $compiler == dart2js && !$browser' but was " |
| r"'$compiler == dart2js && $builder_tag == strong && !$browser'."); |
| } |
| |
| void testCheckForCorrectOrderingInSections_okOrdering() { |
| expectNoError(r"""[ $compiler == dart2js && $runtime != ff && !$browser ] |
| a_test: Pass |
| """); |
| } |
| |
| void checkLintNormalizedSection_invalidAlphabeticalOrderingVariables() { |
| expectError( |
| r"""[ $runtime == ff ] |
| a_test: Pass |
| |
| [ $compiler == dart2js ] |
| a_test: Pass |
| """, |
| r"Error at line 1: Section expressions are not correctly ordered in file." |
| r" '$compiler == dart2js' on line 4 should come before '$runtime == ff' " |
| r"at line 1."); |
| } |
| |
| void checkLintNormalizedSection_invalidAlphabeticalOrderingVariableArguments() { |
| expectError( |
| r"""[ $runtime == ff ] |
| a_test: Pass |
| |
| [ $runtime == chrome ] |
| a_test: Pass |
| """, |
| r"Error at line 1: Section expressions are not correctly ordered in file." |
| r" '$runtime == chrome' on line 4 should come before '$runtime == ff' at " |
| r"line 1."); |
| } |
| |
| void checkLintNormalizedSection_invalidOrderingWithNotEqual() { |
| expectError( |
| r""" |
| [ $ runtime == chrome ] |
| a_test: Pass |
| |
| [ $runtime != ff ] |
| a_test: Pass |
| |
| [ $runtime == ff ] |
| a_test: Pass |
| """, |
| r"Error at line 4: Section expressions are not correctly ordered in file." |
| r" '$runtime == ff' on line 7 should come before '$runtime != ff' at " |
| r"line 4."); |
| } |
| |
| void checkLintNormalizedSection_invalidOrderingWithNegation() { |
| expectError( |
| r""" |
| [ ! $browser ] |
| a_test: Pass |
| |
| [ ! $checked ] |
| a_test: Pass |
| |
| [ $checked ] |
| a_test: Pass |
| |
| """, |
| r"Error at line 4: Section expressions are not correctly ordered in file." |
| r" '$checked' on line 7 should come before '!$checked' at line 4."); |
| } |
| |
| void checkLintNormalizedSection_correctOrdering() { |
| expectNoError(r""" |
| [ ! $browser ] |
| a_test: Pass |
| |
| [ $compiler == dart2js ] |
| |
| [ $compiler == dartk ] |
| |
| [ $checked ] |
| a_test: Pass |
| |
| [ !$checked ] |
| a_test: Pass |
| |
| [ $runtime == chrome ] |
| a_test: Pass |
| |
| """); |
| } |
| |
| void checkLintSectionHeaderDuplicates_invalidDuplicateSections() { |
| expectError( |
| r""" |
| [ ! $browser ] |
| a_test: Pass |
| |
| [ ! $browser ] |
| a_test: Pass |
| """, |
| r"Error at line 4: The condition '!$browser' is duplicated on lines 1 " |
| r"and 4."); |
| } |