#!/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 "keeps 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_success assert_output "$diff_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" } @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 "" }