diff --git a/branch_bender/test_verify.py b/branch_bender/test_verify.py index 36cff525..2a658dec 100644 --- a/branch_bender/test_verify.py +++ b/branch_bender/test_verify.py @@ -59,6 +59,18 @@ def test_base(): assert_output(output, GitAutograderStatus.SUCCESSFUL) +def test_merge_undo_succeeds(): + with base_setup() as (test, rs): + rs.git.merge("feature/login", no_ff=False) + rs.git.reset("HEAD~1", hard=True) + rs.git.merge("feature/login", no_ff=True) + rs.git.merge("feature/dashboard", no_ff=True) + rs.git.merge("feature/payments", no_ff=True) + + output = test.run() + assert_output(output, GitAutograderStatus.SUCCESSFUL) + + def test_ff_fails(): with base_setup() as (test, rs): rs.git.merge("feature/login") diff --git a/branch_bender/verify.py b/branch_bender/verify.py index 3a5af5f2..fe9eaf4d 100644 --- a/branch_bender/verify.py +++ b/branch_bender/verify.py @@ -41,26 +41,28 @@ def verify(exercise: GitAutograderExercise) -> GitAutograderOutput: if len(merge_order) < 3: raise exercise.wrong_answer([MISSING_MERGES]) - if merge_order[0] != "feature/login": + # Use negative indexing to check the last 3 merges (most recent) + # This allows users to undo mistakes (e.g., reset --hard after accidental ff) and redo properly + if merge_order[-3] != "feature/login": raise exercise.wrong_answer([FEATURE_LOGIN_MERGE_MISSING, RESET_MESSAGE]) - if messages[0] == "Fast-forward": + if messages[-3] == "Fast-forward": raise exercise.wrong_answer( [NO_FAST_FORWARDING.format(branch_name="feature/login"), RESET_MESSAGE] ) - if merge_order[1] != "feature/dashboard": + if merge_order[-2] != "feature/dashboard": raise exercise.wrong_answer([FEATURE_DASHBOARD_MERGE_MISSING, RESET_MESSAGE]) - if messages[1] == "Fast-forward": + if messages[-2] == "Fast-forward": raise exercise.wrong_answer( [NO_FAST_FORWARDING.format(branch_name="feature/dashboard"), RESET_MESSAGE] ) - if merge_order[2] != "feature/payments": + if merge_order[-1] != "feature/payments": raise exercise.wrong_answer([FEATURE_PAYMENTS_MERGE_MISSING, RESET_MESSAGE]) - if messages[2] == "Fast-forward": + if messages[-1] == "Fast-forward": raise exercise.wrong_answer( [NO_FAST_FORWARDING.format(branch_name="feature/payments"), RESET_MESSAGE] )