#!/usr/bin/env ruby

def run_script(src)
  if system("bash", "-eo", "pipefail", "-c", src) != true
    exit(1)
  end
end

def run_vimscript(src)
  wrapper = <<~EOF
    vim --clean --not-a-term -u <(cat <<- "EOM"
    set nocompatible
    let &rtp='#{Dir.pwd},' . &rtp
    set t_ti= t_te=
    set shortmess+=F
    set noswapfile
    set nocp
    set nomore
    func! Log(msg)
      if $DEV != '1'
        echo a:msg
      endif
    endfunc
    EOM
  EOF

  wrapper += <<~'EOF'
    ) -S <(cat <<- "EOM"
      #{src}

      redir @q
      silent function /^NewTest_
      redir END
      let s:tests = split(substitute(@q, '\(function\|def\) \(\k*()\)', '\2', 'g'))
      for test in s:tests
        echo test
        %bwipe!
        exe 'call ' . test
        set noinsertmode
        if len(v:errors) > 0
          for err in v:errors
            echo err
          endfor
          cq!
        endif
      endfor

      qa!
    EOM
    ) | perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
  EOF

  wrapper.gsub!('#{src}') { src }

  run_script(wrapper)
end

test_helptags = <<~EOF
  if ! expect -c 'set timeout 1' -c 'spawn vim -N --clean -c "set nomore | :helptags ./doc | q"' -c 'expect "ENTER" { exit 1 }' > /dev/null; then
    echo "Please ensure ':helptags ./doc' works properly"
    exit 1
  fi
EOF

run_vimscript('source tests/filetypes.vim')
run_vimscript('source tests/extensions.vim')

if !ENV['DEV']
  run_vimscript('source tests/native.vim')
end

run_script(test_helptags)

# run_vimscript("
#   func! TestIndent(file)
#     :e a:file
#     echo 'ok'
#     echo &filetype
#   endfunc
#
#   #{Dir['tests/indent/**/test.*'].map { |f| "call TestIndent(\"#{f}\")"}.join("\n")}
# ")
