| 1 | #!/bin/sh |
| 2 | TEST_PREFIX="[jobs-fg-bg]" |
| 3 | |
| 4 | # Job control tests require a PTY — skip in CI/non-interactive mode |
| 5 | if [ ! -t 0 ] && [ -z "$FORCE_JOB_TESTS" ]; then |
| 6 | echo "Passed: 0" |
| 7 | echo "Failed: 0" |
| 8 | echo "Skipped: 0" |
| 9 | echo "Total: 0" |
| 10 | exit 0 |
| 11 | fi |
| 12 | |
| 13 | . "$(cd "$(dirname "$0")" && pwd)/test_harness.sh" |
| 14 | |
| 15 | section "1. jobs display" |
| 16 | check_exit "jobs with no background jobs" 'jobs' "0" |
| 17 | compare_output "jobs shows background process" 'sleep 60 & jobs; kill %1 2>/dev/null; wait 2>/dev/null' |
| 18 | check_exit "jobs -p shows PIDs" 'sleep 60 & jobs -p >/dev/null; kill %1 2>/dev/null; wait 2>/dev/null' "0" |
| 19 | compare_output "jobs after completion" 'true & wait; jobs' |
| 20 | compare_output "jobs shows multiple" 'sleep 60 & sleep 60 & jobs | wc -l | tr -d " "; kill %1 %2 2>/dev/null; wait 2>/dev/null' |
| 21 | compare_output "jobs -p output is numeric" 'sleep 60 & jobs -p | grep -qE "^[0-9]+$" && echo yes; kill %1 2>/dev/null; wait 2>/dev/null' |
| 22 | |
| 23 | section "2. fg" |
| 24 | compare_exit "fg with no jobs fails" 'fg 2>/dev/null' |
| 25 | compare_output "fg brings job to foreground" 'sleep 0.1 & fg %1 >/dev/null 2>&1; echo $?' |
| 26 | compare_exit "fg invalid job spec fails" 'fg %99 2>/dev/null' |
| 27 | |
| 28 | section "3. bg" |
| 29 | compare_exit "bg with no stopped jobs fails" 'bg 2>/dev/null' |
| 30 | compare_exit "bg invalid job spec fails" 'bg %99 2>/dev/null' |
| 31 | |
| 32 | section "4. job spec parsing" |
| 33 | compare_output "kill by job spec %1" 'sleep 60 & kill %1 2>/dev/null; wait 2>/dev/null; echo done' |
| 34 | compare_output "multiple background jobs" 'sleep 60 & sleep 60 & kill %1 %2 2>/dev/null; wait 2>/dev/null; echo done' |
| 35 | compare_output "job numbering sequential" 'sleep 60 & sleep 60 & sleep 60 & kill %1 %2 %3 2>/dev/null; wait 2>/dev/null; echo done' |
| 36 | |
| 37 | section "5. background execution" |
| 38 | compare_output "command runs in background" '(echo bg_done) & wait; echo fg_done' |
| 39 | compare_output "background preserves exit" '(exit 42) & wait $!; echo $?' |
| 40 | compare_output "dollar-bang tracks PID" 'sleep 0.1 & test -n "$!" && echo yes' |
| 41 | |
| 42 | print_summary |