require "lunit"

module("tests.e3.e3features", package.seeall, lunit.testcase)

local settings

local function set_rule(key, value)
    if value==nil then
        eressea.settings.set(key, settings[key])
    else
        settings[key] = settings[key] or eressea.settings.get(key)
        eressea.settings.set(key, value)
    end
end

function setup()
    eressea.game.reset()
    settings = {}
    set_rule("rules.move.owner_leave", "1")
    set_rule("rules.economy.food", "4")
    set_rule("rules.ship.drifting", "0")
    set_rule("rules.ship.storms", "0")
end

function teardown()
    set_rule("rules.move.owner_leave")
    set_rule("rules.economy.food")
    set_rule("rules.ship.drifting")
    set_rule("rules.ship.storms")
end

function disable_test_bug_1738_build_castle_e3()
    local r = region.create(0, 0, "plain")    
    local f = faction.create("bug_1738@eressea.de", "human", "de")

    local c = building.create(r, "castle")
    c.size = 228

    local u1 = unit.create(f, r, 1)
    u1:set_skill("building", 5)
    u1:add_item("stone", 10000)

    local u2 = unit.create(f, r, 32)
    u2:set_skill("building", 3)
    u2:add_item("stone", 10000)

    u1:clear_orders()
    u1:add_order("MACHE BURG " .. itoa36(c.id))
    -- castle now has size 229.
    u2:clear_orders()
    u2:add_order("MACHE BURG " .. itoa36(c.id))
    -- 32 * 3 makes 96 skill points.
    -- from size 229 to size 250 needs 21 * 3 = 63 points, rest 33.
    -- 33/4 makes 8 points, resulting size is 258.

    process_orders()
    -- resulting size should be 250 because unit 2
    -- does not have the needed minimum skill.
    assert_equal(c.size, 250)
end

function disable_test_market_action()
    local f = faction.create("noreply@eressea.de", "human", "de")
    local x, y, r
    for x=0,2 do
        for y=0,2 do
            r = region.create(x, y, "plain")
            r.luxury = "balm"
            r.herb = "h2"
            r:set_resource("peasant", 5000)
        end
    end
    r = get_region(1, 1)
    local u = unit.create(f, r, 1)
    b = building.create(r, "market")
    b.size = 10
    u.building = b
    update_owners()
    process.markets()
    assert_equal(35, u:get_item("balm"))
    assert_equal(70, u:get_item("h2"))
end

function disable_test_alliance()
    local r = region.create(0, 0, "plain")
    local f1 = faction.create("noreply@eressea.de", "human", "de")
    local u1 = unit.create(f1, r, 1)
    u1:add_item("money", u1.number * 100)
    local f2 = faction.create("info@eressea.de", "human", "de")
    local u2 = unit.create(f2, r, 1)
    u2:add_item("money", u2.number * 100)
    assert(f1.alliance==nil)
    assert(f2.alliance==nil)
    u1:clear_orders()
    u2:clear_orders()
    u1:add_order("ALLIANZ NEU pink")
    u1:add_order("ALLIANZ EINLADEN " .. itoa36(f2.id))
    u2:add_order("ALLIANZ BEITRETEN pink")
    process_orders()
    assert(f1.alliance~=nil)
    assert(f2.alliance~=nil)
    assert(f2.alliance==f1.alliance)
    u1:clear_orders()
    u2:clear_orders()
    u1:add_order("ALLIANZ KOMMANDO " .. itoa36(f2.id))
    process_orders()
    assert(f1.alliance~=nil)
    assert(f2.alliance~=nil)
    assert(f2.alliance==f1.alliance)
    for f in f1.alliance.factions do
        assert_true(f.id==f1.id or f.id==f2.id)
    end
    u1:clear_orders()
    u2:clear_orders()
    u2:add_order("ALLIANZ AUSSTOSSEN " .. itoa36(f1.id))
    process_orders()
    assert(f1.alliance==nil)
    assert(f2.alliance~=nil)
    u1:clear_orders()
    u2:clear_orders()
    u2:add_order("ALLIANZ NEU zing")
    u1:add_order("ALLIANZ BEITRETEN zing") -- no invite!
    process_orders()
    assert(f1.alliance==nil)
    assert(f2.alliance~=nil)
    u1:clear_orders()
    u2:clear_orders()
    u1:add_order("ALLIANZ NEU zack")
    u1:add_order("ALLIANZ EINLADEN " .. itoa36(f2.id))
    u2:add_order("ALLIANZ BEITRETEN zack")
    process_orders()
    assert(f1.alliance==f2.alliance)
    assert(f2.alliance~=nil)
