-- vim:foldmethod=marker
local repl = require 'repl'
pcall(require, 'luarocks.loader')
require 'Test.More'

plan(45)

local clone = repl:clone()
local prompt
local results
local errmsg

isnt(type(clone), 'nil')

function clone:showprompt(p)
  prompt = p
end

function clone:displayresults(r)
  results = r
end

function clone:displayerror(err)
  errmsg = err
end

do -- prompt tests {{{
  lives_ok(function()
    clone:prompt(1)
  end)

  is(prompt, '>')

  lives_ok(function()
    clone:prompt(2)
  end)

  is(prompt, '>>')
end -- }}}

do -- handleline tests {{{
  is(_G.testresult, nil)
  is(results, nil)

  lives_ok(function()
    clone:handleline '_G.testresult = 18'
  end)

  is(_G.testresult, 18)

  is(type(results), 'table')
  is(results.n, 0)
  is(#results, 0)

  lives_ok(function()
    clone:handleline 'return 19'
  end)

  is(type(results), 'table')
  is(results.n, 1)
  is(#results, 1)
  is(results[1], 19)

  lives_ok(function()
    clone:handleline 'return 20, 21, 22'
  end)

  is(type(results), 'table')
  is(results.n, 3)
  is(#results, 3)
  is(results[1], 20)
  is(results[2], 21)
  is(results[3], 22)

  lives_ok(function()
    clone:handleline 'return 1, nil, nil, nil, nil, nil, nil, 2'
  end)

  is(type(results), 'table')
  is(results.n, 8)
  is(results[1], 1)
  for i = 2, 7 do
    is(results[i], nil)
  end
  is(results[8], 2)
end -- }}}

do -- error handling tests {{{
  lives_ok(function()
    clone:handleline '3 4'
  end)

  isnt(type(errmsg), 'nil')

  errmsg = nil

  lives_ok(function()
    clone:handleline 'error "foo"'
  end)

  like(errmsg, 'foo')
end -- }}}

do -- multi-line input tests {{{
  errmsg = nil
  _G.t = {}

  lives_ok(function()
    clone:handleline 'for i = 1, 3 do'
    clone:handleline '  table.insert(_G.t, i)'
    clone:handleline 'end'
  end)

  is(errmsg, nil)
  is(#_G.t, 3)
  is(_G.t[1], 1)
  is(_G.t[2], 2)
  is(_G.t[3], 3)
end -- }}}