// 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."); }