end

function test_no_stealth()
    local r = region.create(0,0, "plain")
    local f = faction.create("noreply@eressea.de", "human", "de")
    local u = unit.create(f, r, 1)

    u:set_skill("stealth", 1)
    assert_equal(-1, u:get_skill("stealth"))
    u:clear_orders()
    u:add_order("LERNEN TARNUNG")
    process_orders()
    assert_equal(-1, u:get_skill("stealth"))
end

function test_seecast()
    local r = region.create(0,0, "plain")
    for i = 1,10 do
        -- this prevents storms (only high seas have storms)
        region.create(i, 1, "plain")
    end
    for i = 1,10 do
        region.create(i, 0, "ocean")
    end
    local f = faction.create("noreply@eressea.de", "human", "de")
    local s1 = ship.create(r, "cutter")
    local u1 = unit.create(f, r, 2)
    u1:set_skill("sailing", 3)
    u1:add_item("money", 1000)
    u1.ship = s1
    local u2 = unit.create(f, r, 1)
    u2.race = "elf"
    u2:set_skill("magic", 6)
    u2.magic = "gwyrrd"
    u2.aura = 60
    u2.ship = s1
    u2:add_spell("stormwinds")
    update_owners()
    u2:clear_orders()
    u2:add_order("Zaubere stufe 2 'Beschwoere einen Sturmelementar' " .. itoa36(s1.id))
    u1:clear_orders()
    u1:add_order("NACH O O O O")
    process_orders()
    assert_equal(4, u2.region.x)

    u2:clear_orders()
    u2:add_order("Zaubere stufe 2 'Beschwoere einen Sturmelementar' " .. itoa36(s1.id))
    u1:clear_orders()
    u1:add_order("NACH O O O O")
    process_orders()
    assert_equal(8, u2.region.x)
end

local function use_tree(terrain)
    local r = region.create(0,0, terrain)
    local f = faction.create("noreply@eressea.de", "human", "de")
    local u1 = unit.create(f, r, 5)
    r:set_resource("tree", 0)
    u1:add_item("xmastree", 1)
    u1:clear_orders()
    u1:add_order("BENUTZEN 1 Weihnachtsbaum")
    process_orders()
    return r
end

function test_xmastree()
    local r
    r = use_tree("ocean")
    assert_equal(0, r:get_resource("tree"))
    eressea.free_game()
    r = use_tree("plain")
    assert_equal(10, r:get_resource("tree"))
end

function test_fishing()
    eressea.settings.set("rules.economy.food", "0")
    local r = region.create(0,0, "ocean")
    local r2 = region.create(1,0, "plain")
    local f = faction.create("noreply@eressea.de", "human", "de")
    local s1 = ship.create(r, "cutter")
    local u1 = unit.create(f, r, 3)
    u1.ship = s1
    u1:set_skill("sailing", 10)
    u1:add_item("money", 100)
    u1:clear_orders()
    u1:add_order("NACH O")
    update_owners()

    process_orders()
    assert_equal(r2, u1.region)
    assert_equal(90, u1:get_item("money"))

    u1:clear_orders()
    u1:add_order("NACH W")

    process_orders()
    assert_equal(r, u1.region)
    assert_equal(60, u1:get_item("money"))
end

