#!/usr/bin/env bash

cat <<'EOF' >mise.toml
[tasks.build]
run = "touch out"
sources = ["input"]
outputs = ["out"]
cache = { enabled = true }
EOF
touch input

assert_fail_contains \
  "MISE_EXPERIMENTAL=0 mise run build" \
  "task artifact caching is experimental"

cat <<'EOF' >mise.toml
[settings]
experimental = true

[tasks.build]
run = "touch out"
sources = ["input"]
outputs = { auto = true }
cache = { enabled = true }
EOF

assert_fail_contains \
  "mise run build" \
  "cache requires explicit outputs or outputs = []"
assert_fail_contains \
  "mise run --dry-run build" \
  "cache requires explicit outputs or outputs = []"

cat <<'EOF' >mise.toml
[settings]
experimental = true

[tasks.build]
run = "touch ../out"
sources = ["input"]
outputs = ["../out"]
cache = { enabled = true }
EOF

assert_fail_contains "mise run build" "cache output must stay within"

cat <<'EOF' >mise.toml
[settings]
experimental = true

[tasks.build]
run = "mkdir -p dist"
sources = ["input"]
outputs = ["dist", "!../out"]
cache = { enabled = true }
EOF

assert_fail_contains "mise run build" "cache output must stay within"

cat <<'EOF' >mise.toml
[settings]
experimental = true

[tasks.build]
run = "mkdir -p dist"
sources = ["input"]
outputs = ["!dist/**"]
cache = { enabled = true }
EOF

assert_fail_contains "mise run build" "outputs require at least one non-excluded pattern"

mkdir outside
ln -s outside build
cat <<'EOF' >mise.toml
[settings]
experimental = true

[tasks.build]
run = "mkdir -p build/dist"
sources = ["input"]
outputs = ["build/dist"]
cache = { enabled = true }
EOF

assert_fail_contains "mise run build" "traverses symlink ancestor"

cat <<'EOF' >mise.toml
[settings]
experimental = true

[tasks.build]
run = "touch input"
sources = ["input"]
outputs = ["input"]
cache = { enabled = true }
EOF

assert_fail_contains "mise run build" "cache outputs must not contain source"

cat <<'EOF' >mise.toml
[settings]
experimental = true

[tasks.build]
run = "touch input"
sources = ["input"]
outputs = ["."]
cache = { enabled = true }
EOF

assert_fail_contains "mise run build" "cache output must stay within"
