diff --git a/scripts/eressea/tests/attrib.lua b/scripts/eressea/tests/attrib.lua new file mode 100644 index 000000000..73d961d94 --- /dev/null +++ b/scripts/eressea/tests/attrib.lua @@ -0,0 +1,53 @@ +require "lunit" + +module("tests.eressea.attrib", package.seeall, lunit.testcase) + +function has_attrib(u, value) + for a in u.attribs do + if (a.data==value) then return true end + end + return false +end + +function test_attrib_global() + a = attrib.create('global', {}) + eressea.write_game('attrib.dat') + eressea.free_game() + eressea.read_game('attrib.dat') +end + +function test_attrib() + local r = region.create(0,0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + data = { arr = { 'a', 'b', 'c' }, name = 'familiar', events = { die = 'familiar_died' }, data = { mage = u2 } } + a = { 'a' } + b = { 'a' } + uno = u.id + u2no = u2.id + a = attrib.create(u, 12) + a = attrib.create(u, "enno") + a = attrib.create(u, u2) + a = attrib.create(u, data) + eressea.write_game("attrib.dat") + eressea.free_game() + eressea.read_game("attrib.dat") + u = get_unit(uno) + u2 = get_unit(u2no) + assert_false(has_attrib(u, 42)) + assert_true(has_attrib(u, "enno")) + assert_true(has_attrib(u, 12)) + + for a in u.attribs do + x = a.data + if (type(x)=="table") then + assert_equal('a', x.arr[1]) + assert_equal('familiar', x.name) + assert_equal('familiar_died', x.events.die) + assert_equal(u2, x.data.mage) + break + end + end +end + diff --git a/scripts/eressea/tests/bindings.lua b/scripts/eressea/tests/bindings.lua new file mode 100644 index 000000000..189d34769 --- /dev/null +++ b/scripts/eressea/tests/bindings.lua @@ -0,0 +1,61 @@ +require "lunit" + +local eressea = eressea +local _G = _G + +module("tests.bindings", lunit.testcase) + +function test_eressea() + assert_equal("function", _G.type(eressea.free_game)) + assert_equal("function", _G.type(eressea.read_game)) + assert_equal("function", _G.type(eressea.write_game)) + assert_equal("function", _G.type(eressea.read_orders)) +end + +function test_process() + assert_equal("function", _G.type(eressea.process.update_long_order)) + assert_equal("function", _G.type(eressea.process.markets)) + assert_equal("function", _G.type(eressea.process.produce)) + + assert_equal("function", _G.type(eressea.process.make_temp)) + assert_equal("function", _G.type(eressea.process.settings)) + assert_equal("function", _G.type(eressea.process.set_allies)) + assert_equal("function", _G.type(eressea.process.set_prefix)) + assert_equal("function", _G.type(eressea.process.set_stealth)) + assert_equal("function", _G.type(eressea.process.set_status)) + assert_equal("function", _G.type(eressea.process.set_name)) + assert_equal("function", _G.type(eressea.process.set_group)) + assert_equal("function", _G.type(eressea.process.set_origin)) + assert_equal("function", _G.type(eressea.process.quit)) + assert_equal("function", _G.type(eressea.process.study)) + assert_equal("function", _G.type(eressea.process.movement)) + assert_equal("function", _G.type(eressea.process.use)) + assert_equal("function", _G.type(eressea.process.battle)) + assert_equal("function", _G.type(eressea.process.siege)) + assert_equal("function", _G.type(eressea.process.leave)) + assert_equal("function", _G.type(eressea.process.promote)) + assert_equal("function", _G.type(eressea.process.renumber)) + assert_equal("function", _G.type(eressea.process.restack)) + assert_equal("function", _G.type(eressea.process.set_spells)) + assert_equal("function", _G.type(eressea.process.set_help)) + assert_equal("function", _G.type(eressea.process.contact)) + assert_equal("function", _G.type(eressea.process.enter)) + assert_equal("function", _G.type(eressea.process.magic)) + assert_equal("function", _G.type(eressea.process.give_control)) + assert_equal("function", _G.type(eressea.process.regeneration)) + assert_equal("function", _G.type(eressea.process.guard_on)) + assert_equal("function", _G.type(eressea.process.guard_off)) + assert_equal("function", _G.type(eressea.process.explain)) + assert_equal("function", _G.type(eressea.process.messages)) + assert_equal("function", _G.type(eressea.process.reserve)) + assert_equal("function", _G.type(eressea.process.claim)) + assert_equal("function", _G.type(eressea.process.follow)) + assert_equal("function", _G.type(eressea.process.alliance)) + assert_equal("function", _G.type(eressea.process.idle)) + assert_equal("function", _G.type(eressea.process.set_default)) +end + +function test_settings() + assert_equal("function", _G.type(eressea.settings.set)) + assert_equal("function", _G.type(eressea.settings.get)) +end diff --git a/scripts/eressea/tests/bson.lua b/scripts/eressea/tests/bson.lua new file mode 100644 index 000000000..ec0966bcd --- /dev/null +++ b/scripts/eressea/tests/bson.lua @@ -0,0 +1,65 @@ +require "lunit" + +module("tests.eressea.bson", package.seeall, lunit.testcase) + +function setup() + eressea.free_game() +end + +function test_bson_create() + local a = attrib.create("global", 12) + assert_not_equal(nil, a) + for a in attrib.get("global") do + assert_equal(a.data, 12) + end +end + +function test_illegal_arg() + local a = attrib.create(nil, 42) + assert_equal(nil, a) + a = attrib.create("fred", 42) + assert_equal(nil, a) +end + +function test_bson_readwrite() + local i, r = region.create(0, 0, "mountain") + attrib.create(r, 42) + i = eressea.write_game("test_read_write.dat") + assert_equal(0, i) + eressea.free_game() + r = get_region(0, 0) + assert_equal(nil, r) + i = eressea.read_game("test_read_write.dat") + assert_equal(0, i) + r = get_region(0, 0) + assert_not_equal(nil, r) + for a in attrib.get(r) do + assert_equal(a.data, 42) + end +end + +function test_bson() + local r = region.create(0, 0, "mountain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + assert_not_equal(nil, u) + assert_not_equal(nil, r) + assert_not_equal(nil, f) + attrib.create(r, 1) + assert_equal(attrib.get(r)().data, 1) + attrib.create(u, 3) + assert_equal(attrib.get(u)().data, 3) + attrib.create(f, 5) + assert_equal(attrib.get(f)().data, 5) +end + +function test_bson_with_multiple_attribs() + local r = region.create(0, 0, "mountain") + attrib.create(r, { a=1}) + attrib.create(r, { a=5}) + local total = 0 + for a in attrib.get(r) do + total = total + a.data.a; + end + assert_equal(6, total) +end diff --git a/scripts/eressea/tests/castles.lua b/scripts/eressea/tests/castles.lua new file mode 100644 index 000000000..5bb506333 --- /dev/null +++ b/scripts/eressea/tests/castles.lua @@ -0,0 +1,27 @@ +require "lunit" + +module('tests.eressea.castles', package.seeall, lunit.testcase ) + +function setup() + eressea.free_game() +end + +function test_small_castles() + 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", "halfling", "de") + local u2 = unit.create(f2, r, 1) + u1:add_item("money", 10000) + + local b = building.create(r, "castle") + u2.building = b + u1.building = b + + b.owner = u2 + assert_equal("site", b:get_typename(7)) + assert_equal("fortification", b:get_typename(8)) + b.owner = u1 + assert_equal("site", b:get_typename(9)) + assert_equal("fortification", b:get_typename(10)) +end diff --git a/scripts/eressea/tests/common.lua b/scripts/eressea/tests/common.lua new file mode 100644 index 000000000..8c8664992 --- /dev/null +++ b/scripts/eressea/tests/common.lua @@ -0,0 +1,1106 @@ +require "lunit" + +local function _test_create_ship(r) + local s = ship.create(r, config.ships[1]) + return s +end + +local function one_unit(r, f) + local u = unit.create(f, r, 1) + u:add_item("money", u.number * 100) + u:clear_orders() + return u +end + +local function two_units(r, f1, f2) + return one_unit(r, f1), one_unit(r, f2) +end + +local function two_factions() + local f1 = faction.create("one@eressea.de", "human", "de") + local f2 = faction.create("two@eressea.de", "elf", "de") + return f1, f2 +end + +module("tests.eressea.common", package.seeall, lunit.testcase) + +function setup() + eressea.free_game() + eressea.settings.set("nmr.removenewbie", "0") + eressea.settings.set("nmr.timeout", "0") + eressea.settings.set("NewbieImmunity", "0") + eressea.settings.set("rules.economy.food", "4") + eressea.settings.set("rules.encounters", "0") + eressea.settings.set("rules.peasants.growth", "1") +end + +function test_flags() + local r = region.create(0, 0, "plain") + local f = faction.create("flags@eressea.de", "halfling", "de") + local u = unit.create(f, r, 1) + local no = itoa36(f.id) + local flags = 587203585 + f.flags = flags + + eressea.write_game("test.dat") + eressea.free_game() + eressea.read_game("test.dat") + f = get_faction(no) + assert_equal(flags, f.flags) +end + +function test_elvenhorse_requires_riding_5() + local r = region.create(0, 0, "plain") + region.create(1, 0, "plain") + local goal = region.create(2, 0, "plain") + local f = faction.create("riding@eressea.de", "halfling", "de") + local u = unit.create(f, r, 1) + u:add_item("elvenhorse", 1) + u:set_skill("riding", 6)-- halfling has -1 modifier + u:clear_orders() + u:add_order("NACH O O") + process_orders() + assert_equal(goal, u.region) +end + +function test_cannot_ride_elvenhorse_without_enough_skill() + local r = region.create(0, 0, "plain") + local goal = region.create(1, 0, "plain") + region.create(2, 0, "plain") + local f = faction.create("elvenhorse@eressea.de", "halfling", "de") + local u = unit.create(f, r, 1) + u:add_item("elvenhorse", 1) + u:set_skill("riding", 5) -- halfling has -1 modifier + u:clear_orders() + u:add_order("NACH O O") + process_orders() + assert_equal(goal, u.region) +end + +function test_no_peasant_growth() + local r = region.create(0, 0, "plain") + r:set_resource("peasant", 2000) + eressea.settings.set("rules.peasants.growth", "0") + process_orders() + assert_equal(r:get_resource("peasant"), 2000) +end + +function test_demon_food() + local r = region.create(0, 0, "plain") + local f = faction.create("demonfood@eressea.de", "demon", "de") + local u = unit.create(f, r, 1) + local p = r:get_resource("peasant") + r:set_resource("peasant", 2000) + eressea.settings.set("rules.economy.food", "0") + eressea.settings.set("rules.peasants.growth", "0") + process_orders() + assert_not_nil(u) + assert_equal(1, u.number) + assert_equal(1999, r:get_resource("peasant")) +end + +function test_fleeing_units_can_be_transported() + local r = region.create(0, 0, "plain") + local r1 = region.create(1, 0, "plain") + local f1, f2 = two_factions() + local u1, u2 = two_units(r, f1, f2) + local u3 = one_unit(r, f2) + u1.number = 100 + u1:add_order("ATTACKIEREN " .. itoa36(u2.id)) + u2.number = 100 + u2:add_order("FAHREN " .. itoa36(u3.id)) + u2:add_order("KAEMPFE FLIEHE") + u3.number = 100 + u3:add_order("KAEMPFE FLIEHE") + u3:add_order("TRANSPORT " .. itoa36(u2.id)) + u3:add_order("NACH O ") + u3:set_skill("riding", 2) + u3:add_item("horse", u2.number) + u3:add_order("KAEMPFE FLIEHE") + process_orders() + assert_equal(u3.region.id, r1.id, "transporter did not move") + assert_equal(u2.region.id, r1.id, "transported unit did not move") +end + +function test_plane() + local pl = plane.create(0, -3, -3, 7, 7) + local nx, ny = plane.normalize(pl, 4, 4) + assert_equal(nx, -3, "normalization failed") + assert_equal(ny, -3, "normalization failed") + local f = faction.create("plan@eressea.de", "human", "de") + f.id = atoi36("tpla") + local r, x, y + for x = -3, 3 do for y = -3, 3 do + r = region.create(x, y, "plain") + if x==y then + local u = unit.create(f, r, 1) + end + end end +end + +function test_pure() + local r = region.create(0, 0, "plain") + assert_not_equal(nil, r) + assert_equal(r, get_region(0, 0)) +end + +function test_read_write() + local r = region.create(0, 0, "plain") + local f = faction.create("readwrite@eressea.de", "human", "de") + local u = unit.create(f, r) + u.number = 2 + local fno = f.id + local uno = u.id + local result = 0 + assert_equal(r.terrain, "plain") + result = eressea.write_game("test.dat") + assert_equal(result, 0) + assert_not_equal(get_region(0, 0), nil) + assert_not_equal(get_faction(fno), nil) + assert_not_equal(get_unit(uno), nil) + r = nil + f = nil + u = nil + eressea.free_game() + assert_equal(get_region(0, 0), nil) + assert_equal(nil, get_faction(fno)) + assert_equal(nil, get_unit(uno)) + result = eressea.read_game("test.dat") + assert_equal(0, result) + assert_not_equal(nil, get_region(0, 0)) + assert_not_equal(nil, get_faction(fno)) + assert_not_equal(nil, get_unit(uno)) +end + +function test_descriptions() + local info = "Descriptions can be very long. Bug 1984 behauptet, dass es Probleme gibt mit Beschreibungen die laenger als 120 Zeichen sind. This description is longer than 120 characters." + local r = region.create(0, 0, "plain") + local f = faction.create("descriptions@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + local s = _test_create_ship(r) + local b = building.create(r, "castle") + local uno = u.id + local fno = f.id + local sno = s.id + local bno = b.id + u.info = info + r.info = info + f.info = info + s.info = info + b.info = info + + filename = "test.dat" + eressea.write_game(filename) + eressea.free_game() + eressea.read_game(filename) + assert_equal(info, get_ship(sno).info) + assert_equal(info, get_unit(uno).info) + assert_equal(info, get_faction(fno).info) + assert_equal(info, get_building(bno).info) + assert_equal(info, get_region(0, 0).info) +end + +function test_gmtool() + local r1 = region.create(1, 0, "plain") + local r2 = region.create(1, 1, "plain") + local r3 = region.create(1, 2, "plain") + gmtool.open() + gmtool.select(r1, true) + gmtool.select_at(0, 1, true) + gmtool.select(r2, true) + gmtool.select_at(0, 2, true) + gmtool.select(r3, false) + gmtool.select(r3, true) + gmtool.select_at(0, 3, false) + gmtool.select(r3, false) + + local selections = 0 + for r in gmtool.get_selection() do + selections=selections+1 + end + assert_equal(2, selections) + assert_equal(nil, gmtool.get_cursor()) + + gmtool.close() +end + +function test_faction() + local r = region.create(0, 0, "plain") + local f = faction.create("testfaction@eressea.de", "human", "de") + assert(f) + f.info = "Spazz" + assert(f.info=="Spazz") + f:add_item("donotwant", 42) + f:add_item("stone", 42) + f:add_item("sword", 42) + local items = 0 + for u in f.items do + items = items + 1 + end + assert(items==2) + unit.create(f, r) + unit.create(f, r) + local units = 0 + for u in f.units do + units = units + 1 + end + assert(units==2) +end + +function test_unit() + local r = region.create(0, 0, "plain") + local f = faction.create("testunit@eressea.de", "human", "de") + local u = unit.create(f, r) + u.number = 20 + u.name = "Enno" + assert(u.name=="Enno") + u.info = "Spazz" + assert(u.info=="Spazz") + u:add_item("sword", 4) + assert(u:get_item("sword")==4) + assert(u:get_pooled("sword")==4) + u:use_pooled("sword", 2) + assert(u:get_item("sword")==2) +end + +function test_region() + local r = region.create(0, 0, "plain") + r:set_resource("horse", 42) + r:set_resource("money", 45) + r:set_resource("peasant", 200) + assert(r:get_resource("horse") == 42) + assert(r:get_resource("money") == 45) + assert(r:get_resource("peasant") == 200) + r.name = nil + r.info = nil + assert(r.name=="") + assert(r.info=="") + r.name = "Alabasterheim" + r.info = "Hier wohnen die siebzehn Zwerge" + assert(tostring(r) == "Alabasterheim (0,0)") +end + +function test_building() + local u + local f = faction.create("testbuilding@eressea.de", "human", "de") + local r = region.create(0, 0, "plain") + local b = building.create(r, "castle") + u = unit.create(f, r) + u.number = 1 + u.building = b + u = unit.create(f, r) + u.number = 2 + -- u.building = b + u = unit.create(f, r) + u.number = 3 + u.building = b + local units = 0 + for u in b.units do + units = units + 1 + end + assert(units==2) + local r2 = region.create(0, 1, "plain") + assert(b.region==r) + b.region = r2 + assert(b.region==r2) + assert(r2.buildings()==b) +end + +function test_message() + local r = region.create(0, 0, "plain") + local f = faction.create("testmessage@eressea.de", "human", "de") + local u = unit.create(f, r) + local msg = message.create("item_create_spell") + msg:set_unit("mage", u) + msg:set_int("number", 1) + msg:set_resource("item", "sword") + msg:send_region(r) + msg:send_faction(f) + + return msg +end + +function test_hashtable() + local f = faction.create("noreply1@eressea.de", "human", "de") + f.objects:set("enno", "smart guy") + f.objects:set("age", 10) + assert(f.objects:get("jesus") == nil) + assert(f.objects:get("enno") == "smart guy") + assert(f.objects:get("age") == 10) + f.objects:set("age", nil) + assert(f.objects:get("age") == nil) +end + +function test_events() + local fail = 1 + local function msg_handler(u, evt) + str = evt:get(0) + u2 = evt:get(1) + assert(u2~=nil) + assert(str=="Du Elf stinken") + message_unit(u, u2, "thanks unit, i got your message: " .. str) + message_faction(u, u2.faction, "thanks faction, i got your message: " .. str) + message_region(u, "thanks region, i got your message: " .. str) + fail = 0 + end + + plain = region.create(0, 0, "plain") + skill = 8 + + f = faction.create("noreply2@eressea.de", "elf", "de") + f.age = 20 + + u = unit.create(f, plain) + u.number = 1 + u:add_item("money", u.number*100) + u:clear_orders() + u:add_order("NUMMER PARTEI test") + u:add_handler("message", msg_handler) + msg = "BOTSCHAFT EINHEIT " .. itoa36(u.id) .. " Du~Elf~stinken" + f = faction.create("noreply3@eressea.de", "elf", "de") + f.age = 20 + + u = unit.create(f, plain) + u.number = 1 + u:add_item("money", u.number*100) + u:clear_orders() + u:add_order("NUMMER PARTEI eviL") + u:add_order(msg) + process_orders() + assert(fail==0) +end + +function test_recruit2() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply4@eressea.de", "human", "de") + local u = unit.create(f, r) + u.number = 1 + u:add_item("money", 2000) + u:clear_orders() + u:add_order("MACHE TEMP 1") + u:add_order("REKRUTIERE 1 Elf") + u:add_order("REKRUTIERE 1 Mensch") + u:add_order("REKRUTIERE 1") + process_orders() +end + +function test_guard() + region.create(1, 0, "plain") + local r = region.create(0, 0, "plain") + local f1 = faction.create("noreply5@eressea.de", "human", "de") + f1.age = 20 + local u1 = unit.create(f1, r, 10) + u1:add_item("sword", 10) + u1:add_item("money", 10) + u1:set_skill("melee", 10) + u1:clear_orders() + u1:add_order("NACH O") + u1.name="Kalle Pimp" + + local f2 = faction.create("noreply6@eressea.de", "human", "de") + f2.age = 20 + local u2 = unit.create(f2, r, 1) + local u3 = unit.create(f2, r, 1) + local b = building.create(r, "castle") + b.size = 10 + u2.building = b + u3.building = b + u2:clear_orders() + u2:add_order("ATTACKIEREN " .. itoa36(u1.id)) -- you will die... + u2:add_item("money", 100) + u3:add_item("money", 100) + process_orders() + assert_equal(r, u1.region, "unit may not move after combat") +end + +function test_recruit() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply7@eressea.de", "human", "de") + local u = unit.create(f, r) + u.number = 1 + local n = 3 + r:set_resource("peasant", 200) + u:clear_orders() + u:add_item("money", 110*n+20) + u:add_order("REKRUTIERE " .. n) + process_orders() + assert(u.number == n+1) + local p = r:get_resource("peasant") + assert(p<200 and p>=200-n) + -- assert(u:get_item("money")==10) +end + +function test_produce() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply8@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + u:clear_orders() + local sword = config.get_resource('sword') + u:set_skill(sword.build_skill_name, 3) + u:add_item("iron", 10) + u:add_item("money", u.number * 10) + u:add_order("MACHE Schwert") + process_orders() + assert_equal(10-3/sword.build_skill_min*sword.materials['iron'], u:get_item("iron")) + assert_equal(3/sword.build_skill_min, u:get_item("sword")) +end + +function test_work() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply9@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + u:add_item("money", u.number * 10) -- humans cost 10 + u:set_skill("herbalism", 5) + u:clear_orders() + u:add_order("ARBEITEN") + process_orders() + assert(u:get_item("money")>=10) +end + +function test_upkeep() + eressea.settings.set("rules.economy.food", "0") + local r = region.create(0, 0, "plain") + local f = faction.create("noreply10@eressea.de", "human", "de") + local u = unit.create(f, r, 5) + u:add_item("money", u.number * 11) + u:clear_orders() + u:add_order("LERNE Waffenbau") + process_orders() + assert(u:get_item("money")==u.number) +end + +function test_id() + local r = region.create(0, 0, "plain") + + local f = faction.create("noreply11@eressea.de", "human", "de") + f.id = atoi36("42") + assert(get_faction(42)~=f) + assert(get_faction("42")==f) + assert(get_faction(atoi36("42"))==f) + + local u = unit.create(f, r, 1) + u.id = atoi36("42") + assert(get_unit(42)~=u) + assert(get_unit("42")==u) + assert(get_unit(atoi36("42"))==u) + + local b = building.create(r, "castle") + -- b.id = atoi36("42") + local fortytwo = itoa36(b.id) + assert(get_building(fortytwo)==b) + assert(get_building(atoi36(fortytwo))==b) + + local s = _test_create_ship(r) + assert_not_nil(s) + -- s.id = atoi36("42") + local fortytwo = itoa36(s.id) + assert(get_ship(fortytwo)==s) + assert(get_ship(atoi36(fortytwo))==s) +end + +function test_herbalism() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply12@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + u:add_item("money", u.number * 100) + u:set_skill("herbalism", 5) + u:clear_orders() + u:add_order("MACHE Samen") + process_orders() +end + +function test_mallorn() + local r = region.create(0, 0, "plain") + r:set_flag(1, false) -- not mallorn + r:set_resource("tree", 100) + assert(r:get_resource("tree")==100) + local m = region.create(0, 0, "plain") + m:set_flag(1, true) -- mallorn + m:set_resource("tree", 100) + assert(m:get_resource("tree")==100) + + local f = faction.create("noreply13@eressea.de", "human", "de") + + local u1 = unit.create(f, r, 1) + u1:add_item("money", u1.number * 100) + u1:set_skill("forestry", 2) + u1:clear_orders() + u1:add_order("MACHE HOLZ") + + local u2 = unit.create(f, m, 1) + u2:add_item("money", u2.number * 100) + u2:set_skill("forestry", 2) + u2:clear_orders() + u2:add_order("MACHE HOLZ") + + local u3 = unit.create(f, m, 1) + u3:add_item("money", u3.number * 100) + u3:set_skill("forestry", 2) + u3:clear_orders() + u3:add_order("MACHE Mallorn") + + process_orders() + + assert_equal(2, u1:get_item("log")) + assert_equal(2, u2:get_item("log")) + local mallorn_cfg = config.get_resource("mallorn") + if mallorn_cfg then + assert_equal(1, u3:get_item("mallorn")) + else + assert_equal(-1, u3:get_item("mallorn")) + assert_equal(0, u3:get_item("log")) + end +end + +function test_coordinate_translation() + local pl = plane.create(1, 500, 500, 1001, 1001) -- astralraum + local pe = plane.create(1, -8761, 3620, 23, 23) -- eternath + local r = region.create(1000, 1000, "plain") + local f = faction.create("noreply14@eressea.de", "human", "de") + assert_not_equal(nil, r) + assert_equal(r.x, 1000) + assert_equal(r.y, 1000) + local nx, ny = plane.normalize(pl, r.x, r.y) + assert_equal(nx, 1000) + assert_equal(ny, 1000) + local r1 = region.create(500, 500, "plain") + f:set_origin(r1) + nx, ny = f:normalize(r1) + assert_equal(0, nx) + assert_equal(0, ny) + local r0 = region.create(0, 0, "plain") + nx, ny = f:normalize(r0) + assert_equal(0, nx) + assert_equal(0, ny) + nx, ny = f:normalize(r) + assert_equal(500, nx) + assert_equal(500, ny) + local rn = region.create(1010, 1010, "plain") + nx, ny = f:normalize(rn) + assert_equal(-491, nx) + assert_equal(-491, ny) + + local re = region.create(-8760, 3541, "plain") -- eternath + nx, ny = f:normalize(rn) + assert_equal(-491, nx) + assert_equal(-491, ny) +end + +function test_control() + local u1, u2 = two_units(region.create(0, 0, "plain"), two_factions()) + local r = u1.region + local b = building.create(r, "castle") + u1.building = b + u2.building = b + assert_equal(u1, b.owner) + u1:clear_orders() + u1:add_order("GIB " .. itoa36(u2.id) .. " KOMMANDO") + u1:add_order("VERLASSE") + process_orders() + assert_equal(u2, b.owner) +end + +function test_store_unit() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply15@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + local fid = f.id + u:add_item("money", u.number * 100) + local filename = config.basepath .. "/data/test.dat" + store = storage.create(filename, "wb") + assert_not_equal(store, nil) + store:write_unit(u) + store:close() + eressea.free_game() + -- recreate world: + r = region.create(0, 0, "plain") + f = faction.create("noreply16@eressea.de", "human", "de") + f.id = fid + store = storage.create(filename, "rb") + assert_not_nil(store) + u = store:read_unit() + store:close() + assert(u) + assert(u:get_item("money") == u.number * 100) +end + +function test_building_other() + local r = region.create(0,0, "plain") + local f1 = faction.create("noreply17@eressea.de", "human", "de") + local f2 = faction.create("noreply18@eressea.de", "human", "de") + local b = building.create(r, "castle") + b.size = 10 + local u1 = unit.create(f1, r, 3) + u1.building = b + u1:add_item("money", 100) + + local u2 = unit.create(f2, r, 3) + u2:set_skill("building", 10) + u2:add_item("money", 100) + u2:add_item("stone", 100) + u2:clear_orders() + u2:add_order("MACHEN BURG " .. itoa36(b.id)) + process_orders() + assert_not_equal(10, b.size) +end + +function test_config() + assert_not_equal(nil, config.basepath) + assert_not_equal(nil, config.locales) +end + +local function _test_create_laen() + eressea.settings.set("rules.terraform.all", "1") + local r = region.create(0,0, "mountain") + local f1 = faction.create("noreply19@eressea.de", "human", "de") + local u1 = unit.create(f1, r, 1) + r:set_resource("laen", 50) + return r, u1 +end + +function test_laen1() + local r, u1 = _test_create_laen() + + u1:add_item("money", 1000) + u1:set_skill("mining", 14) + u1:clear_orders() + u1:add_order("MACHEN Laen") + + process_orders() + assert_equal(0, u1:get_item("laen")) +end + +function test_laen2() + local r, u1 = _test_create_laen() + + u1:add_item("money", 1000) + u1:set_skill("mining", 15) + u1:clear_orders() + u1:add_order("MACHEN Laen") + u1.name = "Laenmeister" + + local b = building.create(r, "mine") + b.size = 10 + u1.building = b + local laen = r:get_resource("laen") + + process_orders() + init_reports() + write_report(u1.faction) + assert_equal(laen - 2, r:get_resource("laen")) + assert_equal(2, u1:get_item("laen")) +end + +function test_mine() + local r = region.create(0,0, "mountain") + local f1 = faction.create("noreply20@eressea.de", "human", "de") + local u1 = unit.create(f1, r, 1) + + u1:add_item("money", 1000) + u1:set_skill("mining", 1) + u1:clear_orders() + u1:add_order("MACHEN Eisen") + + local b = building.create(r, "mine") + b.size = 10 + u1.building = b + local iron = r:get_resource("iron") + + process_orders() + assert_equal(2, u1:get_item("iron")) -- skill +1 + assert_equal(iron - 1, r:get_resource("iron")) -- only 1/2 is taken away +end + +function test_guard_resources() + -- this is not quite http://bugs.eressea.de/view.php?id=1756 + local r = region.create(0,0, "mountain") + local f1 = faction.create("noreply21@eressea.de", "human", "de") + f1.age=20 + local f2 = faction.create("noreply22@eressea.de", "human", "de") + f2.age=20 + local u1 = unit.create(f1, r, 1) + u1:add_item("money", 100) + u1:set_skill("melee", 3) + u1:add_item("sword", 1) + u1:clear_orders() + u1:add_order("BEWACHEN") + + 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") + assert_true(iron > 0) + process_orders() + assert_equal(iron, u2:get_item("iron")) +end + +local function is_flag_set(flags, flag) + return math.fmod(flags, flag*2) - math.fmod(flags, flag) == flag; +end + +function test_hero_hero_transfer() + local r = region.create(0,0, "mountain") + local f = faction.create("noreply23@eressea.de", "human", "de") + f.age=20 + local UFL_HERO = 128 + + local u1 = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u1:add_item("money", 10000) + u1.flags = u1.flags + UFL_HERO + u2.flags = u2.flags + UFL_HERO + u1:clear_orders() + u1:add_order("GIB " .. itoa36(u2.id) .. " 1 PERSONEN") + u1:add_order("REKRUTIEREN 1") + process_orders() + assert_equal(2, u2.number) + assert_true(is_flag_set(u2.flags, 128), 128, "unit is not a hero?") + assert_equal(1, u1.number) + assert_false(is_flag_set(u1.flags, 128), 128, "recruiting into an empty hero unit should not create a hero") +end + +function test_hero_normal_transfer() + local r = region.create(0,0, "mountain") + local f = faction.create("noreply24@eressea.de", "human", "de") + f.age=20 + local UFL_HERO = 128 + + local u1 = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u1:add_item("money", 10000) + u1.flags = u1.flags + UFL_HERO + u1:clear_orders() + u1:add_order("GIB " .. itoa36(u2.id) .. " 1 PERSONEN") + process_orders() + assert_equal(1, u1.number) + assert_equal(1, u2.number) + assert_true(is_flag_set(u1.flags, 128), "unit is not a hero?") + assert_false(is_flag_set(u2.flags, 128), "unit turned into a hero") +end + +function test_expensive_skills_cost_money() + local r = region.create(0,0, "mountain") + local f = faction.create("noreply25@eressea.de", "elf", "de") + local u = unit.create(f, r, 1) + u:add_item("money", 10000) + u:clear_orders() + u:add_order("LERNEN MAGIE Gwyrrd") + process_orders() + assert_equal(9900, u:get_item("money")) + assert_equal(1, u:get_skill("magic")) +end + +function test_food_is_consumed() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply26@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + u:add_item("money", 100) + u:clear_orders() + u:add_order("LERNEN Reiten") -- don't work + eressea.settings.set("rules.economy.food", "4") + process_orders() + assert_equal(100, u:get_item("money")) +end + +function test_food_can_override() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply27@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + u:add_item("money", 100) + u:clear_orders() + u:add_order("LERNEN Reiten") -- don't work + eressea.settings.set("rules.economy.food", "0") + process_orders() + assert_equal(90, u:get_item("money")) +end + +function test_swim_and_survive() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply28@eressea.de", "human", "de") + f.nam = "chaos" + local u = unit.create(f, r, 1) + process_orders() + r.terrain = "ocean" + local s = _test_create_ship(r) + u:clear_orders() + u:add_order("BETRETE SCHIFF " .. itoa36(s.id)) + process_orders() + assert_equal(u.number, 1) +end + +function test_swim_and_die() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply29@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + local uid = u.id + process_orders() + r.terrain = "ocean" + u = get_unit(uid) + assert_not_equal(get_unit(uid), nil) + process_orders() + assert_equal(get_unit(uid), nil) +end + +function test_ride_with_horse() + region.create(1, 0, "plain") + region.create(2, 0, "plain") + local r = region.create(0, 0, "plain") + local f = faction.create("noreply30@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + u:add_item("horse", 1) + local horse_cfg = config.get_resource("horse") + u:add_item("sword", (horse_cfg.capacity - u.weight)/100) + u:set_skill("riding", 2) + + u:clear_orders() + u:add_order("NACH O O") + process_orders() + assert_equal(u.region.x, 2) + + u:add_item("sword", 1) + u:clear_orders() + u:add_order("NACH W W") + process_orders() + assert_equal(u.region.x, 1) +end + +function test_ride_with_horses_and_cart() + region.create(1, 0, "plain") + region.create(2, 0, "plain") + local r = region.create(0, 0, "plain") + local f = faction.create("noreply31@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + local horse_cfg = config.get_resource("horse") + local cart_cfg = config.get_resource("cart") + local sword_cfg = config.get_resource("sword") + + u:set_skill("riding", 3) + + local capacity = (horse_cfg.capacity-horse_cfg.weight)*2 - u.weight + if cart_cfg~=nil then + capacity = capacity + cart_cfg.capacity-cart_cfg.weight + end + u:add_item("sword", capacity / sword_cfg.weight) + + u:add_item("horse", 1) + if cart_cfg~=nil then + -- we need 2 horses for a cart, so this should fail: + u:add_item("cart", 1) + u:clear_orders() + u:add_order("NACH O O") + process_orders() + assert_equal(0, u.region.x) + end + + -- here is your second horse, milord: + u:add_item("horse", 1) + assert_equal(2, u:get_item("horse")) + + -- ride + u:clear_orders() + u:add_order("NACH O O") + process_orders() + assert_equal(2, u.region.x) + + -- walk + u:add_item("sword", 1000/sword_cfg.weight) + u:clear_orders() + u:add_order("NACH W W") + process_orders() + assert_equal(1, u.region.x) + + -- make this fellow too heavy + u:add_item("sword", 1000/sword_cfg.weight) + u:clear_orders() + u:add_order("NACH W W") + process_orders() + assert_equal(1, u.region.x) +end + +function test_walk_and_carry_the_cart() + region.create(1, 0, "plain") + local r = region.create(2, 0, "plain") + local r = region.create(0, 0, "plain") + local f = faction.create("noreply32@eressea.de", "human", "de") + local u = unit.create(f, r, 10) + u:add_item("cart", 1) + + -- walk + u:clear_orders() + u:add_order("NACH O O") + process_orders() + assert_equal(1, u.region.x) +end + +module("tests.recruit", package.seeall, lunit.testcase) + +function setup() + eressea.free_game() + eressea.settings.set("rules.economy.food", "4") + eressea.settings.set("rules.peasants.growth", "0") +end + +function test_bug_1795_limit() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u1 = one_unit(r,f) + u1:add_item("money", 100000000) + u1:add_order("REKRUTIEREN 9999") + r:set_resource("peasant", 2000) -- no fractional growth! + local peasants = r:get_resource("peasant") + local limit,frac = math.modf(peasants/40) -- one day this should be a parameter + + process_orders() + assert_equal(limit+1, u1.number, u1.number .. "!=" .. (limit+1)) + assert_equal(peasants-limit, r:get_resource("peasant")) +end + +function test_bug_1795_demons() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply@eressea.de", "demon", "de") + local u1 = one_unit(r,f) + r:set_resource("peasant", 2000) + local peasants = r:get_resource("peasant") + local limit,frac = math.modf(peasants/40) + + u1:add_item("money", 100000000) + u1:add_order("REKRUTIEREN 9999") + + process_orders() + + assert_equal(limit+1, u1.number, u1.number .. "!=" .. (limit+1)) + assert_equal(peasants, r:get_resource("peasant")) +end + +module("tests.report", package.seeall, lunit.testcase) + +function setup() + eressea.free_game() + eressea.settings.set("nmr.removenewbie", "0") + eressea.settings.set("nmr.timeout", "0") + eressea.settings.set("rules.economy.food", "4") +end + +local function find_in_report(f, pattern, extension) + extension = extension or "nr" + local filename = config.reportpath .. "/" .. get_turn() .. "-" .. itoa36(f.id) .. "." .. extension + local report = io.open(filename, 'r'); + assert_not_nil(report) + t = report:read("*all") + report:close() + + local start, _ = string.find(t, pattern) +-- posix.unlink(filename) + return start~=nil +end + +function test_coordinates_no_plane() + local r = region.create(0, 0, "mountain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + init_reports() + write_report(f) + assert_true(find_in_report(f, r.name .. " %(0,0%), Berg")) +end + +function test_show_shadowmaster_attacks() + 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 = "shadowmaster" + u:clear_orders() + u:add_order("ZEIGE Schattenmeister") + process_orders() + init_reports() + write_report(f) + assert_false(find_in_report(f, ", ,")) +end + +function test_coordinates_named_plane() + local p = plane.create(0, -3, -3, 7, 7, "Hell") + local r = region.create(0, 0, "mountain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + init_reports() + write_report(f) + assert_true(find_in_report(f, r.name .. " %(0,0,Hell%), Berg")) +end + +function test_coordinates_unnamed_plane() + local p = plane.create(0, -3, -3, 7, 7) + local r = region.create(0, 0, "mountain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + init_reports() + write_report(f) + assert_true(find_in_report(f, r.name .. " %(0,0%), Berg")) +end + +function test_coordinates_noname_plane() + local p = plane.create(0, -3, -3, 7, 7, "") + local r = region.create(0, 0, "mountain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + init_reports() + write_report(f) + assert_true(find_in_report(f, r.name .. " %(0,0%), Berg")) +end + +function test_lighthouse() + local r = region.create(0, 0, "mountain") + local f = faction.create("noreply@eressea.de", "human", "de") + region.create(1, 0, "mountain") + region.create(2, 0, "ocean") + region.create(0, 1, "firewall") + region.create(3, 0, "mountain") + region.create(4, 0, "plain") + local u = unit.create(f, r, 1) + local b = building.create(r, "lighthouse") + b.size = 100 + b.working = true + u.building = b + u:set_skill("perception", 9) + u:add_item("money", 1000) + assert_not_nil(b) + + init_reports() + write_report(f) + assert_true(find_in_report(f, " %(1,0%) %(vom Turm erblickt%)")) + assert_true(find_in_report(f, " %(2,0%) %(vom Turm erblickt%)")) + assert_true(find_in_report(f, " %(3,0%) %(vom Turm erblickt%)")) + + assert_false(find_in_report(f, " %(0,0%) %(vom Turm erblickt%)")) + assert_false(find_in_report(f, " %(0,1%) %(vom Turm erblickt%)")) + assert_false(find_in_report(f, " %(4,0%) %(vom Turm erblickt%)")) +end + +module("tests.parser", package.seeall, lunit.testcase) + +function setup() + eressea.free_game() + eressea.settings.set("rules.economy.food", "4") -- FOOD_IS_FREE + eressea.settings.set("rules.encounters", "0") + eressea.settings.set("rules.move.owner_leave", "0") +end + +function test_parser() + local r = region.create(0, 0, "mountain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + local filename = config.basepath .. "/data/orders.txt" + + local file = io.open(filename, "w") + assert_not_nil(file) + file:write('ERESSEA ' .. itoa36(f.id) .. ' "' .. f.password .. '"\n') + file:write('EINHEIT ' .. itoa36(u.id) .. "\n") + file:write("BENENNEN EINHEIT 'Goldene Herde'\n") + file:close() + + eressea.read_orders(filename) + process_orders() + assert_equal("Goldene Herde", u.name) +end diff --git a/scripts/eressea/tests/config.lua b/scripts/eressea/tests/config.lua new file mode 100644 index 000000000..b24da72bc --- /dev/null +++ b/scripts/eressea/tests/config.lua @@ -0,0 +1,39 @@ +require "lunit" + +module("tests.eressea.config", package.seeall, lunit.testcase ) + +function setup() + eressea.free_game() +end + +function test_read_race() + local f + eressea.free_game() + f = faction.create("orc@example.com", "orc", "en") + assert_equal(nil, f) + assert_not_nil(eressea.config) + eressea.config.parse('{ "races": { "orc" : {}}}') + f = faction.create("orc@example.com", "orc", "en") + assert_not_nil(f) +end + +function test_read_ship() + local s + eressea.free_game() + s = ship.create(nil, "boat") + assert_equal(nil, s) + assert_not_nil(eressea.config) + conf = [[{ + "ships": { + "boat" : { + "construction" : { + "maxsize" : 20 + } + } + } + }]] + eressea.config.parse(conf); + s = ship.create(nil, "boat") + assert_not_nil(s) +end + diff --git a/scripts/eressea/tests/e3a.lua b/scripts/eressea/tests/e3a.lua new file mode 100644 index 000000000..fc0031efb --- /dev/null +++ b/scripts/eressea/tests/e3a.lua @@ -0,0 +1,735 @@ +require "lunit" + +module("tests.e3.e3features", package.seeall, lunit.testcase) + +function setup() + eressea.free_game() + eressea.settings.set("rules.economy.food", "4") +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_analyze_magic() + local r1 = region.create(0,0, "plain") + local r2 = region.create(1,0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + + local u = unit.create(f, r2, 1) + + u.race = "elf" + u:set_skill("magic", 6) + u.magic = "gwyrrd" + u.aura = 60 + u:add_spell("analyze_magic") + u:clear_orders() + u:add_order("Zaubere stufe 2 'Magie analysieren' REGION 1,0") + process_orders() +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_xmas2009() + local r = region.create(0,0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u1 = unit.create(f, r, 1) + process_orders() + xmas2009() + assert_equal("xmastree", f.items()) +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() + eressea.settings.set("rules.ship.drifting", "0") + eressea.settings.set("rules.ship.storms", "0") + 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) + write_reports() + 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) + write_reports() + 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() + eressea.settings.set("rules.move.owner_leave", "1") + 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() + init_reports() + write_report(u.faction) + 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_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_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") + u1:add_order("NACH O O O") + 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 + +function 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() + for r in regions() do + market_action(r) + end + assert_equal(35, u:get_item("balm")) + assert_equal(70, u:get_item("h2")) +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 disabled_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() + --[[ + init_reports() + write_report(f) + ]]-- + -- resulting size should be 250 because unit 2 + -- does not have the needed minimum skill. + assert_equal(c.size, 250) +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_building_owner_can_enter_ship() + local r1 = region.create(1, 2, "plain") + local f1 = faction.create("noreply@tteessttiinngg.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 diff --git a/scripts/eressea/tests/eressea.lua b/scripts/eressea/tests/eressea.lua new file mode 100644 index 000000000..789b81b6b --- /dev/null +++ b/scripts/eressea/tests/eressea.lua @@ -0,0 +1,360 @@ +require "lunit" + +module("tests.e3.e2features", package.seeall, lunit.testcase ) + +local function one_unit(r, f) + local u = unit.create(f, r, 1) + u:add_item("money", u.number * 100) + u:clear_orders() + return u +end + +local function two_factions() + local f1 = faction.create("one@eressea.de", "human", "de") + local f2 = faction.create("two@eressea.de", "human", "de") + return f1, f2 +end + +local function two_units(r, f1, f2) + return one_unit(r, f1), one_unit(r, f2) +end + +function setup() + eressea.free_game() + eressea.settings.set("nmr.timeout", "0") + eressea.settings.set("rules.economy.food", "4") +end + +function test_learn() + eressea.settings.set("study.random_progress", "0") + local r = region.create(0, 0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + f.age = 20 + local u = unit.create(f, r) + u:clear_orders() + u:add_order("@LERNEN Reiten") + process_orders() + assert_equal(1, u:get_skill("riding")) + process_orders() + process_orders() + assert_equal(2, u:get_skill("riding")) + process_orders() + process_orders() + process_orders() + assert_equal(3, u:get_skill("riding")) +end + +function test_teach() + eressea.settings.set("study.random_progress", "0") + local r = region.create(0, 0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + f.age = 20 + local u = unit.create(f, r, 10) + local u2 = unit.create(f, r) + u:clear_orders() + u:add_order("@LERNEN reiten") + u2:clear_orders() + u2:add_order("LEHREN " .. itoa36(u.id)) + u2:set_skill("riding", 4) + process_orders() + assert_equal(1, u:get_skill("riding")) + process_orders() + assert_equal(2, u:get_skill("riding")) +end + +function test_rename() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r) + u:add_item("aoh", 1) + assert_equal(u:get_item("ao_healing"), 1) +end + +function DISABLE_test_alp() + local r = region.create(0,0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + local u2 = unit.create(f, r, 1) + u.race = "elf" + u:set_skill("magic", 10) + u:add_item("money", 3010) + u.magic = "illaun" + u.aura = 200 + u.ship = s1 + u:add_spell("summon_alp") + u:clear_orders() + u:add_order("ZAUBERE 'Alp' " .. itoa36(u2.id)) + process_orders() + print(get_turn(), f) + write_reports() +end + +function test_unit_limit_is_1500() + local r = region.create(0,0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + for i = 1,1500 do + unit.create(f, r, 1) + end + local u = unit.create(f, r, 0) + u:add_item("money", 20000) + u:clear_orders() + u:add_order("REKRUTIEREN 1") + process_orders() + assert_equal(1, u.number) +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") + + -- u1 is at the limit and moves + local s1 = ship.create(r, "boat") + local u1 = unit.create(f, r, 5) + u1.ship = s1 + u1:set_skill("sailing", 10) + u1:clear_orders() + u1:add_order("NACH O O") + + -- u2 has too many people + local s2 = ship.create(r, "boat") + local u2 = unit.create(f, r, 6) + u2.ship = s2 + u2:set_skill("sailing", 10) + u2:clear_orders() + u2:add_order("NACH O O") + + -- u4 has too much stuff + local s4 = ship.create(r, "boat") + local u4 = unit.create(f, r, 5) + u4.ship = s4 + u4:set_skill("sailing", 10) + u4:add_item("sword", 1) + u4:clear_orders() + u4:add_order("NACH O O") + + process_orders() + +-- print(s.region, u.region, r2) + assert_equal(r2, u1.region, "boat with 5 humans did not move") + assert_not_equal(r2, u2.region, "boat with too many people has moved") + assert_not_equal(r2, u4.region, "boat with too much cargo has moved") +end + +function test_levitate() + local r = region.create(0,0, "plain") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 2) + local s = ship.create(r, "boat") + u.ship = s + u.age = 20 + u:set_skill("sailing", 5) + u:add_item("money", 100) + u:clear_orders() + u:add_order("ARBEITE") + levitate_ship(u.ship, u, 2, 1) + assert_equal(32, u.ship.flags) + process_orders() + assert_equal(0, u.ship.flags) +end + +function test_terrains() + local terrains = { "hell", "wall1", "corridor1" } + for k,v in ipairs(terrains) do + local r = region.create(k, k, v) + assert_not_equal(nil, r) + end +end + +function test_races() + local races = { "wolf", "orc", "human", "demon" } + for k,v in ipairs(races) do + local f = faction.create("noreply@eressea.de", "human", "de") + assert_not_equal(nil, f) + end +end + +function test_can_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") + u1:add_order("KONTAKTIERE ".. itoa36(u2.id)) + process_orders() + assert_equal(9, u2.number) + assert_equal(11, u1.number) +end + +function test_no_uruk() + local f1 = faction.create("noreply@eressea.de", "uruk", "de") + assert_equal(f1.race, "orc") +end + +function test_snowman() + local r = region.create(0, 0, "glacier") + local f = faction.create("noreply@eressea.de", "human", "de") + local u = unit.create(f, r, 1) + u:add_item("snowman", 1) + u:clear_orders() + u:add_order("BENUTZEN 1 Schneemann") + process_orders() + for u2 in r.units do + if u2.id~=u.id then + assert_equal(u2.race, "snowman") + u = nil + break + end + end + assert_equal(nil, u) +end + +function test_block_movement() + eressea.settings.set("rules.guard.base_stop_prob", "0.3") + eressea.settings.set("rules.guard.amulet_stop_prob", "0.0") + eressea.settings.set("rules.guard.skill_stop_prob", "0.1") + + local r0 = region.create(0, 0, "plain") + local r1 = region.create(1, 0, "plain") + local r2 = region.create(2, 0, "plain") + local f1, f2 = two_factions() + f1.age=20 + f2.age=20 + + local u11 = one_unit(r1, f1) + local u2 = { } + for i = 1, 20 do + u2[i] = one_unit(r0, f2) + end + + u11:add_item("sword", 1) + u11:add_item("money", 1) + u11:set_skill("melee", 1) + u11:set_skill("perception", 7) + u11:clear_orders() + u11:add_order("BEWACHEN") + + process_orders() + + for i, u in ipairs(u2) do + u:add_item("horse", 1) + u:set_skill("riding", 1) + u:clear_orders() + u:add_order("NACH o o") + end + + u2[1]:set_skill("stealth", 8) + + process_orders() + + assert_equal(r2, u2[1].region, "nobody should see me") + for i, u in ipairs(u2) do + if i > 1 then + assert_equal(r1, u.region, "perception +7 should always stop me") + end + end +end + + + +function test_block_movement_aots() + eressea.settings.set("rules.guard.base_stop_prob", "0.0") + eressea.settings.set("rules.guard.skill_stop_prob", "1.0") + eressea.settings.set("rules.guard.amulet_stop_prob", "1.1") + + local r0 = region.create(0, 0, "plain") + local r1 = region.create(1, 0, "plain") + local r2 = region.create(2, 0, "plain") + local f1, f2 = two_factions() + f1.age=20 + f2.age=20 + + local u11, u12 = two_units(r1, f1, f1) + local u21, u22 = two_units(r0, f2, f2) + + for i, u in ipairs ({ u11, u12 }) do + u:add_item("sword", 1) + u:add_item("money", 1) + u:set_skill("melee", 1) + u:clear_orders() + u:add_order("BEWACHEN") + end + + process_orders() + + for i, u in ipairs ({ u21, u22 }) do + u:add_item("horse", 1) + u:set_skill("riding", 1) + u:clear_orders() + u:add_order("NACH o o") + end + + u12:add_item("aots", 10) + u22:set_skill("stealth", 1) + + process_orders() + + assert_equal(r1, u21.region, "unit with amulet should stop me") + assert_equal(r2, u22.region, "nobody should see me") +end + +function test_stonegolems() + local r0 = region.create(0, 0, "plain") + local f1 = faction.create("noreply@eressea.de", "stonegolem", "de") + local u1 = unit.create(f1, r0, 1) + local u2 = unit.create(f1, r0, 2) + local c1 = building.create(r0, "castle") + + c1.size = 226 + + u1:set_skill("building", 1) + u2:set_skill("building", 1) + +-- test that no server crash occur + u1:clear_orders() + u1:add_order("Mache Burg") + process_orders() + assert_equal(0 ,u1.number, "There shoud be no Stone Golems") +-- end test server crash + +-- test that Stone Golems build for four stones + u2:clear_orders() + u2:add_order("MACHE 4 BURG " .. itoa36(c1.id)) + process_orders() + assert_equal(230, c1.size, "resulting size should be 230") + assert_equal(1 ,u2.number, "There shoud be one Stone Golems") +-- end test Stone Golems four stones +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 diff --git a/scripts/eressea/tests/init.lua b/scripts/eressea/tests/init.lua new file mode 100644 index 000000000..d25bddb9f --- /dev/null +++ b/scripts/eressea/tests/init.lua @@ -0,0 +1,16 @@ +-- require 'eressea.tests.spells' +require 'eressea.tests.common' +require 'eressea.tests.stealth' +-- require 'eressea.tests.spells-e3' +-- require 'eressea.tests.spells-e2' +require 'eressea.tests.settings' +-- require 'eressea.tests.morale' +-- require 'eressea.tests.orders' +-- require 'eressea.tests.eressea' +-- require 'eressea.tests.e3a' +-- require 'eressea.tests.config' +-- require 'eressea.tests.common' +require 'eressea.tests.castles' +require 'eressea.tests.bindings' +-- require 'eressea.tests.bson' +-- require 'eressea.tests.attrib' diff --git a/scripts/eressea/tests/morale.lua b/scripts/eressea/tests/morale.lua new file mode 100644 index 000000000..88b451f1d --- /dev/null +++ b/scripts/eressea/tests/morale.lua @@ -0,0 +1,179 @@ +require "lunit" + +module("tests.eressea.morale", package.seeall, lunit.testcase ) + +function setup() + eressea.game.reset() + eressea.settings.set('rules.region_owners', '1') +end + +function test_when_owner_returns_morale_drops_only_2() + local r = region.create(0, 0, "plain") + assert_equal(1, r.morale) + local f1 = faction.create("noreply@eressea.de", "human", "de") + local u1 = unit.create(f1, r, 1) + u1:add_item("money", 10000) + local b = building.create(r, "castle") + b.size = 50 + + set_turn(get_turn()+10) + f1.lastturn=get_turn() + u1.building = b + update_owners() + r.morale = 6 + u1.building = nil + process_orders() + assert_equal(5, r.morale) -- no owner, fall by 1 + u1.building = b + update_owners() + set_key("test", 42) + process_orders() + assert_equal(3, r.morale) -- new owner, fall by 2 +end + +function test_morale_alliance() + local r = region.create(0, 0, "plain") + assert_equal(1, r.morale) + local f1 = faction.create("noreply@eressea.de", "human", "de") + local u1 = unit.create(f1, r, 1) + u1:add_item("money", 10000) + local f2 = faction.create("noreply@eressea.de", "human", "de") + local u2 = unit.create(f2, r, 1) + u2:add_item("money", 10000) + local f3 = faction.create("noreply@eressea.de", "human", "de") + local u3 = unit.create(f3, r, 1) + u3:add_item("money", 10000) + + local al = alliance.create(42, "Die Antwoord") + f1.alliance = al; + f2.alliance = al; + + local b = building.create(r, "castle") + b.size = 50 + u1.building = b + u2.building = b + u3.building = b + update_owners() + r.morale = 6 + + local function run_a_turn() + process_orders() + f1.lastturn=get_turn() + f2.lastturn=get_turn() + f3.lastturn=get_turn() + end + + -- just checking everything's okay after setup. + run_a_turn() + assert_equal(6, r.morale) + + -- change owner, new owner is in the same alliance + u1.building = nil + run_a_turn() + assert_equal(4, r.morale) + + -- change owner, new owner is not in the same alliance + u2.building = nil + run_a_turn() + assert_equal(0, r.morale) +end + +function test_morale_change() + local r = region.create(0, 0, "plain") + assert_equal(1, r.morale) + local f1 = faction.create("noreply@eressea.de", "human", "de") + local u1 = unit.create(f1, r, 1) + u1:add_item("money", 10000) + local f2 = faction.create("noreply@eressea.de", "human", "de") + local u2 = unit.create(f2, r, 1) + u2:add_item("money", 10000) + + local AVG_STEP = 6 + local b = building.create(r, "castle") + b.size = 10 + u1.building = b + + local function run_a_turn() + process_orders() + f1.lastturn=get_turn() + f2.lastturn=get_turn() + end + + -- reinhardt-regel: nach 2*AVG_STEP ist moral mindestens einmal gestiegen. + update_owners() + assert_not_equal(r.owner, nil) + for i=1,AVG_STEP*2 do + run_a_turn() + assert_not_equal(r.owner, nil) + end + assert_not_equal(1, r.morale) + + -- regel: moral ist nie hoeher als 2 punkte ueber burgen-max. + for i=1,AVG_STEP*4 do + run_a_turn() + end + assert_equal(4, r.morale) + + -- auch mit herrscher faellt moral um 1 pro woche, wenn moral > burgstufe + r.morale = 6 + run_a_turn() + assert_equal(5, r.morale) + run_a_turn() + assert_equal(4, r.morale) + run_a_turn() + assert_equal(4, r.morale) + + -- regel: ohne herrscher fällt die moral jede woche um 1 punkt, bis sie 1 erreicht + u1.building = nil + update_owners() + run_a_turn() + assert_equal(3, r.morale) + run_a_turn() + assert_equal(2, r.morale) + run_a_turn() + assert_equal(1, r.morale) + run_a_turn() + assert_equal(1, r.morale) + + -- ohne herrscher ändert sich auch beschissene Moral nicht: + r.morale = 0 + run_a_turn() + assert_equal(0, r.morale) +end + +function test_morale_old() + local r = region.create(0, 0, "plain") + assert_equal(1, r.morale) + local f1 = faction.create("first@eressea.de", "human", "de") + local u1 = unit.create(f1, r, 1) + local f2 = faction.create("second@eressea.de", "human", "de") + local u2 = unit.create(f2, r, 1) + + local b = building.create(r, "castle") + b.size = 10 + u1.building = b + u2.building = b + update_owners() + assert_equal(1, r.morale) + r.morale = 5 + assert_equal(u1.faction, r.owner) + u1:clear_orders() + u1:add_order("GIB " .. itoa36(u2.id) .. " KOMMANDO") + process_orders() + u1:clear_orders() + assert_equal(r.owner, u2.faction) + assert_equal(3, r.morale) -- 5-MORALE_TRANSFER + for u in r.units do + if u.faction.id==u2.faction.id then + u.building = nil + end + end + update_owners() + assert_equal(r.owner, u1.faction) + assert_equal(0, r.morale) +end + +function test_no_uruk() + local f1 = faction.create("noreply@eressea.de", "uruk", "de") + assert_equal(f1.race, "orc") +end diff --git a/scripts/eressea/tests/orders.lua b/scripts/eressea/tests/orders.lua new file mode 100644 index 000000000..ce6ba9949 --- /dev/null +++ b/scripts/eressea/tests/orders.lua @@ -0,0 +1,268 @@ +require "lunit" + +local _G = _G +local eressea = eressea +local default_ship = config.ships[1] +local default_building = config.buildings[1] + +module('tests.eressea.orders', package.seeall, lunit.testcase) + +local r, f, u + +function setup() + eressea.free_game() + r = _G.region.create(0, 0, "mountain") + f = _G.faction.create("noreply@eressea.de", "human", "de") + u = _G.unit.create(f, r, 1) + u:clear_orders() + eressea.settings.set("rules.economy.food", "4") + eressea.settings.set("nmr.removenewbie", "0") + eressea.settings.set("nmr.timeout", "0") + eressea.settings.set("NewbieImmunity", "0") +end + +function test_learn() + u:add_order("LERNEN Hiebwaffen") + _G.process_orders() + assert_not_equal(0, u:get_skill("melee")) +end + +function test_give() + local u2 = _G.unit.create(f, r, 1) + u:add_item("money", 10) + u:add_order("GIB " .. u2.id .. "5 SILBER") + _G.process_orders() + assert_not_equal(5, u:get_item("money")) + assert_not_equal(5, u2:get_item("money")) +end + +function test_make_temp() + u:add_order("MACHE TEMP 123 'Herpderp'") + u:add_order("// this comment will be copied") + u:add_order("ENDE") + eressea.process.make_temp() + + for x in f.units do + if x.name == 'Herpderp' then u=x end + end + assert_equal('Herpderp', u.name) + assert_equal(0, u.number) + local c = 0 + for o in u.orders do + assert_equal('// this comment will be copied', o) + c = c + 1 + end + assert_equal(1, c) +end + +function test_give_temp() + u.number = 2 + u:add_order("GIB TEMP 123 1 PERSON") + u:add_order("MACHE TEMP 123 'Herpderp'") + u:add_order("ENDE") + _G.process_orders() + assert_equal(1, u.number) + + for x in f.units do + if x.name == 'Herpderp' then u=x end + end + assert_equal('Herpderp', u.name) + assert_equal(1, u.number) +end + +function test_process_settings() + f.options = 0 + u:add_order("EMAIL herp@derp.com") + u:add_order("BANNER 'Herpderp'") + u:add_order("PASSWORT 'HerpDerp'") + u:add_order("OPTION AUSWERTUNG") + eressea.process.settings() + assert_equal("herp@derp.com", f.email) + assert_equal("Herpderp", f.info) + assert_equal("HerpDerp", f.password) + assert_equal(1, f.options) +end + +function test_process_group() + u:add_order("GRUPPE herp") + eressea.process.set_group() + assert_equal('herp', u.group) +end + +function test_process_origin() + u:add_order("URSPRUNG 1 2") + eressea.process.set_origin() + x, y = u.faction:get_origin() + assert_equal(1, x) + assert_equal(2, y) +end + +function test_process_quit() + fno = f.id + u:add_order("STIRB '" .. u.faction.password .. "'") + assert_not_equal(nil, _G.get_faction(fno)) + eressea.process.quit() + eressea.write_game('test.dat') + eressea.free_game() + eressea.read_game('test.dat') + assert_equal(nil, _G.get_faction(fno)) +end + +function test_process_make() + u.region:set_resource('tree', 100) + u:set_skill('forestry', 1) + u:add_order('MACHE HOLZ') + eressea.process.produce() + assert_equal(1, u:get_item('log')) +end + +function test_process_study() + u:add_order("LERNEN Holzfaellen") + eressea.process.update_long_order() + eressea.process.study() + x, y = u.faction:get_origin() + assert_equal(1, u:get_skill('forestry')) +end + +function test_process_teach() + eressea.settings.set("study.random_progress", "0") + u:set_skill('forestry', 3) + u2 = _G.unit.create(f, r, 10) + u2:clear_orders() + u2:set_skill('forestry', 1) + u2:add_order("LERNEN Holzfaellen") + u:add_order("LEHREN " .. _G.itoa36(u2.id)) + eressea.process.update_long_order() + eressea.process.study() + assert_equal(2, u2:get_skill('forestry')) +end + +function test_process_move() + r2 = _G.region.create(1, 0, 'plain') + u:add_order('NACH O') + assert_not_equal(r2.id, u.region.id) + eressea.process.update_long_order() + eressea.process.movement() + assert_equal(r2, u.region) +end + +function test_process_leave() + r2 = _G.region.create(1, 0, 'plain') + b = _G.building.create(r, default_building) + assert_not_nil(b) + u.building = b + assert_equal(b, u.building) + u:add_order('VERLASSEN') + eressea.process.leave() + assert_not_equal(b, u.building) +end + +function test_process_name_unit() + u:add_order("BENENNE EINHEIT 'Weasel'") + u:add_order("BESCHREIBE EINHEIT 'Juanita'") + eressea.process.set_name() + assert_equal('Weasel', u.name) + assert_equal('Juanita', u.info) +end + +function test_process_name_faction() + u:add_order("BENENNE PARTEI 'Herpderp'") + eressea.process.set_name() + assert_equal('Herpderp', f.name) +end + +function test_process_name_building() + u:add_order("BENENNE GEBAEUDE 'Herpderp'") + u.building = _G.building.create(r, default_building) + eressea.process.set_name() + assert_equal('Herpderp', u.building.name) +end + +function test_process_name_ship() + u:add_order("BENENNE SCHIFF 'Herpderp'") + u.ship = _G.ship.create(r, default_ship) + eressea.process.set_name() + assert_equal('Herpderp', u.ship.name) +end + +function test_process_renumber() + u:add_order("NUMMER EINHEIT 'ii'") + eressea.process.renumber() + assert_equal(666, u.id) +end + +function test_process_enter() + b = _G.building.create(r, default_building) + assert_not_nil(b) + u:add_order("BETRETEN GEBAEUDE " .. _G.itoa36(b.id)) + eressea.process.enter(1) + assert_equal(b, u.building) +end + +function test_process_restack() + eressea.process.restack() +end + +function test_process_setspells() + eressea.process.set_spells() +end + +function test_process_help() + eressea.process.set_help() +end + +function test_process_contact() + eressea.process.contact() +end + +function test_process_battle() + eressea.process.battle() +end + +function test_process_magic() + eressea.process.magic() +end + +function test_process_give_control() + eressea.process.give_control() +end + +function test_process_regeneration() + eressea.process.regeneration() +end + +function test_process_guard_on() + eressea.process.guard_on() +end + +function test_process_guard_off() + eressea.process.guard_off() +end + +function test_process_explain() + eressea.process.explain() +end + +function test_process_messages() + eressea.process.messages() +end + +function test_process_reserve() + eressea.process.reserve() +end + +function test_process_claim() + eressea.process.claim() +end + +function test_process_follow() + eressea.process.follow() +end + +function test_process_idle() + eressea.process.idle() +end + +function test_process_set_default() + eressea.process.set_default() +end diff --git a/scripts/eressea/tests/settings.lua b/scripts/eressea/tests/settings.lua new file mode 100644 index 000000000..a454a1152 --- /dev/null +++ b/scripts/eressea/tests/settings.lua @@ -0,0 +1,13 @@ +require "lunit" + +module("tests.eressea.settings", package.seeall, lunit.testcase ) + +function setup() + eressea.free_game() +end + +function test_settings() + assert_equal(nil, eressea.settings.get("foo")) + eressea.settings.set("foo", "bar") + assert_equal("bar", eressea.settings.get("foo")) +end diff --git a/scripts/eressea/tests/spells-e3.lua b/scripts/eressea/tests/spells-e3.lua new file mode 100644 index 000000000..44eda4e0f --- /dev/null +++ b/scripts/eressea/tests/spells-e3.lua @@ -0,0 +1,47 @@ +require "lunit" + +module("eressea.tests.spells.e3", package.seeall, lunit.testcase) + +function setup() + eressea.free_game() + eressea.settings.set("magic.fumble.enable", "0") + eressea.settings.set("nmr.removenewbie", "0") + eressea.settings.set("nmr.timeout", "0") + eressea.settings.set("rules.peasants.growth", "0") +end + +function test_blessedharvest_lasts_n_turn() + eressea.free_game() + local r = region.create(0, 0, "plain") + local f = faction.create("noreply@eressea.de", "halfling", "de") + local u = unit.create(f, r) + local err = 0 + r:set_resource("peasant", 100) + r:set_resource("money", 0) + u:add_item("money", 1000) + u.magic = "gwyrrd" + u.race = "dwarf" + u:set_skill("magic", 20) + u.aura = 200 + err = err + u:add_spell("raindance") + err = err + u:add_spell("blessedharvest") + assert_equal(0, err) + + u:clear_orders() + u:add_order("ZAUBERE STUFE 3 Regentanz") + assert_equal(0, r:get_resource("money"), 0) + + local m = 0 + local p = 100 + + process_orders() + assert_equal(200, r:get_resource("money")) + u:clear_orders() + u:add_order("ARBEITEN") + process_orders() + process_orders() + process_orders() + assert_equal(800, r:get_resource("money")) + process_orders() + assert_equal(900, r:get_resource("money")) +end diff --git a/scripts/eressea/tests/stealth.lua b/scripts/eressea/tests/stealth.lua new file mode 100644 index 000000000..fcdf48b70 --- /dev/null +++ b/scripts/eressea/tests/stealth.lua @@ -0,0 +1,37 @@ +require "lunit" + +module('eressea.tests.stealth', package.seeall, lunit.testcase) + +local f +local u + +function setup() + eressea.game.reset() + eressea.settings.set('rules.economy.food', '4') + eressea.settings.set('rules.magic.playerschools', '') + + local r = region.create(0,0, "plain") + f = faction.create("stealthy@eressea.de", "human", "de") + u = unit.create(f, r, 1) + f = faction.create("stealth@eressea.de", "human", "de") +end + +function test_stealth_faction_on() + u:clear_orders() + u:add_order("TARNEN PARTEI") + + eressea.settings.set("rules.stealth.faction", 1) + process_orders() + assert_not_match("Partei", report.report_unit(u, f)) + assert_match("anonym", report.report_unit(u, f)) +end + +function test_stealth_faction_off() + u:clear_orders() + u:add_order("TARNEN PARTEI") + + eressea.settings.set("rules.stealth.faction", 0) + process_orders() + assert_match("Partei", report.report_unit(u, f)) + assert_not_match("anonym", report.report_unit(u, f)) +end