blob: 2122385acb1cd6cbf05d381435dd1bff2dd29a67 [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2017-2020 The Verible Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
MY_OUTPUT_FILE="${TEST_TMPDIR}/myoutput.txt"
readonly MY_OUTPUT_FILE
# Process script flags and arguments.
[[ "$#" == 1 ]] || {
echo "Expecting 1 positional argument, verible-verilog-lint path."
exit 1
}
lint_tool="$(rlocation ${TEST_WORKSPACE}/$1)"
################################################################################
echo "=== Test no file"
"$lint_tool" > "$MY_OUTPUT_FILE" 2>&1
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
################################################################################
echo "=== Test the '--helpfull' flag"
"$lint_tool" --helpfull > "$MY_OUTPUT_FILE" 2>&1
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
grep -q -e "--rules" "$MY_OUTPUT_FILE" || {
echo "Expected \"--rules\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
################################################################################
echo "=== Test the '--help_rules' flag"
"$lint_tool" --help_rules=no-tabs > "$MY_OUTPUT_FILE" 2>&1
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
################################################################################
echo "=== Test the '--generate_markdown' flag"
"$lint_tool" --generate_markdown > "$MY_OUTPUT_FILE"
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
[[ -s "$MY_OUTPUT_FILE" ]] || {
echo "Expected $MY_OUTPUT_FILE to be non-empty, but got empty."
exit 1
}
################################################################################
echo "=== Test --parse_fatal (default)"
TEST_FILE="${TEST_TMPDIR}/syntax-error.sv"
cat > ${TEST_FILE} <<EOF
class c // missing semicolon
endclass
EOF
"$lint_tool" "$TEST_FILE" > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
echo "=== Test --show_diagnostic_context"
"$lint_tool" "$TEST_FILE" --show_diagnostic_context > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
DIAGNOSTIC_OUTPUT="${TEST_TMPDIR}/expected-diagnostic.out"
cat > "${DIAGNOSTIC_OUTPUT}" <<EOF
${TEST_TMPDIR}/syntax-error.sv:2:1-8: syntax error at token "endclass"
endclass
^
EOF
"$lint_tool" "$TEST_FILE" --show_diagnostic_context > "${MY_OUTPUT_FILE}.out"
diff --strip-trailing-cr "${DIAGNOSTIC_OUTPUT}" "${MY_OUTPUT_FILE}.out"
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
cat > "${DIAGNOSTIC_OUTPUT}" <<EOF
${TEST_TMPDIR}/syntax-error.sv:2:1-8: syntax error at token "endclass"
EOF
"$lint_tool" "$TEST_FILE" > "${MY_OUTPUT_FILE}.out"
diff --strip-trailing-cr "${DIAGNOSTIC_OUTPUT}" "${MY_OUTPUT_FILE}.out"
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
echo "=== Test --parse_fatal"
"$lint_tool" "$TEST_FILE" --parse_fatal > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
echo "=== Test --noparse_fatal"
"$lint_tool" "$TEST_FILE" --noparse_fatal > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
################################################################################
echo "=== Test --check_syntax (default) and --parse_fatal (default)"
TEST_FILE="${TEST_TMPDIR}/syntax-error.sv"
cat > ${TEST_FILE} <<EOF
class c // missing semicolon
endclass
EOF
"$lint_tool" "$TEST_FILE" > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
echo "=== Test --check_syntax"
"$lint_tool" "$TEST_FILE" --check_syntax > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
echo "=== Test --nocheck_syntax"
"$lint_tool" "$TEST_FILE" --nocheck_syntax > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
[[ ! -s "${MY_OUTPUT_FILE}.err" ]] || {
echo "Expected ${MY_OUTPUT_FILE}.err to be empty, but got:"
cat "${MY_OUTPUT_FILE}.err"
exit 1
}
################################################################################
echo "=== Test --lint_fatal (default)"
TEST_FILE="${TEST_TMPDIR}/lint-error.sv"
cat > "${TEST_FILE}" <<EOF
class c; // tabs
endclass
EOF
"$lint_tool" --rules=no-tabs "$TEST_FILE" > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
echo "=== Test --lint_fatal"
"$lint_tool" --rules=no-tabs --lint_fatal "$TEST_FILE" > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
echo "=== Test --nolint_fatal"
"$lint_tool" --rules=no-tabs --nolint_fatal "$TEST_FILE" > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
################################################################################
echo "=== Test invalid rule (--rules)"
# using same ${TEST_FILE}
echo "=== Test --nolint_fatal"
"$lint_tool" --rules=does-not-exist-fake-rule --nolint_fatal "$TEST_FILE" > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
################################################################################
echo "=== Test '--waiver_files'."
TEST_FILE="${TEST_TMPDIR}/instance_parameters.sv"
cat > "${TEST_FILE}" <<EOF
module instance_parameters;
bar #(4, 8) baz;
endmodule
EOF
"$lint_tool" "$TEST_FILE" --waiver_files > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
grep -q "ERROR: Missing the value for the flag 'waiver_files'" "${MY_OUTPUT_FILE}.err" || {
echo "Expected \"ERROR: Missing the value for the flag 'waiver_files'\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "${MY_OUTPUT_FILE}.err"
exit 1
}
WAIVER_FILE="${TEST_TMPDIR}/waive_module-parameter.vlt"
echo "=== Test --waiver_files $WAIVER_FILE with one rule"
cat > ${WAIVER_FILE} <<EOF
waive --rule=module-parameter
EOF
"$lint_tool" "$TEST_FILE" --waiver_files "$WAIVER_FILE" > /dev/null 2> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
WAIVER_FILE="${TEST_TMPDIR}/waive_module-parameter_line.vlt"
echo "=== Test --waiver_files $WAIVER_FILE with one rule on one line"
cat > ${WAIVER_FILE} <<EOF
waive --rule=module-parameter --line=1
EOF
# This is buggy: the error message actually comes out of stdout instead of stderr. This
# needs to be fixed in a separate change, but for now we merge stdout and stderr.
"$lint_tool" "$TEST_FILE" --waiver_files "$WAIVER_FILE" > "${MY_OUTPUT_FILE}.err" 2>&1
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
grep -q "module-parameter" "${MY_OUTPUT_FILE}.err" || {
echo "Expected \"module-parameter\" in ${MY_OUTPUT_FILE}.err but didn't find it. Got:"
cat "${MY_OUTPUT_FILE}.err"
exit 1
}
################################################################################
echo "=== Test --autofix=inplace"
ORIGINAL_TEST_FILE="${TEST_TMPDIR}/autofix_original.sv"
REFERENCE_TEST_FILE="${TEST_TMPDIR}/autofix_reference.sv"
TEST_FILE="${TEST_TMPDIR}/autofix.sv"
# Fixable violations, in order:
# :2:10: no-trailing-spaces
# :3:10: forbid-consecutive-null-statements
# :4:10: forbid-consecutive-null-statements
# :4:11: no-trailing-spaces
# :5:10: forbid-consecutive-null-statements
# :6:10: forbid-consecutive-null-statements
# :7:10: no-trailing-spaces
# :7:14: posix-eof
>"${ORIGINAL_TEST_FILE}"
echo -en 'module Autofix; \n' >>"${ORIGINAL_TEST_FILE}"
echo -en ' wire a;;\n' >>"${ORIGINAL_TEST_FILE}"
echo -en ' wire b;; \n' >>"${ORIGINAL_TEST_FILE}"
echo -en ' wire c;;\n' >>"${ORIGINAL_TEST_FILE}"
echo -en ' wire d;;\n' >>"${ORIGINAL_TEST_FILE}"
echo -en 'endmodule ' >>"${ORIGINAL_TEST_FILE}"
>"${REFERENCE_TEST_FILE}"
echo -en 'module Autofix;\n' >>"${REFERENCE_TEST_FILE}"
echo -en ' wire a;\n' >>"${REFERENCE_TEST_FILE}"
echo -en ' wire b;\n' >>"${REFERENCE_TEST_FILE}"
echo -en ' wire c;\n' >>"${REFERENCE_TEST_FILE}"
echo -en ' wire d;\n' >>"${REFERENCE_TEST_FILE}"
echo -en 'endmodule\n' >>"${REFERENCE_TEST_FILE}"
cp "${ORIGINAL_TEST_FILE}" "${TEST_FILE}"
RULES_CONFIG_FILE="${TEST_TMPDIR}/rules.conf"
cat > ${RULES_CONFIG_FILE} <<EOF
forbid-consecutive-null-statements
no-trailing-spaces
posix-eof
EOF
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" --autofix=inplace \
"${TEST_FILE}" > /dev/null 2>&1
visualize_invisible_characters() {
local -r TAB=$'\t'
local -r CR=$'\r'
local -r LF=$'\n'
sed \
-e ':join' \
-e 'N' \
-e '$!b join' \
-e 's/ /·/g' \
-e "s/${TAB}/├───/g" \
-e "s/${CR}/⁋/g" \
-e "s/\\n/¶\\${LF}/g"
}
check_diff() {
local reference_file_="$1"
local test_file_="$2"
local diff_file_="$3"
local err_message_="$4"
local vis_reference_file_="${reference_file_}.vis"
local vis_test_file_="${test_file_}.vis"
# Show invisible characters, return error when visualization failed
visualize_invisible_characters < "$reference_file_" > "$vis_reference_file_" || return 1
visualize_invisible_characters < "$test_file_" > "$vis_test_file_" || return 1
diff -u "${vis_reference_file_}" "${vis_test_file_}" >"${diff_file_}"
status="$?"
(( $status )) && {
echo "${err_message_}:"
cat "${diff_file_}"
}
return $status
}
DIFF_FILE="${TEST_TMPDIR}/autofix.diff"
FILES_DIFFER_ERR_MESSAGE="Reference file and fixed test file differ"
check_diff "${REFERENCE_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"${FILES_DIFFER_ERR_MESSAGE}"|| exit 1
################################################################################
echo "=== Test --autofix=inplace (multiple source files)"
# using same ${RULES_CONFIG_FILE}, ${ORIGINAL_TEST_FILE}, ${REFERENCE_TEST_FILE}
ORIGINAL_TEST_FILE_2="${TEST_TMPDIR}/autofix_2_original.sv"
ORIGINAL_TEST_FILE_3="${TEST_TMPDIR}/autofix_3_original.sv"
REFERENCE_TEST_FILE_2="${TEST_TMPDIR}/autofix_2_reference.sv"
REFERENCE_TEST_FILE_3="${TEST_TMPDIR}/autofix_3_reference.sv"
TEST_FILE_2="${TEST_TMPDIR}/autofix_2.sv"
TEST_FILE_3="${TEST_TMPDIR}/autofix_3.sv"
# No violations
>"${ORIGINAL_TEST_FILE_2}"
echo -en 'module AutofixTwo;\n' >>"${ORIGINAL_TEST_FILE_2}"
echo -en 'endmodule\n' >>"${ORIGINAL_TEST_FILE_2}"
cp "${ORIGINAL_TEST_FILE_2}" "${REFERENCE_TEST_FILE_2}"
# Fixable violations:
# :1:21: forbid-consecutive-null-statements
# :2:10: no-trailing-spaces
>"${ORIGINAL_TEST_FILE_3}"
echo -en 'module AutofixThree;;\n' >>"${ORIGINAL_TEST_FILE_3}"
echo -en ' wire a; \n' >>"${ORIGINAL_TEST_FILE_3}"
echo -en 'endmodule\n' >>"${ORIGINAL_TEST_FILE_3}"
>"${REFERENCE_TEST_FILE_3}"
echo -en 'module AutofixThree;\n' >>"${REFERENCE_TEST_FILE_3}"
echo -en ' wire a;\n' >>"${REFERENCE_TEST_FILE_3}"
echo -en 'endmodule\n' >>"${REFERENCE_TEST_FILE_3}"
cp "${ORIGINAL_TEST_FILE}" "${TEST_FILE}"
cp "${ORIGINAL_TEST_FILE_2}" "${TEST_FILE_2}"
cp "${ORIGINAL_TEST_FILE_3}" "${TEST_FILE_3}"
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" --autofix=inplace \
"${TEST_FILE}" "${TEST_FILE_2}" "${TEST_FILE_3}" > /dev/null 2>&1
DIFF_FILE_2="${TEST_TMPDIR}/autofix_2.diff"
DIFF_FILE_3="${TEST_TMPDIR}/autofix_3.diff"
failure=0
check_diff "${REFERENCE_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${REFERENCE_TEST_FILE_2}" "${TEST_FILE_2}" "${DIFF_FILE_2}" \
"${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${REFERENCE_TEST_FILE_3}" "${TEST_FILE_3}" "${DIFF_FILE_3}" \
"${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
(( $failure )) && exit 1
################################################################################
echo "=== Test --autofix=no --autofix_output_file=somefilename"
# if we've not chosen any autofix, then it doesn't matter if the output file
# is bogus.
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" \
--autofix=no \
--autofix_output_file="/" "${TEST_FILE}" > /dev/null 2>&1
(( $? )) && exit 1
################################################################################
echo "=== Test --autofix=patch --autofix_output_file=<invalidlocation>"
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" \
--autofix=patch \
--autofix_output_file="/" "${TEST_FILE}" > /dev/null 2>&1
if [ $? -ne 3 ] ; then
echo "Expected unwritable output patch file to result in exit-code 3"
exit 1
fi
################################################################################
echo "=== Test --autofix=patch --autofix_output_file=..."
# using same ${RULES_CONFIG_FILE}, ${ORIGINAL_TEST_FILE}, ${REFERENCE_TEST_FILE}
PATCH_FILE="${TEST_TMPDIR}/autofix.patch"
REDIRECT_PATCH_FILE="${TEST_TMPDIR}/redirect-autofix.patch"
cp "${ORIGINAL_TEST_FILE}" "${TEST_FILE}"
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" \
--autofix=patch \
--autofix_output_file="${PATCH_FILE}" \
"${TEST_FILE}" > /dev/null 2>&1
# if filename is not given directly we expect output to stdout
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" \
--autofix=patch \
"${TEST_FILE}" > ${REDIRECT_PATCH_FILE} 2>/dev/null
check_diff "${PATCH_FILE}" "${REDIRECT_PATCH_FILE}" "${DIFF_FILE}" \
"Patch difference on --autofix_output_file and stdout" || exit 1
NO_CHANGES_ERR_MESSAGE="Expected no changes in input file. Actual changes"
# Test that source file was not modified
check_diff "${ORIGINAL_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"${NO_CHANGES_ERR_MESSAGE}" || exit 1
# Patch source file with generated patch file
patch_out="$(patch "${TEST_FILE}" "${PATCH_FILE}" 2>&1)"
status="$?"
(( $status )) && {
echo "Expected exit code 0 from 'patch' tool, but got $status"
echo "--- 'patch' output ---"
echo "$patch_out"
exit 1
}
# Check patched source
check_diff "${REFERENCE_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"${FILES_DIFFER_ERR_MESSAGE}" || exit 1
################################################################################
echo "=== Test --autofix=patch --autofix_output_file=... (multiple source files)"
# using same ${ORIGINAL_TEST_FILE}, ${REFERENCE_TEST_FILE},
# ${ORIGINAL_TEST_FILE_2}, ${REFERENCE_TEST_FILE_2},
# ${ORIGINAL_TEST_FILE_3}, ${REFERENCE_TEST_FILE_3},
# ${RULES_CONFIG_FILE},
cp "${ORIGINAL_TEST_FILE}" "${TEST_FILE}"
cp "${ORIGINAL_TEST_FILE_2}" "${TEST_FILE_2}"
cp "${ORIGINAL_TEST_FILE_3}" "${TEST_FILE_3}"
# `patch` doesn't like absolute paths
REL_TEST_FILE="$(basename ${TEST_FILE})"
REL_TEST_FILE_2="$(basename ${TEST_FILE_2})"
REL_TEST_FILE_3="$(basename ${TEST_FILE_3})"
(
cd $TEST_TMPDIR
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" --autofix=patch \
--autofix_output_file="${PATCH_FILE}" \
"${REL_TEST_FILE}" "${REL_TEST_FILE_2}" "${REL_TEST_FILE_3}" > /dev/null 2>&1
)
failure=0
# Test that source files were not modified
check_diff "${ORIGINAL_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"${NO_CHANGES_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${ORIGINAL_TEST_FILE_2}" "${TEST_FILE_2}" "${DIFF_FILE_2}" \
"${NO_CHANGES_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${ORIGINAL_TEST_FILE_3}" "${TEST_FILE_3}" "${DIFF_FILE_3}" \
"${NO_CHANGES_ERR_MESSAGE}"
(( failure|="$?" ))
(( $failure )) && exit 1
# Patch sources with generated patch file
patch_out="$(cd $TEST_TMPDIR; patch -p1 < "${PATCH_FILE}" 2>&1)"
status="$?"
(( $status )) && {
echo "Expected exit code 0 from 'patch' tool, but got $status"
echo "--- 'patch' output ---"
echo "$patch_out"
exit 1
}
# Check patched sources
check_diff "${REFERENCE_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${REFERENCE_TEST_FILE_2}" "${TEST_FILE_2}" "${DIFF_FILE_2}" \
"${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${REFERENCE_TEST_FILE_3}" "${TEST_FILE_3}" "${DIFF_FILE_3}" \
"${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
(( $failure )) && exit 1
################################################################################
echo "=== Test --autofix=inplace-interactive"
# using same ${ORIGINAL_TEST_FILE}, ${ORIGINAL_TEST_FILE_2},
# ${ORIGINAL_TEST_FILE_3}, ${RULES_CONFIG_FILE},
# interactive_autofix_test "<input-keys>" \
# "reference file 1 contents" "more content"... \
# --- \
# "reference file 2 contents" "more content"... \
# --- \
# "reference file 3 contents" "more content"...
interactive_autofix_test() {
local keys_="$1"
shift
local -a expected_fixes_=("")
local source_idx_=0
while (( $# > 0 )); do
if [[ "$1" == '---' ]]; then
(( source_idx_++ ))
expected_fixes_[source_idx_]=""
else
expected_fixes_[source_idx_]+="$1"
fi
shift
done
cp "${ORIGINAL_TEST_FILE}" "${TEST_FILE}"
cp "${ORIGINAL_TEST_FILE_2}" "${TEST_FILE_2}"
cp "${ORIGINAL_TEST_FILE_3}" "${TEST_FILE_3}"
# echo -------------
# echo -en "${expected_fixes_[0]:-}"
# echo -------------
# echo -en "${expected_fixes_[1]:-}"
# echo -------------
# echo -en "${expected_fixes_[2]:-}"
# echo -------------
echo -en "${expected_fixes_[0]:-}" > "${REFERENCE_TEST_FILE}"
echo -en "${expected_fixes_[1]:-}" > "${REFERENCE_TEST_FILE_2}"
echo -en "${expected_fixes_[2]:-}" > "${REFERENCE_TEST_FILE_3}"
# Checking two ways to interact: with patch-interactive and
# with inplace-interactive
# In patch interactive mode, we record the patch, check that original
# files are not modified, and that the output is as expected after
# application of the patch.
# `patch` doesn't like absolute paths
REL_TEST_FILE="$(basename ${TEST_FILE})"
REL_TEST_FILE_2="$(basename ${TEST_FILE_2})"
REL_TEST_FILE_3="$(basename ${TEST_FILE_3})"
( cd $TEST_TMPDIR
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" \
--autofix=patch-interactive --autofix_output_file="${PATCH_FILE}" \
"${REL_TEST_FILE}" "${REL_TEST_FILE_2}" "${REL_TEST_FILE_3}" \
> /dev/null 2>&1 \
<<< "$keys_"
)
# Making sure that the original files were not touched
check_diff "${ORIGINAL_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"${NO_CHANGES_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${ORIGINAL_TEST_FILE_2}" "${TEST_FILE_2}" "${DIFF_FILE}" \
"${NO_CHANGES_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${ORIGINAL_TEST_FILE_3}" "${TEST_FILE_3}" "${DIFF_FILE}" \
"${NO_CHANGES_ERR_MESSAGE}"
(( failure|="$?" ))
patch_out="$(cd $TEST_TMPDIR; patch -p1 < "${PATCH_FILE}" 2>&1)"
status="$?"
(( $status )) && {
echo "Expected exit code 0 from 'patch' tool, but got $status"
echo "--- 'patch' output ---"
echo "$patch_out"
exit 1
}
# Check patched sources
check_diff "${REFERENCE_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"Patching - ${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${REFERENCE_TEST_FILE_2}" "${TEST_FILE_2}" "${DIFF_FILE_2}" \
"Patching - ${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${REFERENCE_TEST_FILE_3}" "${TEST_FILE_3}" "${DIFF_FILE_3}" \
"Patching - ${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
# Testing interactive modification of the file directly
cp "${ORIGINAL_TEST_FILE}" "${TEST_FILE}"
cp "${ORIGINAL_TEST_FILE_2}" "${TEST_FILE_2}"
cp "${ORIGINAL_TEST_FILE_3}" "${TEST_FILE_3}"
"$lint_tool" --ruleset=none --rules_config="${RULES_CONFIG_FILE}" \
--autofix=inplace-interactive \
"${TEST_FILE}" "${TEST_FILE_2}" "${TEST_FILE_3}" \
> /dev/null 2>&1 \
<<< "$keys_"
failure=0
check_diff "${REFERENCE_TEST_FILE}" "${TEST_FILE}" "${DIFF_FILE}" \
"Inplace - ${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${REFERENCE_TEST_FILE_2}" "${TEST_FILE_2}" "${DIFF_FILE_2}" \
"Inplace - ${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
check_diff "${REFERENCE_TEST_FILE_3}" "${TEST_FILE_3}" "${DIFF_FILE_3}" \
"Inplace - ${FILES_DIFFER_ERR_MESSAGE}"
(( failure|="$?" ))
(( $failure )) && exit 1
}
echo "=== Test --autofix=inplace-interactive: Apply All"
interactive_autofix_test "A" \
'module Autofix;\n' \
' wire a;\n' \
' wire b;\n' \
' wire c;\n' \
' wire d;\n' \
'endmodule\n' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;\n' \
' wire a;\n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Reject All"
interactive_autofix_test "D" \
'module Autofix; \n' \
' wire a;;\n' \
' wire b;; \n' \
' wire c;;\n' \
' wire d;;\n' \
'endmodule ' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;;\n' \
' wire a; \n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Reject"
interactive_autofix_test "nA" \
'module Autofix; \n' \
' wire a;\n' \
' wire b;\n' \
' wire c;\n' \
' wire d;\n' \
'endmodule\n' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;\n' \
' wire a;\n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Apply"
interactive_autofix_test "yD" \
'module Autofix;\n' \
' wire a;;\n' \
' wire b;; \n' \
' wire c;;\n' \
' wire d;;\n' \
'endmodule ' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;;\n' \
' wire a; \n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Apply All For Rule"
interactive_autofix_test "annnnnn" \
'module Autofix;\n' \
' wire a;;\n' \
' wire b;;\n' \
' wire c;;\n' \
' wire d;;\n' \
'endmodule' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;;\n' \
' wire a;\n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Reject All For Rule"
interactive_autofix_test "dyyyyyy" \
'module Autofix; \n' \
' wire a;\n' \
' wire b; \n' \
' wire c;\n' \
' wire d;\n' \
'endmodule \n' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;\n' \
' wire a; \n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Reject All For Rule, Apply All For Rule"
interactive_autofix_test "dan" \
'module Autofix; \n' \
' wire a;\n' \
' wire b; \n' \
' wire c;\n' \
' wire d;\n' \
'endmodule ' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;\n' \
' wire a; \n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Show Fix"
interactive_autofix_test "yppnnpypyyppynpypn" \
'module Autofix;\n' \
' wire a;;\n' \
' wire b;;\n' \
' wire c;\n' \
' wire d;\n' \
'endmodule' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;\n' \
' wire a; \n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Show Applied Fixes"
interactive_autofix_test "yPPnnPyPyyPPynPyPn" \
'module Autofix;\n' \
' wire a;;\n' \
' wire b;;\n' \
' wire c;\n' \
' wire d;\n' \
'endmodule' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;\n' \
' wire a; \n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: EOF too early"
interactive_autofix_test "y" \
'module Autofix;\n' \
' wire a;;\n' \
' wire b;; \n' \
' wire c;;\n' \
' wire d;;\n' \
'endmodule ' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;;\n' \
' wire a; \n' \
'endmodule\n'
echo "=== Test --autofix=inplace-interactive: Unknown keys"
# Only "y" and "D" are valid
interactive_autofix_test "@^(y***D" \
'module Autofix;\n' \
' wire a;;\n' \
' wire b;; \n' \
' wire c;;\n' \
' wire d;;\n' \
'endmodule ' \
--- \
'module AutofixTwo;\n' \
'endmodule\n' \
--- \
'module AutofixThree;;\n' \
' wire a; \n' \
'endmodule\n'
################################################################################
echo "=== Test --autofix=generate-waiver --autofix_output_file: run linter on a file, then use the generated waiver file to waive all violations"
# File with SV base
TEST_FILE="${TEST_TMPDIR}/generate-waiver.sv"
cat >"${TEST_FILE}" <<EOF
module m;
wire x = y;
always @* x=y;
always @* x=y;
endmodule
module m;
begin
wire x=y;
end
begin
wire s=y;
end
endmodule
module m;
wire x = y;
always @* x=y;
always @* x=y;
endmodule
EOF
"$lint_tool" "${TEST_FILE}" --autofix=generate-waiver --autofix_output_file "${MY_OUTPUT_FILE}" &> /dev/null
status="$?"
[[ $status == 1 ]] || {
echo "Expected exit code 1, but got $status"
exit 1
}
"$lint_tool" "${TEST_FILE}" --waiver_files "${MY_OUTPUT_FILE}" &> "${MY_OUTPUT_FILE}.err"
status="$?"
[[ $status == 0 ]] || {
echo "Expected exit code 0, but got $status"
exit 1
}
[[ -s "{$MY_OUTPUT_FILE}.err" ]] && {
echo "Expected ${MY_OUTPUT_FILE}.err to be empty, but got:"
cat "${MY_OUTPUT_FILE}.err"
exit 1
}
################################################################################
echo "=== Test --autofix=inplace-interactive: Choose alternative fix"
# Choose alternatives with key '1' or '2'
# Files with alternatives in autofixes
ORIGINAL_ALT_AUTO_FIX="${TEST_TMPDIR}/orig-autofix-alternative.sv"
cat >"${ORIGINAL_ALT_AUTO_FIX}" <<EOF
module AlternativeAutoFix;
assign a = 32'h1;
endmodule
EOF
REFERENCE_ALT_AUTO_FIX_1="${TEST_TMPDIR}/alt-autofix-alternative-1.sv"
cat >"${REFERENCE_ALT_AUTO_FIX_1}" <<EOF
module AlternativeAutoFix;
assign a = 32'h00000001;
endmodule
EOF
REFERENCE_ALT_AUTO_FIX_2="${TEST_TMPDIR}/alt-autofix-alternative-2.sv"
cat >"${REFERENCE_ALT_AUTO_FIX_2}" <<EOF
module AlternativeAutoFix;
assign a = 32'd1;
endmodule
EOF
failure=0
cp ${ORIGINAL_ALT_AUTO_FIX} ${TEST_FILE}
"$lint_tool" --ruleset=none --rules="undersized-binary-literal=hex:true" \
--autofix=inplace-interactive \
"${TEST_FILE}" > /dev/null 2>&1 \
<<< "1"
check_diff "${REFERENCE_ALT_AUTO_FIX_1}" "${TEST_FILE}" "${DIFF_FILE}" \
"First alternative not chosen."
(( failure|="$?" ))
# Choosing first non-existing alternative, then an existing one.
cp ${ORIGINAL_ALT_AUTO_FIX} ${TEST_FILE}
"$lint_tool" --ruleset=none --rules="undersized-binary-literal=hex:true" \
--autofix=inplace-interactive \
"${TEST_FILE}" > /dev/null 2>&1 \
<<< "41"
check_diff "${REFERENCE_ALT_AUTO_FIX_1}" "${TEST_FILE}" "${DIFF_FILE}" \
"First alternative not chosen."
(( failure|="$?" ))
cp ${ORIGINAL_ALT_AUTO_FIX} ${TEST_FILE}
"$lint_tool" --ruleset=none --rules="undersized-binary-literal=hex:true" \
--autofix=inplace-interactive \
"${TEST_FILE}" > /dev/null 2>&1 \
<<< "2"
check_diff "${REFERENCE_ALT_AUTO_FIX_2}" "${TEST_FILE}" "${DIFF_FILE}" \
"Second alternative not chosen."
(( failure|="$?" ))
(( $failure )) && exit 1
echo "PASS"