mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			114 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
_G.core = {}
 | 
						|
_G.vector = {metatable = {}}
 | 
						|
 | 
						|
dofile("builtin/common/vector.lua")
 | 
						|
dofile("builtin/common/misc_helpers.lua")
 | 
						|
 | 
						|
function core.get_last_run_mod() return "*test*" end
 | 
						|
function core.set_last_run_mod() end
 | 
						|
 | 
						|
local do_step
 | 
						|
function core.register_globalstep(func)
 | 
						|
	do_step = func
 | 
						|
end
 | 
						|
 | 
						|
dofile("builtin/common/after.lua")
 | 
						|
 | 
						|
describe("after", function()
 | 
						|
	it("executes callbacks when expected", function()
 | 
						|
		local result = ""
 | 
						|
		core.after(0, function()
 | 
						|
			result = result .. "a"
 | 
						|
		end)
 | 
						|
		core.after(1, function()
 | 
						|
			result = result .. "b"
 | 
						|
		end)
 | 
						|
		core.after(1, function()
 | 
						|
			result = result .. "c"
 | 
						|
		end)
 | 
						|
		core.after(2, function()
 | 
						|
			result = result .. "d"
 | 
						|
		end)
 | 
						|
		local cancel = core.after(2, function()
 | 
						|
			result = result .. "e"
 | 
						|
		end)
 | 
						|
		do_step(0)
 | 
						|
		assert.same("a", result)
 | 
						|
 | 
						|
		do_step(1)
 | 
						|
		assert.same("abc", result)
 | 
						|
 | 
						|
		core.after(2, function()
 | 
						|
			result = result .. "f"
 | 
						|
		end)
 | 
						|
		core.after(1, function()
 | 
						|
			result = result .. "g"
 | 
						|
		end)
 | 
						|
		core.after(-1, function()
 | 
						|
			result = result .. "h"
 | 
						|
		end)
 | 
						|
		cancel:cancel()
 | 
						|
		do_step(1)
 | 
						|
		assert.same("abchdg", result)
 | 
						|
 | 
						|
		do_step(1)
 | 
						|
		assert.same("abchdgf", result)
 | 
						|
	end)
 | 
						|
 | 
						|
	it("defers jobs with delay 0", function()
 | 
						|
		local result = ""
 | 
						|
		core.after(0, function()
 | 
						|
			core.after(0, function()
 | 
						|
				result = result .. "b"
 | 
						|
			end)
 | 
						|
			result = result .. "a"
 | 
						|
		end)
 | 
						|
		do_step(1)
 | 
						|
		assert.same("a", result)
 | 
						|
		do_step(1)
 | 
						|
		assert.same("ab", result)
 | 
						|
	end)
 | 
						|
 | 
						|
	it("passes arguments", function()
 | 
						|
		core.after(0, function(...)
 | 
						|
			assert.same(0, select("#", ...))
 | 
						|
		end)
 | 
						|
		core.after(0, function(...)
 | 
						|
			assert.same(4, select("#", ...))
 | 
						|
			assert.same(1, (select(1, ...)))
 | 
						|
			assert.same(nil, (select(2, ...)))
 | 
						|
			assert.same("a", (select(3, ...)))
 | 
						|
			assert.same(nil, (select(4, ...)))
 | 
						|
		end, 1, nil, "a", nil)
 | 
						|
		do_step(0)
 | 
						|
	end)
 | 
						|
 | 
						|
	it("rejects invalid arguments", function()
 | 
						|
		assert.has.errors(function() core.after() end)
 | 
						|
		assert.has.errors(function() core.after(nil, nil) end)
 | 
						|
		assert.has.errors(function() core.after(0) end)
 | 
						|
		assert.has.errors(function() core.after(0, nil) end)
 | 
						|
		assert.has.errors(function() core.after(nil, function() end) end)
 | 
						|
		assert.has.errors(function() core.after(0 / 0, function() end) end)
 | 
						|
	end)
 | 
						|
 | 
						|
	-- Make sure that the underlying heap is working correctly
 | 
						|
	it("can be abused as a heapsort", function()
 | 
						|
		local t = {}
 | 
						|
		for i = 1, 1000 do
 | 
						|
			t[i] = math.random(100)
 | 
						|
		end
 | 
						|
		local sorted = table.copy(t)
 | 
						|
		table.sort(sorted)
 | 
						|
		local i = 0
 | 
						|
		for _, v in ipairs(t) do
 | 
						|
			core.after(v, function()
 | 
						|
				i = i + 1
 | 
						|
				assert.equal(v, sorted[i])
 | 
						|
			end)
 | 
						|
		end
 | 
						|
		do_step(math.max(unpack(t)))
 | 
						|
		assert.equal(#t, i)
 | 
						|
	end)
 | 
						|
end)
 |