name: "Builtins: dot"
cases:
  - name: "Basic dot usage"
    test_files:
      - path: "script.sh"
        contents: |
          echo "In sourced script"
          var="updated"
    stdin: |
      var="orig"
      . script.sh
      echo "var: ${var}"

  - name: "Basic source usage"
    test_files:
      - path: "script.sh"
        contents: |
          echo "In sourced script"
          for f in ${FUNCNAME[@]}; do
            echo "FUNCNAME: '${f}'"
          done
          for s in ${BASH_SOURCE[@]}; do
            echo "BASH_SOURCE: '${s}'"
          done
          var="updated"

          function script_func() {
            echo "In script func"
            for f in ${FUNCNAME[@]}; do
              echo "FUNCNAME: '${f}'"
            done
            for s in ${BASH_SOURCE[@]}; do
              echo "BASH_SOURCE: '${s}'"
            done
          }
    stdin: |
      var="orig"
      source ./script.sh
      echo "var: ${var}"
      script_func

  - name: "Source non-existent file path"
    ignore_stderr: true
    stdin: |
      source script.sh
      echo "Result: $?"

  - name: "Source dir"
    ignore_stderr: true
    stdin: |
      source .
      echo "Result: $?"

  - name: "Source script without args"
    test_files:
      - path: "script.sh"
        contents: |
          echo "In sourced script"
          echo "Args: $@"
    stdin: |
      set -- outer1 outer2 outer3
      source script.sh

  - name: "Source script with args"
    test_files:
      - path: "script.sh"
        contents: |
          echo "In sourced script"
          echo "Args: $@"
    stdin: |
      set -- outer1 outer2 outer3
      source script.sh inner1 inner2

  - name: "Source with redirection"
    test_files:
      - path: "script.sh"
        contents: |
          echo "In sourced script"
    stdin: |
      source script.sh arg1 arg2 > out.txt
      echo "Sourced script; dumping..."
      cat out.txt

  - name: "Source with return"
    test_files:
      - path: "script.sh"
        contents: |
          echo "Before return"
          return 42
          echo "After return"
    stdin: |
      echo "Before source"
      source script.sh
      echo "After source, exit code: $?"

  - name: "Source with exit"
    test_files:
      - path: "script.sh"
        contents: |
          echo "Before exit"
          exit 42
          echo "After exit"
    stdin: |
      echo "Before source"
      source script.sh
      echo "After source"

  - name: "Source with break in caller's loop"
    test_files:
      - path: "script.sh"
        contents: |
          echo "In script, breaking"
          break
    stdin: |
      for i in 1 2 3; do
        echo "Iteration $i"
        source script.sh
        echo "After source"
      done
      echo "After loop"

  - name: "Source with continue in caller's loop"
    test_files:
      - path: "script.sh"
        contents: |
          echo "In script, continuing"
          continue
          echo "After continue"
    stdin: |
      for i in 1 2 3; do
        echo "Iteration $i"
        source script.sh
        echo "After source"
      done
      echo "After loop"