function test_ship_capacity()
    local r = region.create(0,0, "ocean")
    region.create(1,0, "ocean")
    local r2 = region.create(2,0, "ocean")
    local f = faction.create("noreply@eressea.de", "human", "de")
    local f2 = faction.create("noreply@eressea.de", "goblin", "de")

    -- u1 is at the limit and moves
    local s1 = ship.create(r, "cutter")
    local u1 = unit.create(f, r, 5)
    u1.ship = s1
    u1:set_skill("sailing", 10)
    u1:add_item("sword", 55)
    u1:clear_orders()
    u1:add_order("NACH O O")

    -- u2 has too many people
    local s2 = ship.create(r, "cutter")
    local u2 = unit.create(f, r, 6)
    u2.ship = s2
    u2:set_skill("sailing", 10)
    u2:clear_orders()
    u2:add_order("NACH O O")

    -- u3 has goblins, they weigh 40% less
    local s3 = ship.create(r, "cutter")
    local u3 = unit.create(f2, r, 8)
    u3.ship = s3
    u3:set_skill("sailing", 10)
    u3:add_item("sword", 55)
    u3:clear_orders()
    u3:add_order("NACH O O")

    -- u4 has too much stuff
    local s4 = ship.create(r, "cutter")
    local u4 = unit.create(f, r, 5)
    u4.ship = s4
    u4:set_skill("sailing", 10)
    u4:add_item("sword", 56)
    u4:clear_orders()
    u4:add_order("NACH O O")

    update_owners()
    process_orders()
    if r2~=u1.region then
        print(get_turn(), u1, u1.faction)
    end
    assert_equal(r2, u1.region)
    assert_not_equal(r2.id, u2.region.id)
    if r2~=u3.region then
        print(get_turn(), u3, u3.faction)
    end
    assert_equal(r2, u3.region)
    assert_not_equal(r2.id, u4.region.id)
end
    
function test_owners()
    local r = region.create(0, 0, "plain")
    local f1 = faction.create("noreply@eressea.de", "human", "de")
    local u1 = unit.create(f1, r, 1)
    local f2 = faction.create("noreply@eressea.de", "human", "de")
    local u2 = unit.create(f2, r, 1)
    local u3 = unit.create(f2, r, 1)

    local b3 = building.create(r, "castle")
    b3.size = 2
    u3.building = b3
    local b1 = building.create(r, "castle")
    b1.size = 1
    u1.building = b1
    local b2 = building.create(r, "castle")
    b2.size = 2
    u2.building = b2

    update_owners()
    assert(r.owner==u3.faction)
    b1.size=3
    b2.size=3
    update_owners()
    assert(r.owner==u2.faction)
    b1.size=4
    update_owners()
    assert(r.owner==u1.faction)
end

function test_taxes()
    local r = region.create(0, 0, "plain")
    r:set_resource("peasant", 1000)
    r:set_resource("money", 5000)
    local f = faction.create("noreply@eressea.de", "human", "de")
    local u = unit.create(f, r, 1)
    u:clear_orders()
    u:add_order("LERNE Holzfaellen") -- do not work
    local b = building.create(r, "watch")
    b.size = 10
    u.building = b
    update_owners()
    assert_equal(1, r.morale)
    process_orders()
    assert_equal(1, r.morale)
    assert_equal(25, u:get_item("money"))
end

function test_region_owner_cannot_leave_castle()
    local r = region.create(0, 0, "plain")
    local f = faction.create("noreply@eressea.de", "human", "de")
    f.id = 42
    local b1 = building.create(r, "castle")
    b1.size = 10
    local b2 = building.create(r, "lighthouse")
    b2.size = 10
    local u = unit.create(f, r, 1)
    u.building = b1
    u:add_item("money", u.number * 100)
    u:clear_orders()
    u:add_order("BETRETE BURG " .. itoa36(b2.id))
    process_orders()
    assert_equal(b1, u.building, "region owner has left the building") -- region owners may not leave
end

