mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
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_callback.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})
 |