blob: 4b62ec19fa21c6c4e278f64f4f5755b541bb04b3 [file] [log] [blame]
#!/bin/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.
# Find input files
MY_INPUT_FILE="${TEST_TMPDIR}/myinput.txt"
readonly MY_INPUT_FILE
MY_OUTPUT_FILE="${TEST_TMPDIR}/myoutput.txt"
readonly MY_OUTPUT_FILE
MY_EXPECT_FILE="${TEST_TMPDIR}/myexpect.txt"
readonly MY_EXPECT_FILE
# Process script flags and arguments.
[[ "$#" == 1 ]] || {
echo "Expecting 1 positional argument, verible-patch-tool path."
exit 1
}
patch_tool="$1"
################################################################################
# Test no command.
"$patch_tool" > "$MY_OUTPUT_FILE" 2>&1
status="$?"
[[ $status == 1 ]] || {
"Expected exit code 1, but got $status"
exit 1
}
################################################################################
# Test invalid command.
"$patch_tool" wish > "$MY_OUTPUT_FILE" 2>&1
status="$?"
[[ $status == 1 ]] || {
"Expected exit code 1, but got $status"
exit 1
}
################################################################################
# Test the 'help' command.
"$patch_tool" help > "$MY_OUTPUT_FILE" 2>&1
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
grep -q "changed-lines" "$MY_OUTPUT_FILE" || {
echo "Expected \"changed-lines\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
################################################################################
# Test 'help' on a specific command.
"$patch_tool" help help > "$MY_OUTPUT_FILE" 2>&1
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
################################################################################
# Test changed-lines: missing patchfile argument.
"$patch_tool" changed-lines > /dev/null
status="$?"
[[ $status == 1 ]] || {
"Expected exit code 1, but got $status"
exit 1
}
################################################################################
# Test changed-lines: using a fake patch file.
cat > "$MY_INPUT_FILE" <<EOF
--- /path/to/file1.txt 2017-01-01
+++ /path/to/file1.txt 2017-01-01
@@ -9,3 +12,6 @@
same
+new
+new too
same
+new three
same
--- /dev/null 2017-01-01
+++ /path/to/file2.txt 2017-01-01
@@ -0,0 +1,3 @@
+do
+re
+mi
EOF
cat > "$MY_EXPECT_FILE" <<EOF
/path/to/file1.txt 13-14,16
/path/to/file2.txt
EOF
"$patch_tool" changed-lines "$MY_INPUT_FILE" > "$MY_OUTPUT_FILE"
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
diff -u "$MY_EXPECT_FILE" "$MY_OUTPUT_FILE" || {
exit 1
}
# Same but piped into stdin.
"$patch_tool" changed-lines - < "$MY_INPUT_FILE" > "$MY_OUTPUT_FILE"
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
diff -u "$MY_EXPECT_FILE" "$MY_OUTPUT_FILE" || {
exit 1
}
################################################################################
# Test changed-lines: reading a malformed patch file.
cat > "$MY_INPUT_FILE" <<EOF
--- /path/to/file1.txt 2017-01-01
+++ /path/to/file1.txt 2017-01-01
@@ -1,1 +1,1 @@
EOF
"$patch_tool" changed-lines "$MY_INPUT_FILE" > /dev/null
status="$?"
[[ $status == 1 ]] || {
"Expected exit code 1, but got $status"
exit 1
}
################################################################################
# Test changed-lines: reading a nonexistent patch file.
"$patch_tool" changed-lines "$MY_INPUT_FILE.does.not.exist" > /dev/null
status="$?"
[[ $status == 1 ]] || {
"Expected exit code 1, but got $status"
exit 1
}
################################################################################
# Test stdin-test noninteractively.
cat > "$MY_INPUT_FILE" <<EOF
Lovely file!
EOF
"$patch_tool" stdin-test < "$MY_INPUT_FILE" > "$MY_OUTPUT_FILE"
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
grep -q "Lovely file" "$MY_OUTPUT_FILE" || {
echo "Expected \"Lovely file\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
################################################################################
# Test cat-test noninteractively.
cat > "$MY_INPUT_FILE".1 <<EOF
111111
EOF
cat > "$MY_INPUT_FILE".2 <<EOF
222222
EOF
"$patch_tool" cat-test "$MY_INPUT_FILE".1 > "$MY_OUTPUT_FILE"
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
grep -q "111111" "$MY_OUTPUT_FILE" || {
echo "Expected \"111111\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
# Test single redirection
"$patch_tool" cat-test - < "$MY_INPUT_FILE".1 > "$MY_OUTPUT_FILE"
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
grep -q "111111" "$MY_OUTPUT_FILE" || {
echo "Expected \"111111\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
# Test single redirection with one other file
"$patch_tool" cat-test - "$MY_INPUT_FILE".2 < "$MY_INPUT_FILE".1 > "$MY_OUTPUT_FILE"
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
grep -q "111111" "$MY_OUTPUT_FILE" || {
echo "Expected \"111111\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
grep -q "222222" "$MY_OUTPUT_FILE" || {
echo "Expected \"222222\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
# Test single redirection with one other file, different order
"$patch_tool" cat-test "$MY_INPUT_FILE".2 - < "$MY_INPUT_FILE".1 > "$MY_OUTPUT_FILE"
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
grep -q "111111" "$MY_OUTPUT_FILE" || {
echo "Expected \"111111\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
grep -q "222222" "$MY_OUTPUT_FILE" || {
echo "Expected \"222222\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
rm -f "$MY_INPUT_FILE".{1,2}
################################################################################
# Test apply-pick: missing patchfile argument
"$patch_tool" apply-pick > "$MY_OUTPUT_FILE" 2>&1
status="$?"
[[ $status == 1 ]] || {
"Expected exit code 1, but got $status"
exit 1
}
grep -q "Missing patchfile argument" "$MY_OUTPUT_FILE" || {
echo "Expected \"Missing patchfile argument\" in $MY_OUTPUT_FILE but didn't find it. Got:"
cat "$MY_OUTPUT_FILE"
exit 1
}
################################################################################
# Test apply-pick: nonexistent patchfile
"$patch_tool" apply-pick "$MY_INPUT_FILE.does.not.exist" > /dev/null
status="$?"
[[ $status == 1 ]] || {
"Expected exit code 1, but got $status"
exit 1
}
################################################################################
# Test apply-pick: reading a malformed patch file.
cat > "$MY_INPUT_FILE" <<EOF
--- /path/to/file1.txt 2017-01-01
+++ /path/to/file1.txt 2017-01-01
@@ -1,1 +1,1 @@
EOF
"$patch_tool" apply-pick "$MY_INPUT_FILE" > /dev/null
status="$?"
[[ $status == 1 ]] || {
"Expected exit code 1, but got $status"
exit 1
}
################################################################################
# Test apply-pick: various declining/accepting of patch hunks
# 1. generate patch from two files
# Let the 'original' file be write-able for in-place modification.
cat > "$MY_INPUT_FILE".orig <<EOF
a
b
c
d
e
f
g
h
EOF
cp "$MY_INPUT_FILE".orig "$MY_INPUT_FILE".bkp
chmod -w "$MY_INPUT_FILE".bkp
# Delete two lines 'b' and 'g'.
cat > "$MY_INPUT_FILE".proposed <<EOF
a
c
d
e
f
h
EOF
chmod -w "$MY_INPUT_FILE".proposed
# Use only 1 line of context to prevent hunks from merging.
# Expect two hunks in this patch.
diff -U 1 "$MY_INPUT_FILE".orig "$MY_INPUT_FILE".proposed > "$MY_INPUT_FILE".patch
chmod -w "$MY_INPUT_FILE".patch
# 2. Run apply-pick.
# Pass patchfile via file.
# User declines all hunks.
cat > "$MY_INPUT_FILE".user-input <<EOF
n
n
EOF
"$patch_tool" apply-pick "$MY_INPUT_FILE".patch < "$MY_INPUT_FILE".user-input > /dev/null
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
diff -u "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig || {
echo "Expected these files to match, but got the above diff."
exit 1
}
# 2a.1 Pass patchfile via stdin redirection.
# This doesn't work yet.
if false
then
( "$patch_tool" apply-pick - < "$MY_INPUT_FILE".patch ) < "$MY_INPUT_FILE".user-input > /dev/null
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
diff -u "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig || {
echo "Expected these files to match, but got the above diff."
exit 1
}
fi
# 2b. User accepts only the first hunk
cat > "$MY_INPUT_FILE".user-input <<EOF
y
n
EOF
"$patch_tool" apply-pick "$MY_INPUT_FILE".patch < "$MY_INPUT_FILE".user-input > /dev/null
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
# Expect only 'b' to be deleted.
cat > "$MY_EXPECT_FILE" <<EOF
a
c
d
e
f
g
h
EOF
# Expect original file to have been modified in-place.
diff -u "$MY_EXPECT_FILE" "$MY_INPUT_FILE".orig || {
echo "Expected these files to match, but got the above diff."
exit 1
}
# Restore the original file for the next test.
cp "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig
chmod u+w "$MY_INPUT_FILE".orig
# 2c. User accepts only the second hunk
cat > "$MY_INPUT_FILE".user-input <<EOF
n
y
EOF
"$patch_tool" apply-pick "$MY_INPUT_FILE".patch < "$MY_INPUT_FILE".user-input > /dev/null
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
# Expect only 'g' to be deleted.
cat > "$MY_EXPECT_FILE" <<EOF
a
b
c
d
e
f
h
EOF
# Expect original file to have been modified in-place.
diff -u "$MY_EXPECT_FILE" "$MY_INPUT_FILE".orig || {
echo "Expected these files to match, but got the above diff."
exit 1
}
# Restore the original file for the next test.
cp "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig
chmod u+w "$MY_INPUT_FILE".orig
# 2d. User accepts both hunks.
cat > "$MY_INPUT_FILE".user-input <<EOF
y
y
EOF
"$patch_tool" apply-pick "$MY_INPUT_FILE".patch < "$MY_INPUT_FILE".user-input > /dev/null
status="$?"
[[ $status == 0 ]] || {
"Expected exit code 0, but got $status"
exit 1
}
# Expect 'b' and 'g' to be deleted.
cat > "$MY_EXPECT_FILE" <<EOF
a
c
d
e
f
h
EOF
# Expect original file to have been modified in-place.
diff -u "$MY_EXPECT_FILE" "$MY_INPUT_FILE".orig || {
echo "Expected these files to match, but got the above diff."
exit 1
}
# Restore the original file for the next test.
cp "$MY_INPUT_FILE".bkp "$MY_INPUT_FILE".orig
chmod u+w "$MY_INPUT_FILE".orig
################################################################################
echo "PASS"