function test_market()
    -- if i am the only trader around, i should be getting all the herbs from all 7 regions
    local herb_multi = 500 -- from rc_herb_trade()
    local r, idx
    local herbnames = { 'h0', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7', 'h8' }
    idx = 1
    for x = -1, 1 do for y = -1, 1 do
        r = region.create(x, y, "plain")
        r:set_resource("peasant", herb_multi * 9 + 50) -- 10 herbs per region
        r.herb = herbnames[idx]
        idx = idx+1
    end end
    r = get_region(0, 0)
    local b = building.create(r, "market")
    b.size = 10
    local f = faction.create("noreply@eressea.de", "human", "de")
    f.id = 42
    local u = unit.create(f, r, 1)
    u.building = b
    u:add_item("money", u.number * 10000)
    for i = 0, 5 do
        local rn = r:next(i)
    end
    b.working = true
    eressea.process.markets()
    u:add_item("money", -u:get_item("money")) -- now we only have herbs
    local len = 0
    for i in u.items do
        len = len + 1
    end
    assert_not_equal(0, len, "trader did not get any herbs")
    for idx, name in pairs(herbnames) do
        local n = u:get_item(name)
        if n>0 then
            assert_equal(10, n, 'trader did not get exaxtly 10 herbs')
        end
    end
end

function test_market_gives_items()
    local r
    for x = -1, 1 do for y = -1, 1 do
        r = region.create(x, y, "plain")
        r:set_resource("peasant", 5000) 
    end end
    r = get_region(0, 0)
    local b = building.create(r, "market")
    b.size = 10
    local f = faction.create("noreply@eressea.de", "human", "de")
    f.id = 42
    local u = unit.create(f, r, 1)
    u.building = b
    u:add_item("money", u.number * 10000)
    for i = 0, 5 do
        local rn = r:next(i)
    end
    process_orders()
    local len = 0
    for i in u.items do
        len = len + 1
    end
    assert(len>1)
end

function test_spells()
    local r = region.create(0, 0, "plain")
    local f = faction.create("noreply@eressea.de", "human", "de")
    local u = unit.create(f, r, 1)
    u.race = "elf"
    u:clear_orders()
    u:add_item("money", 10000)
    u:set_skill("magic", 5)
    u:add_order("LERNE MAGIE Illaun")
    process_orders()
    local sp
    local nums = 0
    if f.spells~=nil then
        for sp in f.spells do
            nums = nums + 1
        end
        assert(nums>0)
        for sp in u.spells do
            nums = nums - 1
        end
        assert(nums==0)
    elseif u.spells~=nil then
        for sp in u.spells do
            nums = nums + 1
        end
        assert(nums>0)
    end
end

function test_canoe_passes_through_land()
    local f = faction.create("noreply@eressea.de", "human", "de")
    local src = region.create(0, 0, "ocean")
    local land = region.create(1, 0, "plain")
    region.create(2, 0, "ocean")
    local dst = region.create(3, 0, "ocean")
    local sh = ship.create(src, "canoe")
    local u1 = unit.create(f, src, 1)
    local u2 = unit.create(f, src, 1)
    u1.ship = sh
    u2.ship = sh
    u1:set_skill("sailing", 10)
    u1:clear_orders()
    u1:add_order("NACH O O O")
    process_orders()
    assert_equal(land, u2.region, "canoe did not stop at coast")
    process_orders()
    assert_equal(dst, sh.region, "canoe could not leave coast")
    assert_equal(dst, u1.region, "canoe could not leave coast")
    assert_equal(dst, u2.region, "canoe could not leave coast")
end

function test_give_50_percent_of_money()
    local r = region.create(0, 0, "plain")
    local u1 = unit.create(faction.create("noreply@eressea.de", "human", "de"), r, 1)
    local u2 = unit.create(faction.create("noreply@eressea.de", "orc", "de"), r, 1)
    u1.faction.age = 10
    u2.faction.age = 10
    u1:add_item("money", 500)
    u2:add_item("money", 500)
    local m1, m2 = u1:get_item("money"), u2:get_item("money")
    u1:clear_orders()
    u1:add_order("GIB " .. itoa36(u2.id) .. " 221 Silber")
    u2:clear_orders()
    u2:add_order("LERNEN Hiebwaffen")
    process_orders()
    assert_equal(m1, u1:get_item("money"))
    assert_equal(m2, u2:get_item("money"))

    m1, m2 = u1:get_item("money"), u2:get_item("money")
    u1:clear_orders()
    u1:add_order("GIB " .. itoa36(u2.id) .. " 221 Silber")
    u2:clear_orders()
    u2:add_order("HELFEN " .. itoa36(u1.faction.id) .. " GIB")
    u2:add_item("horse", 100)
    u2:add_order("GIB 0 ALLES PFERD")
    local h = r:get_resource("horse")
    process_orders()
    assert_true(r:get_resource("horse")>=h+100)
    assert_equal(m1-221, u1:get_item("money"))
    assert_equal(m2+110, u2:get_item("money"))
end

function test_give_100_percent_of_items()
    r = region.create(0, 0, "plain")
    local u1 = unit.create(faction.create("noreply@eressea.de", "human", "de"), r, 1)
    local u2 = unit.create(faction.create("noreply@eressea.de", "orc", "de"), r, 1)
    u1.faction.age = 10
    u2.faction.age = 10
    u1:add_item("money", 500)
    u1:add_item("log", 500)
    local m1, m2 = u1:get_item("log"), u2:get_item("log")
    u1:clear_orders()
    u1:add_order("GIB " .. itoa36(u2.id) .. " 332 Holz")
    u2:clear_orders()
    u2:add_order("LERNEN Hiebwaffen")
    u2:add_order("HELFEN " .. itoa36(u1.faction.id) .. " GIB")
    process_orders()
    assert_equal(m1-332, u1:get_item("log"))
    assert_equal(m2+332, u2:get_item("log"))
end

function test_cannot_give_person()
    local r = region.create(0, 0, "plain")
    local f1 = faction.create("noreply@eressea.de", "human", "de")
    local f2 = faction.create("noreply@eressea.de", "human", "de")
    local u1 = unit.create(f1, r, 10)
    local u2 = unit.create(f2, r, 10)
    u1.faction.age = 10
    u2.faction.age = 10
    u1:add_item("money", 500)
    u2:add_item("money", 500)
    u2:clear_orders()
    u2:add_order("GIB ".. itoa36(u1.id) .. " 1 PERSON")
    u2:add_order("HELFE ".. itoa36(f1.id) .. " GIB")
    u1:add_order("HELFE ".. itoa36(f2.id) .. " GIB")
    process_orders()
    assert_equal(10, u2.number)
    assert_equal(10, u1.number)
end

function test_cannot_give_unit()
    local r = region.create(0, 0, "plain")
    local f1 = faction.create("noreply@eressea.de", "human", "de")
    local f2 = faction.create("noreply@eressea.de", "human", "de")
    local u1 = unit.create(f1, r, 10)
    local u2 = unit.create(f2, r, 10)
    u1.faction.age = 10
    u2.faction.age = 10
    u1:add_item("money", 500)
    u2:add_item("money", 500)
    u2:clear_orders()
    u2:add_order("GIB ".. itoa36(u1.id) .. " EINHEIT")
    u2:add_order("HELFE ".. itoa36(f1.id) .. " GIB")
    u1:add_order("HELFE ".. itoa36(f2.id) .. " GIB")
    process_orders()
    assert_not_equal(u2.faction.id, u1.faction.id)
end

function test_guard_by_owners()
    -- http://bugs.eressea.de/view.php?id=1756
    local r = region.create(0,0, "mountain")
    local f1 = faction.create("noreply@eressea.de", "human", "de")
    f1.age=20
    local f2 = faction.create("noreply@eressea.de", "human", "de")
    f2.age=20
    local u1 = unit.create(f1, r, 1)
    local b = building.create(r, "castle")
    b.size = 10
    u1.building = b
    u1:add_item("money", 100)

    local u2 = unit.create(f2, r, 1)
    u2:add_item("money", 100)
    u2:set_skill("mining", 3)
    u2:clear_orders()
    u2:add_order("MACHEN EISEN")

    process_orders()
    local iron = u2:get_item("iron")
    process_orders()
    assert_equal(iron, u2:get_item("iron"))
end

local function setup_packice(x, onfoot)
    local f = faction.create("noreply@eressea.de", "human", "de")
    local plain = region.create(0,0, "plain")
    local ice = region.create(1,0, "packice")
    local ocean = region.create(2,0, "ocean")
    local u = unit.create(f, get_region(x, 0), 2)
    if not onfoot then
        local s = ship.create(u.region, "cutter")
        u:set_skill("sailing", 3)
        u.ship = s
    end
    u:add_item("money", 400)
    return u
end

function test_no_sailing_through_packice()
    local u = setup_packice(0)
    u:clear_orders()
    u:add_order("NACH O O")
    process_orders()
    assert_equal(0, u.region.x)
end

function test_can_sail_from_packice_to_ocean()
    local u = setup_packice(1)

    u:clear_orders()
    u:add_order("NACH W")
    process_orders()
    assert_equal(1, u.region.x)

    u:clear_orders()
    u:add_order("NACH O")
    process_orders()
    assert_equal(2, u.region.x)
end

function test_can_sail_into_packice()
    local u = setup_packice(2)
    u:clear_orders()
    u:add_order("NACH W W")
    process_orders()
    assert_equal(1, u.region.x)
end

function test_can_walk_into_packice()
    local u = setup_packice(0, true)
    u:clear_orders()
    u:add_order("NACH O")
    process_orders()
    assert_equal(1, u.region.x)
end

function test_cannot_walk_into_ocean()
    local u = setup_packice(1, true)
    u:clear_orders()
    u:add_order("NACH O")
    process_orders()
    assert_equal(1, u.region.x)
end

function test_p2()
    local f = faction.create("noreply@eressea.de", "human", "de")
    local r = region.create(0, 0, "plain")
    local u = unit.create(f, r, 1)
    r:set_resource("tree", 0)
    u:clear_orders()
    u:add_order("BENUTZE 'Wasser des Lebens'")
    u:add_item("p2", 1)
    u:add_item("log", 10)
    u:add_item("mallorn", 10)
    process_orders()
    assert_equal(5, r:get_resource("tree"))
    assert_equal(0, u:get_item("p2"))
    assert_equal(15, u:get_item("log") + u:get_item("mallorn"))
end

function test_p2_move()
    -- http://bugs.eressea.de/view.php?id=1855
    local f = faction.create("noreply@eressea.de", "human", "de")
    local r = region.create(0, 0, "plain")
    region.create(1, 0, "plain")
    local u = unit.create(f, r, 1)
    r:set_resource("tree", 0)
    u:clear_orders()
    u:add_order("BENUTZE 'Wasser des Lebens'")
    u:add_order("NACH OST")
    u:add_item("horse", 1)
    u:add_item("p2", 1)
    u:add_item("log", 1)
    u:add_item("mallorn", 1)
    process_orders()
    assert_equal(1, u.region.x)
    assert_equal(1, r:get_resource("tree"))
end

function test_golem_use_four_iron()
    local r0 = region.create(0, 0, "plain")
    local f1 = faction.create("noreply@eressea.de", "halfling", "de")
    local u1 = unit.create(f1, r0, 3)
    u1.race = "irongolem"
    u1:set_skill("weaponsmithing", 1)
    u1:set_skill("armorer", 1)
    u1:clear_orders()
    u1:add_order("Mache 4 Turmschild")

    process_orders()

    assert_equal(2, u1.number)
    assert_equal(4, u1:get_item("towershield"))
end

function test_silver_weight_stops_movement()
    local r1 = region.create(1, 1, "plain")
    local r2 = region.create(2, 1, "plain")
    region.create(3, 1, "plain")
    local f1 = faction.create("noreply@eressea.de", "human", "de")    
    local u1 = unit.create(f1, r1, 1)
    u1:clear_orders()
    u1:add_order("NACH OST")
    u1:add_item("money", 540)
    assert_equal(1540, u1.weight)
    process_orders()
    assert_equal(r2, u1.region)
    u1:add_item("money", 1)
    process_orders()
    assert_equal(r2, u1.region)
end

function test_silver_weight_stops_ship()
    local r1 = region.create(1, 1, "ocean")
    local r2 = region.create(2, 1, "ocean")
    region.create(3, 1, "ocean")
    local f1 = faction.create("noreply@eressea.de", "human", "de")    
    local u1 = unit.create(f1, r1, 1)
    u1:set_skill("sailing", 3)
    local s1 = ship.create(r1, "canoe")
    u1.ship = s1
    u1:clear_orders()
    u1:add_order("NACH OST")
    u1:add_item("money", 2000)
    process_orders()
    assert_equal(r2, u1.region)
    u1:add_item("money", 1)
    process_orders()
    assert_equal(r2, u1.region)
end

function test_building_owner_can_enter_ship()
    local r1 = region.create(1, 2, "plain")    
    local f1 = faction.create("noreply@eressea.de", "human", "de")
    local b1 = building.create(r1, "castle")    
    b1.size = 10    
    local s1 = ship.create(r1, "cutter")        

    local u1 = unit.create(f1, r1, 10)    
    u1.building = b1    
    u1:add_item("money", u1.number * 100)    
    u1:clear_orders()    
    u1:add_order("VERLASSEN")    
    u1:add_order("BETRETE SCHIFF " .. itoa36(s1.id))    

    local u2 = unit.create(f1, r1, 10)    
    u2.ship = s1    
    u2:add_item("money", u1.number * 100)    
    u2:clear_orders()    
    process_orders()
    assert_equal(s1, u1.ship)
    assert_equal(null, u1.building, "owner of the building can not go into a ship")
end

function test_only_building_owner_can_set_not_paid()
  local r = region.create(0, 0, "plain")
  local f = faction.create("noreply@eressea.de", "human", "de")
  local u1 = unit.create(f, r, 1)
  local u2 = unit.create(f, r, 1)
  local mine = building.create(r, "mine")
  mine.size = 2
  u1:add_item("money", 500)
  u1.building = mine
  u2.building = mine
  u1:clear_orders()
  u2:clear_orders()
-- Test that Bezahle nicht is working
  u1:add_order("Bezahle nicht")
  process_orders()
  assert_equal(500, u1:get_item("money"))
  u1:clear_orders()
-- Test that bug fix 0001976 is working 
-- Bezahle nicht is not working
  u2:add_order("Bezahle nicht")
  process_orders()
  assert_equal(0, u1:get_item("money"))
end

function test_spyreport_message()
    local r1 = region.create(1, 2, "plain")    
    local f1 = faction.create("noreply@eressea.de", "human", "de")
    local u1 = unit.create(f1, r1, 1)
    local u2 = unit.create(f1, r1, 1)
    msg = message.create("spyreport")
    msg:set_unit("spy", u1)
    msg:set_unit("target", u2)
    msg:set_string("status", "hodor")
    assert_not_equal("", msg:render("de"))
    assert_not_equal("", msg:render("en"))
end

function test_volcanooutbreak_message()
    local r1 = region.create(1, 0, "plain")
    local r2 = region.create(1, 1, "plain")
    msg = message.create("volcanooutbreak")
    msg:set_region("regionn", r1)
    msg:set_region("regionv", r2)
    assert_not_equal("", msg:render("de"))
    assert_not_equal("", msg:render("en"))
end