#!/usr/bin/env bash

# Regression test: task delegation via `run = [{ task }]` should not
# re-run shared dependencies that already completed in the parent graph.

cat <<'EOF' >mise.toml
[tasks.setup]
run = "echo '>>> SETUP RUNNING <<<'"

[tasks.lint]
hide = true
depends = ["setup"]
run = "echo 'lint done'"

[tasks."check:security"]
hide = true
depends = ["setup"]
run = "echo 'security check done'"

[tasks."fix:security"]
hide = true
depends = ["lint"]
run = [{ task = "check:security" }]

[tasks.all]
depends = ["fix:security"]

[tasks.sequence]
run = [
  { task = "check:security" },
  { task = "check:security" },
]
EOF

# "setup" output must appear exactly once (exclude the "$ echo ..." command line)
output="$(mise run -f all 2>&1)"
count="$(echo "$output" | grep -v '^\[setup\] \$' | grep -c '>>> SETUP RUNNING <<<')"
if [[ $count -ne 1 ]]; then
  echo "Expected setup to run exactly once, but it ran $count times"
  echo "Full output:"
  echo "$output"
  exit 1
fi

# Verify all tasks actually ran
assert_contains "echo \"$output\"" "lint done"
assert_contains "echo \"$output\"" "security check done"

# Standalone call should still trigger setup as a dependency
assert_contains "mise run -f check:security" ">>> SETUP RUNNING <<<"
assert_contains "mise run -f check:security" "security check done"

# Sequential injected graphs share completed state, so the second entry does
# not repeat either the delegated task or its dependency.
output="$(mise run -f sequence 2>&1)"
setup_count="$(echo "$output" | grep -v '^\[setup\] \$' | grep -c '>>> SETUP RUNNING <<<')"
security_count="$(echo "$output" | grep -v '^\[check:security\] \$' | grep -c 'security check done')"
if [[ $setup_count -ne 1 || $security_count -ne 1 ]]; then
  echo "Expected setup and check:security to run exactly once"
  echo "Full output:"
  echo "$output"
  exit 1
fi
