aboutsummaryrefslogtreecommitdiff
path: root/games/devtest/mods/unittests/entity.lua
blob: 68635cad7f5c9b7a2ac7c4b6089536e9f86ef71e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
local log = {}

local function insert_log(...)
	log[#log+1] = string.format(...)
end

local function objref_str(self, ref)
	if ref and ref:is_player() then
		return "player"
	end
	return self.object == ref and "self" or tostring(ref)
end

core.register_entity("unittests:callbacks", {
	initial_properties = {
		hp_max = 5,
		visual = "upright_sprite",
		textures = { "unittests_stick.png" },
		static_save = false,
	},

	on_activate = function(self, staticdata, dtime_s)
		self.object:set_armor_groups({test = 100})
		assert(self.object:get_hp() == self.initial_properties.hp_max)
		insert_log("on_activate(%d)", #staticdata)
	end,
	on_deactivate = function(self, removal)
		insert_log("on_deactivate(%s)", tostring(removal))
	end,
	on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage)
		insert_log("on_punch(%s, %.1f, %d)", objref_str(self, puncher),
			time_from_last_punch, damage)
	end,
	on_death = function(self, killer)
		assert(self.object:get_hp() == 0)
		insert_log("on_death(%s)", objref_str(self, killer))
	end,
	on_rightclick = function(self, clicker)
		insert_log("on_rightclick(%s)", objref_str(self, clicker))
	end,
	on_attach_child = function(self, child)
		insert_log("on_attach_child(%s)", objref_str(self, child))
	end,
	on_detach_child = function(self, child)
		insert_log("on_detach_child(%s)", objref_str(self, child))
	end,
	on_detach = function(self, parent)
		insert_log("on_detach(%s)", objref_str(self, parent))
	end,
	get_staticdata = function(self)
		assert(false)
	end,
})

--

local function check_log(expect)
	if #expect ~= #log then
		error("Log mismatch: " .. core.write_json(log))
	end
	for i, s in ipairs(expect) do
		if log[i] ~= s then
			error("Log mismatch at " .. i .. ": " .. core.write_json(log))
		end
	end
	log = {} -- clear it for next time
end

local function test_entity_lifecycle(_, pos)
	log = {}

	-- with binary in staticdata
	local obj = core.add_entity(pos, "unittests:callbacks", "abc\000def")
	check_log({"on_activate(7)"})

	obj:set_hp(0)
	check_log({"on_death(nil)", "on_deactivate(true)"})

	-- objectref must be invalid now
	assert(obj:get_velocity() == nil)
end
unittests.register("test_entity_lifecycle", test_entity_lifecycle, {map=true})

local function test_entity_interact(_, pos)
	log = {}

	local obj = core.add_entity(pos, "unittests:callbacks")
	check_log({"on_activate(0)"})

	-- rightclick
	obj:right_click(obj)
	check_log({"on_rightclick(self)"})

	-- useless punch
	obj:punch(obj, 0.5, {})
	check_log({"on_punch(self, 0.5, 0)"})

	-- fatal punch
	obj:punch(obj, 1.9, {
		full_punch_interval = 1.0,
		damage_groups = { test = 10 },
	})
	check_log({
		-- does 10 damage even though we only have 5 hp
		"on_punch(self, 1.9, 10)",
		"on_death(self)",
		"on_deactivate(true)"
	})
end
unittests.register("test_entity_interact", test_entity_interact, {map=true})

local function test_entity_attach(player, pos)
	log = {}

	local obj = core.add_entity(pos, "unittests:callbacks")
	check_log({"on_activate(0)"})

	-- attach player to entity
	player:set_attach(obj)
	check_log({"on_attach_child(player)"})
	player:set_detach()
	check_log({"on_detach_child(player)"})

	-- attach entity to player
	obj:set_attach(player)
	check_log({})
	obj:set_detach()
	check_log({"on_detach(player)"})

	obj:remove()
end
unittests.register("test_entity_attach", test_entity_attach, {player=true, map=true})