blob: dcd6e06c7898b35906138d9536ee5593ffcc7bfe [file] [log] [blame]
// 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.");
}