```git-check-assertions run test/mechanicaldiff.bats assert_success git checkout HEAD~ bin run test/mechanicaldiff.bats assert_failure assert_output --partial "-- command failed --" ```
209 lines
5.6 KiB
Bash
Executable file
209 lines
5.6 KiB
Bash
Executable file
#!/usr/bin/env bats
|
|
|
|
setup() {
|
|
set -euo pipefail
|
|
|
|
bats_load_library bats-support
|
|
bats_load_library bats-assert
|
|
|
|
DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")" >/dev/null 2>&1 && pwd)"
|
|
PATH="$DIR/../bin:$PATH"
|
|
}
|
|
|
|
@test "keeps hunk when replacement matches" {
|
|
printf "%s\n" "foo" >"$BATS_TEST_TMPDIR/old"
|
|
printf "%s\n" "bar" >"$BATS_TEST_TMPDIR/new"
|
|
diff_output="$(git diff --no-index "$BATS_TEST_TMPDIR/old" \
|
|
"$BATS_TEST_TMPDIR/new" || true)"
|
|
run mechanicaldiff.py foo bar <<<"$diff_output"
|
|
assert_success
|
|
assert_output "$diff_output"
|
|
}
|
|
|
|
@test "drops diff when replacement does not match" {
|
|
printf "%s\n" "foo" >"$BATS_TEST_TMPDIR/old"
|
|
printf "%s\n" "baz" >"$BATS_TEST_TMPDIR/new"
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" "$BATS_TEST_TMPDIR/new" \
|
|
>"$BATS_TEST_TMPDIR/diff" || true
|
|
run mechanicaldiff.py foo bar <"$BATS_TEST_TMPDIR/diff"
|
|
assert_failure
|
|
assert_output ""
|
|
}
|
|
|
|
@test "drops diff with only mode change" {
|
|
printf "%s\n" "foo" >"$BATS_TEST_TMPDIR/old"
|
|
printf "%s\n" "foo" >"$BATS_TEST_TMPDIR/new"
|
|
chmod 0644 "$BATS_TEST_TMPDIR/old"
|
|
chmod 0755 "$BATS_TEST_TMPDIR/new"
|
|
|
|
diff_output="$(git diff --no-index "$BATS_TEST_TMPDIR/old" \
|
|
"$BATS_TEST_TMPDIR/new" || true)"
|
|
|
|
run mechanicaldiff.py foo bar <<<"$diff_output"
|
|
assert_failure
|
|
assert_output ""
|
|
}
|
|
|
|
@test "drops one hunk and keeps another" {
|
|
cat >"$BATS_TEST_TMPDIR/old" <<-'EOF'
|
|
alpha
|
|
beta
|
|
gamma
|
|
one
|
|
two
|
|
three
|
|
four
|
|
five
|
|
six
|
|
seven
|
|
eight
|
|
nine
|
|
ten
|
|
delta
|
|
EOF
|
|
sed \
|
|
-e 's/beta/beta_changed/' \
|
|
-e 's/delta/delta_changed/' \
|
|
"$BATS_TEST_TMPDIR/old" >"$BATS_TEST_TMPDIR/new"
|
|
sed 's/beta/beta_changed/' "$BATS_TEST_TMPDIR/old" \
|
|
>"$BATS_TEST_TMPDIR/new_kept"
|
|
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" \
|
|
"$BATS_TEST_TMPDIR/new" \
|
|
>"$BATS_TEST_TMPDIR/diff_full" || true
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" \
|
|
"$BATS_TEST_TMPDIR/new_kept" \
|
|
>"$BATS_TEST_TMPDIR/diff_expected" || true
|
|
|
|
run mechanicaldiff.py "beta" "beta_changed" <"$BATS_TEST_TMPDIR/diff_full"
|
|
assert_failure
|
|
assert_output --partial "-beta"
|
|
assert_output --partial "+beta_changed"
|
|
refute_output --partial "delta_changed"
|
|
}
|
|
|
|
@test "handles multiple files" {
|
|
printf "%s\n" "foo" >"$BATS_TEST_TMPDIR/old1"
|
|
printf "%s\n" "bar" >"$BATS_TEST_TMPDIR/new1"
|
|
printf "%s\n" "alpha" >"$BATS_TEST_TMPDIR/old2"
|
|
printf "%s\n" "beta" >"$BATS_TEST_TMPDIR/new2"
|
|
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old1" "$BATS_TEST_TMPDIR/new1" \
|
|
>"$BATS_TEST_TMPDIR/diff_one" || true
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old2" "$BATS_TEST_TMPDIR/new2" \
|
|
>"$BATS_TEST_TMPDIR/diff_two" || true
|
|
|
|
cat "$BATS_TEST_TMPDIR/diff_one" "$BATS_TEST_TMPDIR/diff_two" \
|
|
>"$BATS_TEST_TMPDIR/diff_all"
|
|
|
|
run mechanicaldiff.py foo bar <"$BATS_TEST_TMPDIR/diff_one"
|
|
assert_success
|
|
output_one="$output"
|
|
|
|
run mechanicaldiff.py foo bar <"$BATS_TEST_TMPDIR/diff_two"
|
|
assert_failure
|
|
output_two="$output"
|
|
|
|
run mechanicaldiff.py foo bar <"$BATS_TEST_TMPDIR/diff_all"
|
|
assert_failure
|
|
assert_output "${output_one}${output_two}"
|
|
}
|
|
|
|
@test "supports regex group substitutions" {
|
|
cat >"$BATS_TEST_TMPDIR/old" <<-'EOF'
|
|
foo(123)
|
|
bar
|
|
EOF
|
|
cat >"$BATS_TEST_TMPDIR/new" <<-'EOF'
|
|
foo-123
|
|
bar
|
|
EOF
|
|
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" "$BATS_TEST_TMPDIR/new" \
|
|
>"$BATS_TEST_TMPDIR/diff" || true
|
|
|
|
run mechanicaldiff.py 'foo\((\d+)\)' 'foo-\1' <"$BATS_TEST_TMPDIR/diff"
|
|
assert_success
|
|
assert_output "$(cat "$BATS_TEST_TMPDIR/diff")"
|
|
}
|
|
|
|
@test "replaces a substring within a line" {
|
|
cat >"$BATS_TEST_TMPDIR/old" <<-'EOF'
|
|
prefix foo suffix
|
|
EOF
|
|
cat >"$BATS_TEST_TMPDIR/new" <<-'EOF'
|
|
prefix bar suffix
|
|
EOF
|
|
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" "$BATS_TEST_TMPDIR/new" \
|
|
>"$BATS_TEST_TMPDIR/diff" || true
|
|
|
|
run mechanicaldiff.py foo bar <"$BATS_TEST_TMPDIR/diff"
|
|
assert_success
|
|
assert_output "$(cat "$BATS_TEST_TMPDIR/diff")"
|
|
}
|
|
|
|
@test "ignores leading and trailing blank lines for comparison" {
|
|
cat >"$BATS_TEST_TMPDIR/old" <<-'EOF'
|
|
|
|
prefix foo suffix
|
|
|
|
EOF
|
|
cat >"$BATS_TEST_TMPDIR/new" <<-'EOF'
|
|
prefix bar suffix
|
|
EOF
|
|
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" "$BATS_TEST_TMPDIR/new" \
|
|
>"$BATS_TEST_TMPDIR/diff" || true
|
|
|
|
run mechanicaldiff.py foo bar <"$BATS_TEST_TMPDIR/diff"
|
|
assert_success
|
|
assert_output "$(cat "$BATS_TEST_TMPDIR/diff")"
|
|
}
|
|
|
|
@test "keeps only matching line in a consecutive change block" {
|
|
cat >"$BATS_TEST_TMPDIR/old" <<-'EOF'
|
|
foo
|
|
bar
|
|
baz
|
|
EOF
|
|
sed \
|
|
-e 's/foo/foo_changed/' \
|
|
-e 's/bar/bar_changed/' \
|
|
"$BATS_TEST_TMPDIR/old" >"$BATS_TEST_TMPDIR/new"
|
|
sed 's/foo/foo_changed/' "$BATS_TEST_TMPDIR/old" \
|
|
>"$BATS_TEST_TMPDIR/new_kept"
|
|
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" "$BATS_TEST_TMPDIR/new" \
|
|
>"$BATS_TEST_TMPDIR/diff_full" || true
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" "$BATS_TEST_TMPDIR/new_kept" \
|
|
>"$BATS_TEST_TMPDIR/diff_expected" || true
|
|
|
|
run mechanicaldiff.py foo foo_changed <"$BATS_TEST_TMPDIR/diff_full"
|
|
assert_failure
|
|
expected="$(sed \
|
|
-e 's/new_kept/new/g' \
|
|
-e '/^index /d' \
|
|
"$BATS_TEST_TMPDIR/diff_expected")"
|
|
output_normalized="$(printf '%s\n' "$output" | sed -e '/^index /d')"
|
|
assert_equal "$expected" "$output_normalized"
|
|
}
|
|
|
|
@test "drops hunk when all pairs become context" {
|
|
cat >"$BATS_TEST_TMPDIR/old" <<-'EOF'
|
|
foo
|
|
bar
|
|
baz
|
|
EOF
|
|
sed \
|
|
-e 's/foo/foo_changed/' \
|
|
-e 's/bar/bar_changed/' \
|
|
"$BATS_TEST_TMPDIR/old" >"$BATS_TEST_TMPDIR/new"
|
|
|
|
git diff --no-index "$BATS_TEST_TMPDIR/old" "$BATS_TEST_TMPDIR/new" \
|
|
>"$BATS_TEST_TMPDIR/diff_full" || true
|
|
|
|
run mechanicaldiff.py qux quux <"$BATS_TEST_TMPDIR/diff_full"
|
|
assert_failure
|
|
assert_output ""
|
|
}
|