mechanicaldiff/test/mechanicaldiff.bats

158 lines
4.3 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 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 "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"
}