name: "caller builtin"
cases:
  - name: "caller in function"
    test_files:
      - path: script.sh
        contents: |
          function outer() {
              echo "In outer"
              inner
          }

          function inner() {
              echo "In inner"

              echo "[Calling caller 0]"
              caller 0

              echo "[Calling caller 1]"
              caller 1
          }
    stdin: |
      source script.sh
      outer

  - name: "caller no args"
    known_failure: true # TODO(caller): needs investigation
    test_files:
      - path: script.sh
        contents: |
          function myfunc() {
              echo "In myfunc"
              caller
          }
    stdin: |
      source script.sh
      myfunc

  - name: "caller no args (nested)"
    test_files:
      - path: script.sh
        contents: |
          function myfunc() {
              echo "In myfunc"
              caller
          }

          function myouterfunc() {
              echo "In myouterfunc"
              myfunc
          }
    stdin: |
      source script.sh
      myouterfunc

  - name: "caller invalid expr"
    ignore_stderr: true # Different error messages
    stdin: |
      f() { caller x; }
      f

  - name: "caller out of range"
    stdin: |
      caller 100

  - name: "caller not in function"
    stdin: |
      caller
