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

plan(19)

do -- basic tests {{{
  local clone = repl:clone()

  clone:loadplugin(function()
    features = 'foo'
  end)

  ok(clone:hasfeature 'foo')
  ok(not clone:hasfeature 'bar')
  ok(not clone:hasfeature 'baz')

  clone:loadplugin(function()
    features = { 'bar', 'baz' }
  end)

  ok(clone:hasfeature 'foo')
  ok(clone:hasfeature 'bar')
  ok(clone:hasfeature 'baz')
end -- }}}

do -- requirefeature {{{
  local clone = repl:clone()

  clone:loadplugin(function()
    features = 'foo'
  end)

  clone:requirefeature 'foo'

  local line_no
  local _, err = pcall(function()
    line_no = utils.next_line_number()
    clone:requirefeature 'bar'
  end)

  like(err, tostring(line_no) .. ': required feature "bar" not present')
end -- }}}

do -- conflicts {{{
  local clone = repl:clone()
  local line_no

  clone:loadplugin(function()
    features = 'foo'
  end)

  local _, err = pcall(function()
    line_no = utils.next_line_number()
    clone:loadplugin(function()
      features = 'foo'
    end)
  end)
  like(err, tostring(line_no) .. ': feature "foo" already present')

  -- XXX what about methods injected into the object?
end -- }}}

do -- clone:hasfeature {{{
  local child = repl:clone()

  child:loadplugin(function()
    features = 'foo'
  end)

  local grandchild = child:clone()

  ok(not repl:hasfeature 'foo')
  ok(child:hasfeature 'foo')
  ok(grandchild:hasfeature 'foo')

  child:loadplugin(function()
    features = 'bar'
  end)

  ok(not repl:hasfeature 'bar')
  ok(child:hasfeature 'bar')
  ok(not grandchild:hasfeature 'bar')
end -- }}}

do -- iffeature tests {{{
  local clone = repl:clone()
  local has_run

  clone:iffeature('foo', function()
    has_run = true
  end)

  ok(not has_run)

  clone:loadplugin(function()
    features = 'foo'
  end)

  ok(has_run)

  has_run = false

  clone:iffeature('foo', function()
    has_run = true
  end)

  ok(has_run)
end -- }}}

do -- iffeature multiple times {{{
  local clone = repl:clone()
  local has_run
  local has_run2

  clone:iffeature('foo', function()
    has_run = true
  end)

  clone:iffeature('foo', function()
    has_run2 = true
  end)

  clone:loadplugin(function()
    features = 'foo'
  end)

  ok(has_run)
  ok(has_run2)
end -- }}}