local tcname = 'tests.shared.items'
local lunit = require("lunit")
if _VERSION >= 'Lua 5.2' then
  _ENV = module(tcname, 'seeall')
else
  module(tcname, lunit.testcase, package.seeall)
end

function setup()
    eressea.free_game()
    eressea.settings.set("nmr.timeout", "0")
    eressea.settings.set("NewbieImmunity", "0")
    eressea.settings.set("rules.food.flags", "4")
    eressea.settings.set("rules.ship.storms", "0")
    eressea.settings.set("magic.regeneration.enable", "0")
end

function test_use_mistletoe()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 1)
    u:add_item('mistletoe', 3)
    u:add_order("BENUTZEN 2 Mistelzweig")
    process_orders()
    assert_equal(2, u:effect('mistletoe'))
    assert_equal(1, u:get_item('mistletoe'))
    assert_equal(1, f:count_msg_type('use_item'))
end

function test_mistletoe_survive()
    local r = region.create(0, 0, "plain")
    local u = unit.create(faction.create("human"), r, 1)
    local u2 = unit.create(faction.create("human"), r, 1)
    local uno = u.id
    u:add_item('mistletoe', 2)
    u:add_order("BENUTZEN 2 Mistelzweig")
    u2:add_order('ATTACKIERE ' .. itoa36(uno))
    process_orders()
    u = get_unit(uno)
    assert_not_nil(u)
    assert_equal(1, u:effect('mistletoe'))
end

function test_dreameye()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 1)
    u:add_item("dreameye", 2)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Traumauge")
    assert_nil(u:get_curse('skillmod'))
    turn_begin()
    turn_process()
    assert_not_nil(u:get_curse('skillmod'))
    assert_equal(1, u:get_item("dreameye"))
    assert_equal(1, f:count_msg_type('use_tacticcrystal'))
    turn_end()
    assert_nil(u:get_curse('skillmod'))
end

function test_manacrystal()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 1)
    u:add_item("manacrystal", 2)
    u:clear_orders()
    u.magic = "gwyrrd"
    u:set_skill('magic', 1)
    u.aura = 0
    u:add_order("BENUTZEN 1 Astralkristall")
    turn_begin()
    turn_process()
    assert_equal(1, u:get_item("manacrystal"))
    assert_equal(25, u.aura)
    assert_equal(1, f:count_msg_type('manacrystal_use'))
    turn_end()
end

function test_skillpotion()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 1)
    u:add_item("skillpotion", 2)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Talenttrunk")
    process_orders()
    assert_equal(1, u:get_item("skillpotion"))
    assert_equal(1, f:count_msg_type('skillpotion_use'))
end

function test_studypotion()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 1)
    turn_begin()
    u:add_item("studypotion", 2)
    u:clear_orders()
    u:add_order("LERNE Unterhaltung")
    u:add_order("BENUTZEN 1 Lerntrank")
    turn_process()
    -- cannot sense the "learning" attribute, because study_cmd
    -- removes it during processing :(
    assert_equal(1, u:get_item("studypotion"))
    turn_end()
end

function test_antimagic()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 1)

    turn_begin()
    u:add_item("antimagic", 2)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Antimagiekristall")
    assert_equal(nil, r:get_curse('antimagiczone'))
    turn_process()
    assert_equal(5, r:get_curse('antimagiczone'))
    assert_equal(1, r:count_msg_type('use_antimagiccrystal'))
    assert_equal(1, u:get_item("antimagic"))
    turn_end()
    assert_equal(5, r:get_curse('antimagiczone')) -- haelt zwei wochen
    turn_end() -- hack: age the curse again
    assert_equal(nil, r:get_curse('antimagiczone'))
end

function test_use_healing_potion()
    -- Heiltrank kann (auch) mit BENUTZE eingesetzt werden
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 30)
    assert_equal(600, u.hp)
    u.hp = 100
    turn_begin()
    u:add_item("healing", 1)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Heiltrank")
    turn_process()
    assert_equal(530, u.hp)
    assert_equal(0, u:get_item("healing"))
    assert_equal(1, f:count_msg_type('use_item'))
    turn_end()
end

function test_use_healing_potion_multi_units()
    -- Heiltrank kann mehrere Einheiten heilen
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u1 = unit.create(f, r, 30)
    local u = unit.create(f, r, 30)
    assert_equal(600, u1.hp)
    assert_equal(600, u.hp)
    u.hp = 400
    u1.hp = 400
    turn_begin()
    u:add_item("healing", 1)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Heiltrank")
    turn_process()
    assert_equal(600, u.hp)
    assert_equal(600, u1.hp)
    assert_equal(0, u:get_item("healing"))
    turn_end()
end

function test_use_multiple_healing_potions()
    -- Einheit kann mehr als einen Heiltrank benutzen
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 60)
    assert_equal(1200, u.hp)
    u.hp = 400
    turn_begin()
    u:add_item("healing", 2)
    u:clear_orders()
    u:add_order("BENUTZEN 2 Heiltrank")
    turn_process()
    assert_equal(1200, u.hp)
    assert_equal(0, u:get_item("healing"))
    turn_end()
end

function test_use_elixir()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 10)
    assert_equal(200, u.hp)
    u:add_item("p13", 1)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Elixier~der~Macht")
    process_orders()
    -- potion makes hp 1000, monthly_healing takes away 400:
    assert_equal(600, u.hp)
    assert_equal(0, u:get_item("p13"))
    assert_equal(1, f:count_msg_type('use_item'))
end

function test_use_ointment()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 30)
    assert_equal(600, u.hp)
    u.hp = 100
    u:add_item("ointment", 1)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Wundsalbe")
    process_orders()
    assert_equal(530, u.hp)
    assert_equal(0, u:get_item("ointment"))
    assert_equal(1, f:count_msg_type('use_item'))
end

function test_use_domore()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 1)
    u:add_item("p3", 1)
    u:add_order("BENUTZEN 1 Schaffenstrunk")
    process_orders()
    assert_equal(10, u:effect("p3"))
    assert_equal(0, u:get_item("p3"))
    assert_equal(1, f:count_msg_type('use_item'))
    u:clear_orders()
    u:set_skill('weaponsmithing', 3)
    u:add_item("iron", 2)
    u:add_order("MACHEN Schwert")
    process_orders()
    assert_equal(9, u:effect("p3"))
    assert_equal(0, u:get_item("iron"))
    assert_equal(2, u:get_item("sword"))
end

function test_bloodpotion_demon()
    local r = region.create(0, 0, "plain")
    local f = faction.create("demon")
    local u = unit.create(f, r, 1)
    u:add_item("peasantblood", 1)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Bauernblut")
    process_orders()
    assert_equal(100, u:effect('peasantblood'))
    assert_equal(0, u:get_item("peasantblood"))
    assert_equal(1, f:count_msg_type('use_item'))
    assert_equal("demon", u.race)
end

function test_bloodpotion_other()
    local r = region.create(0, 0, "plain")
    local f = faction.create("human")
    local u = unit.create(f, r, 1)
    u:add_item("peasantblood", 1)
    u:clear_orders()
    u:add_order("BENUTZEN 1 Bauernblut")
    process_orders()
    assert_equal(0, u:effect('peasantblood'))
    assert_equal(0, u:get_item("peasantblood"))
    assert_equal(1, f:count_msg_type('use_item'))
    assert_equal("smurf", u.race)
end