From 18062e9ca1d9388c4f346cddf1ecb86c139a91fd Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Sat, 15 Nov 2025 16:29:07 -0500 Subject: [PATCH 01/25] gamepad turn --- asteroids/main.lua | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/asteroids/main.lua b/asteroids/main.lua index 660b3be..c6b02c9 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -86,18 +86,13 @@ function love.load() end function love.update(dt) - if love.keyboard.isDown('right') then - state.ship.angle = state.ship.angle + game.controls.ship.turnRate * dt - end - if love.keyboard.isDown('left') then - state.ship.angle = state.ship.angle - game.controls.ship.turnRate * dt - end - state.ship.angle = state.ship.angle % (2 * math.pi) - if state.controls.joystick ~= nil then local thrust = state.controls.joystick:getGamepadAxis('triggerright') * game.controls.ship.maxThrust state.ship.speed.x = state.ship.speed.x + math.cos(state.ship.angle) * thrust * dt state.ship.speed.y = state.ship.speed.y + math.sin(state.ship.angle) * thrust * dt + + local spin = state.controls.joystick:getGamepadAxis('leftx') * game.controls.ship.turnRate + state.ship.angle = (state.ship.angle + spin * dt) % (2 * math.pi) end state.ship.x = (state.ship.x + state.ship.speed.x * dt) % game.width state.ship.y = (state.ship.y + state.ship.speed.y * dt) % game.height From 1b1ed94b2f13485f53b19a74809ac18adf39a2fa Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Sat, 15 Nov 2025 16:42:02 -0500 Subject: [PATCH 02/25] gamepad fire --- asteroids/main.lua | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/asteroids/main.lua b/asteroids/main.lua index c6b02c9..de4136d 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -7,7 +7,6 @@ local function initGame() ship = { radius = 30, bullet = { - timerLimit = 0.5, radius = 5, speed = 500, time = 4, @@ -65,8 +64,6 @@ local function initState() y = 0, } }, - -- the time after which the ship can fire another bullet - bulletTimer = game.ship.bullet.timerLimit, bullets = {}, asteroids = asteroids, controls = { @@ -136,19 +133,6 @@ function love.update(dt) end end - state.bulletTimer = state.bulletTimer + dt - if love.keyboard.isDown('s') then - if state.bulletTimer >= game.ship.bullet.timerLimit then - state.bulletTimer = 0 - table.insert(state.bullets, { - x = state.ship.x + math.cos(state.ship.angle) * game.ship.radius, - y = state.ship.y + math.sin(state.ship.angle) * game.ship.radius, - angle = state.ship.angle, - timeLeft = game.ship.bullet.time, - }) - end - end - for _, asteroid in ipairs(state.asteroids) do asteroid.x = (asteroid.x + math.cos(asteroid.angle) * game.asteroids.stages[asteroid.stage].speed * dt) % game.width @@ -166,6 +150,21 @@ function love.update(dt) end end +function love.gamepadpressed(joystick, button) + if joystick ~= state.controls.joystick then + return + end + if button == "b" then + -- debounce, perhaps + table.insert(state.bullets, { + x = state.ship.x + math.cos(state.ship.angle) * game.ship.radius, + y = state.ship.y + math.sin(state.ship.angle) * game.ship.radius, + angle = state.ship.angle, + timeLeft = game.ship.bullet.time, + }) + end +end + function love.draw() for y = -1, 1 do for x = -1, 1 do From d498c7c78aa340a837e53a26a7774291b9b86ff0 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Sat, 15 Nov 2025 20:32:13 -0500 Subject: [PATCH 03/25] ship sprite --- asteroids/.gitignore | 1 + asteroids/main.lua | 23 +++++++++++++---------- asteroids/resources/ship.png | Bin 0 -> 2698 bytes 3 files changed, 14 insertions(+), 10 deletions(-) create mode 100644 asteroids/.gitignore create mode 100644 asteroids/resources/ship.png diff --git a/asteroids/.gitignore b/asteroids/.gitignore new file mode 100644 index 0000000..a9a5aec --- /dev/null +++ b/asteroids/.gitignore @@ -0,0 +1 @@ +tmp diff --git a/asteroids/main.lua b/asteroids/main.lua index de4136d..b5d28ef 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -11,6 +11,8 @@ local function initGame() speed = 500, time = 4, }, + -- 99x75 + sprite = love.graphics.newImage('resources/ship.png'), }, asteroids = { stages = { @@ -58,7 +60,7 @@ local function initState() ship = { x = game.width / 2, y = game.height / 2, - angle = 0, + angle = 3 * math.pi / 2, speed = { x = 0, y = 0, @@ -170,15 +172,16 @@ function love.draw() for x = -1, 1 do love.graphics.origin() love.graphics.translate(x * game.width, y * game.height) - love.graphics.setColor(0, 0, 1) - love.graphics.circle('fill', state.ship.x, state.ship.y, game.ship.radius) - local shipCircleDistance = game.ship.radius * 2 / 3 - love.graphics.setColor(0, 1, 1) - love.graphics.circle( - 'fill', - state.ship.x + math.cos(state.ship.angle) * shipCircleDistance, - state.ship.y + math.sin(state.ship.angle) * shipCircleDistance, - game.ship.radius / 6 + love.graphics.setColor(1, 1, 1) + local scale = 2 * game.ship.radius / math.max(game.ship.sprite:getWidth(), game.ship.sprite:getHeight()) + love.graphics.draw(game.ship.sprite, + state.ship.x, + state.ship.y, + (state.ship.angle + math.pi / 2) % (math.pi * 2), + scale, + scale, + game.ship.sprite:getWidth() / 2, + game.ship.sprite:getHeight() / 2 ) for _, bullet in ipairs(state.bullets) do diff --git a/asteroids/resources/ship.png b/asteroids/resources/ship.png new file mode 100644 index 0000000000000000000000000000000000000000..cecbbed97ab05b70d3acf45529935a3f9f974249 GIT binary patch literal 2698 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 Ef&*|u*#H0l literal 0 HcmV?d00001 From ba00a4b8dd9b319e5e3de75903859e7efb1dfce8 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Sat, 15 Nov 2025 20:46:59 -0500 Subject: [PATCH 04/25] bullet sound --- asteroids/main.lua | 8 ++++++-- asteroids/resources/bullet.mp3 | Bin 0 -> 28665 bytes 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 asteroids/resources/bullet.mp3 diff --git a/asteroids/main.lua b/asteroids/main.lua index b5d28ef..7e2d872 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -10,6 +10,7 @@ local function initGame() radius = 5, speed = 500, time = 4, + sound = love.sound.newSoundData('resources/bullet.mp3'), }, -- 99x75 sprite = love.graphics.newImage('resources/ship.png'), @@ -158,12 +159,15 @@ function love.gamepadpressed(joystick, button) end if button == "b" then -- debounce, perhaps - table.insert(state.bullets, { + local bullet = { x = state.ship.x + math.cos(state.ship.angle) * game.ship.radius, y = state.ship.y + math.sin(state.ship.angle) * game.ship.radius, angle = state.ship.angle, timeLeft = game.ship.bullet.time, - }) + sound = love.audio.newSource(game.ship.bullet.sound), + } + table.insert(state.bullets, bullet) + bullet.sound:play() end end diff --git a/asteroids/resources/bullet.mp3 b/asteroids/resources/bullet.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d1f2ba2b0e668bf86e442fce3838f43754395d5b GIT binary patch literal 28665 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 N|BJ5;{m;U1{{y|V@I(Lr literal 0 HcmV?d00001 From 11a4fe98260af7c6eade92d2c2c361f4aa9ac339 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Sat, 15 Nov 2025 20:54:47 -0500 Subject: [PATCH 05/25] bullet recoil --- asteroids/main.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/asteroids/main.lua b/asteroids/main.lua index 7e2d872..61c1a0b 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -8,6 +8,7 @@ local function initGame() radius = 30, bullet = { radius = 5, + recoil = -10, speed = 500, time = 4, sound = love.sound.newSoundData('resources/bullet.mp3'), @@ -168,6 +169,8 @@ function love.gamepadpressed(joystick, button) } table.insert(state.bullets, bullet) bullet.sound:play() + state.ship.speed.x = state.ship.speed.x + math.cos(state.ship.angle) * game.ship.bullet.recoil + state.ship.speed.y = state.ship.speed.y + math.sin(state.ship.angle) * game.ship.bullet.recoil end end From b832731fa0c86453d81d75f6778d233ee3c876ca Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Sat, 15 Nov 2025 21:43:10 -0500 Subject: [PATCH 06/25] introduce actor trait --- asteroids/main.lua | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/asteroids/main.lua b/asteroids/main.lua index 61c1a0b..a0ad3ee 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -13,7 +13,6 @@ local function initGame() time = 4, sound = love.sound.newSoundData('resources/bullet.mp3'), }, - -- 99x75 sprite = love.graphics.newImage('resources/ship.png'), }, asteroids = { @@ -53,6 +52,9 @@ local function initState() for _, asteroid in ipairs(asteroids) do asteroid.angle = love.math.random() * (2 * math.pi) asteroid.stage = #game.asteroids.stages + local stage = game.asteroids.stages[asteroid.stage] + asteroid.speed = stage.speed + asteroid.radius = stage.radius end local joystick = nil if love.joystick.getJoystickCount() == 1 then @@ -86,6 +88,19 @@ function love.load() reset() end +-- updates the actor's location by applying the passage of time +-- TODO ship +-- TODO spin +local function update(actor, dt) + local dv = actor.speed * dt + actor.x = (actor.x + math.cos(actor.angle) * dv) % game.width + actor.y = (actor.y + math.sin(actor.angle) * dv) % game.height +end + +local function intersects(actor1, actor2) + return (actor1.x - actor2.x) ^ 2 + (actor1.y - actor2.y) ^ 2 <= (actor1.radius + actor2.radius) ^ 2 +end + function love.update(dt) if state.controls.joystick ~= nil then local thrust = state.controls.joystick:getGamepadAxis('triggerright') * game.controls.ship.maxThrust @@ -108,27 +123,32 @@ function love.update(dt) if bullet.timeLeft <= 0 then table.remove(state.bullets, bulletIndex) else - bullet.x = (bullet.x + math.cos(bullet.angle) * game.ship.bullet.speed * dt) % game.width - bullet.y = (bullet.y + math.sin(bullet.angle) * game.ship.bullet.speed * dt) % game.height + update(bullet, dt) end for asteroidIndex = #state.asteroids, 1, -1 do local asteroid = state.asteroids[asteroidIndex] - if areCirclesIntersecting(bullet.x, bullet.y, game.ship.bullet.radius, asteroid.x, asteroid.y, game.asteroids.stages[asteroid.stage].radius) then + if intersects(bullet, asteroid) then table.remove(state.bullets, bulletIndex) if asteroid.stage > 1 then local angle1 = love.math.random() * (2 * math.pi) local angle2 = (angle1 - math.pi) % (2 * math.pi) + local radius = game.asteroids.stages[asteroid.stage - 1].radius + local speed = game.asteroids.stages[asteroid.stage - 1].speed table.insert(state.asteroids, { x = asteroid.x, y = asteroid.y, angle = angle1, stage = asteroid.stage - 1, + radius = radius, + speed = speed, }) table.insert(state.asteroids, { x = asteroid.x, y = asteroid.y, angle = angle2, stage = asteroid.stage - 1, + radius = radius, + speed = speed, }) end table.remove(state.asteroids, asteroidIndex) @@ -138,12 +158,9 @@ function love.update(dt) end for _, asteroid in ipairs(state.asteroids) do - asteroid.x = (asteroid.x + math.cos(asteroid.angle) * game.asteroids.stages[asteroid.stage].speed * dt) % - game.width - asteroid.y = (asteroid.y + math.sin(asteroid.angle) * game.asteroids.stages[asteroid.stage].speed * dt) % - game.height + update(asteroid, dt) - if areCirclesIntersecting(state.ship.x, state.ship.y, game.ship.radius, asteroid.x, asteroid.y, game.asteroids.stages[asteroid.stage].radius) then + if areCirclesIntersecting(state.ship.x, state.ship.y, game.ship.radius, asteroid.x, asteroid.y, asteroid.radius) then reset() break end @@ -164,6 +181,8 @@ function love.gamepadpressed(joystick, button) x = state.ship.x + math.cos(state.ship.angle) * game.ship.radius, y = state.ship.y + math.sin(state.ship.angle) * game.ship.radius, angle = state.ship.angle, + speed = game.ship.bullet.speed, + radius = game.ship.bullet.radius, timeLeft = game.ship.bullet.time, sound = love.audio.newSource(game.ship.bullet.sound), } From fddb06ed8b45c896fa148a544b1e07718f962665 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Sun, 16 Nov 2025 12:06:35 -0500 Subject: [PATCH 07/25] extract phys --- asteroids/main.lua | 26 +++++++++----------------- asteroids/phys.lua | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 asteroids/phys.lua diff --git a/asteroids/main.lua b/asteroids/main.lua index a0ad3ee..0bc5df9 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -1,4 +1,5 @@ local love = require("love") +local phys = require("phys") local function initGame() return { @@ -68,7 +69,8 @@ local function initState() speed = { x = 0, y = 0, - } + }, + radius = game.ship.radius, }, bullets = {}, asteroids = asteroids, @@ -88,17 +90,11 @@ function love.load() reset() end --- updates the actor's location by applying the passage of time --- TODO ship --- TODO spin +-- updates the actor's location by applying the passage of time within the game world local function update(actor, dt) - local dv = actor.speed * dt - actor.x = (actor.x + math.cos(actor.angle) * dv) % game.width - actor.y = (actor.y + math.sin(actor.angle) * dv) % game.height -end - -local function intersects(actor1, actor2) - return (actor1.x - actor2.x) ^ 2 + (actor1.y - actor2.y) ^ 2 <= (actor1.radius + actor2.radius) ^ 2 + phys.update(actor, dt) + actor.x = actor.x % game.width + actor.y = actor.y % game.height end function love.update(dt) @@ -113,10 +109,6 @@ function love.update(dt) state.ship.x = (state.ship.x + state.ship.speed.x * dt) % game.width state.ship.y = (state.ship.y + state.ship.speed.y * dt) % game.height - local function areCirclesIntersecting(aX, aY, aRadius, bX, bY, bRadius) - return (aX - bX) ^ 2 + (aY - bY) ^ 2 <= (aRadius + bRadius) ^ 2 - end - for bulletIndex = #state.bullets, 1, -1 do local bullet = state.bullets[bulletIndex] bullet.timeLeft = bullet.timeLeft - dt @@ -127,7 +119,7 @@ function love.update(dt) end for asteroidIndex = #state.asteroids, 1, -1 do local asteroid = state.asteroids[asteroidIndex] - if intersects(bullet, asteroid) then + if phys.intersects(bullet, asteroid) then table.remove(state.bullets, bulletIndex) if asteroid.stage > 1 then local angle1 = love.math.random() * (2 * math.pi) @@ -160,7 +152,7 @@ function love.update(dt) for _, asteroid in ipairs(state.asteroids) do update(asteroid, dt) - if areCirclesIntersecting(state.ship.x, state.ship.y, game.ship.radius, asteroid.x, asteroid.y, asteroid.radius) then + if phys.intersects(state.ship, asteroid) then reset() break end diff --git a/asteroids/phys.lua b/asteroids/phys.lua new file mode 100644 index 0000000..edc5920 --- /dev/null +++ b/asteroids/phys.lua @@ -0,0 +1,18 @@ +local phys = { + tau = 2 * math.pi +} + +-- returns true if the two actors intersect +function phys.intersects(actor1, actor2) + return (actor1.x - actor2.x) ^ 2 + (actor1.y - actor2.y) ^ 2 <= (actor1.radius + actor2.radius) ^ 2 +end + +-- updates the actor's location by applying the passage of time +-- TODO spin +function phys.update(actor, dt) + local dv = actor.speed * dt + actor.x = actor.x + math.cos(actor.angle) * dv + actor.y = actor.y + math.sin(actor.angle) * dv +end + +return phys From 9cdf032c39044d30aac5706ea125483dfeb15a3d Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Sun, 16 Nov 2025 22:51:51 -0500 Subject: [PATCH 08/25] add phys.apply --- asteroids/inspect.lua | 371 +++++ asteroids/luaunit.lua | 3453 +++++++++++++++++++++++++++++++++++++++ asteroids/phys.lua | 23 + asteroids/test_phys.lua | 33 + 4 files changed, 3880 insertions(+) create mode 100644 asteroids/inspect.lua create mode 100644 asteroids/luaunit.lua create mode 100644 asteroids/test_phys.lua diff --git a/asteroids/inspect.lua b/asteroids/inspect.lua new file mode 100644 index 0000000..956c5b1 --- /dev/null +++ b/asteroids/inspect.lua @@ -0,0 +1,371 @@ +local _tl_compat; if (tonumber((_VERSION or ''):match('[%d.]*$')) or 0) < 5.3 then local p, m = pcall(require, 'compat53.module'); if p then _tl_compat = m end end; local math = _tl_compat and _tl_compat.math or math; local string = _tl_compat and _tl_compat.string or string; local table = _tl_compat and _tl_compat.table or table; local type = type +local inspect = { Options = {} } + + + + + + + + + + + + + + + + + +inspect._VERSION = 'inspect.lua 3.1.0' +inspect._URL = 'http://github.com/kikito/inspect.lua' +inspect._DESCRIPTION = 'human-readable representations of tables' +inspect._LICENSE = [[ + MIT LICENSE + + Copyright (c) 2022 Enrique GarcĂ­a Cota + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +]] +inspect.KEY = setmetatable({}, { __tostring = function() return 'inspect.KEY' end }) +inspect.METATABLE = setmetatable({}, { __tostring = function() return 'inspect.METATABLE' end }) + +local tostring = tostring +local rep = string.rep +local match = string.match +local char = string.char +local gsub = string.gsub +local fmt = string.format + +local _rawget +if rawget then + _rawget = rawget +else + _rawget = function(t, k) return t[k] end +end + +local function rawpairs(t) + return next, t, nil +end + + + +local function smartQuote(str) + if match(str, '"') and not match(str, "'") then + return "'" .. str .. "'" + end + return '"' .. gsub(str, '"', '\\"') .. '"' +end + + +local shortControlCharEscapes = { + ["\a"] = "\\a", ["\b"] = "\\b", ["\f"] = "\\f", ["\n"] = "\\n", + ["\r"] = "\\r", ["\t"] = "\\t", ["\v"] = "\\v", ["\127"] = "\\127", +} +local longControlCharEscapes = { ["\127"] = "\127" } +for i = 0, 31 do + local ch = char(i) + if not shortControlCharEscapes[ch] then + shortControlCharEscapes[ch] = "\\" .. i + longControlCharEscapes[ch] = fmt("\\%03d", i) + end +end + +local function escape(str) + return (gsub(gsub(gsub(str, "\\", "\\\\"), + "(%c)%f[0-9]", longControlCharEscapes), + "%c", shortControlCharEscapes)) +end + +local luaKeywords = { + ['and'] = true, + ['break'] = true, + ['do'] = true, + ['else'] = true, + ['elseif'] = true, + ['end'] = true, + ['false'] = true, + ['for'] = true, + ['function'] = true, + ['goto'] = true, + ['if'] = true, + ['in'] = true, + ['local'] = true, + ['nil'] = true, + ['not'] = true, + ['or'] = true, + ['repeat'] = true, + ['return'] = true, + ['then'] = true, + ['true'] = true, + ['until'] = true, + ['while'] = true, +} + +local function isIdentifier(str) + return type(str) == "string" and + not not str:match("^[_%a][_%a%d]*$") and + not luaKeywords[str] +end + +local flr = math.floor +local function isSequenceKey(k, sequenceLength) + return type(k) == "number" and + flr(k) == k and + 1 <= (k) and + k <= sequenceLength +end + +local defaultTypeOrders = { + ['number'] = 1, ['boolean'] = 2, ['string'] = 3, ['table'] = 4, + ['function'] = 5, ['userdata'] = 6, ['thread'] = 7, +} + +local function sortKeys(a, b) + local ta, tb = type(a), type(b) + + + if ta == tb and (ta == 'string' or ta == 'number') then + return (a) < (b) + end + + local dta = defaultTypeOrders[ta] or 100 + local dtb = defaultTypeOrders[tb] or 100 + + + return dta == dtb and ta < tb or dta < dtb +end + +local function getKeys(t) + + local seqLen = 1 + while _rawget(t, seqLen) ~= nil do + seqLen = seqLen + 1 + end + seqLen = seqLen - 1 + + local keys, keysLen = {}, 0 + for k in rawpairs(t) do + if not isSequenceKey(k, seqLen) then + keysLen = keysLen + 1 + keys[keysLen] = k + end + end + table.sort(keys, sortKeys) + return keys, keysLen, seqLen +end + +local function countCycles(x, cycles) + if type(x) == "table" then + if cycles[x] then + cycles[x] = cycles[x] + 1 + else + cycles[x] = 1 + for k, v in rawpairs(x) do + countCycles(k, cycles) + countCycles(v, cycles) + end + countCycles(getmetatable(x), cycles) + end + end +end + +local function makePath(path, a, b) + local newPath = {} + local len = #path + for i = 1, len do newPath[i] = path[i] end + + newPath[len + 1] = a + newPath[len + 2] = b + + return newPath +end + + +local function processRecursive(process, + item, + path, + visited) + if item == nil then return nil end + if visited[item] then return visited[item] end + + local processed = process(item, path) + if type(processed) == "table" then + local processedCopy = {} + visited[item] = processedCopy + local processedKey + + for k, v in rawpairs(processed) do + processedKey = processRecursive(process, k, makePath(path, k, inspect.KEY), visited) + if processedKey ~= nil then + processedCopy[processedKey] = processRecursive(process, v, makePath(path, processedKey), visited) + end + end + + local mt = processRecursive(process, getmetatable(processed), makePath(path, inspect.METATABLE), visited) + if type(mt) ~= 'table' then mt = nil end + setmetatable(processedCopy, mt) + processed = processedCopy + end + return processed +end + +local function puts(buf, str) + buf.n = buf.n + 1 + buf[buf.n] = str +end + + + +local Inspector = {} + + + + + + + + + + +local Inspector_mt = { __index = Inspector } + +local function tabify(inspector) + puts(inspector.buf, inspector.newline .. rep(inspector.indent, inspector.level)) +end + +function Inspector:getId(v) + local id = self.ids[v] + local ids = self.ids + if not id then + local tv = type(v) + id = (ids[tv] or 0) + 1 + ids[v], ids[tv] = id, id + end + return tostring(id) +end + +function Inspector:putValue(v) + local buf = self.buf + local tv = type(v) + if tv == 'string' then + puts(buf, smartQuote(escape(v))) + elseif tv == 'number' or tv == 'boolean' or tv == 'nil' or + tv == 'cdata' or tv == 'ctype' then + puts(buf, tostring(v)) + elseif tv == 'table' and not self.ids[v] then + local t = v + + if t == inspect.KEY or t == inspect.METATABLE then + puts(buf, tostring(t)) + elseif self.level >= self.depth then + puts(buf, '{...}') + else + if self.cycles[t] > 1 then puts(buf, fmt('<%d>', self:getId(t))) end + + local keys, keysLen, seqLen = getKeys(t) + + puts(buf, '{') + self.level = self.level + 1 + + for i = 1, seqLen + keysLen do + if i > 1 then puts(buf, ',') end + if i <= seqLen then + puts(buf, ' ') + self:putValue(t[i]) + else + local k = keys[i - seqLen] + tabify(self) + if isIdentifier(k) then + puts(buf, k) + else + puts(buf, "[") + self:putValue(k) + puts(buf, "]") + end + puts(buf, ' = ') + self:putValue(t[k]) + end + end + + local mt = getmetatable(t) + if type(mt) == 'table' then + if seqLen + keysLen > 0 then puts(buf, ',') end + tabify(self) + puts(buf, ' = ') + self:putValue(mt) + end + + self.level = self.level - 1 + + if keysLen > 0 or type(mt) == 'table' then + tabify(self) + elseif seqLen > 0 then + puts(buf, ' ') + end + + puts(buf, '}') + end + + else + puts(buf, fmt('<%s %d>', tv, self:getId(v))) + end +end + + + + +function inspect.inspect(root, options) + options = options or {} + + local depth = options.depth or (math.huge) + local newline = options.newline or '\n' + local indent = options.indent or ' ' + local process = options.process + + if process then + root = processRecursive(process, root, {}, {}) + end + + local cycles = {} + countCycles(root, cycles) + + local inspector = setmetatable({ + buf = { n = 0 }, + ids = {}, + cycles = cycles, + depth = depth, + level = 0, + newline = newline, + indent = indent, + }, Inspector_mt) + + inspector:putValue(root) + + return table.concat(inspector.buf) +end + +setmetatable(inspect, { + __call = function(_, root, options) + return inspect.inspect(root, options) + end, +}) + +return inspect diff --git a/asteroids/luaunit.lua b/asteroids/luaunit.lua new file mode 100644 index 0000000..5bd8e55 --- /dev/null +++ b/asteroids/luaunit.lua @@ -0,0 +1,3453 @@ +--[[ + luaunit.lua + +Description: A unit testing framework +Homepage: https://github.com/bluebird75/luaunit +Development by Philippe Fremy +Based on initial work of Ryu, Gwang (http://www.gpgstudy.com/gpgiki/LuaUnit) +License: BSD License, see LICENSE.txt +]]-- + +require("math") +local M={} + +-- private exported functions (for testing) +M.private = {} + +M.VERSION='3.4' +M._VERSION=M.VERSION -- For LuaUnit v2 compatibility + +-- a version which distinguish between regular Lua and LuaJit +M._LUAVERSION = (jit and jit.version) or _VERSION + +--[[ Some people like assertEquals( actual, expected ) and some people prefer +assertEquals( expected, actual ). +]]-- +M.ORDER_ACTUAL_EXPECTED = true +M.PRINT_TABLE_REF_IN_ERROR_MSG = false +M.LINE_LENGTH = 80 +M.TABLE_DIFF_ANALYSIS_THRESHOLD = 10 -- display deep analysis for more than 10 items +M.LIST_DIFF_ANALYSIS_THRESHOLD = 10 -- display deep analysis for more than 10 items + +-- this setting allow to remove entries from the stack-trace, for +-- example to hide a call to a framework which would be calling luaunit +M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE = 0 + +--[[ EPS is meant to help with Lua's floating point math in simple corner +cases like almostEquals(1.1-0.1, 1), which may not work as-is (e.g. on numbers +with rational binary representation) if the user doesn't provide some explicit +error margin. + +The default margin used by almostEquals() in such cases is EPS; and since +Lua may be compiled with different numeric precisions (single vs. double), we +try to select a useful default for it dynamically. Note: If the initial value +is not acceptable, it can be changed by the user to better suit specific needs. + +See also: https://en.wikipedia.org/wiki/Machine_epsilon +]] +M.EPS = 2^-52 -- = machine epsilon for "double", ~2.22E-16 +if math.abs(1.1 - 1 - 0.1) > M.EPS then + -- rounding error is above EPS, assume single precision + M.EPS = 2^-23 -- = machine epsilon for "float", ~1.19E-07 +end + +-- set this to false to debug luaunit +local STRIP_LUAUNIT_FROM_STACKTRACE = true + +M.VERBOSITY_DEFAULT = 10 +M.VERBOSITY_LOW = 1 +M.VERBOSITY_QUIET = 0 +M.VERBOSITY_VERBOSE = 20 +M.DEFAULT_DEEP_ANALYSIS = nil +M.FORCE_DEEP_ANALYSIS = true +M.DISABLE_DEEP_ANALYSIS = false + +-- set EXPORT_ASSERT_TO_GLOBALS to have all asserts visible as global values +-- EXPORT_ASSERT_TO_GLOBALS = true + +-- we need to keep a copy of the script args before it is overriden +local cmdline_argv = rawget(_G, "arg") + +M.FAILURE_PREFIX = 'LuaUnit test FAILURE: ' -- prefix string for failed tests +M.SUCCESS_PREFIX = 'LuaUnit test SUCCESS: ' -- prefix string for successful tests finished early +M.SKIP_PREFIX = 'LuaUnit test SKIP: ' -- prefix string for skipped tests + + + +M.USAGE=[[Usage: lua [options] [testname1 [testname2] ... ] +Options: + -h, --help: Print this help + --version: Print version information + -v, --verbose: Increase verbosity + -q, --quiet: Set verbosity to minimum + -e, --error: Stop on first error + -f, --failure: Stop on first failure or error + -s, --shuffle: Shuffle tests before running them + -o, --output OUTPUT: Set output type to OUTPUT + Possible values: text, tap, junit, nil + -n, --name NAME: For junit only, mandatory name of xml file + -r, --repeat NUM: Execute all tests NUM times, e.g. to trig the JIT + -p, --pattern PATTERN: Execute all test names matching the Lua PATTERN + May be repeated to include several patterns + Make sure you escape magic chars like +? with % + -x, --exclude PATTERN: Exclude all test names matching the Lua PATTERN + May be repeated to exclude several patterns + Make sure you escape magic chars like +? with % + testname1, testname2, ... : tests to run in the form of testFunction, + TestClass or TestClass.testMethod + +You may also control LuaUnit options with the following environment variables: +* LUAUNIT_OUTPUT: same as --output +* LUAUNIT_JUNIT_FNAME: same as --name ]] + +---------------------------------------------------------------- +-- +-- general utility functions +-- +---------------------------------------------------------------- + +--[[ Note on catching exit + +I have seen the case where running a big suite of test cases and one of them would +perform a os.exit(0), making the outside world think that the full test suite was executed +successfully. + +This is an attempt to mitigate this problem: we override os.exit() to now let a test +exit the framework while we are running. When we are not running, it behaves normally. +]] + +M.oldOsExit = os.exit +os.exit = function(...) + if M.LuaUnit and #M.LuaUnit.instances ~= 0 then + local msg = [[You are trying to exit but there is still a running instance of LuaUnit. +LuaUnit expects to run until the end before exiting with a complete status of successful/failed tests. + +To force exit LuaUnit while running, please call before os.exit (assuming lu is the luaunit module loaded): + + lu.unregisterCurrentSuite() + +]] + M.private.error_fmt(2, msg) + end + M.oldOsExit(...) +end + +local function pcall_or_abort(func, ...) + -- unpack is a global function for Lua 5.1, otherwise use table.unpack + local unpack = rawget(_G, "unpack") or table.unpack + local result = {pcall(func, ...)} + if not result[1] then + -- an error occurred + print(result[2]) -- error message + print() + print(M.USAGE) + os.exit(-1) + end + return unpack(result, 2) +end + +local crossTypeOrdering = { + number = 1, boolean = 2, string = 3, table = 4, other = 5 +} +local crossTypeComparison = { + number = function(a, b) return a < b end, + string = function(a, b) return a < b end, + other = function(a, b) return tostring(a) < tostring(b) end, +} + +local function crossTypeSort(a, b) + local type_a, type_b = type(a), type(b) + if type_a == type_b then + local func = crossTypeComparison[type_a] or crossTypeComparison.other + return func(a, b) + end + type_a = crossTypeOrdering[type_a] or crossTypeOrdering.other + type_b = crossTypeOrdering[type_b] or crossTypeOrdering.other + return type_a < type_b +end + +local function __genSortedIndex( t ) + -- Returns a sequence consisting of t's keys, sorted. + local sortedIndex = {} + + for key,_ in pairs(t) do + table.insert(sortedIndex, key) + end + + table.sort(sortedIndex, crossTypeSort) + return sortedIndex +end +M.private.__genSortedIndex = __genSortedIndex + +local function sortedNext(state, control) + -- Equivalent of the next() function of table iteration, but returns the + -- keys in sorted order (see __genSortedIndex and crossTypeSort). + -- The state is a temporary variable during iteration and contains the + -- sorted key table (state.sortedIdx). It also stores the last index (into + -- the keys) used by the iteration, to find the next one quickly. + local key + + --print("sortedNext: control = "..tostring(control) ) + if control == nil then + -- start of iteration + state.count = #state.sortedIdx + state.lastIdx = 1 + key = state.sortedIdx[1] + return key, state.t[key] + end + + -- normally, we expect the control variable to match the last key used + if control ~= state.sortedIdx[state.lastIdx] then + -- strange, we have to find the next value by ourselves + -- the key table is sorted in crossTypeSort() order! -> use bisection + local lower, upper = 1, state.count + repeat + state.lastIdx = math.modf((lower + upper) / 2) + key = state.sortedIdx[state.lastIdx] + if key == control then + break -- key found (and thus prev index) + end + if crossTypeSort(key, control) then + -- key < control, continue search "right" (towards upper bound) + lower = state.lastIdx + 1 + else + -- key > control, continue search "left" (towards lower bound) + upper = state.lastIdx - 1 + end + until lower > upper + if lower > upper then -- only true if the key wasn't found, ... + state.lastIdx = state.count -- ... so ensure no match in code below + end + end + + -- proceed by retrieving the next value (or nil) from the sorted keys + state.lastIdx = state.lastIdx + 1 + key = state.sortedIdx[state.lastIdx] + if key then + return key, state.t[key] + end + + -- getting here means returning `nil`, which will end the iteration +end + +local function sortedPairs(tbl) + -- Equivalent of the pairs() function on tables. Allows to iterate in + -- sorted order. As required by "generic for" loops, this will return the + -- iterator (function), an "invariant state", and the initial control value. + -- (see http://www.lua.org/pil/7.2.html) + return sortedNext, {t = tbl, sortedIdx = __genSortedIndex(tbl)}, nil +end +M.private.sortedPairs = sortedPairs + +-- seed the random with a strongly varying seed +math.randomseed(math.floor(os.clock()*1E11)) + +local function randomizeTable( t ) + -- randomize the item orders of the table t + for i = #t, 2, -1 do + local j = math.random(i) + if i ~= j then + t[i], t[j] = t[j], t[i] + end + end +end +M.private.randomizeTable = randomizeTable + +local function strsplit(delimiter, text) +-- Split text into a list consisting of the strings in text, separated +-- by strings matching delimiter (which may _NOT_ be a pattern). +-- Example: strsplit(", ", "Anna, Bob, Charlie, Dolores") + if delimiter == "" or delimiter == nil then -- this would result in endless loops + error("delimiter is nil or empty string!") + end + if text == nil then + return nil + end + + local list, pos, first, last = {}, 1 + while true do + first, last = text:find(delimiter, pos, true) + if first then -- found? + table.insert(list, text:sub(pos, first - 1)) + pos = last + 1 + else + table.insert(list, text:sub(pos)) + break + end + end + return list +end +M.private.strsplit = strsplit + +local function hasNewLine( s ) + -- return true if s has a newline + return (string.find(s, '\n', 1, true) ~= nil) +end +M.private.hasNewLine = hasNewLine + +local function prefixString( prefix, s ) + -- Prefix all the lines of s with prefix + return prefix .. string.gsub(s, '\n', '\n' .. prefix) +end +M.private.prefixString = prefixString + +local function strMatch(s, pattern, start, final ) + -- return true if s matches completely the pattern from index start to index end + -- return false in every other cases + -- if start is nil, matches from the beginning of the string + -- if final is nil, matches to the end of the string + start = start or 1 + final = final or string.len(s) + + local foundStart, foundEnd = string.find(s, pattern, start, false) + return foundStart == start and foundEnd == final +end +M.private.strMatch = strMatch + +local function patternFilter(patterns, expr) + -- Run `expr` through the inclusion and exclusion rules defined in patterns + -- and return true if expr shall be included, false for excluded. + -- Inclusion pattern are defined as normal patterns, exclusions + -- patterns start with `!` and are followed by a normal pattern + + -- result: nil = UNKNOWN (not matched yet), true = ACCEPT, false = REJECT + -- default: true if no explicit "include" is found, set to false otherwise + local default, result = true, nil + + if patterns ~= nil then + for _, pattern in ipairs(patterns) do + local exclude = pattern:sub(1,1) == '!' + if exclude then + pattern = pattern:sub(2) + else + -- at least one include pattern specified, a match is required + default = false + end + -- print('pattern: ',pattern) + -- print('exclude: ',exclude) + -- print('default: ',default) + + if string.find(expr, pattern) then + -- set result to false when excluding, true otherwise + result = not exclude + end + end + end + + if result ~= nil then + return result + end + return default +end +M.private.patternFilter = patternFilter + +local function xmlEscape( s ) + -- Return s escaped for XML attributes + -- escapes table: + -- " " + -- ' ' + -- < < + -- > > + -- & & + + return string.gsub( s, '.', { + ['&'] = "&", + ['"'] = """, + ["'"] = "'", + ['<'] = "<", + ['>'] = ">", + } ) +end +M.private.xmlEscape = xmlEscape + +local function xmlCDataEscape( s ) + -- Return s escaped for CData section, escapes: "]]>" + return string.gsub( s, ']]>', ']]>' ) +end +M.private.xmlCDataEscape = xmlCDataEscape + + +local function lstrip( s ) + --[[Return s with all leading white spaces and tabs removed]] + local idx = 0 + while idx < s:len() do + idx = idx + 1 + local c = s:sub(idx,idx) + if c ~= ' ' and c ~= '\t' then + break + end + end + return s:sub(idx) +end +M.private.lstrip = lstrip + +local function extractFileLineInfo( s ) + --[[ From a string in the form "(leading spaces) dir1/dir2\dir3\file.lua:linenb: msg" + + Return the "file.lua:linenb" information + ]] + local s2 = lstrip(s) + local firstColon = s2:find(':', 1, true) + if firstColon == nil then + -- string is not in the format file:line: + return s + end + local secondColon = s2:find(':', firstColon+1, true) + if secondColon == nil then + -- string is not in the format file:line: + return s + end + + return s2:sub(1, secondColon-1) +end +M.private.extractFileLineInfo = extractFileLineInfo + + +local function stripLuaunitTrace2( stackTrace, errMsg ) + --[[ + -- Example of a traceback: + < + [C]: in function 'xpcall' + ./luaunit.lua:1449: in function 'protectedCall' + ./luaunit.lua:1508: in function 'execOneFunction' + ./luaunit.lua:1596: in function 'runSuiteByInstances' + ./luaunit.lua:1660: in function 'runSuiteByNames' + ./luaunit.lua:1736: in function 'runSuite' + example_with_luaunit.lua:140: in main chunk + [C]: in ?>> + error message: <> + + Other example: + < + [C]: in function 'xpcall' + ./luaunit.lua:1517: in function 'protectedCall' + ./luaunit.lua:1578: in function 'execOneFunction' + ./luaunit.lua:1677: in function 'runSuiteByInstances' + ./luaunit.lua:1730: in function 'runSuiteByNames' + ./luaunit.lua:1806: in function 'runSuite' + example_with_luaunit.lua:140: in main chunk + [C]: in ?>> + error message: <> + + < + [C]: in function 'xpcall' + luaunit2/luaunit.lua:1532: in function 'protectedCall' + luaunit2/luaunit.lua:1591: in function 'execOneFunction' + luaunit2/luaunit.lua:1679: in function 'runSuiteByInstances' + luaunit2/luaunit.lua:1743: in function 'runSuiteByNames' + luaunit2/luaunit.lua:1819: in function 'runSuite' + luaunit2/example_with_luaunit.lua:140: in main chunk + [C]: in ?>> + error message: <> + + + -- first line is "stack traceback": KEEP + -- next line may be luaunit line: REMOVE + -- next lines are call in the program under testOk: REMOVE + -- next lines are calls from luaunit to call the program under test: KEEP + + -- Strategy: + -- keep first line + -- remove lines that are part of luaunit + -- kepp lines until we hit a luaunit line + + The strategy for stripping is: + * keep first line "stack traceback:" + * part1: + * analyse all lines of the stack from bottom to top of the stack (first line to last line) + * extract the "file:line:" part of the line + * compare it with the "file:line" part of the error message + * if it does not match strip the line + * if it matches, keep the line and move to part 2 + * part2: + * anything NOT starting with luaunit.lua is the interesting part of the stack trace + * anything starting again with luaunit.lua is part of the test launcher and should be stripped out + ]] + + local function isLuaunitInternalLine( s ) + -- return true if line of stack trace comes from inside luaunit + return s:find('[/\\]luaunit%.lua:%d+: ') ~= nil + end + + -- print( '<<'..stackTrace..'>>' ) + + local t = strsplit( '\n', stackTrace ) + -- print( prettystr(t) ) + + local idx = 2 + + local errMsgFileLine = extractFileLineInfo(errMsg) + -- print('emfi="'..errMsgFileLine..'"') + + -- remove lines that are still part of luaunit + while t[idx] and extractFileLineInfo(t[idx]) ~= errMsgFileLine do + -- print('Removing : '..t[idx] ) + table.remove(t, idx) + end + + -- keep lines until we hit luaunit again + while t[idx] and (not isLuaunitInternalLine(t[idx])) do + -- print('Keeping : '..t[idx] ) + idx = idx + 1 + end + + -- remove remaining luaunit lines + while t[idx] do + -- print('Removing2 : '..t[idx] ) + table.remove(t, idx) + end + + -- print( prettystr(t) ) + return table.concat( t, '\n') + +end +M.private.stripLuaunitTrace2 = stripLuaunitTrace2 + + +local function prettystr_sub(v, indentLevel, printTableRefs, cycleDetectTable ) + local type_v = type(v) + if "string" == type_v then + -- use clever delimiters according to content: + -- enclose with single quotes if string contains ", but no ' + if v:find('"', 1, true) and not v:find("'", 1, true) then + return "'" .. v .. "'" + end + -- use double quotes otherwise, escape embedded " + return '"' .. v:gsub('"', '\\"') .. '"' + + elseif "table" == type_v then + --if v.__class__ then + -- return string.gsub( tostring(v), 'table', v.__class__ ) + --end + return M.private._table_tostring(v, indentLevel, printTableRefs, cycleDetectTable) + + elseif "number" == type_v then + -- eliminate differences in formatting between various Lua versions + if v ~= v then + return "#NaN" -- "not a number" + end + if v == math.huge then + return "#Inf" -- "infinite" + end + if v == -math.huge then + return "-#Inf" + end + if _VERSION == "Lua 5.3" then + local i = math.tointeger(v) + if i then + return tostring(i) + end + end + end + + return tostring(v) +end + +local function prettystr( v ) + --[[ Pretty string conversion, to display the full content of a variable of any type. + + * string are enclosed with " by default, or with ' if string contains a " + * tables are expanded to show their full content, with indentation in case of nested tables + ]]-- + local cycleDetectTable = {} + local s = prettystr_sub(v, 1, M.PRINT_TABLE_REF_IN_ERROR_MSG, cycleDetectTable) + if cycleDetectTable.detected and not M.PRINT_TABLE_REF_IN_ERROR_MSG then + -- some table contain recursive references, + -- so we must recompute the value by including all table references + -- else the result looks like crap + cycleDetectTable = {} + s = prettystr_sub(v, 1, true, cycleDetectTable) + end + return s +end +M.prettystr = prettystr + +function M.adjust_err_msg_with_iter( err_msg, iter_msg ) + --[[ Adjust the error message err_msg: trim the FAILURE_PREFIX or SUCCESS_PREFIX information if needed, + add the iteration message if any and return the result. + + err_msg: string, error message captured with pcall + iter_msg: a string describing the current iteration ("iteration N") or nil + if there is no iteration in this test. + + Returns: (new_err_msg, test_status) + new_err_msg: string, adjusted error message, or nil in case of success + test_status: M.NodeStatus.FAIL, SUCCESS or ERROR according to the information + contained in the error message. + ]] + if iter_msg then + iter_msg = iter_msg..', ' + else + iter_msg = '' + end + + local RE_FILE_LINE = '.*:%d+: ' + + -- error message is not necessarily a string, + -- so convert the value to string with prettystr() + if type( err_msg ) ~= 'string' then + err_msg = prettystr( err_msg ) + end + + if (err_msg:find( M.SUCCESS_PREFIX ) == 1) or err_msg:match( '('..RE_FILE_LINE..')' .. M.SUCCESS_PREFIX .. ".*" ) then + -- test finished early with success() + return nil, M.NodeStatus.SUCCESS + end + + if (err_msg:find( M.SKIP_PREFIX ) == 1) or (err_msg:match( '('..RE_FILE_LINE..')' .. M.SKIP_PREFIX .. ".*" ) ~= nil) then + -- substitute prefix by iteration message + err_msg = err_msg:gsub('.*'..M.SKIP_PREFIX, iter_msg, 1) + -- print("failure detected") + return err_msg, M.NodeStatus.SKIP + end + + if (err_msg:find( M.FAILURE_PREFIX ) == 1) or (err_msg:match( '('..RE_FILE_LINE..')' .. M.FAILURE_PREFIX .. ".*" ) ~= nil) then + -- substitute prefix by iteration message + err_msg = err_msg:gsub(M.FAILURE_PREFIX, iter_msg, 1) + -- print("failure detected") + return err_msg, M.NodeStatus.FAIL + end + + + + -- print("error detected") + -- regular error, not a failure + if iter_msg then + local match + -- "./test\\test_luaunit.lua:2241: some error msg + match = err_msg:match( '(.*:%d+: ).*' ) + if match then + err_msg = err_msg:gsub( match, match .. iter_msg ) + else + -- no file:line: infromation, just add the iteration info at the beginning of the line + err_msg = iter_msg .. err_msg + end + end + return err_msg, M.NodeStatus.ERROR +end + +local function tryMismatchFormatting( table_a, table_b, doDeepAnalysis, margin ) + --[[ + Prepares a nice error message when comparing tables, performing a deeper + analysis. + + Arguments: + * table_a, table_b: tables to be compared + * doDeepAnalysis: + M.DEFAULT_DEEP_ANALYSIS: (the default if not specified) perform deep analysis only for big lists and big dictionnaries + M.FORCE_DEEP_ANALYSIS : always perform deep analysis + M.DISABLE_DEEP_ANALYSIS: never perform deep analysis + * margin: supplied only for almost equality + + Returns: {success, result} + * success: false if deep analysis could not be performed + in this case, just use standard assertion message + * result: if success is true, a multi-line string with deep analysis of the two lists + ]] + + -- check if table_a & table_b are suitable for deep analysis + if type(table_a) ~= 'table' or type(table_b) ~= 'table' then + return false + end + + if doDeepAnalysis == M.DISABLE_DEEP_ANALYSIS then + return false + end + + local len_a, len_b, isPureList = #table_a, #table_b, true + + for k1, v1 in pairs(table_a) do + if type(k1) ~= 'number' or k1 > len_a then + -- this table a mapping + isPureList = false + break + end + end + + if isPureList then + for k2, v2 in pairs(table_b) do + if type(k2) ~= 'number' or k2 > len_b then + -- this table a mapping + isPureList = false + break + end + end + end + + if isPureList and math.min(len_a, len_b) < M.LIST_DIFF_ANALYSIS_THRESHOLD then + if not (doDeepAnalysis == M.FORCE_DEEP_ANALYSIS) then + return false + end + end + + if isPureList then + return M.private.mismatchFormattingPureList( table_a, table_b, margin ) + else + -- only work on mapping for the moment + -- return M.private.mismatchFormattingMapping( table_a, table_b, doDeepAnalysis ) + return false + end +end +M.private.tryMismatchFormatting = tryMismatchFormatting + +local function getTaTbDescr() + if not M.ORDER_ACTUAL_EXPECTED then + return 'expected', 'actual' + end + return 'actual', 'expected' +end + +local function extendWithStrFmt( res, ... ) + table.insert( res, string.format( ... ) ) +end + +local function mismatchFormattingMapping( table_a, table_b, doDeepAnalysis ) + --[[ + Prepares a nice error message when comparing tables which are not pure lists, performing a deeper + analysis. + + Returns: {success, result} + * success: false if deep analysis could not be performed + in this case, just use standard assertion message + * result: if success is true, a multi-line string with deep analysis of the two lists + ]] + + -- disable for the moment + --[[ + local result = {} + local descrTa, descrTb = getTaTbDescr() + + local keysCommon = {} + local keysOnlyTa = {} + local keysOnlyTb = {} + local keysDiffTaTb = {} + + local k, v + + for k,v in pairs( table_a ) do + if is_equal( v, table_b[k] ) then + table.insert( keysCommon, k ) + else + if table_b[k] == nil then + table.insert( keysOnlyTa, k ) + else + table.insert( keysDiffTaTb, k ) + end + end + end + + for k,v in pairs( table_b ) do + if not is_equal( v, table_a[k] ) and table_a[k] == nil then + table.insert( keysOnlyTb, k ) + end + end + + local len_a = #keysCommon + #keysDiffTaTb + #keysOnlyTa + local len_b = #keysCommon + #keysDiffTaTb + #keysOnlyTb + local limited_display = (len_a < 5 or len_b < 5) + + if math.min(len_a, len_b) < M.TABLE_DIFF_ANALYSIS_THRESHOLD then + return false + end + + if not limited_display then + if len_a == len_b then + extendWithStrFmt( result, 'Table A (%s) and B (%s) both have %d items', descrTa, descrTb, len_a ) + else + extendWithStrFmt( result, 'Table A (%s) has %d items and table B (%s) has %d items', descrTa, len_a, descrTb, len_b ) + end + + if #keysCommon == 0 and #keysDiffTaTb == 0 then + table.insert( result, 'Table A and B have no keys in common, they are totally different') + else + local s_other = 'other ' + if #keysCommon then + extendWithStrFmt( result, 'Table A and B have %d identical items', #keysCommon ) + else + table.insert( result, 'Table A and B have no identical items' ) + s_other = '' + end + + if #keysDiffTaTb ~= 0 then + result[#result] = string.format( '%s and %d items differing present in both tables', result[#result], #keysDiffTaTb) + else + result[#result] = string.format( '%s and no %sitems differing present in both tables', result[#result], s_other, #keysDiffTaTb) + end + end + + extendWithStrFmt( result, 'Table A has %d keys not present in table B and table B has %d keys not present in table A', #keysOnlyTa, #keysOnlyTb ) + end + + local function keytostring(k) + if "string" == type(k) and k:match("^[_%a][_%w]*$") then + return k + end + return prettystr(k) + end + + if #keysDiffTaTb ~= 0 then + table.insert( result, 'Items differing in A and B:') + for k,v in sortedPairs( keysDiffTaTb ) do + extendWithStrFmt( result, ' - A[%s]: %s', keytostring(v), prettystr(table_a[v]) ) + extendWithStrFmt( result, ' + B[%s]: %s', keytostring(v), prettystr(table_b[v]) ) + end + end + + if #keysOnlyTa ~= 0 then + table.insert( result, 'Items only in table A:' ) + for k,v in sortedPairs( keysOnlyTa ) do + extendWithStrFmt( result, ' - A[%s]: %s', keytostring(v), prettystr(table_a[v]) ) + end + end + + if #keysOnlyTb ~= 0 then + table.insert( result, 'Items only in table B:' ) + for k,v in sortedPairs( keysOnlyTb ) do + extendWithStrFmt( result, ' + B[%s]: %s', keytostring(v), prettystr(table_b[v]) ) + end + end + + if #keysCommon ~= 0 then + table.insert( result, 'Items common to A and B:') + for k,v in sortedPairs( keysCommon ) do + extendWithStrFmt( result, ' = A and B [%s]: %s', keytostring(v), prettystr(table_a[v]) ) + end + end + + return true, table.concat( result, '\n') + ]] +end +M.private.mismatchFormattingMapping = mismatchFormattingMapping + +local function mismatchFormattingPureList( table_a, table_b, margin ) + --[[ + Prepares a nice error message when comparing tables which are lists, performing a deeper + analysis. + + margin is supplied only for almost equality + + Returns: {success, result} + * success: false if deep analysis could not be performed + in this case, just use standard assertion message + * result: if success is true, a multi-line string with deep analysis of the two lists + ]] + local result, descrTa, descrTb = {}, getTaTbDescr() + + local len_a, len_b, refa, refb = #table_a, #table_b, '', '' + if M.PRINT_TABLE_REF_IN_ERROR_MSG then + refa, refb = string.format( '<%s> ', M.private.table_ref(table_a)), string.format('<%s> ', M.private.table_ref(table_b) ) + end + local longest, shortest = math.max(len_a, len_b), math.min(len_a, len_b) + local deltalv = longest - shortest + + local commonUntil = shortest + for i = 1, shortest do + if not M.private.is_table_equals(table_a[i], table_b[i], margin) then + commonUntil = i - 1 + break + end + end + + local commonBackTo = shortest - 1 + for i = 0, shortest - 1 do + if not M.private.is_table_equals(table_a[len_a-i], table_b[len_b-i], margin) then + commonBackTo = i - 1 + break + end + end + + + table.insert( result, 'List difference analysis:' ) + if len_a == len_b then + -- TODO: handle expected/actual naming + extendWithStrFmt( result, '* lists %sA (%s) and %sB (%s) have the same size', refa, descrTa, refb, descrTb ) + else + extendWithStrFmt( result, '* list sizes differ: list %sA (%s) has %d items, list %sB (%s) has %d items', refa, descrTa, len_a, refb, descrTb, len_b ) + end + + extendWithStrFmt( result, '* lists A and B start differing at index %d', commonUntil+1 ) + if commonBackTo >= 0 then + if deltalv > 0 then + extendWithStrFmt( result, '* lists A and B are equal again from index %d for A, %d for B', len_a-commonBackTo, len_b-commonBackTo ) + else + extendWithStrFmt( result, '* lists A and B are equal again from index %d', len_a-commonBackTo ) + end + end + + local function insertABValue(ai, bi) + bi = bi or ai + if M.private.is_table_equals( table_a[ai], table_b[bi], margin) then + return extendWithStrFmt( result, ' = A[%d], B[%d]: %s', ai, bi, prettystr(table_a[ai]) ) + else + extendWithStrFmt( result, ' - A[%d]: %s', ai, prettystr(table_a[ai])) + extendWithStrFmt( result, ' + B[%d]: %s', bi, prettystr(table_b[bi])) + end + end + + -- common parts to list A & B, at the beginning + if commonUntil > 0 then + table.insert( result, '* Common parts:' ) + for i = 1, commonUntil do + insertABValue( i ) + end + end + + -- diffing parts to list A & B + if commonUntil < shortest - commonBackTo - 1 then + table.insert( result, '* Differing parts:' ) + for i = commonUntil + 1, shortest - commonBackTo - 1 do + insertABValue( i ) + end + end + + -- display indexes of one list, with no match on other list + if shortest - commonBackTo <= longest - commonBackTo - 1 then + table.insert( result, '* Present only in one list:' ) + for i = shortest - commonBackTo, longest - commonBackTo - 1 do + if len_a > len_b then + extendWithStrFmt( result, ' - A[%d]: %s', i, prettystr(table_a[i]) ) + -- table.insert( result, '+ (no matching B index)') + else + -- table.insert( result, '- no matching A index') + extendWithStrFmt( result, ' + B[%d]: %s', i, prettystr(table_b[i]) ) + end + end + end + + -- common parts to list A & B, at the end + if commonBackTo >= 0 then + table.insert( result, '* Common parts at the end of the lists' ) + for i = longest - commonBackTo, longest do + if len_a > len_b then + insertABValue( i, i-deltalv ) + else + insertABValue( i-deltalv, i ) + end + end + end + + return true, table.concat( result, '\n') +end +M.private.mismatchFormattingPureList = mismatchFormattingPureList + +local function prettystrPairs(value1, value2, suffix_a, suffix_b) + --[[ + This function helps with the recurring task of constructing the "expected + vs. actual" error messages. It takes two arbitrary values and formats + corresponding strings with prettystr(). + + To keep the (possibly complex) output more readable in case the resulting + strings contain line breaks, they get automatically prefixed with additional + newlines. Both suffixes are optional (default to empty strings), and get + appended to the "value1" string. "suffix_a" is used if line breaks were + encountered, "suffix_b" otherwise. + + Returns the two formatted strings (including padding/newlines). + ]] + local str1, str2 = prettystr(value1), prettystr(value2) + if hasNewLine(str1) or hasNewLine(str2) then + -- line break(s) detected, add padding + return "\n" .. str1 .. (suffix_a or ""), "\n" .. str2 + end + return str1 .. (suffix_b or ""), str2 +end +M.private.prettystrPairs = prettystrPairs + +local UNKNOWN_REF = 'table 00-unknown ref' +local ref_generator = { value=1, [UNKNOWN_REF]=0 } + +local function table_ref( t ) + -- return the default tostring() for tables, with the table ID, even if the table has a metatable + -- with the __tostring converter + local ref = '' + local mt = getmetatable( t ) + if mt == nil then + ref = tostring(t) + else + local success, result + success, result = pcall(setmetatable, t, nil) + if not success then + -- protected table, if __tostring is defined, we can + -- not get the reference. And we can not know in advance. + ref = tostring(t) + if not ref:match( 'table: 0?x?[%x]+' ) then + return UNKNOWN_REF + end + else + ref = tostring(t) + setmetatable( t, mt ) + end + end + -- strip the "table: " part + ref = ref:sub(8) + if ref ~= UNKNOWN_REF and ref_generator[ref] == nil then + -- Create a new reference number + ref_generator[ref] = ref_generator.value + ref_generator.value = ref_generator.value+1 + end + if M.PRINT_TABLE_REF_IN_ERROR_MSG then + return string.format('table %02d-%s', ref_generator[ref], ref) + else + return string.format('table %02d', ref_generator[ref]) + end +end +M.private.table_ref = table_ref + +local TABLE_TOSTRING_SEP = ", " +local TABLE_TOSTRING_SEP_LEN = string.len(TABLE_TOSTRING_SEP) + +local function _table_tostring( tbl, indentLevel, printTableRefs, cycleDetectTable ) + printTableRefs = printTableRefs or M.PRINT_TABLE_REF_IN_ERROR_MSG + cycleDetectTable = cycleDetectTable or {} + cycleDetectTable[tbl] = true + + local result, dispOnMultLines = {}, false + + -- like prettystr but do not enclose with "" if the string is just alphanumerical + -- this is better for displaying table keys who are often simple strings + local function keytostring(k) + if "string" == type(k) and k:match("^[_%a][_%w]*$") then + return k + end + return prettystr_sub(k, indentLevel+1, printTableRefs, cycleDetectTable) + end + + local mt = getmetatable( tbl ) + + if mt and mt.__tostring then + -- if table has a __tostring() function in its metatable, use it to display the table + -- else, compute a regular table + result = tostring(tbl) + if type(result) ~= 'string' then + return string.format( '', prettystr(result) ) + end + result = strsplit( '\n', result ) + return M.private._table_tostring_format_multiline_string( result, indentLevel ) + + else + -- no metatable, compute the table representation + + local entry, count, seq_index = nil, 0, 1 + for k, v in sortedPairs( tbl ) do + + -- key part + if k == seq_index then + -- for the sequential part of tables, we'll skip the "=" output + entry = '' + seq_index = seq_index + 1 + elseif cycleDetectTable[k] then + -- recursion in the key detected + cycleDetectTable.detected = true + entry = "<"..table_ref(k)..">=" + else + entry = keytostring(k) .. "=" + end + + -- value part + if cycleDetectTable[v] then + -- recursion in the value detected! + cycleDetectTable.detected = true + entry = entry .. "<"..table_ref(v)..">" + else + entry = entry .. + prettystr_sub( v, indentLevel+1, printTableRefs, cycleDetectTable ) + end + count = count + 1 + result[count] = entry + end + return M.private._table_tostring_format_result( tbl, result, indentLevel, printTableRefs ) + end + +end +M.private._table_tostring = _table_tostring -- prettystr_sub() needs it + +local function _table_tostring_format_multiline_string( tbl_str, indentLevel ) + local indentString = '\n'..string.rep(" ", indentLevel - 1) + return table.concat( tbl_str, indentString ) + +end +M.private._table_tostring_format_multiline_string = _table_tostring_format_multiline_string + + +local function _table_tostring_format_result( tbl, result, indentLevel, printTableRefs ) + -- final function called in _table_to_string() to format the resulting list of + -- string describing the table. + + local dispOnMultLines = false + + -- set dispOnMultLines to true if the maximum LINE_LENGTH would be exceeded with the values + local totalLength = 0 + for k, v in ipairs( result ) do + totalLength = totalLength + string.len( v ) + if totalLength >= M.LINE_LENGTH then + dispOnMultLines = true + break + end + end + + -- set dispOnMultLines to true if the max LINE_LENGTH would be exceeded + -- with the values and the separators. + if not dispOnMultLines then + -- adjust with length of separator(s): + -- two items need 1 sep, three items two seps, ... plus len of '{}' + if #result > 0 then + totalLength = totalLength + TABLE_TOSTRING_SEP_LEN * (#result - 1) + end + dispOnMultLines = (totalLength + 2 >= M.LINE_LENGTH) + end + + -- now reformat the result table (currently holding element strings) + if dispOnMultLines then + local indentString = string.rep(" ", indentLevel - 1) + result = { + "{\n ", + indentString, + table.concat(result, ",\n " .. indentString), + "\n", + indentString, + "}" + } + else + result = {"{", table.concat(result, TABLE_TOSTRING_SEP), "}"} + end + if printTableRefs then + table.insert(result, 1, "<"..table_ref(tbl).."> ") -- prepend table ref + end + return table.concat(result) +end +M.private._table_tostring_format_result = _table_tostring_format_result -- prettystr_sub() needs it + +local function table_findkeyof(t, element) + -- Return the key k of the given element in table t, so that t[k] == element + -- (or `nil` if element is not present within t). Note that we use our + -- 'general' is_equal comparison for matching, so this function should + -- handle table-type elements gracefully and consistently. + if type(t) == "table" then + for k, v in pairs(t) do + if M.private.is_table_equals(v, element) then + return k + end + end + end + return nil +end + +local function _is_table_items_equals(actual, expected ) + local type_a, type_e = type(actual), type(expected) + + if type_a ~= type_e then + return false + + elseif (type_a == 'table') --[[and (type_e == 'table')]] then + for k, v in pairs(actual) do + if table_findkeyof(expected, v) == nil then + return false -- v not contained in expected + end + end + for k, v in pairs(expected) do + if table_findkeyof(actual, v) == nil then + return false -- v not contained in actual + end + end + return true + + elseif actual ~= expected then + return false + end + + return true +end + +--[[ +This is a specialized metatable to help with the bookkeeping of recursions +in _is_table_equals(). It provides an __index table that implements utility +functions for easier management of the table. The "cached" method queries +the state of a specific (actual,expected) pair; and the "store" method sets +this state to the given value. The state of pairs not "seen" / visited is +assumed to be `nil`. +]] +local _recursion_cache_MT = { + __index = { + -- Return the cached value for an (actual,expected) pair (or `nil`) + cached = function(t, actual, expected) + local subtable = t[actual] or {} + return subtable[expected] + end, + + -- Store cached value for a specific (actual,expected) pair. + -- Returns the value, so it's easy to use for a "tailcall" (return ...). + store = function(t, actual, expected, value, asymmetric) + local subtable = t[actual] + if not subtable then + subtable = {} + t[actual] = subtable + end + subtable[expected] = value + + -- Unless explicitly marked "asymmetric": Consider the recursion + -- on (expected,actual) to be equivalent to (actual,expected) by + -- default, and thus cache the value for both. + if not asymmetric then + t:store(expected, actual, value, true) + end + + return value + end + } +} + +local function _is_table_equals(actual, expected, cycleDetectTable, marginForAlmostEqual) + --[[Returns true if both table are equal. + + If argument marginForAlmostEqual is suppied, number comparison is done using alomstEqual instead + of strict equality. + + cycleDetectTable is an internal argument used during recursion on tables. + ]] + --print('_is_table_equals( \n '..prettystr(actual)..'\n , '..prettystr(expected).. + -- '\n , '..prettystr(cycleDetectTable)..'\n , '..prettystr(marginForAlmostEqual)..' )') + + local type_a, type_e = type(actual), type(expected) + + if type_a ~= type_e then + return false -- different types won't match + end + + if type_a == 'number' then + if marginForAlmostEqual ~= nil then + return M.almostEquals(actual, expected, marginForAlmostEqual) + else + return actual == expected + end + elseif type_a ~= 'table' then + -- other types compare directly + return actual == expected + end + + cycleDetectTable = cycleDetectTable or { actual={}, expected={} } + if cycleDetectTable.actual[ actual ] then + -- oh, we hit a cycle in actual + if cycleDetectTable.expected[ expected ] then + -- uh, we hit a cycle at the same time in expected + -- so the two tables have similar structure + return true + end + + -- cycle was hit only in actual, the structure differs from expected + return false + end + + if cycleDetectTable.expected[ expected ] then + -- no cycle in actual, but cycle in expected + -- the structure differ + return false + end + + -- at this point, no table cycle detected, we are + -- seeing this table for the first time + + -- mark the cycle detection + cycleDetectTable.actual[ actual ] = true + cycleDetectTable.expected[ expected ] = true + + + local actualKeysMatched = {} + for k, v in pairs(actual) do + actualKeysMatched[k] = true -- Keep track of matched keys + if not _is_table_equals(v, expected[k], cycleDetectTable, marginForAlmostEqual) then + -- table differs on this key + -- clear the cycle detection before returning + cycleDetectTable.actual[ actual ] = nil + cycleDetectTable.expected[ expected ] = nil + return false + end + end + + for k, v in pairs(expected) do + if not actualKeysMatched[k] then + -- Found a key that we did not see in "actual" -> mismatch + -- clear the cycle detection before returning + cycleDetectTable.actual[ actual ] = nil + cycleDetectTable.expected[ expected ] = nil + return false + end + -- Otherwise actual[k] was already matched against v = expected[k]. + end + + -- all key match, we have a match ! + cycleDetectTable.actual[ actual ] = nil + cycleDetectTable.expected[ expected ] = nil + return true +end +M.private._is_table_equals = _is_table_equals + +local function failure(main_msg, extra_msg_or_nil, level) + -- raise an error indicating a test failure + -- for error() compatibility we adjust "level" here (by +1), to report the + -- calling context + local msg + if type(extra_msg_or_nil) == 'string' and extra_msg_or_nil:len() > 0 then + msg = extra_msg_or_nil .. '\n' .. main_msg + else + msg = main_msg + end + error(M.FAILURE_PREFIX .. msg, (level or 1) + 1 + M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE) +end + +local function is_table_equals(actual, expected, marginForAlmostEqual) + return _is_table_equals(actual, expected, nil, marginForAlmostEqual) +end +M.private.is_table_equals = is_table_equals + +local function fail_fmt(level, extra_msg_or_nil, ...) + -- failure with printf-style formatted message and given error level + failure(string.format(...), extra_msg_or_nil, (level or 1) + 1) +end +M.private.fail_fmt = fail_fmt + +local function error_fmt(level, ...) + -- printf-style error() + error(string.format(...), (level or 1) + 1 + M.STRIP_EXTRA_ENTRIES_IN_STACK_TRACE) +end +M.private.error_fmt = error_fmt + +---------------------------------------------------------------- +-- +-- assertions +-- +---------------------------------------------------------------- + +local function errorMsgEquality(actual, expected, doDeepAnalysis, margin) + -- margin is supplied only for almost equal verification + + if not M.ORDER_ACTUAL_EXPECTED then + expected, actual = actual, expected + end + if type(expected) == 'string' or type(expected) == 'table' then + local strExpected, strActual = prettystrPairs(expected, actual) + local result = string.format("expected: %s\nactual: %s", strExpected, strActual) + if margin then + result = result .. '\nwere not equal by the margin of: '..prettystr(margin) + end + + -- extend with mismatch analysis if possible: + local success, mismatchResult + success, mismatchResult = tryMismatchFormatting( actual, expected, doDeepAnalysis, margin ) + if success then + result = table.concat( { result, mismatchResult }, '\n' ) + end + return result + end + return string.format("expected: %s, actual: %s", + prettystr(expected), prettystr(actual)) +end + +function M.assertError(f, ...) + -- assert that calling f with the arguments will raise an error + -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error + if pcall( f, ... ) then + failure( "Expected an error when calling function but no error generated", nil, 2 ) + end +end + +function M.fail( msg ) + -- stops a test due to a failure + failure( msg, nil, 2 ) +end + +function M.failIf( cond, msg ) + -- Fails a test with "msg" if condition is true + if cond then + failure( msg, nil, 2 ) + end +end + +function M.skip(msg) + -- skip a running test + error_fmt(2, M.SKIP_PREFIX .. msg) +end + +function M.skipIf( cond, msg ) + -- skip a running test if condition is met + if cond then + error_fmt(2, M.SKIP_PREFIX .. msg) + end +end + +function M.runOnlyIf( cond, msg ) + -- continue a running test if condition is met, else skip it + if not cond then + error_fmt(2, M.SKIP_PREFIX .. prettystr(msg)) + end +end + +function M.success() + -- stops a test with a success + error_fmt(2, M.SUCCESS_PREFIX) +end + +function M.successIf( cond ) + -- stops a test with a success if condition is met + if cond then + error_fmt(2, M.SUCCESS_PREFIX) + end +end + + +------------------------------------------------------------------ +-- Equality assertions +------------------------------------------------------------------ + +function M.assertEquals(actual, expected, extra_msg_or_nil, doDeepAnalysis) + if type(actual) == 'table' and type(expected) == 'table' then + if not is_table_equals(actual, expected) then + failure( errorMsgEquality(actual, expected, doDeepAnalysis), extra_msg_or_nil, 2 ) + end + elseif type(actual) ~= type(expected) then + failure( errorMsgEquality(actual, expected), extra_msg_or_nil, 2 ) + elseif actual ~= expected then + failure( errorMsgEquality(actual, expected), extra_msg_or_nil, 2 ) + end +end + +function M.almostEquals( actual, expected, margin ) + if type(actual) ~= 'number' or type(expected) ~= 'number' or type(margin) ~= 'number' then + error_fmt(3, 'almostEquals: must supply only number arguments.\nArguments supplied: %s, %s, %s', + prettystr(actual), prettystr(expected), prettystr(margin)) + end + if margin < 0 then + error_fmt(3, 'almostEquals: margin must not be negative, current value is ' .. margin) + end + return math.abs(expected - actual) <= margin +end + +function M.assertAlmostEquals( actual, expected, margin, extra_msg_or_nil ) + -- check that two floats are close by margin + margin = margin or M.EPS + if type(margin) ~= 'number' then + error_fmt(2, 'almostEquals: margin must be a number, not %s', prettystr(margin)) + end + + if type(actual) == 'table' and type(expected) == 'table' then + -- handle almost equals for table + if not is_table_equals(actual, expected, margin) then + failure( errorMsgEquality(actual, expected, nil, margin), extra_msg_or_nil, 2 ) + end + elseif type(actual) == 'number' and type(expected) == 'number' and type(margin) == 'number' then + if not M.almostEquals(actual, expected, margin) then + if not M.ORDER_ACTUAL_EXPECTED then + expected, actual = actual, expected + end + local delta = math.abs(actual - expected) + fail_fmt(2, extra_msg_or_nil, 'Values are not almost equal\n' .. + 'Actual: %s, expected: %s, delta %s above margin of %s', + actual, expected, delta, margin) + end + else + error_fmt(3, 'almostEquals: must supply only number or table arguments.\nArguments supplied: %s, %s, %s', + prettystr(actual), prettystr(expected), prettystr(margin)) + end +end + +function M.assertNotEquals(actual, expected, extra_msg_or_nil) + if type(actual) ~= type(expected) then + return + end + + if type(actual) == 'table' and type(expected) == 'table' then + if not is_table_equals(actual, expected) then + return + end + elseif actual ~= expected then + return + end + fail_fmt(2, extra_msg_or_nil, 'Received the not expected value: %s', prettystr(actual)) +end + +function M.assertNotAlmostEquals( actual, expected, margin, extra_msg_or_nil ) + -- check that two floats are not close by margin + margin = margin or M.EPS + if M.almostEquals(actual, expected, margin) then + if not M.ORDER_ACTUAL_EXPECTED then + expected, actual = actual, expected + end + local delta = math.abs(actual - expected) + fail_fmt(2, extra_msg_or_nil, 'Values are almost equal\nActual: %s, expected: %s' .. + ', delta %s below margin of %s', + actual, expected, delta, margin) + end +end + +function M.assertItemsEquals(actual, expected, extra_msg_or_nil) + -- checks that the items of table expected + -- are contained in table actual. Warning, this function + -- is at least O(n^2) + if not _is_table_items_equals(actual, expected ) then + expected, actual = prettystrPairs(expected, actual) + fail_fmt(2, extra_msg_or_nil, 'Content of the tables are not identical:\nExpected: %s\nActual: %s', + expected, actual) + end +end + +------------------------------------------------------------------ +-- String assertion +------------------------------------------------------------------ + +function M.assertStrContains( str, sub, isPattern, extra_msg_or_nil ) + -- this relies on lua string.find function + -- a string always contains the empty string + -- assert( type(str) == 'string', 'Argument 1 of assertStrContains() should be a string.' ) ) + -- assert( type(sub) == 'string', 'Argument 2 of assertStrContains() should be a string.' ) ) + if not string.find(str, sub, 1, not isPattern) then + sub, str = prettystrPairs(sub, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Could not find %s %s in string %s', + isPattern and 'pattern' or 'substring', sub, str) + end +end + +function M.assertStrIContains( str, sub, extra_msg_or_nil ) + -- this relies on lua string.find function + -- a string always contains the empty string + if not string.find(str:lower(), sub:lower(), 1, true) then + sub, str = prettystrPairs(sub, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Could not find (case insensitively) substring %s in string %s', + sub, str) + end +end + +function M.assertNotStrContains( str, sub, isPattern, extra_msg_or_nil ) + -- this relies on lua string.find function + -- a string always contains the empty string + if string.find(str, sub, 1, not isPattern) then + sub, str = prettystrPairs(sub, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Found the not expected %s %s in string %s', + isPattern and 'pattern' or 'substring', sub, str) + end +end + +function M.assertNotStrIContains( str, sub, extra_msg_or_nil ) + -- this relies on lua string.find function + -- a string always contains the empty string + if string.find(str:lower(), sub:lower(), 1, true) then + sub, str = prettystrPairs(sub, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Found (case insensitively) the not expected substring %s in string %s', + sub, str) + end +end + +function M.assertStrMatches( str, pattern, start, final, extra_msg_or_nil ) + -- Verify a full match for the string + if not strMatch( str, pattern, start, final ) then + pattern, str = prettystrPairs(pattern, str, '\n') + fail_fmt(2, extra_msg_or_nil, 'Could not match pattern %s with string %s', + pattern, str) + end +end + +local function _assertErrorMsgEquals( stripFileAndLine, expectedMsg, func, ... ) + local no_error, error_msg = pcall( func, ... ) + if no_error then + failure( 'No error generated when calling function but expected error: '..M.prettystr(expectedMsg), nil, 3 ) + end + if type(expectedMsg) == "string" and type(error_msg) ~= "string" then + -- table are converted to string automatically + error_msg = tostring(error_msg) + end + local differ = false + if stripFileAndLine then + if error_msg:gsub("^.+:%d+: ", "") ~= expectedMsg then + differ = true + end + else + if error_msg ~= expectedMsg then + local tr = type(error_msg) + local te = type(expectedMsg) + if te == 'table' then + if tr ~= 'table' then + differ = true + else + local ok = pcall(M.assertItemsEquals, error_msg, expectedMsg) + if not ok then + differ = true + end + end + else + differ = true + end + end + end + + if differ then + error_msg, expectedMsg = prettystrPairs(error_msg, expectedMsg) + fail_fmt(3, nil, 'Error message expected: %s\nError message received: %s\n', + expectedMsg, error_msg) + end +end + +function M.assertErrorMsgEquals( expectedMsg, func, ... ) + -- assert that calling f with the arguments will raise an error + -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error + _assertErrorMsgEquals(false, expectedMsg, func, ...) +end + +function M.assertErrorMsgContentEquals(expectedMsg, func, ...) + _assertErrorMsgEquals(true, expectedMsg, func, ...) +end + +function M.assertErrorMsgContains( partialMsg, func, ... ) + -- assert that calling f with the arguments will raise an error + -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error + local no_error, error_msg = pcall( func, ... ) + if no_error then + failure( 'No error generated when calling function but expected error containing: '..prettystr(partialMsg), nil, 2 ) + end + if type(error_msg) ~= "string" then + error_msg = tostring(error_msg) + end + if not string.find( error_msg, partialMsg, nil, true ) then + error_msg, partialMsg = prettystrPairs(error_msg, partialMsg) + fail_fmt(2, nil, 'Error message does not contain: %s\nError message received: %s\n', + partialMsg, error_msg) + end +end + +function M.assertErrorMsgMatches( expectedMsg, func, ... ) + -- assert that calling f with the arguments will raise an error + -- example: assertError( f, 1, 2 ) => f(1,2) should generate an error + local no_error, error_msg = pcall( func, ... ) + if no_error then + failure( 'No error generated when calling function but expected error matching: "'..expectedMsg..'"', nil, 2 ) + end + if type(error_msg) ~= "string" then + error_msg = tostring(error_msg) + end + if not strMatch( error_msg, expectedMsg ) then + expectedMsg, error_msg = prettystrPairs(expectedMsg, error_msg) + fail_fmt(2, nil, 'Error message does not match pattern: %s\nError message received: %s\n', + expectedMsg, error_msg) + end +end + +------------------------------------------------------------------ +-- Type assertions +------------------------------------------------------------------ + +function M.assertEvalToTrue(value, extra_msg_or_nil) + if not value then + failure("expected: a value evaluating to true, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertEvalToFalse(value, extra_msg_or_nil) + if value then + failure("expected: false or nil, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsTrue(value, extra_msg_or_nil) + if value ~= true then + failure("expected: true, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsTrue(value, extra_msg_or_nil) + if value == true then + failure("expected: not true, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsFalse(value, extra_msg_or_nil) + if value ~= false then + failure("expected: false, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsFalse(value, extra_msg_or_nil) + if value == false then + failure("expected: not false, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsNil(value, extra_msg_or_nil) + if value ~= nil then + failure("expected: nil, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsNil(value, extra_msg_or_nil) + if value == nil then + failure("expected: not nil, actual: nil", extra_msg_or_nil, 2) + end +end + +--[[ +Add type assertion functions to the module table M. Each of these functions +takes a single parameter "value", and checks that its Lua type matches the +expected string (derived from the function name): + +M.assertIsXxx(value) -> ensure that type(value) conforms to "xxx" +]] +for _, funcName in ipairs( + {'assertIsNumber', 'assertIsString', 'assertIsTable', 'assertIsBoolean', + 'assertIsFunction', 'assertIsUserdata', 'assertIsThread'} +) do + local typeExpected = funcName:match("^assertIs([A-Z]%a*)$") + -- Lua type() always returns lowercase, also make sure the match() succeeded + typeExpected = typeExpected and typeExpected:lower() + or error("bad function name '"..funcName.."' for type assertion") + + M[funcName] = function(value, extra_msg_or_nil) + if type(value) ~= typeExpected then + if type(value) == 'nil' then + fail_fmt(2, extra_msg_or_nil, 'expected: a %s value, actual: nil', + typeExpected, type(value), prettystrPairs(value)) + else + fail_fmt(2, extra_msg_or_nil, 'expected: a %s value, actual: type %s, value %s', + typeExpected, type(value), prettystrPairs(value)) + end + end + end +end + +--[[ +Add shortcuts for verifying type of a variable, without failure (luaunit v2 compatibility) +M.isXxx(value) -> returns true if type(value) conforms to "xxx" +]] +for _, typeExpected in ipairs( + {'Number', 'String', 'Table', 'Boolean', + 'Function', 'Userdata', 'Thread', 'Nil' } +) do + local typeExpectedLower = typeExpected:lower() + local isType = function(value) + return (type(value) == typeExpectedLower) + end + M['is'..typeExpected] = isType + M['is_'..typeExpectedLower] = isType +end + +--[[ +Add non-type assertion functions to the module table M. Each of these functions +takes a single parameter "value", and checks that its Lua type differs from the +expected string (derived from the function name): + +M.assertNotIsXxx(value) -> ensure that type(value) is not "xxx" +]] +for _, funcName in ipairs( + {'assertNotIsNumber', 'assertNotIsString', 'assertNotIsTable', 'assertNotIsBoolean', + 'assertNotIsFunction', 'assertNotIsUserdata', 'assertNotIsThread'} +) do + local typeUnexpected = funcName:match("^assertNotIs([A-Z]%a*)$") + -- Lua type() always returns lowercase, also make sure the match() succeeded + typeUnexpected = typeUnexpected and typeUnexpected:lower() + or error("bad function name '"..funcName.."' for type assertion") + + M[funcName] = function(value, extra_msg_or_nil) + if type(value) == typeUnexpected then + fail_fmt(2, extra_msg_or_nil, 'expected: not a %s type, actual: value %s', + typeUnexpected, prettystrPairs(value)) + end + end +end + +function M.assertIs(actual, expected, extra_msg_or_nil) + if actual ~= expected then + if not M.ORDER_ACTUAL_EXPECTED then + actual, expected = expected, actual + end + local old_print_table_ref_in_error_msg = M.PRINT_TABLE_REF_IN_ERROR_MSG + M.PRINT_TABLE_REF_IN_ERROR_MSG = true + expected, actual = prettystrPairs(expected, actual, '\n', '') + M.PRINT_TABLE_REF_IN_ERROR_MSG = old_print_table_ref_in_error_msg + fail_fmt(2, extra_msg_or_nil, 'expected and actual object should not be different\nExpected: %s\nReceived: %s', + expected, actual) + end +end + +function M.assertNotIs(actual, expected, extra_msg_or_nil) + if actual == expected then + local old_print_table_ref_in_error_msg = M.PRINT_TABLE_REF_IN_ERROR_MSG + M.PRINT_TABLE_REF_IN_ERROR_MSG = true + local s_expected + if not M.ORDER_ACTUAL_EXPECTED then + s_expected = prettystrPairs(actual) + else + s_expected = prettystrPairs(expected) + end + M.PRINT_TABLE_REF_IN_ERROR_MSG = old_print_table_ref_in_error_msg + fail_fmt(2, extra_msg_or_nil, 'expected and actual object should be different: %s', s_expected ) + end +end + + +------------------------------------------------------------------ +-- Scientific assertions +------------------------------------------------------------------ + + +function M.assertIsNaN(value, extra_msg_or_nil) + if type(value) ~= "number" or value == value then + failure("expected: NaN, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsNaN(value, extra_msg_or_nil) + if type(value) == "number" and value ~= value then + failure("expected: not NaN, actual: NaN", extra_msg_or_nil, 2) + end +end + +function M.assertIsInf(value, extra_msg_or_nil) + if type(value) ~= "number" or math.abs(value) ~= math.huge then + failure("expected: #Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsPlusInf(value, extra_msg_or_nil) + if type(value) ~= "number" or value ~= math.huge then + failure("expected: #Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsMinusInf(value, extra_msg_or_nil) + if type(value) ~= "number" or value ~= -math.huge then + failure("expected: -#Inf, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertNotIsPlusInf(value, extra_msg_or_nil) + if type(value) == "number" and value == math.huge then + failure("expected: not #Inf, actual: #Inf", extra_msg_or_nil, 2) + end +end + +function M.assertNotIsMinusInf(value, extra_msg_or_nil) + if type(value) == "number" and value == -math.huge then + failure("expected: not -#Inf, actual: -#Inf", extra_msg_or_nil, 2) + end +end + +function M.assertNotIsInf(value, extra_msg_or_nil) + if type(value) == "number" and math.abs(value) == math.huge then + failure("expected: not infinity, actual: " .. prettystr(value), extra_msg_or_nil, 2) + end +end + +function M.assertIsPlusZero(value, extra_msg_or_nil) + if type(value) ~= 'number' or value ~= 0 then + failure("expected: +0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) + else if (1/value == -math.huge) then + -- more precise error diagnosis + failure("expected: +0.0, actual: -0.0", extra_msg_or_nil, 2) + else if (1/value ~= math.huge) then + -- strange, case should have already been covered + failure("expected: +0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end + end + end +end + +function M.assertIsMinusZero(value, extra_msg_or_nil) + if type(value) ~= 'number' or value ~= 0 then + failure("expected: -0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) + else if (1/value == math.huge) then + -- more precise error diagnosis + failure("expected: -0.0, actual: +0.0", extra_msg_or_nil, 2) + else if (1/value ~= -math.huge) then + -- strange, case should have already been covered + failure("expected: -0.0, actual: " ..prettystr(value), extra_msg_or_nil, 2) + end + end + end +end + +function M.assertNotIsPlusZero(value, extra_msg_or_nil) + if type(value) == 'number' and (1/value == math.huge) then + failure("expected: not +0.0, actual: +0.0", extra_msg_or_nil, 2) + end +end + +function M.assertNotIsMinusZero(value, extra_msg_or_nil) + if type(value) == 'number' and (1/value == -math.huge) then + failure("expected: not -0.0, actual: -0.0", extra_msg_or_nil, 2) + end +end + +function M.assertTableContains(t, expected, extra_msg_or_nil) + -- checks that table t contains the expected element + if table_findkeyof(t, expected) == nil then + t, expected = prettystrPairs(t, expected) + fail_fmt(2, extra_msg_or_nil, 'Table %s does NOT contain the expected element %s', + t, expected) + end +end + +function M.assertNotTableContains(t, expected, extra_msg_or_nil) + -- checks that table t doesn't contain the expected element + local k = table_findkeyof(t, expected) + if k ~= nil then + t, expected = prettystrPairs(t, expected) + fail_fmt(2, extra_msg_or_nil, 'Table %s DOES contain the unwanted element %s (at key %s)', + t, expected, prettystr(k)) + end +end + +---------------------------------------------------------------- +-- Compatibility layer +---------------------------------------------------------------- + +-- for compatibility with LuaUnit v2.x +function M.wrapFunctions() + -- In LuaUnit version <= 2.1 , this function was necessary to include + -- a test function inside the global test suite. Nowadays, the functions + -- are simply run directly as part of the test discovery process. + -- so just do nothing ! + io.stderr:write[[Use of WrapFunctions() is no longer needed. +Just prefix your test function names with "test" or "Test" and they +will be picked up and run by LuaUnit. +]] +end + +local list_of_funcs = { + -- { official function name , alias } + + -- general assertions + { 'assertEquals' , 'assert_equals' }, + { 'assertItemsEquals' , 'assert_items_equals' }, + { 'assertNotEquals' , 'assert_not_equals' }, + { 'assertAlmostEquals' , 'assert_almost_equals' }, + { 'assertNotAlmostEquals' , 'assert_not_almost_equals' }, + { 'assertEvalToTrue' , 'assert_eval_to_true' }, + { 'assertEvalToFalse' , 'assert_eval_to_false' }, + { 'assertStrContains' , 'assert_str_contains' }, + { 'assertStrIContains' , 'assert_str_icontains' }, + { 'assertNotStrContains' , 'assert_not_str_contains' }, + { 'assertNotStrIContains' , 'assert_not_str_icontains' }, + { 'assertStrMatches' , 'assert_str_matches' }, + { 'assertError' , 'assert_error' }, + { 'assertErrorMsgEquals' , 'assert_error_msg_equals' }, + { 'assertErrorMsgContains' , 'assert_error_msg_contains' }, + { 'assertErrorMsgMatches' , 'assert_error_msg_matches' }, + { 'assertErrorMsgContentEquals', 'assert_error_msg_content_equals' }, + { 'assertIs' , 'assert_is' }, + { 'assertNotIs' , 'assert_not_is' }, + { 'assertTableContains' , 'assert_table_contains' }, + { 'assertNotTableContains' , 'assert_not_table_contains' }, + { 'wrapFunctions' , 'WrapFunctions' }, + { 'wrapFunctions' , 'wrap_functions' }, + + -- type assertions: assertIsXXX -> assert_is_xxx + { 'assertIsNumber' , 'assert_is_number' }, + { 'assertIsString' , 'assert_is_string' }, + { 'assertIsTable' , 'assert_is_table' }, + { 'assertIsBoolean' , 'assert_is_boolean' }, + { 'assertIsNil' , 'assert_is_nil' }, + { 'assertIsTrue' , 'assert_is_true' }, + { 'assertIsFalse' , 'assert_is_false' }, + { 'assertIsNaN' , 'assert_is_nan' }, + { 'assertIsInf' , 'assert_is_inf' }, + { 'assertIsPlusInf' , 'assert_is_plus_inf' }, + { 'assertIsMinusInf' , 'assert_is_minus_inf' }, + { 'assertIsPlusZero' , 'assert_is_plus_zero' }, + { 'assertIsMinusZero' , 'assert_is_minus_zero' }, + { 'assertIsFunction' , 'assert_is_function' }, + { 'assertIsThread' , 'assert_is_thread' }, + { 'assertIsUserdata' , 'assert_is_userdata' }, + + -- type assertions: assertIsXXX -> assertXxx + { 'assertIsNumber' , 'assertNumber' }, + { 'assertIsString' , 'assertString' }, + { 'assertIsTable' , 'assertTable' }, + { 'assertIsBoolean' , 'assertBoolean' }, + { 'assertIsNil' , 'assertNil' }, + { 'assertIsTrue' , 'assertTrue' }, + { 'assertIsFalse' , 'assertFalse' }, + { 'assertIsNaN' , 'assertNaN' }, + { 'assertIsInf' , 'assertInf' }, + { 'assertIsPlusInf' , 'assertPlusInf' }, + { 'assertIsMinusInf' , 'assertMinusInf' }, + { 'assertIsPlusZero' , 'assertPlusZero' }, + { 'assertIsMinusZero' , 'assertMinusZero'}, + { 'assertIsFunction' , 'assertFunction' }, + { 'assertIsThread' , 'assertThread' }, + { 'assertIsUserdata' , 'assertUserdata' }, + + -- type assertions: assertIsXXX -> assert_xxx (luaunit v2 compat) + { 'assertIsNumber' , 'assert_number' }, + { 'assertIsString' , 'assert_string' }, + { 'assertIsTable' , 'assert_table' }, + { 'assertIsBoolean' , 'assert_boolean' }, + { 'assertIsNil' , 'assert_nil' }, + { 'assertIsTrue' , 'assert_true' }, + { 'assertIsFalse' , 'assert_false' }, + { 'assertIsNaN' , 'assert_nan' }, + { 'assertIsInf' , 'assert_inf' }, + { 'assertIsPlusInf' , 'assert_plus_inf' }, + { 'assertIsMinusInf' , 'assert_minus_inf' }, + { 'assertIsPlusZero' , 'assert_plus_zero' }, + { 'assertIsMinusZero' , 'assert_minus_zero' }, + { 'assertIsFunction' , 'assert_function' }, + { 'assertIsThread' , 'assert_thread' }, + { 'assertIsUserdata' , 'assert_userdata' }, + + -- type assertions: assertNotIsXXX -> assert_not_is_xxx + { 'assertNotIsNumber' , 'assert_not_is_number' }, + { 'assertNotIsString' , 'assert_not_is_string' }, + { 'assertNotIsTable' , 'assert_not_is_table' }, + { 'assertNotIsBoolean' , 'assert_not_is_boolean' }, + { 'assertNotIsNil' , 'assert_not_is_nil' }, + { 'assertNotIsTrue' , 'assert_not_is_true' }, + { 'assertNotIsFalse' , 'assert_not_is_false' }, + { 'assertNotIsNaN' , 'assert_not_is_nan' }, + { 'assertNotIsInf' , 'assert_not_is_inf' }, + { 'assertNotIsPlusInf' , 'assert_not_plus_inf' }, + { 'assertNotIsMinusInf' , 'assert_not_minus_inf' }, + { 'assertNotIsPlusZero' , 'assert_not_plus_zero' }, + { 'assertNotIsMinusZero' , 'assert_not_minus_zero' }, + { 'assertNotIsFunction' , 'assert_not_is_function' }, + { 'assertNotIsThread' , 'assert_not_is_thread' }, + { 'assertNotIsUserdata' , 'assert_not_is_userdata' }, + + -- type assertions: assertNotIsXXX -> assertNotXxx (luaunit v2 compat) + { 'assertNotIsNumber' , 'assertNotNumber' }, + { 'assertNotIsString' , 'assertNotString' }, + { 'assertNotIsTable' , 'assertNotTable' }, + { 'assertNotIsBoolean' , 'assertNotBoolean' }, + { 'assertNotIsNil' , 'assertNotNil' }, + { 'assertNotIsTrue' , 'assertNotTrue' }, + { 'assertNotIsFalse' , 'assertNotFalse' }, + { 'assertNotIsNaN' , 'assertNotNaN' }, + { 'assertNotIsInf' , 'assertNotInf' }, + { 'assertNotIsPlusInf' , 'assertNotPlusInf' }, + { 'assertNotIsMinusInf' , 'assertNotMinusInf' }, + { 'assertNotIsPlusZero' , 'assertNotPlusZero' }, + { 'assertNotIsMinusZero' , 'assertNotMinusZero' }, + { 'assertNotIsFunction' , 'assertNotFunction' }, + { 'assertNotIsThread' , 'assertNotThread' }, + { 'assertNotIsUserdata' , 'assertNotUserdata' }, + + -- type assertions: assertNotIsXXX -> assert_not_xxx + { 'assertNotIsNumber' , 'assert_not_number' }, + { 'assertNotIsString' , 'assert_not_string' }, + { 'assertNotIsTable' , 'assert_not_table' }, + { 'assertNotIsBoolean' , 'assert_not_boolean' }, + { 'assertNotIsNil' , 'assert_not_nil' }, + { 'assertNotIsTrue' , 'assert_not_true' }, + { 'assertNotIsFalse' , 'assert_not_false' }, + { 'assertNotIsNaN' , 'assert_not_nan' }, + { 'assertNotIsInf' , 'assert_not_inf' }, + { 'assertNotIsPlusInf' , 'assert_not_plus_inf' }, + { 'assertNotIsMinusInf' , 'assert_not_minus_inf' }, + { 'assertNotIsPlusZero' , 'assert_not_plus_zero' }, + { 'assertNotIsMinusZero' , 'assert_not_minus_zero' }, + { 'assertNotIsFunction' , 'assert_not_function' }, + { 'assertNotIsThread' , 'assert_not_thread' }, + { 'assertNotIsUserdata' , 'assert_not_userdata' }, + + -- all assertions with Coroutine duplicate Thread assertions + { 'assertIsThread' , 'assertIsCoroutine' }, + { 'assertIsThread' , 'assertCoroutine' }, + { 'assertIsThread' , 'assert_is_coroutine' }, + { 'assertIsThread' , 'assert_coroutine' }, + { 'assertNotIsThread' , 'assertNotIsCoroutine' }, + { 'assertNotIsThread' , 'assertNotCoroutine' }, + { 'assertNotIsThread' , 'assert_not_is_coroutine' }, + { 'assertNotIsThread' , 'assert_not_coroutine' }, +} + +-- Create all aliases in M +for _,v in ipairs( list_of_funcs ) do + local funcname, alias = v[1], v[2] + M[alias] = M[funcname] + + if EXPORT_ASSERT_TO_GLOBALS then + _G[funcname] = M[funcname] + _G[alias] = M[funcname] + end +end + +---------------------------------------------------------------- +-- +-- Outputters +-- +---------------------------------------------------------------- + +-- A common "base" class for outputters +-- For concepts involved (class inheritance) see http://www.lua.org/pil/16.2.html + +local genericOutput = { __class__ = 'genericOutput' } -- class +local genericOutput_MT = { __index = genericOutput } -- metatable +M.genericOutput = genericOutput -- publish, so that custom classes may derive from it + +function genericOutput.new(runner, default_verbosity) + -- runner is the "parent" object controlling the output, usually a LuaUnit instance + local t = { runner = runner } + if runner then + t.result = runner.result + t.verbosity = runner.verbosity or default_verbosity + t.fname = runner.fname + else + t.verbosity = default_verbosity + end + return setmetatable( t, genericOutput_MT) +end + +-- abstract ("empty") methods +function genericOutput:startSuite() + -- Called once, when the suite is started +end + +function genericOutput:startClass(className) + -- Called each time a new test class is started +end + +function genericOutput:startTest(testName) + -- called each time a new test is started, right before the setUp() + -- the current test status node is already created and available in: self.result.currentNode +end + +function genericOutput:updateStatus(node) + -- called with status failed or error as soon as the error/failure is encountered + -- this method is NOT called for a successful test because a test is marked as successful by default + -- and does not need to be updated +end + +function genericOutput:endTest(node) + -- called when the test is finished, after the tearDown() method +end + +function genericOutput:endClass() + -- called when executing the class is finished, before moving on to the next class of at the end of the test execution +end + +function genericOutput:endSuite() + -- called at the end of the test suite execution +end + + +---------------------------------------------------------------- +-- class TapOutput +---------------------------------------------------------------- + +local TapOutput = genericOutput.new() -- derived class +local TapOutput_MT = { __index = TapOutput } -- metatable +TapOutput.__class__ = 'TapOutput' + + -- For a good reference for TAP format, check: http://testanything.org/tap-specification.html + + function TapOutput.new(runner) + local t = genericOutput.new(runner, M.VERBOSITY_LOW) + return setmetatable( t, TapOutput_MT) + end + function TapOutput:startSuite() + print("1.."..self.result.selectedCount) + print('# Started on '..self.result.startDate) + end + function TapOutput:startClass(className) + if className ~= '[TestFunctions]' then + print('# Starting class: '..className) + end + end + + function TapOutput:updateStatus( node ) + if node:isSkipped() then + io.stdout:write("ok ", self.result.currentTestNumber, "\t# SKIP ", node.msg, "\n" ) + return + end + + io.stdout:write("not ok ", self.result.currentTestNumber, "\t", node.testName, "\n") + if self.verbosity > M.VERBOSITY_LOW then + print( prefixString( '# ', node.msg ) ) + end + if (node:isFailure() or node:isError()) and self.verbosity > M.VERBOSITY_DEFAULT then + print( prefixString( '# ', node.stackTrace ) ) + end + end + + function TapOutput:endTest( node ) + if node:isSuccess() then + io.stdout:write("ok ", self.result.currentTestNumber, "\t", node.testName, "\n") + end + end + + function TapOutput:endSuite() + print( '# '..M.LuaUnit.statusLine( self.result ) ) + return self.result.notSuccessCount + end + + +-- class TapOutput end + +---------------------------------------------------------------- +-- class JUnitOutput +---------------------------------------------------------------- + +-- See directory junitxml for more information about the junit format +local JUnitOutput = genericOutput.new() -- derived class +local JUnitOutput_MT = { __index = JUnitOutput } -- metatable +JUnitOutput.__class__ = 'JUnitOutput' + + function JUnitOutput.new(runner) + local t = genericOutput.new(runner, M.VERBOSITY_LOW) + t.testList = {} + return setmetatable( t, JUnitOutput_MT ) + end + + function JUnitOutput:startSuite() + -- open xml file early to deal with errors + if self.fname == nil then + error('With Junit, an output filename must be supplied with --name!') + end + if string.sub(self.fname,-4) ~= '.xml' then + self.fname = self.fname..'.xml' + end + self.fd = io.open(self.fname, "w") + if self.fd == nil then + error("Could not open file for writing: "..self.fname) + end + + print('# XML output to '..self.fname) + print('# Started on '..self.result.startDate) + end + function JUnitOutput:startClass(className) + if className ~= '[TestFunctions]' then + print('# Starting class: '..className) + end + end + function JUnitOutput:startTest(testName) + print('# Starting test: '..testName) + end + + function JUnitOutput:updateStatus( node ) + if node:isFailure() then + print( '# Failure: ' .. prefixString( '# ', node.msg ):sub(4, nil) ) + -- print('# ' .. node.stackTrace) + elseif node:isError() then + print( '# Error: ' .. prefixString( '# ' , node.msg ):sub(4, nil) ) + -- print('# ' .. node.stackTrace) + end + end + + function JUnitOutput:endSuite() + print( '# '..M.LuaUnit.statusLine(self.result)) + + -- XML file writing + self.fd:write('\n') + self.fd:write('\n') + self.fd:write(string.format( + ' \n', + self.result.runCount, self.result.startIsodate, self.result.duration, self.result.errorCount, self.result.failureCount, self.result.skippedCount )) + self.fd:write(" \n") + self.fd:write(string.format(' \n', _VERSION ) ) + self.fd:write(string.format(' \n', M.VERSION) ) + -- XXX please include system name and version if possible + self.fd:write(" \n") + + for i,node in ipairs(self.result.allTests) do + self.fd:write(string.format(' \n', + node.className, node.testName, node.duration ) ) + if node:isNotSuccess() then + self.fd:write(node:statusXML()) + end + self.fd:write(' \n') + end + + -- Next two lines are needed to validate junit ANT xsd, but really not useful in general: + self.fd:write(' \n') + self.fd:write(' \n') + + self.fd:write(' \n') + self.fd:write('\n') + self.fd:close() + return self.result.notSuccessCount + end + + +-- class TapOutput end + +---------------------------------------------------------------- +-- class TextOutput +---------------------------------------------------------------- + +--[[ Example of other unit-tests suite text output + +-- Python Non verbose: + +For each test: . or F or E + +If some failed tests: + ============== + ERROR / FAILURE: TestName (testfile.testclass) + --------- + Stack trace + + +then -------------- +then "Ran x tests in 0.000s" +then OK or FAILED (failures=1, error=1) + +-- Python Verbose: +testname (filename.classname) ... ok +testname (filename.classname) ... FAIL +testname (filename.classname) ... ERROR + +then -------------- +then "Ran x tests in 0.000s" +then OK or FAILED (failures=1, error=1) + +-- Ruby: +Started + . + Finished in 0.002695 seconds. + + 1 tests, 2 assertions, 0 failures, 0 errors + +-- Ruby: +>> ruby tc_simple_number2.rb +Loaded suite tc_simple_number2 +Started +F.. +Finished in 0.038617 seconds. + + 1) Failure: +test_failure(TestSimpleNumber) [tc_simple_number2.rb:16]: +Adding doesn't work. +<3> expected but was +<4>. + +3 tests, 4 assertions, 1 failures, 0 errors + +-- Java Junit +.......F. +Time: 0,003 +There was 1 failure: +1) testCapacity(junit.samples.VectorTest)junit.framework.AssertionFailedError + at junit.samples.VectorTest.testCapacity(VectorTest.java:87) + at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) + at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + +FAILURES!!! +Tests run: 8, Failures: 1, Errors: 0 + + +-- Maven + +# mvn test +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running math.AdditionTest +Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: +0.03 sec <<< FAILURE! + +Results : + +Failed tests: + testLireSymbole(math.AdditionTest) + +Tests run: 2, Failures: 1, Errors: 0, Skipped: 0 + + +-- LuaUnit +---- non verbose +* display . or F or E when running tests +---- verbose +* display test name + ok/fail +---- +* blank line +* number) ERROR or FAILURE: TestName + Stack trace +* blank line +* number) ERROR or FAILURE: TestName + Stack trace + +then -------------- +then "Ran x tests in 0.000s (%d not selected, %d skipped)" +then OK or FAILED (failures=1, error=1) + + +]] + +local TextOutput = genericOutput.new() -- derived class +local TextOutput_MT = { __index = TextOutput } -- metatable +TextOutput.__class__ = 'TextOutput' + + function TextOutput.new(runner) + local t = genericOutput.new(runner, M.VERBOSITY_DEFAULT) + t.errorList = {} + return setmetatable( t, TextOutput_MT ) + end + + function TextOutput:startSuite() + if self.verbosity > M.VERBOSITY_DEFAULT then + print( 'Started on '.. self.result.startDate ) + end + end + + function TextOutput:startTest(testName) + if self.verbosity > M.VERBOSITY_DEFAULT then + io.stdout:write( " ", self.result.currentNode.testName, " ... " ) + end + end + + function TextOutput:endTest( node ) + if node:isSuccess() then + if self.verbosity > M.VERBOSITY_DEFAULT then + io.stdout:write("Ok\n") + else + io.stdout:write(".") + io.stdout:flush() + end + else + if self.verbosity > M.VERBOSITY_DEFAULT then + print( node.status ) + print( node.msg ) + --[[ + -- find out when to do this: + if self.verbosity > M.VERBOSITY_DEFAULT then + print( node.stackTrace ) + end + ]] + else + -- write only the first character of status E, F or S + io.stdout:write(string.sub(node.status, 1, 1)) + io.stdout:flush() + end + end + end + + function TextOutput:displayOneFailedTest( index, fail ) + print(index..") "..fail.testName ) + print( fail.msg ) + print( fail.stackTrace ) + print() + end + + function TextOutput:displayErroredTests() + if #self.result.errorTests ~= 0 then + print("Tests with errors:") + print("------------------") + for i, v in ipairs(self.result.errorTests) do + self:displayOneFailedTest(i, v) + end + end + end + + function TextOutput:displayFailedTests() + if #self.result.failedTests ~= 0 then + print("Failed tests:") + print("-------------") + for i, v in ipairs(self.result.failedTests) do + self:displayOneFailedTest(i, v) + end + end + end + + function TextOutput:endSuite() + if self.verbosity > M.VERBOSITY_DEFAULT then + print("=========================================================") + else + print() + end + self:displayErroredTests() + self:displayFailedTests() + print( M.LuaUnit.statusLine( self.result ) ) + if self.result.notSuccessCount == 0 then + print('OK') + end + end + +-- class TextOutput end + + +---------------------------------------------------------------- +-- class NilOutput +---------------------------------------------------------------- + +local function nopCallable() + --print(42) + return nopCallable +end + +local NilOutput = { __class__ = 'NilOuptut' } -- class +local NilOutput_MT = { __index = nopCallable } -- metatable + +function NilOutput.new(runner) + return setmetatable( { __class__ = 'NilOutput' }, NilOutput_MT ) +end + +---------------------------------------------------------------- +-- +-- class LuaUnit +-- +---------------------------------------------------------------- + +M.LuaUnit = { + outputType = TextOutput, + verbosity = M.VERBOSITY_DEFAULT, + __class__ = 'LuaUnit', + instances = {} +} +local LuaUnit_MT = { __index = M.LuaUnit } + +if EXPORT_ASSERT_TO_GLOBALS then + LuaUnit = M.LuaUnit +end + + function M.LuaUnit.new() + local newInstance = setmetatable( {}, LuaUnit_MT ) + return newInstance + end + + -----------------[[ Utility methods ]]--------------------- + + function M.LuaUnit.asFunction(aObject) + -- return "aObject" if it is a function, and nil otherwise + if 'function' == type(aObject) then + return aObject + end + end + + function M.LuaUnit.splitClassMethod(someName) + --[[ + Return a pair of className, methodName strings for a name in the form + "class.method". If no class part (or separator) is found, will return + nil, someName instead (the latter being unchanged). + + This convention thus also replaces the older isClassMethod() test: + You just have to check for a non-nil className (return) value. + ]] + local separator = string.find(someName, '.', 1, true) + if separator then + return someName:sub(1, separator - 1), someName:sub(separator + 1) + end + return nil, someName + end + + function M.LuaUnit.isMethodTestName( s ) + -- return true is the name matches the name of a test method + -- default rule is that is starts with 'Test' or with 'test' + return string.sub(s, 1, 4):lower() == 'test' + end + + function M.LuaUnit.isTestName( s ) + -- return true is the name matches the name of a test + -- default rule is that is starts with 'Test' or with 'test' + return string.sub(s, 1, 4):lower() == 'test' + end + + function M.LuaUnit.collectTests() + -- return a list of all test names in the global namespace + -- that match LuaUnit.isTestName + + local testNames = {} + for k, _ in pairs(_G) do + if type(k) == "string" and M.LuaUnit.isTestName( k ) then + table.insert( testNames , k ) + end + end + table.sort( testNames ) + return testNames + end + + function M.LuaUnit.parseCmdLine( cmdLine ) + -- parse the command line + -- Supported command line parameters: + -- --verbose, -v: increase verbosity + -- --quiet, -q: silence output + -- --error, -e: treat errors as fatal (quit program) + -- --output, -o, + name: select output type + -- --pattern, -p, + pattern: run test matching pattern, may be repeated + -- --exclude, -x, + pattern: run test not matching pattern, may be repeated + -- --shuffle, -s, : shuffle tests before reunning them + -- --name, -n, + fname: name of output file for junit, default to stdout + -- --repeat, -r, + num: number of times to execute each test + -- [testnames, ...]: run selected test names + -- + -- Returns a table with the following fields: + -- verbosity: nil, M.VERBOSITY_DEFAULT, M.VERBOSITY_QUIET, M.VERBOSITY_VERBOSE + -- output: nil, 'tap', 'junit', 'text', 'nil' + -- testNames: nil or a list of test names to run + -- exeRepeat: num or 1 + -- pattern: nil or a list of patterns + -- exclude: nil or a list of patterns + + local result, state = {}, nil + local SET_OUTPUT = 1 + local SET_PATTERN = 2 + local SET_EXCLUDE = 3 + local SET_FNAME = 4 + local SET_REPEAT = 5 + + if cmdLine == nil then + return result + end + + local function parseOption( option ) + if option == '--help' or option == '-h' then + result['help'] = true + return + elseif option == '--version' then + result['version'] = true + return + elseif option == '--verbose' or option == '-v' then + result['verbosity'] = M.VERBOSITY_VERBOSE + return + elseif option == '--quiet' or option == '-q' then + result['verbosity'] = M.VERBOSITY_QUIET + return + elseif option == '--error' or option == '-e' then + result['quitOnError'] = true + return + elseif option == '--failure' or option == '-f' then + result['quitOnFailure'] = true + return + elseif option == '--shuffle' or option == '-s' then + result['shuffle'] = true + return + elseif option == '--output' or option == '-o' then + state = SET_OUTPUT + return state + elseif option == '--name' or option == '-n' then + state = SET_FNAME + return state + elseif option == '--repeat' or option == '-r' then + state = SET_REPEAT + return state + elseif option == '--pattern' or option == '-p' then + state = SET_PATTERN + return state + elseif option == '--exclude' or option == '-x' then + state = SET_EXCLUDE + return state + end + error('Unknown option: '..option,3) + end + + local function setArg( cmdArg, state ) + if state == SET_OUTPUT then + result['output'] = cmdArg + return + elseif state == SET_FNAME then + result['fname'] = cmdArg + return + elseif state == SET_REPEAT then + result['exeRepeat'] = tonumber(cmdArg) + or error('Malformed -r argument: '..cmdArg) + return + elseif state == SET_PATTERN then + if result['pattern'] then + table.insert( result['pattern'], cmdArg ) + else + result['pattern'] = { cmdArg } + end + return + elseif state == SET_EXCLUDE then + local notArg = '!'..cmdArg + if result['pattern'] then + table.insert( result['pattern'], notArg ) + else + result['pattern'] = { notArg } + end + return + end + error('Unknown parse state: '.. state) + end + + + for i, cmdArg in ipairs(cmdLine) do + if state ~= nil then + setArg( cmdArg, state, result ) + state = nil + else + if cmdArg:sub(1,1) == '-' then + state = parseOption( cmdArg ) + else + if result['testNames'] then + table.insert( result['testNames'], cmdArg ) + else + result['testNames'] = { cmdArg } + end + end + end + end + + if result['help'] then + M.LuaUnit.help() + end + + if result['version'] then + M.LuaUnit.version() + end + + if state ~= nil then + error('Missing argument after '..cmdLine[ #cmdLine ],2 ) + end + + return result + end + + function M.LuaUnit.help() + print(M.USAGE) + os.exit(0) + end + + function M.LuaUnit.version() + print('LuaUnit v'..M.VERSION..' by Philippe Fremy ') + os.exit(0) + end + +---------------------------------------------------------------- +-- class NodeStatus +---------------------------------------------------------------- + + local NodeStatus = { __class__ = 'NodeStatus' } -- class + local NodeStatus_MT = { __index = NodeStatus } -- metatable + M.NodeStatus = NodeStatus + + -- values of status + NodeStatus.SUCCESS = 'SUCCESS' + NodeStatus.SKIP = 'SKIP' + NodeStatus.FAIL = 'FAIL' + NodeStatus.ERROR = 'ERROR' + + function NodeStatus.new( number, testName, className ) + -- default constructor, test are PASS by default + local t = { number = number, testName = testName, className = className } + setmetatable( t, NodeStatus_MT ) + t:success() + return t + end + + function NodeStatus:success() + self.status = self.SUCCESS + -- useless because lua does this for us, but it helps me remembering the relevant field names + self.msg = nil + self.stackTrace = nil + end + + function NodeStatus:skip(msg) + self.status = self.SKIP + self.msg = msg + self.stackTrace = nil + end + + function NodeStatus:fail(msg, stackTrace) + self.status = self.FAIL + self.msg = msg + self.stackTrace = stackTrace + end + + function NodeStatus:error(msg, stackTrace) + self.status = self.ERROR + self.msg = msg + self.stackTrace = stackTrace + end + + function NodeStatus:isSuccess() + return self.status == NodeStatus.SUCCESS + end + + function NodeStatus:isNotSuccess() + -- Return true if node is either failure or error or skip + return (self.status == NodeStatus.FAIL or self.status == NodeStatus.ERROR or self.status == NodeStatus.SKIP) + end + + function NodeStatus:isSkipped() + return self.status == NodeStatus.SKIP + end + + function NodeStatus:isFailure() + return self.status == NodeStatus.FAIL + end + + function NodeStatus:isError() + return self.status == NodeStatus.ERROR + end + + function NodeStatus:statusXML() + if self:isError() then + return table.concat( + {' \n', + ' \n'}) + elseif self:isFailure() then + return table.concat( + {' \n', + ' \n'}) + elseif self:isSkipped() then + return table.concat({' ', xmlEscape(self.msg),'\n' } ) + end + return ' \n' -- (not XSD-compliant! normally shouldn't get here) + end + + --------------[[ Output methods ]]------------------------- + + local function conditional_plural(number, singular) + -- returns a grammatically well-formed string "%d " + local suffix = '' + if number ~= 1 then -- use plural + suffix = (singular:sub(-2) == 'ss') and 'es' or 's' + end + return string.format('%d %s%s', number, singular, suffix) + end + + function M.LuaUnit.statusLine(result) + -- return status line string according to results + local s = { + string.format('Ran %d tests in %0.3f seconds', + result.runCount, result.duration), + conditional_plural(result.successCount, 'success'), + } + if result.notSuccessCount > 0 then + if result.failureCount > 0 then + table.insert(s, conditional_plural(result.failureCount, 'failure')) + end + if result.errorCount > 0 then + table.insert(s, conditional_plural(result.errorCount, 'error')) + end + else + table.insert(s, '0 failures') + end + if result.skippedCount > 0 then + table.insert(s, string.format("%d skipped", result.skippedCount)) + end + if result.nonSelectedCount > 0 then + table.insert(s, string.format("%d non-selected", result.nonSelectedCount)) + end + return table.concat(s, ', ') + end + + function M.LuaUnit:startSuite(selectedCount, nonSelectedCount) + self.result = { + selectedCount = selectedCount, + nonSelectedCount = nonSelectedCount, + successCount = 0, + runCount = 0, + currentTestNumber = 0, + currentClassName = "", + currentNode = nil, + suiteStarted = true, + startTime = os.clock(), + startDate = os.date(os.getenv('LUAUNIT_DATEFMT')), + startIsodate = os.date('%Y-%m-%dT%H:%M:%S'), + patternIncludeFilter = self.patternIncludeFilter, + + -- list of test node status + allTests = {}, + failedTests = {}, + errorTests = {}, + skippedTests = {}, + + failureCount = 0, + errorCount = 0, + notSuccessCount = 0, + skippedCount = 0, + } + + self.outputType = self.outputType or TextOutput + self.output = self.outputType.new(self) + self.output:startSuite() + end + + function M.LuaUnit:startClass( className, classInstance ) + self.result.currentClassName = className + self.output:startClass( className ) + self:setupClass( className, classInstance ) + end + + function M.LuaUnit:startTest( testName ) + self.result.currentTestNumber = self.result.currentTestNumber + 1 + self.result.runCount = self.result.runCount + 1 + self.result.currentNode = NodeStatus.new( + self.result.currentTestNumber, + testName, + self.result.currentClassName + ) + self.result.currentNode.startTime = os.clock() + table.insert( self.result.allTests, self.result.currentNode ) + self.output:startTest( testName ) + end + + function M.LuaUnit:updateStatus( err ) + -- "err" is expected to be a table / result from protectedCall() + if err.status == NodeStatus.SUCCESS then + return + end + + local node = self.result.currentNode + + --[[ As a first approach, we will report only one error or one failure for one test. + + However, we can have the case where the test is in failure, and the teardown is in error. + In such case, it's a good idea to report both a failure and an error in the test suite. This is + what Python unittest does for example. However, it mixes up counts so need to be handled carefully: for + example, there could be more (failures + errors) count that tests. What happens to the current node ? + + We will do this more intelligent version later. + ]] + + -- if the node is already in failure/error, just don't report the new error (see above) + if node.status ~= NodeStatus.SUCCESS then + return + end + + if err.status == NodeStatus.FAIL then + node:fail( err.msg, err.trace ) + table.insert( self.result.failedTests, node ) + elseif err.status == NodeStatus.ERROR then + node:error( err.msg, err.trace ) + table.insert( self.result.errorTests, node ) + elseif err.status == NodeStatus.SKIP then + node:skip( err.msg ) + table.insert( self.result.skippedTests, node ) + else + error('No such status: ' .. prettystr(err.status)) + end + + self.output:updateStatus( node ) + end + + function M.LuaUnit:endTest() + local node = self.result.currentNode + -- print( 'endTest() '..prettystr(node)) + -- print( 'endTest() '..prettystr(node:isNotSuccess())) + node.duration = os.clock() - node.startTime + node.startTime = nil + self.output:endTest( node ) + + if node:isSuccess() then + self.result.successCount = self.result.successCount + 1 + elseif node:isError() then + if self.quitOnError or self.quitOnFailure then + -- Runtime error - abort test execution as requested by + -- "--error" option. This is done by setting a special + -- flag that gets handled in internalRunSuiteByInstances(). + print("\nERROR during LuaUnit test execution:\n" .. node.msg) + self.result.aborted = true + end + elseif node:isFailure() then + if self.quitOnFailure then + -- Failure - abort test execution as requested by + -- "--failure" option. This is done by setting a special + -- flag that gets handled in internalRunSuiteByInstances(). + print("\nFailure during LuaUnit test execution:\n" .. node.msg) + self.result.aborted = true + end + elseif node:isSkipped() then + self.result.runCount = self.result.runCount - 1 + else + error('No such node status: ' .. prettystr(node.status)) + end + self.result.currentNode = nil + end + + function M.LuaUnit:endClass() + self:teardownClass( self.lastClassName, self.lastClassInstance ) + self.output:endClass() + end + + function M.LuaUnit:endSuite() + if self.result.suiteStarted == false then + error('LuaUnit:endSuite() -- suite was already ended' ) + end + self.result.duration = os.clock()-self.result.startTime + self.result.suiteStarted = false + + -- Expose test counts for outputter's endSuite(). This could be managed + -- internally instead by using the length of the lists of failed tests + -- but unit tests rely on these fields being present. + self.result.failureCount = #self.result.failedTests + self.result.errorCount = #self.result.errorTests + self.result.notSuccessCount = self.result.failureCount + self.result.errorCount + self.result.skippedCount = #self.result.skippedTests + + self.output:endSuite() + end + + function M.LuaUnit:setOutputType(outputType, fname) + -- Configures LuaUnit runner output + -- outputType is one of: NIL, TAP, JUNIT, TEXT + -- when outputType is junit, the additional argument fname is used to set the name of junit output file + -- for other formats, fname is ignored + if outputType:upper() == "NIL" then + self.outputType = NilOutput + return + end + if outputType:upper() == "TAP" then + self.outputType = TapOutput + return + end + if outputType:upper() == "JUNIT" then + self.outputType = JUnitOutput + if fname then + self.fname = fname + end + return + end + if outputType:upper() == "TEXT" then + self.outputType = TextOutput + return + end + error( 'No such format: '..outputType,2) + end + + --------------[[ Runner ]]----------------- + + function M.LuaUnit:protectedCall(classInstance, methodInstance, prettyFuncName) + -- if classInstance is nil, this is just a function call + -- else, it's method of a class being called. + + local function err_handler(e) + -- transform error into a table, adding the traceback information + return { + status = NodeStatus.ERROR, + msg = e, + trace = string.sub(debug.traceback("", 1), 2) + } + end + + local ok, err + if classInstance then + -- stupid Lua < 5.2 does not allow xpcall with arguments so let's use a workaround + ok, err = xpcall( function () methodInstance(classInstance) end, err_handler ) + else + ok, err = xpcall( function () methodInstance() end, err_handler ) + end + if ok then + return {status = NodeStatus.SUCCESS} + end + -- print('ok="'..prettystr(ok)..'" err="'..prettystr(err)..'"') + + local iter_msg + iter_msg = self.exeRepeat and 'iteration '..self.currentCount + + err.msg, err.status = M.adjust_err_msg_with_iter( err.msg, iter_msg ) + + if err.status == NodeStatus.SUCCESS or err.status == NodeStatus.SKIP then + err.trace = nil + return err + end + + -- reformat / improve the stack trace + if prettyFuncName then -- we do have the real method name + err.trace = err.trace:gsub("in (%a+) 'methodInstance'", "in %1 '"..prettyFuncName.."'") + end + if STRIP_LUAUNIT_FROM_STACKTRACE then + err.trace = stripLuaunitTrace2(err.trace, err.msg) + end + + return err -- return the error "object" (table) + end + + + function M.LuaUnit:execOneFunction(className, methodName, classInstance, methodInstance) + -- When executing a test function, className and classInstance must be nil + -- When executing a class method, all parameters must be set + + if type(methodInstance) ~= 'function' then + self:unregisterSuite() + error( tostring(methodName)..' must be a function, not '..type(methodInstance)) + end + + local prettyFuncName + if className == nil then + className = '[TestFunctions]' + prettyFuncName = methodName + else + prettyFuncName = className..'.'..methodName + end + + if self.lastClassName ~= className then + if self.lastClassName ~= nil then + self:endClass() + end + self:startClass( className, classInstance ) + self.lastClassName = className + self.lastClassInstance = classInstance + end + + self:startTest(prettyFuncName) + + local node = self.result.currentNode + for iter_n = 1, self.exeRepeat or 1 do + if node:isNotSuccess() then + break + end + self.currentCount = iter_n + + -- run setUp first (if any) + if classInstance then + local func = self.asFunction( classInstance.setUp ) or + self.asFunction( classInstance.Setup ) or + self.asFunction( classInstance.setup ) or + self.asFunction( classInstance.SetUp ) + if func then + self:updateStatus(self:protectedCall(classInstance, func, className..'.setUp')) + end + end + + -- run testMethod() + if node:isSuccess() then + self:updateStatus(self:protectedCall(classInstance, methodInstance, prettyFuncName)) + end + + -- lastly, run tearDown (if any) + if classInstance then + local func = self.asFunction( classInstance.tearDown ) or + self.asFunction( classInstance.TearDown ) or + self.asFunction( classInstance.teardown ) or + self.asFunction( classInstance.Teardown ) + if func then + self:updateStatus(self:protectedCall(classInstance, func, className..'.tearDown')) + end + end + end + + self:endTest() + end + + function M.LuaUnit.expandOneClass( result, className, classInstance ) + --[[ + Input: a list of { name, instance }, a class name, a class instance + Ouptut: modify result to add all test method instance in the form: + { className.methodName, classInstance } + ]] + for methodName, methodInstance in sortedPairs(classInstance) do + if M.LuaUnit.asFunction(methodInstance) and M.LuaUnit.isMethodTestName( methodName ) then + table.insert( result, { className..'.'..methodName, classInstance } ) + end + end + end + + function M.LuaUnit.expandClasses( listOfNameAndInst ) + --[[ + -- expand all classes (provided as {className, classInstance}) to a list of {className.methodName, classInstance} + -- functions and methods remain untouched + + Input: a list of { name, instance } + + Output: + * { function name, function instance } : do nothing + * { class.method name, class instance }: do nothing + * { class name, class instance } : add all method names in the form of (className.methodName, classInstance) + ]] + local result = {} + + for i,v in ipairs( listOfNameAndInst ) do + local name, instance = v[1], v[2] + if M.LuaUnit.asFunction(instance) then + table.insert( result, { name, instance } ) + else + if type(instance) ~= 'table' then + error( 'Instance must be a table or a function, not a '..type(instance)..' with value '..prettystr(instance)) + end + local className, methodName = M.LuaUnit.splitClassMethod( name ) + if className then + local methodInstance = instance[methodName] + if methodInstance == nil then + error( "Could not find method in class "..tostring(className).." for method "..tostring(methodName) ) + end + table.insert( result, { name, instance } ) + else + M.LuaUnit.expandOneClass( result, name, instance ) + end + end + end + + return result + end + + function M.LuaUnit.applyPatternFilter( patternIncFilter, listOfNameAndInst ) + local included, excluded = {}, {} + for i, v in ipairs( listOfNameAndInst ) do + -- local name, instance = v[1], v[2] + if patternFilter( patternIncFilter, v[1] ) then + table.insert( included, v ) + else + table.insert( excluded, v ) + end + end + return included, excluded + end + + local function getKeyInListWithGlobalFallback( key, listOfNameAndInst ) + local result = nil + for i,v in ipairs( listOfNameAndInst ) do + if(listOfNameAndInst[i][1] == key) then + result = listOfNameAndInst[i][2] + break + end + end + if(not M.LuaUnit.asFunction( result ) ) then + result = _G[key] + end + return result + end + + function M.LuaUnit:setupSuite( listOfNameAndInst ) + local setupSuite = getKeyInListWithGlobalFallback("setupSuite", listOfNameAndInst) + if self.asFunction( setupSuite ) then + self:updateStatus( self:protectedCall( nil, setupSuite, 'setupSuite' ) ) + end + end + + function M.LuaUnit:teardownSuite(listOfNameAndInst) + local teardownSuite = getKeyInListWithGlobalFallback("teardownSuite", listOfNameAndInst) + if self.asFunction( teardownSuite ) then + self:updateStatus( self:protectedCall( nil, teardownSuite, 'teardownSuite') ) + end + end + + function M.LuaUnit:setupClass( className, instance ) + if type( instance ) == 'table' and self.asFunction( instance.setupClass ) then + self:updateStatus( self:protectedCall( instance, instance.setupClass, className..'.setupClass' ) ) + end + end + + function M.LuaUnit:teardownClass( className, instance ) + if type( instance ) == 'table' and self.asFunction( instance.teardownClass ) then + self:updateStatus( self:protectedCall( instance, instance.teardownClass, className..'.teardownClass' ) ) + end + end + + function M.LuaUnit:internalRunSuiteByInstances( listOfNameAndInst ) + --[[ Run an explicit list of tests. Each item of the list must be one of: + * { function name, function instance } + * { class name, class instance } + * { class.method name, class instance } + + This function is internal to LuaUnit. The official API to perform this action is runSuiteByInstances() + ]] + + local expandedList = self.expandClasses( listOfNameAndInst ) + if self.shuffle then + randomizeTable( expandedList ) + end + local filteredList, filteredOutList = self.applyPatternFilter( + self.patternIncludeFilter, expandedList ) + + self:startSuite( #filteredList, #filteredOutList ) + self:setupSuite( listOfNameAndInst ) + + for i,v in ipairs( filteredList ) do + local name, instance = v[1], v[2] + if M.LuaUnit.asFunction(instance) then + self:execOneFunction( nil, name, nil, instance ) + else + -- expandClasses() should have already taken care of sanitizing the input + assert( type(instance) == 'table' ) + local className, methodName = M.LuaUnit.splitClassMethod( name ) + assert( className ~= nil ) + local methodInstance = instance[methodName] + assert(methodInstance ~= nil) + self:execOneFunction( className, methodName, instance, methodInstance ) + end + if self.result.aborted then + break -- "--error" or "--failure" option triggered + end + end + + if self.lastClassName ~= nil then + self:endClass() + end + + self:teardownSuite( listOfNameAndInst ) + self:endSuite() + + if self.result.aborted then + print("LuaUnit ABORTED (as requested by --error or --failure option)") + self:unregisterSuite() + os.exit(-2) + end + end + + function M.LuaUnit:internalRunSuiteByNames( listOfName ) + --[[ Run LuaUnit with a list of generic names, coming either from command-line or from global + namespace analysis. Convert the list into a list of (name, valid instances (table or function)) + and calls internalRunSuiteByInstances. + ]] + + local instanceName, instance + local listOfNameAndInst = {} + + for i,name in ipairs( listOfName ) do + local className, methodName = M.LuaUnit.splitClassMethod( name ) + if className then + instanceName = className + instance = _G[instanceName] + + if instance == nil then + self:unregisterSuite() + error( "No such name in global space: "..instanceName ) + end + + if type(instance) ~= 'table' then + self:unregisterSuite() + error( 'Instance of '..instanceName..' must be a table, not '..type(instance)) + end + + local methodInstance = instance[methodName] + if methodInstance == nil then + self:unregisterSuite() + error( "Could not find method in class "..tostring(className).." for method "..tostring(methodName) ) + end + + else + -- for functions and classes + instanceName = name + instance = _G[instanceName] + end + + if instance == nil then + self:unregisterSuite() + error( "No such name in global space: "..instanceName ) + end + + if (type(instance) ~= 'table' and type(instance) ~= 'function') then + self:unregisterSuite() + error( 'Name must match a function or a table: '..instanceName ) + end + + table.insert( listOfNameAndInst, { name, instance } ) + end + + self:internalRunSuiteByInstances( listOfNameAndInst ) + end + + function M.LuaUnit.run(...) + -- Run some specific test classes. + -- If no arguments are passed, run the class names specified on the + -- command line. If no class name is specified on the command line + -- run all classes whose name starts with 'Test' + -- + -- If arguments are passed, they must be strings of the class names + -- that you want to run or generic command line arguments (-o, -p, -v, ...) + local runner = M.LuaUnit.new() + return runner:runSuite(...) + end + + function M.LuaUnit:registerSuite() + -- register the current instance into our global array of instances + -- print('-> Register suite') + M.LuaUnit.instances[ #M.LuaUnit.instances+1 ] = self + end + + function M.unregisterCurrentSuite() + -- force unregister the last registered suite + table.remove(M.LuaUnit.instances, #M.LuaUnit.instances) + end + + function M.LuaUnit:unregisterSuite() + -- print('<- Unregister suite') + -- remove our current instqances from the global array of instances + local instanceIdx = nil + for i, instance in ipairs(M.LuaUnit.instances) do + if instance == self then + instanceIdx = i + break + end + end + + if instanceIdx ~= nil then + table.remove(M.LuaUnit.instances, instanceIdx) + -- print('Unregister done') + end + + end + + function M.LuaUnit:initFromArguments( ... ) + --[[Parses all arguments from either command-line or direct call and set internal + flags of LuaUnit runner according to it. + + Return the list of names which were possibly passed on the command-line or as arguments + ]] + local args = {...} + if type(args[1]) == 'table' and args[1].__class__ == 'LuaUnit' then + -- run was called with the syntax M.LuaUnit:runSuite() + -- we support both M.LuaUnit.run() and M.LuaUnit:run() + -- strip out the first argument self to make it a command-line argument list + table.remove(args,1) + end + + if #args == 0 then + args = cmdline_argv + end + + local options = pcall_or_abort( M.LuaUnit.parseCmdLine, args ) + + -- We expect these option fields to be either `nil` or contain + -- valid values, so it's safe to always copy them directly. + self.verbosity = options.verbosity + self.quitOnError = options.quitOnError + self.quitOnFailure = options.quitOnFailure + + self.exeRepeat = options.exeRepeat + self.patternIncludeFilter = options.pattern + self.shuffle = options.shuffle + + options.output = options.output or os.getenv('LUAUNIT_OUTPUT') + options.fname = options.fname or os.getenv('LUAUNIT_JUNIT_FNAME') + + if options.output then + if options.output:lower() == 'junit' and options.fname == nil then + print('With junit output, a filename must be supplied with -n or --name') + os.exit(-1) + end + pcall_or_abort(self.setOutputType, self, options.output, options.fname) + end + + return options.testNames + end + + function M.LuaUnit:runSuite( ... ) + local testNames = self:initFromArguments(...) + self:registerSuite() + self:internalRunSuiteByNames( testNames or M.LuaUnit.collectTests() ) + self:unregisterSuite() + return self.result.notSuccessCount + end + + function M.LuaUnit:runSuiteByInstances( listOfNameAndInst, commandLineArguments ) + --[[ + Run all test functions or tables provided as input. + + Input: a list of { name, instance } + instance can either be a function or a table containing test functions starting with the prefix "test" + + return the number of failures and errors, 0 meaning success + ]] + -- parse the command-line arguments + local testNames = self:initFromArguments( commandLineArguments ) + self:registerSuite() + self:internalRunSuiteByInstances( listOfNameAndInst ) + self:unregisterSuite() + return self.result.notSuccessCount + end + + + +-- class LuaUnit + +-- For compatbility with LuaUnit v2 +M.run = M.LuaUnit.run +M.Run = M.LuaUnit.run + +function M:setVerbosity( verbosity ) + -- set the verbosity value (as integer) + M.LuaUnit.verbosity = verbosity +end +M.set_verbosity = M.setVerbosity +M.SetVerbosity = M.setVerbosity + + +return M + diff --git a/asteroids/phys.lua b/asteroids/phys.lua index edc5920..e337f8a 100644 --- a/asteroids/phys.lua +++ b/asteroids/phys.lua @@ -1,3 +1,5 @@ +local inspect = require('inspect') + local phys = { tau = 2 * math.pi } @@ -10,9 +12,30 @@ end -- updates the actor's location by applying the passage of time -- TODO spin function phys.update(actor, dt) + assert(actor.speed >= 0) local dv = actor.speed * dt actor.x = actor.x + math.cos(actor.angle) * dv actor.y = actor.y + math.sin(actor.angle) * dv end +function phys.rotate(actor, angle) + actor.angle = (actor.angle + angle) % phys.tau +end + +function phys.apply(actor, force) + assert(actor.speed >= 0) + assert(force.speed >= 0) + local ax = math.cos(actor.angle) * actor.speed + local ay = math.sin(actor.angle) * actor.speed + local fx = math.cos(force.angle) * force.speed + local fy = math.sin(force.angle) * force.speed + local x = ax + fx + local y = ay + fy + + local speed = math.sqrt(x ^ 2 + y ^ 2) + local angle = math.atan(y, x) % phys.tau + actor.speed = speed + actor.angle = angle +end + return phys diff --git a/asteroids/test_phys.lua b/asteroids/test_phys.lua new file mode 100644 index 0000000..7909584 --- /dev/null +++ b/asteroids/test_phys.lua @@ -0,0 +1,33 @@ +t = require('luaunit') +local phys = require('phys') + +function TestUpdate() + local actor = { x = 0, y = 0, speed = 1, angle = math.pi } + phys.update(actor, 0.1) + t.assertAlmostEquals( + actor, + { x = -0.1, y = 0, speed = 1, angle = math.pi }) +end + +function TestApply() + local actor = { x = 0, y = 0, speed = 1, angle = math.pi } + + phys.apply(actor, { speed = 1, angle = 0 }) + t.assertAlmostEquals( + { x = actor.x, y = actor.y, speed = actor.speed }, + { x = 0, y = 0, speed = 0 }) + + phys.apply(actor, { speed = 1, angle = math.pi }) + t.assertAlmostEquals( + actor, + { x = 0, y = 0, speed = 1, angle = math.pi } + ) + + phys.apply(actor, { speed = 1, angle = math.pi / 2 }) + t.assertAlmostEquals( + actor, + { x = 0, y = 0, speed = math.sqrt(2), angle = math.pi * 3 / 4 } + ) +end + +os.exit(t.LuaUnit.run()) From f5df91170727fa8695f196310e22270b1b2bd0a8 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Mon, 17 Nov 2025 20:21:42 -0500 Subject: [PATCH 09/25] fix atan issue the love2d that I'm using doesn't have the new atan arity lol --- asteroids/main.lua | 39 +++++++++++++++++++++------------------ asteroids/phys.lua | 6 ++---- asteroids/test_phys.lua | 18 +++++++++++++++++- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/asteroids/main.lua b/asteroids/main.lua index 0bc5df9..cb45bbf 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -1,5 +1,6 @@ local love = require("love") local phys = require("phys") +local inspect = require("inspect") local function initGame() return { @@ -51,7 +52,7 @@ local function initState() } } for _, asteroid in ipairs(asteroids) do - asteroid.angle = love.math.random() * (2 * math.pi) + asteroid.angle = love.math.random() * phys.tau asteroid.stage = #game.asteroids.stages local stage = game.asteroids.stages[asteroid.stage] asteroid.speed = stage.speed @@ -65,11 +66,9 @@ local function initState() ship = { x = game.width / 2, y = game.height / 2, - angle = 3 * math.pi / 2, - speed = { - x = 0, - y = 0, - }, + angle = 0, + facing = phys.tau * 3 / 4, + speed = 0, radius = game.ship.radius, }, bullets = {}, @@ -100,14 +99,14 @@ end function love.update(dt) if state.controls.joystick ~= nil then local thrust = state.controls.joystick:getGamepadAxis('triggerright') * game.controls.ship.maxThrust - state.ship.speed.x = state.ship.speed.x + math.cos(state.ship.angle) * thrust * dt - state.ship.speed.y = state.ship.speed.y + math.sin(state.ship.angle) * thrust * dt + if thrust > 0 then + phys.apply(state.ship, { speed = thrust * dt, angle = state.ship.facing }) + end local spin = state.controls.joystick:getGamepadAxis('leftx') * game.controls.ship.turnRate - state.ship.angle = (state.ship.angle + spin * dt) % (2 * math.pi) + state.ship.facing = (state.ship.facing + spin * dt) % phys.tau end - state.ship.x = (state.ship.x + state.ship.speed.x * dt) % game.width - state.ship.y = (state.ship.y + state.ship.speed.y * dt) % game.height + update(state.ship, dt) for bulletIndex = #state.bullets, 1, -1 do local bullet = state.bullets[bulletIndex] @@ -159,7 +158,7 @@ function love.update(dt) end if #state.asteroids == 0 then - reset() + --reset() end end @@ -169,10 +168,11 @@ function love.gamepadpressed(joystick, button) end if button == "b" then -- debounce, perhaps + -- include ship velocity, perhaps local bullet = { - x = state.ship.x + math.cos(state.ship.angle) * game.ship.radius, - y = state.ship.y + math.sin(state.ship.angle) * game.ship.radius, - angle = state.ship.angle, + x = state.ship.x + math.cos(state.ship.facing) * game.ship.radius, + y = state.ship.y + math.sin(state.ship.facing) * game.ship.radius, + angle = state.ship.facing, speed = game.ship.bullet.speed, radius = game.ship.bullet.radius, timeLeft = game.ship.bullet.time, @@ -180,8 +180,11 @@ function love.gamepadpressed(joystick, button) } table.insert(state.bullets, bullet) bullet.sound:play() - state.ship.speed.x = state.ship.speed.x + math.cos(state.ship.angle) * game.ship.bullet.recoil - state.ship.speed.y = state.ship.speed.y + math.sin(state.ship.angle) * game.ship.bullet.recoil + --state.ship.speed.x = state.ship.speed.x + math.cos(state.ship.angle) * game.ship.bullet.recoil + --state.ship.speed.y = state.ship.speed.y + math.sin(state.ship.angle) * game.ship.bullet.recoil + end + if button == "x" then + print(inspect(state.ship)) end end @@ -195,7 +198,7 @@ function love.draw() love.graphics.draw(game.ship.sprite, state.ship.x, state.ship.y, - (state.ship.angle + math.pi / 2) % (math.pi * 2), + (state.ship.facing + math.pi / 2) % (math.pi * 2), scale, scale, game.ship.sprite:getWidth() / 2, diff --git a/asteroids/phys.lua b/asteroids/phys.lua index e337f8a..b850788 100644 --- a/asteroids/phys.lua +++ b/asteroids/phys.lua @@ -19,12 +19,10 @@ function phys.update(actor, dt) end function phys.rotate(actor, angle) - actor.angle = (actor.angle + angle) % phys.tau + actor.facing = (actor.facing + angle) % phys.tau end function phys.apply(actor, force) - assert(actor.speed >= 0) - assert(force.speed >= 0) local ax = math.cos(actor.angle) * actor.speed local ay = math.sin(actor.angle) * actor.speed local fx = math.cos(force.angle) * force.speed @@ -33,7 +31,7 @@ function phys.apply(actor, force) local y = ay + fy local speed = math.sqrt(x ^ 2 + y ^ 2) - local angle = math.atan(y, x) % phys.tau + local angle = math.atan2(y, x) % phys.tau actor.speed = speed actor.angle = angle end diff --git a/asteroids/test_phys.lua b/asteroids/test_phys.lua index 7909584..41891a2 100644 --- a/asteroids/test_phys.lua +++ b/asteroids/test_phys.lua @@ -26,7 +26,23 @@ function TestApply() phys.apply(actor, { speed = 1, angle = math.pi / 2 }) t.assertAlmostEquals( actor, - { x = 0, y = 0, speed = math.sqrt(2), angle = math.pi * 3 / 4 } + { x = 0, y = 0, speed = math.sqrt(2), angle = math.pi * 3 / 4 }) + + actor = { x = 0, y = 0, speed = 0, angle = 0 } + phys.apply(actor, { speed = 1, angle = math.pi / 2 }) + t.assertAlmostEquals( + actor, + { x = 0, y = 0, speed = 1, angle = math.pi / 2 }) + + phys.apply(actor, { speed = 1, angle = math.pi / 2 }) + t.assertAlmostEquals( + actor, + { x = 0, y = 0, speed = 2, angle = math.pi / 2 }) + + phys.apply(actor, { speed = 1, angle = math.pi }) + t.assertAlmostEquals( + actor, + { x = 0, y = 0, speed = 0, angle = 0 } ) end From 5bcf22a6f8dce820f0d978703ae6bc74a75b233f Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Mon, 17 Nov 2025 20:31:14 -0500 Subject: [PATCH 10/25] bullet recoil, use tau --- asteroids/main.lua | 15 +++++++-------- asteroids/phys.lua | 6 +----- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/asteroids/main.lua b/asteroids/main.lua index cb45bbf..1f50818 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -10,7 +10,7 @@ local function initGame() radius = 30, bullet = { radius = 5, - recoil = -10, + recoil = 10, speed = 500, time = 4, sound = love.sound.newSoundData('resources/bullet.mp3'), @@ -104,7 +104,7 @@ function love.update(dt) end local spin = state.controls.joystick:getGamepadAxis('leftx') * game.controls.ship.turnRate - state.ship.facing = (state.ship.facing + spin * dt) % phys.tau + state.ship.facing = (state.ship.facing + spin * dt) end update(state.ship, dt) @@ -121,8 +121,8 @@ function love.update(dt) if phys.intersects(bullet, asteroid) then table.remove(state.bullets, bulletIndex) if asteroid.stage > 1 then - local angle1 = love.math.random() * (2 * math.pi) - local angle2 = (angle1 - math.pi) % (2 * math.pi) + local angle1 = love.math.random() * phys.tau + local angle2 = angle1 - phys.tau / 2 local radius = game.asteroids.stages[asteroid.stage - 1].radius local speed = game.asteroids.stages[asteroid.stage - 1].speed table.insert(state.asteroids, { @@ -158,7 +158,7 @@ function love.update(dt) end if #state.asteroids == 0 then - --reset() + reset() end end @@ -180,8 +180,7 @@ function love.gamepadpressed(joystick, button) } table.insert(state.bullets, bullet) bullet.sound:play() - --state.ship.speed.x = state.ship.speed.x + math.cos(state.ship.angle) * game.ship.bullet.recoil - --state.ship.speed.y = state.ship.speed.y + math.sin(state.ship.angle) * game.ship.bullet.recoil + phys.apply(state.ship, { speed = game.ship.bullet.recoil, angle = state.ship.facing + phys.tau / 2 }) end if button == "x" then print(inspect(state.ship)) @@ -198,7 +197,7 @@ function love.draw() love.graphics.draw(game.ship.sprite, state.ship.x, state.ship.y, - (state.ship.facing + math.pi / 2) % (math.pi * 2), + (state.ship.facing + phys.tau / 4) % phys.tau, scale, scale, game.ship.sprite:getWidth() / 2, diff --git a/asteroids/phys.lua b/asteroids/phys.lua index b850788..3772423 100644 --- a/asteroids/phys.lua +++ b/asteroids/phys.lua @@ -18,10 +18,6 @@ function phys.update(actor, dt) actor.y = actor.y + math.sin(actor.angle) * dv end -function phys.rotate(actor, angle) - actor.facing = (actor.facing + angle) % phys.tau -end - function phys.apply(actor, force) local ax = math.cos(actor.angle) * actor.speed local ay = math.sin(actor.angle) * actor.speed @@ -31,7 +27,7 @@ function phys.apply(actor, force) local y = ay + fy local speed = math.sqrt(x ^ 2 + y ^ 2) - local angle = math.atan2(y, x) % phys.tau + local angle = math.atan2(y, x) actor.speed = speed actor.angle = angle end From 13bec1a0aa71014c9466aa7710873ddc96ea526c Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Mon, 17 Nov 2025 20:44:11 -0500 Subject: [PATCH 11/25] apply ship velocity to bullets --- asteroids/main.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/asteroids/main.lua b/asteroids/main.lua index 1f50818..0c80ed7 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -34,6 +34,7 @@ local function initGame() } end +-- The constant properties of the game. local game = initGame() local function initState() @@ -79,6 +80,7 @@ local function initState() } end +-- The varying properties of a game being played. local state = {} local function reset() @@ -168,7 +170,6 @@ function love.gamepadpressed(joystick, button) end if button == "b" then -- debounce, perhaps - -- include ship velocity, perhaps local bullet = { x = state.ship.x + math.cos(state.ship.facing) * game.ship.radius, y = state.ship.y + math.sin(state.ship.facing) * game.ship.radius, @@ -178,6 +179,7 @@ function love.gamepadpressed(joystick, button) timeLeft = game.ship.bullet.time, sound = love.audio.newSource(game.ship.bullet.sound), } + phys.apply(bullet, state.ship) table.insert(state.bullets, bullet) bullet.sound:play() phys.apply(state.ship, { speed = game.ship.bullet.recoil, angle = state.ship.facing + phys.tau / 2 }) From eae3659768fe7b1076a7e895132f5ece228ecaad Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Mon, 17 Nov 2025 23:10:15 -0500 Subject: [PATCH 12/25] asteroid sprites, spins and facing for all actors --- asteroids/main.lua | 43 ++++++++++++++---- asteroids/resources/meteorBrown_big1.png | Bin 0 -> 1804 bytes asteroids/resources/meteorBrown_big2.png | Bin 0 -> 2323 bytes asteroids/resources/meteorBrown_big3.png | Bin 0 -> 1713 bytes asteroids/resources/meteorBrown_big4.png | Bin 0 -> 1990 bytes asteroids/resources/meteorBrown_med1.png | Bin 0 -> 982 bytes asteroids/resources/meteorBrown_med3.png | Bin 0 -> 881 bytes asteroids/resources/meteorBrown_small1.png | Bin 0 -> 692 bytes asteroids/resources/meteorBrown_small2.png | Bin 0 -> 667 bytes asteroids/resources/meteorBrown_tiny1.png | Bin 0 -> 461 bytes asteroids/resources/meteorBrown_tiny2.png | Bin 0 -> 371 bytes .../{ship.png => playerShip1_blue.png} | Bin 12 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 asteroids/resources/meteorBrown_big1.png create mode 100644 asteroids/resources/meteorBrown_big2.png create mode 100644 asteroids/resources/meteorBrown_big3.png create mode 100644 asteroids/resources/meteorBrown_big4.png create mode 100644 asteroids/resources/meteorBrown_med1.png create mode 100644 asteroids/resources/meteorBrown_med3.png create mode 100644 asteroids/resources/meteorBrown_small1.png create mode 100644 asteroids/resources/meteorBrown_small2.png create mode 100644 asteroids/resources/meteorBrown_tiny1.png create mode 100644 asteroids/resources/meteorBrown_tiny2.png rename asteroids/resources/{ship.png => playerShip1_blue.png} (100%) diff --git a/asteroids/main.lua b/asteroids/main.lua index 0c80ed7..ccdaccd 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -15,14 +15,14 @@ local function initGame() time = 4, sound = love.sound.newSoundData('resources/bullet.mp3'), }, - sprite = love.graphics.newImage('resources/ship.png'), + sprite = love.graphics.newImage('resources/playerShip1_blue.png'), }, asteroids = { stages = { - { speed = 120, radius = 15 }, - { speed = 70, radius = 30 }, - { speed = 50, radius = 50 }, - { speed = 20, radius = 80 }, + { speed = 120, radius = 15, sprite = love.graphics.newImage('resources/meteorBrown_tiny1.png') }, + { speed = 70, radius = 30, sprite = love.graphics.newImage('resources/meteorBrown_small1.png') }, + { speed = 50, radius = 50, sprite = love.graphics.newImage('resources/meteorBrown_med1.png') }, + { speed = 20, radius = 80, sprite = love.graphics.newImage('resources/meteorBrown_big1.png') }, }, }, controls = { @@ -57,7 +57,10 @@ local function initState() asteroid.stage = #game.asteroids.stages local stage = game.asteroids.stages[asteroid.stage] asteroid.speed = stage.speed + asteroid.facing = math.random() * phys.tau + asteroid.spin = 2 + math.random() * 5 asteroid.radius = stage.radius + asteroid.sprite = stage.sprite end local joystick = nil if love.joystick.getJoystickCount() == 1 then @@ -68,8 +71,9 @@ local function initState() x = game.width / 2, y = game.height / 2, angle = 0, - facing = phys.tau * 3 / 4, speed = 0, + spin = 0, + facing = phys.tau * 3 / 4, radius = game.ship.radius, }, bullets = {}, @@ -125,8 +129,10 @@ function love.update(dt) if asteroid.stage > 1 then local angle1 = love.math.random() * phys.tau local angle2 = angle1 - phys.tau / 2 - local radius = game.asteroids.stages[asteroid.stage - 1].radius - local speed = game.asteroids.stages[asteroid.stage - 1].speed + local stage = game.asteroids.stages[asteroid.stage - 1] + local radius = stage.radius + local speed = stage.speed + local sprite = stage.sprite table.insert(state.asteroids, { x = asteroid.x, y = asteroid.y, @@ -134,6 +140,9 @@ function love.update(dt) stage = asteroid.stage - 1, radius = radius, speed = speed, + facing = math.random() * phys.tau, + spin = 2 + math.random() * 5, + sprite = sprite, }) table.insert(state.asteroids, { x = asteroid.x, @@ -142,6 +151,9 @@ function love.update(dt) stage = asteroid.stage - 1, radius = radius, speed = speed, + facing = math.random() * phys.tau, + spin = 2 + math.random() * 5, + sprite = sprite, }) end table.remove(state.asteroids, asteroidIndex) @@ -178,6 +190,8 @@ function love.gamepadpressed(joystick, button) radius = game.ship.bullet.radius, timeLeft = game.ship.bullet.time, sound = love.audio.newSource(game.ship.bullet.sound), + facing = state.ship.facing, + spin = 0, } phys.apply(bullet, state.ship) table.insert(state.bullets, bullet) @@ -212,8 +226,17 @@ function love.draw() end for _, asteroid in ipairs(state.asteroids) do - love.graphics.setColor(1, 1, 0) - love.graphics.circle('fill', asteroid.x, asteroid.y, game.asteroids.stages[asteroid.stage].radius) + love.graphics.setColor(1, 1, 1) + scale = 2 * asteroid.radius / math.max(asteroid.sprite:getWidth(), asteroid.sprite:getHeight()) + love.graphics.draw(asteroid.sprite, + asteroid.x, + asteroid.y, + asteroid.facing, + scale, + scale, + asteroid.sprite:getWidth() / 2, + asteroid.sprite:getHeight() / 2 + ) end end end diff --git a/asteroids/resources/meteorBrown_big1.png b/asteroids/resources/meteorBrown_big1.png new file mode 100644 index 0000000000000000000000000000000000000000..31e06a4895c2f2b958aa13b664b40a385b3507a4 GIT binary patch literal 1804 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

6hYj}Y z@my*E_|NOp?8Dk5dvh}^(2zyK!HLDgoA8Zv--!+20zeVCqWJM>wgY-7pvmf?fN|PL z_nFur118`mq^>g!e$g?${^D>;|pAs8+FZQRe&jUY$8m6Hk*Bb91`3ln*p}&?}i`Oxj!_PwAf62 z2p2^LbPkVSNN|&klzDAY;5EAajV_y2nnx}`&Kq2x$x{@_VbrDb3UXGJR-^z?Ov~*| zHk*R%%Z}w0U+-TtZXRW_nbzfWo9-^Ewb(+pCjvHe<@QzuvO=JEF)g>Ht%Jg2BkMgKN-kac^^!sZdN*`!IN z!bX|4nf88TZWsxgM=h@)%h=4XqLj_b@d>bN=X`;z`q;%NA2#D*{5oLQ%J~F2ixDPk zaxv>MUzA{u(5gvfQ&z|9H1K(BC-_sFMZQ56u{kz9R>>jCP5j}$P3v~2E(75t@S2z% zh3zQUe@9WYXmdzA&YK+jbN!Z*nO@OxgjGKq# zAbjb&ZP}c(Y)E$6JE8W^4BE5Z^{=YWNIvLzC4DM@@X~bd+ zm}siQt~SA^u0lIF(`_%NQ(2&?x=GPR*?eF#j?PBOQ2Oke)v8I+cEwp>*>-wdUq1BN zMIb54z;;nKJF#p<)MrsrB{xF@<}ME-v9@eQ)#uO$idb8=qUv+Vqj7?rgcz$n`wH51 z>ddm0MW0=s4@XaK@RJS?i#{8l(o*TOzGchxpzAX0v(i@H(E7|DZ-)5;$OvY_ig<=6 zZ`qXy7dNdu^;PnJo|-%+tuZU{ruVW6@nhwk1;Es$?h+S<>>(|Go}Xs001p?MObuGZ)S9N zVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXX Hu0mjfZlqIp literal 0 HcmV?d00001 diff --git a/asteroids/resources/meteorBrown_big4.png b/asteroids/resources/meteorBrown_big4.png new file mode 100644 index 0000000000000000000000000000000000000000..e643572633e8a4fe8c7dd309ada259b6ccc85b7b GIT binary patch literal 1990 zcmV;%2RZnOP)B@ow?;kN(^b{e-7~XNJvj01j;ngUufD44o~5Opzjnu~YkQOByW6K< zcz$VkwfEY2rnY&Of?(W@K#Jef#AP2MtaQv0Y@_$w5UqAPXxv}x; z{AUDe@S3jU52yCD>iBDCSIzAUubXc#kIj!)-!VU5-xCdD?t)Y0dnwcXsahs{M5B-2Bc!Fb2*DAXt~$gJp^z)77U*t*OHxjdzmDIM<%Mv;P#G8-4c+K#t# z`CJVdSTVs^M6h-)UxMRZmaX8k33id=Lv#5d7$LAT4S*}9?3&|UW~=Yy8iO*On7Mqe zmW}$xElFjBJ_R7VV1STu0f3>t1|kc=M>?RC?B}-|=gs|3-!p&SzGxob**1TFeR=kC z(ZN8bM9Mcur~mTNhWY)IP4maCE%WHhZS&Xu2Q$aJ48NoCo#4p1`ktaitFVOfL$0em z#PGf%)i?EdQ>Lg`^}f}fIvA*#_M+quB?2cKP- zIRvX6kW=@&T6aR#0BuDC16cvS0HtXSTtE1Hs}|ScY*#Swz8FE!4hA&VaVGUtU1Lx^ ziM!&l(nFkrVBmfB=REo9Qq(|b1tXf^1NlhQG$4oT7|Qt(l-NP=-I3g2pcSCQ50lXW zJ`kA!=c1&zj$nk|Q8@$yqE}V$QIU_+J-c^vvsDM?77R7@O+`MgnwG#)F2TTJ(h3G! z@DVI=i+r)t&9+TipAxHYD)MpEbjh$3Js9KFwcsKjS521=OD==(lmr9Kv|zy}De@r~ z?^+PF>Qlk$n?_+c?acPDeK*AD`XQK6V2OGUoROIvVaYeKA*ldx z`C;BXs+;_f6!~(5CEwjZ@WlOmaE%0(YImz4>oXN ziPJD@2usg;51f%1X)fM&KLK|Eh*t7>oYDrtQf+gHdJmkD8A;ZWA{dgpK%%B?SgNhK zQjw1{G6QAVmm;4;O`pKhg3}BnMZOYXN!vJT+6zn6d*G<)l3*!iwY3o}QIU_Mruzs> z95vk(me@tUKEe`5O?zR`PabHKni^k{uvQM@u_ZT0HO+#hnB*N}#IXc5&4#5| z5A@{V!VQj_r+iO399)APM?F^-kfB=5G!8W~zOb8ACQ(+LC79*v_#-fcCK zT#yplHwjhKQDG?tdB+|&STu?s!c(DYnqaA|0~S@tJ7$&EC%~FyQXDl+u+-Yg$QtAw zvr6kD*e01&sG2^3r52w_WRtg~*BwJwG|l?~JILZ-G!NT!FGX@#s**PagL|@B3~eEC zro>u@C2jHsOoSE#0V}|Hzz0?|$X~jmC6)x1>U!Rg^<46{b9@8^P6osfbdZxZjslJO zq?P2)AEHxiI2+`cQ-(%jP9K;-=9Q zU#a9>idpAr!`z_ri@!w|#Y0z;-0tsPn#d6R>I*KjaCn^rMZ zLz^0|&vNoz*z76vb6G#=MtN7Uy=BG|xU)i5MaX#dr^e(+@@+Jq{ zt2orb=oB8W;3HbajrwS7YVy{KQKGBibQ YV{c?-a;OG>?f?J)07*qoM6N<$f_^K%Jpcdz literal 0 HcmV?d00001 diff --git a/asteroids/resources/meteorBrown_med1.png b/asteroids/resources/meteorBrown_med1.png new file mode 100644 index 0000000000000000000000000000000000000000..14fa6f5c662c47c759a54d05285bef0837c5ad5d GIT binary patch literal 982 zcmV;{11bE8P)W*-@mVS5{;W>t z%`otepi#{3x3Mdz74j9?WbNXq)2R`y7xR0NS)V;?Hs{X=SeuzJaU0N}QOqA&n>=7c zUPOrq3qtH=W5&E$pBsqRYqRD>y%gZ-(v)ddF9)zU$)@8r;4HD}+=*i=#q3}H`Pp(I zl4w%co7`Tw(2aI>*Gs2c<;m2DhVi^s4D_!i%FaZm9Pzlw5?#@;PN(f`73~buX{*V{gm3Gm$ zx97}{ooWwJ8$TZ}nJ-(F&W3y(VW53UIo+5$=d>ut9z`?^-bF5&b#b7s3|f)p^wsKB zHPO%a7t}<<(e|=0>aR~Z{kU27BI-i6&%S8m_yhG=OO$L6CzK0FJ{SAq~)Y{{Z zODL^&T^u2>FL3~^1in4Ik%%b39W>vf#q5&Z?u8Jc}N>=N?efC9yi4-&yD@kGr zwDyHGJ7n7iVD$oSQXrd?kaZ~#efCwqa^{vxLEspZkaa0KaO!DjD77xGfFt-?m)2t= z?aOWp$w18_dk-q9+E%1}`A7lXxfTL#V%Z>%x?~S}x-QoOq48W_lCj;Fs}vwHiVkZS zu+xF}F;^*oaOs7lYwtRYsC8p#^)=wGQV<&(B}qAcdur3;2EI~|WE&MpqA3#@nH@yl za77C2YTP$kCNcJ)Pc=T0W_(=34J0S#FPX0%%1J}+a&hzpa+7EhB)UMa5oelG;MDAB zk}D**-;_JWF{hMJiRQpecX?!jC=o^yE;rvOJCZI+1{mJa9OMk)-x2s2(RLXv+2$?= z?>&Z(d&tc0j~FfaAW4BA#*LYBQHY?(Nl`%ygD5V|Dlqh9+TGo)^Bip-Ia0000jbVXQnQ*UN;cVTj6 z0AhJAVr*}3WMp|RV{&KQKGBibQV{c?-a;OG>?f?J)07*qoM6N<$ Ef~vIA2mk;8 literal 0 HcmV?d00001 diff --git a/asteroids/resources/meteorBrown_med3.png b/asteroids/resources/meteorBrown_med3.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec2d1ecd7d5f623cba428dd93aa42cb0f22fad4 GIT binary patch literal 881 zcmV-%1CIQOP){GcSMVtuLEw3gVksi`F-Ewx&!wc18Ogd$i$MMbfqqWGyt=n*`E zNAL(9Vch@3XBan|*=J^Fr(JkRX~OJpX8zCHOsRATPq#KU(Y} zFU*45XpW11`?7f2iNv$slz6$?P_{LHNr7X0FOalyS#Vgj&AAIB;Y@}}VT@i>{goRU zgP7oUx^?k<`6?T3l)YG)mOC;4FYh}8!>cjK%G8)QIFn&#@Gc1+%g=F@%ljArt6C(i zZde=@QDWb*h9(U|pP`^(j~6DCW46an9(R&PNMJJTE;%MUq8x@a432qlq@|GrSB@En z-9n}D>Q+O%z0;KT{_d>!xY3gKx$Wm-*Lf#4{(xRNn&yO^<}jx>dvVcvOep`YIdm&^9`O_4EcKC z7)5}qGitpUDhfPr_DmK-Ue2aX;FLW9j&zHcBV5_Ub^Vky$i0i6_R|b7*mk-BNSlZ)9b1s0M%T00000NkvXX Hu0mjfyCb4} literal 0 HcmV?d00001 diff --git a/asteroids/resources/meteorBrown_small1.png b/asteroids/resources/meteorBrown_small1.png new file mode 100644 index 0000000000000000000000000000000000000000..60cf04a504fb8fee8cc2f7cc3968d957906df30b GIT binary patch literal 692 zcmV;l0!#ggP){=8Ji@-d9#1z;Zf0nu81^$23L)PYA#Zr= zCTawHBRe@Ts3b!a1;hJ`50;~&Y;$4EMrn4K={$sB68|U(@meCgEJfJWYSa~HxsZ*M zOpsMm(>7KkBNi!A;YyYd`KtI6B00~`O375H#3ve2n%{Ia2}z09wnGLWN-ILc|16Hq z@PFeEcv-t-BsUpLK<2Hf@^-foV;|LJ_EJf*oAr4m;YD$-L1?PxAcJ*PdAnYVT4bL` z85?i=DfY0nC?zGgI!XZ6RpkvI=gD}yAEw#kc3gN5iaDH$gsSrPyqj<(BfRb{3GeR2 z#v6oY6R-#=WaurraK9N-k^xUU38_=z5i*NZPRON0=qBlD)^IwNBt__=3wXH>Asj3# z4V0Y2p@66y;7%RF+wy|GQ&qB}?o@=b(x9GdPY#u=C~^^rZWF+iu?U0yM3by;ZsqF` zM93}VZl$N%PUZXPaXR4I*5Ful7F{BqtZ7WqSVCv$RO6;DBb*o*O)6P+0H+@$ryLXC zbpWem)rpE6NjZ})T_h_mwK9Ma74=Li@|Kq;8dqrQvQ+~Qqs0n$9Zu9aAVq?CVu~74 zQ-1MF^+mlBK4@zmnXzkDg8)Ye<{=hqR~T+0-K^9OCE ztwCV0(B%LC04;PySaefwW^{L9a%BKwc`jmXZ*OE|c`jped2n=ZE@^FHXJsx>PDe5{ aMQ&qnWMy)w27m4V0000q-Ja81)T$grI-Xk3zSitGQ}nT9zfEg^kMTXTGP1YiYDzf`rls#<4*keA% zUUuUa@GcYP600P%7T~jy0Flq*q!Lftb3);ZOqi=-E~7I+UqNN9jwpcdMCaii3D*;g zieF}}uINW$*|J~6ffB6W7JXA?Z7ZU{>%pS!Jl{0X>FU-Z(`3n`EBd@MFFfDKVsH7M zwJ2z}qHl)@sjcX0wt6LNVS%btP!{h;OE$scUYy--L>x2Mvb9m4e>X)3aVmI_qb`v! zfUG{7n?u?(incL^t5aNM$;9Jsb5?pg0wz%{j^Dy=DO=WiC)oM=~@;Zewp`Wpbznf9?PP002ovPDHLkV1i_? BHT?hp literal 0 HcmV?d00001 diff --git a/asteroids/resources/meteorBrown_tiny1.png b/asteroids/resources/meteorBrown_tiny1.png new file mode 100644 index 0000000000000000000000000000000000000000..69ef3a37738ee7117232271ba9fd4f3db80ce604 GIT binary patch literal 461 zcmV;;0W$uHP)TUVIIl&VJmxMb0PjELw zaV5yx*urH#ND`#DA$LryV}1xn5M3;`t%SU$v+ zQP<;2)yTLo*d7)>>v3igSiqNsJK;14ma0)wG={5ylCXdWg%=2eTnNI*85f)ofk_8% z2>{EuxG*^P!?Fb-0CE{fF$jaQ04Or>6>b2ZEV`?98)&%z001p?MObuGZ)S9NVRB^v zVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXXu0mjf D^53|R literal 0 HcmV?d00001 diff --git a/asteroids/resources/meteorBrown_tiny2.png b/asteroids/resources/meteorBrown_tiny2.png new file mode 100644 index 0000000000000000000000000000000000000000..8a561b542f16a138ae2df52927020639a03d41fc GIT binary patch literal 371 zcmV-(0gV2MP)5r00032Nkl zL!A5n{2;skajvFtgQA>_?ngQp#A7u8WD7`9vZpy%b8~_x7-KicNnPnzvW0ay<+B-PszXCPwOjtoF1g5nq!n3a*v#MzFSkc`&D zT!S1gcx^`qp!kIu0!mbMF>Zuy$Csgy^8*7Z0OTcDEP*l@$WU}O0QSQ!h1ON4WdHyG zEp$a#bW?9;ba!ELWdLG%E@EtNZ)9Y7E@N_eaCC1jX>DO=WiC)oM=~@;Zewp`Wpbzn Rf9?PP002ovPDHLkV1mVGmv;aF literal 0 HcmV?d00001 diff --git a/asteroids/resources/ship.png b/asteroids/resources/playerShip1_blue.png similarity index 100% rename from asteroids/resources/ship.png rename to asteroids/resources/playerShip1_blue.png From 63b296e19c7e9b68307ce531ed66ab43571327a4 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Mon, 17 Nov 2025 23:15:21 -0500 Subject: [PATCH 13/25] spinning asteroids --- asteroids/main.lua | 6 +++--- asteroids/phys.lua | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/asteroids/main.lua b/asteroids/main.lua index ccdaccd..27427fc 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -58,7 +58,7 @@ local function initState() local stage = game.asteroids.stages[asteroid.stage] asteroid.speed = stage.speed asteroid.facing = math.random() * phys.tau - asteroid.spin = 2 + math.random() * 5 + asteroid.spin = 0.1 + math.random() * 0.1 asteroid.radius = stage.radius asteroid.sprite = stage.sprite end @@ -141,7 +141,7 @@ function love.update(dt) radius = radius, speed = speed, facing = math.random() * phys.tau, - spin = 2 + math.random() * 5, + spin = 0.1 + math.random() * 0.1, sprite = sprite, }) table.insert(state.asteroids, { @@ -152,7 +152,7 @@ function love.update(dt) radius = radius, speed = speed, facing = math.random() * phys.tau, - spin = 2 + math.random() * 5, + spin = 0.1 + math.random() * 0.1, sprite = sprite, }) end diff --git a/asteroids/phys.lua b/asteroids/phys.lua index 3772423..5b1e003 100644 --- a/asteroids/phys.lua +++ b/asteroids/phys.lua @@ -10,12 +10,13 @@ function phys.intersects(actor1, actor2) end -- updates the actor's location by applying the passage of time --- TODO spin function phys.update(actor, dt) assert(actor.speed >= 0) local dv = actor.speed * dt actor.x = actor.x + math.cos(actor.angle) * dv actor.y = actor.y + math.sin(actor.angle) * dv + local dr = actor.spin * dt + actor.facing = (actor.facing + dr) % phys.tau end function phys.apply(actor, force) From 21c432f583bc4eed85403e11a1a742086c99350c Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Thu, 20 Nov 2025 20:12:23 -0500 Subject: [PATCH 14/25] explore graphics stack --- asteroids/main.lua | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/asteroids/main.lua b/asteroids/main.lua index 27427fc..b2d0d9e 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -67,6 +67,7 @@ local function initState() joystick = love.joystick.getJoysticks()[1] end return { + debug = true, ship = { x = game.width / 2, y = game.height / 2, @@ -204,21 +205,31 @@ function love.gamepadpressed(joystick, button) end function love.draw() + if state.debug then + love.graphics.setColor(1, 1, 1) + love.graphics.line(game.width / 2, 0, game.width / 2, game.height) + love.graphics.line(0, game.height / 2, game.width, game.height / 2) + end for y = -1, 1 do for x = -1, 1 do love.graphics.origin() love.graphics.translate(x * game.width, y * game.height) + + love.graphics.push() + love.graphics.translate(state.ship.x, state.ship.y) love.graphics.setColor(1, 1, 1) local scale = 2 * game.ship.radius / math.max(game.ship.sprite:getWidth(), game.ship.sprite:getHeight()) love.graphics.draw(game.ship.sprite, - state.ship.x, - state.ship.y, + 0, + 0, (state.ship.facing + phys.tau / 4) % phys.tau, scale, scale, game.ship.sprite:getWidth() / 2, game.ship.sprite:getHeight() / 2 ) + -- TODO rocket exhaust + love.graphics.pop() for _, bullet in ipairs(state.bullets) do love.graphics.setColor(0, 1, 0) From b2b70ee9108bbc4b73fba7549bb5dfb0d5f6b1e9 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Thu, 20 Nov 2025 20:58:15 -0500 Subject: [PATCH 15/25] extract asteroids ctor --- asteroids/actors.lua | 32 ++++++++++++++++++++++++++++++++ asteroids/main.lua | 15 ++++++--------- 2 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 asteroids/actors.lua diff --git a/asteroids/actors.lua b/asteroids/actors.lua new file mode 100644 index 0000000..c0ca225 --- /dev/null +++ b/asteroids/actors.lua @@ -0,0 +1,32 @@ +local phys = require("phys") +local inspect = require("inspect") + +local actors = {} + +function actors.buildActors(game) + local asteroids = {} + local asteroids_mt = { __index = asteroids } + + function asteroids.new(asteroid) + local stage = game.asteroids.stages[asteroid.stage or #game.asteroids.stages] + local instance = { + angle = math.random() * phys.tau, + speed = stage.speed, + facing = math.random() * phys.tau, + spin = (math.random() - 0.5), + radius = stage.radius, + sprite = stage.sprite, + } + for k, v in pairs(asteroid) do + instance[k] = v + end + setmetatable(instance, asteroids_mt) + return instance + end + + return { + asteroids = asteroids, + } +end + +return actors diff --git a/asteroids/main.lua b/asteroids/main.lua index b2d0d9e..43c7c43 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -1,6 +1,7 @@ local love = require("love") local phys = require("phys") local inspect = require("inspect") +local actors = require("actors") local function initGame() return { @@ -38,6 +39,8 @@ end local game = initGame() local function initState() + ---@diagnostic disable-next-line: redefined-local + local actors = actors.buildActors(game) local asteroids = { { x = 100, @@ -52,15 +55,8 @@ local function initState() y = game.height - 100, } } - for _, asteroid in ipairs(asteroids) do - asteroid.angle = love.math.random() * phys.tau - asteroid.stage = #game.asteroids.stages - local stage = game.asteroids.stages[asteroid.stage] - asteroid.speed = stage.speed - asteroid.facing = math.random() * phys.tau - asteroid.spin = 0.1 + math.random() * 0.1 - asteroid.radius = stage.radius - asteroid.sprite = stage.sprite + for i, template in ipairs(asteroids) do + asteroids[i] = actors.asteroids.new(template) end local joystick = nil if love.joystick.getJoystickCount() == 1 then @@ -68,6 +64,7 @@ local function initState() end return { debug = true, + actors = actors, ship = { x = game.width / 2, y = game.height / 2, From c1c774338eb19bfb46f3ab6c1ecf8fefc9cb6e16 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Thu, 20 Nov 2025 21:07:12 -0500 Subject: [PATCH 16/25] reduce asteroid init --- asteroids/actors.lua | 4 +++- asteroids/main.lua | 22 ++++------------------ 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/asteroids/actors.lua b/asteroids/actors.lua index c0ca225..ceb84c1 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -8,7 +8,8 @@ function actors.buildActors(game) local asteroids_mt = { __index = asteroids } function asteroids.new(asteroid) - local stage = game.asteroids.stages[asteroid.stage or #game.asteroids.stages] + local stageIndex = asteroid.stage or #game.asteroids.stages + local stage = game.asteroids.stages[stageIndex] local instance = { angle = math.random() * phys.tau, speed = stage.speed, @@ -20,6 +21,7 @@ function actors.buildActors(game) for k, v in pairs(asteroid) do instance[k] = v end + instance.stage = stageIndex setmetatable(instance, asteroids_mt) return instance end diff --git a/asteroids/main.lua b/asteroids/main.lua index 43c7c43..4d242be 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -127,32 +127,18 @@ function love.update(dt) if asteroid.stage > 1 then local angle1 = love.math.random() * phys.tau local angle2 = angle1 - phys.tau / 2 - local stage = game.asteroids.stages[asteroid.stage - 1] - local radius = stage.radius - local speed = stage.speed - local sprite = stage.sprite - table.insert(state.asteroids, { + table.insert(state.asteroids, state.actors.asteroids.new({ x = asteroid.x, y = asteroid.y, angle = angle1, stage = asteroid.stage - 1, - radius = radius, - speed = speed, - facing = math.random() * phys.tau, - spin = 0.1 + math.random() * 0.1, - sprite = sprite, - }) - table.insert(state.asteroids, { + })) + table.insert(state.asteroids, state.actors.asteroids.new({ x = asteroid.x, y = asteroid.y, angle = angle2, stage = asteroid.stage - 1, - radius = radius, - speed = speed, - facing = math.random() * phys.tau, - spin = 0.1 + math.random() * 0.1, - sprite = sprite, - }) + })) end table.remove(state.asteroids, asteroidIndex) break From 583efe528cf6331bd81c257870ada257b755ac0c Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Thu, 20 Nov 2025 21:26:44 -0500 Subject: [PATCH 17/25] add bullet actor --- asteroids/actors.lua | 46 ++++++++++++++++++++++++++++++++++++++++++++ asteroids/main.lua | 25 +++++------------------- 2 files changed, 51 insertions(+), 20 deletions(-) diff --git a/asteroids/actors.lua b/asteroids/actors.lua index ceb84c1..92c199d 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -1,3 +1,4 @@ +local love = require("love") local phys = require("phys") local inspect = require("inspect") @@ -26,8 +27,53 @@ function actors.buildActors(game) return instance end + function asteroids:draw() + local width = self.sprite:getWidth() + local height = self.sprite:getHeight() + love.graphics.push() + love.graphics.setColor(1, 1, 1) + local scale = 2 * self.radius / math.max(width, height) + love.graphics.draw(self.sprite, + self.x, + self.y, + self.facing, + scale, + scale, + width / 2, + height / 2 + ) + love.graphics.pop() + end + + local bullets = {} + local bullets_mt = { __index = bullets } + + function bullets.new(bullet) + local instance = { + spin = 0, + } + for k, v in pairs(game.ship.bullet) do + instance[k] = v + end + for k, v in pairs(bullet) do + instance[k] = v + end + instance.sound = love.audio.newSource(game.ship.bullet.sound) + instance.timeLeft = instance.time + setmetatable(instance, bullets_mt) + return instance + end + + function bullets:draw() + love.graphics.push() + love.graphics.setColor(0, 1, 0) + love.graphics.circle('fill', self.x, self.y, self.radius) + love.graphics.pop() + end + return { asteroids = asteroids, + bullets = bullets, } end diff --git a/asteroids/main.lua b/asteroids/main.lua index 4d242be..9869fb5 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -166,20 +166,16 @@ function love.gamepadpressed(joystick, button) end if button == "b" then -- debounce, perhaps - local bullet = { + local bullet = state.actors.bullets.new({ x = state.ship.x + math.cos(state.ship.facing) * game.ship.radius, y = state.ship.y + math.sin(state.ship.facing) * game.ship.radius, angle = state.ship.facing, - speed = game.ship.bullet.speed, - radius = game.ship.bullet.radius, - timeLeft = game.ship.bullet.time, - sound = love.audio.newSource(game.ship.bullet.sound), facing = state.ship.facing, - spin = 0, - } + }) phys.apply(bullet, state.ship) table.insert(state.bullets, bullet) bullet.sound:play() + phys.apply(state.ship, { speed = game.ship.bullet.recoil, angle = state.ship.facing + phys.tau / 2 }) end if button == "x" then @@ -215,22 +211,11 @@ function love.draw() love.graphics.pop() for _, bullet in ipairs(state.bullets) do - love.graphics.setColor(0, 1, 0) - love.graphics.circle('fill', bullet.x, bullet.y, game.ship.bullet.radius) + bullet:draw() end for _, asteroid in ipairs(state.asteroids) do - love.graphics.setColor(1, 1, 1) - scale = 2 * asteroid.radius / math.max(asteroid.sprite:getWidth(), asteroid.sprite:getHeight()) - love.graphics.draw(asteroid.sprite, - asteroid.x, - asteroid.y, - asteroid.facing, - scale, - scale, - asteroid.sprite:getWidth() / 2, - asteroid.sprite:getHeight() / 2 - ) + asteroid:draw() end end end From 38af0bcaa1b30585965a477941e17e80707a47f0 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Thu, 20 Nov 2025 21:37:04 -0500 Subject: [PATCH 18/25] add ship actor --- asteroids/actors.lua | 45 ++++++++++++++++++++++++++++++++++++++++++++ asteroids/main.lua | 27 ++------------------------ 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/asteroids/actors.lua b/asteroids/actors.lua index 92c199d..0720d4c 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -71,9 +71,54 @@ function actors.buildActors(game) love.graphics.pop() end + local ships = {} + local ships_mt = { __index = ships } + + function ships.new(ship) + local instance = { + x = game.width / 2, + y = game.height / 2, + angle = 0, + speed = 0, + spin = 0, + facing = phys.tau * 3 / 4, + radius = game.ship.radius, + } + for k, v in pairs(game.ship) do + instance[k] = v + end + for k, v in pairs(ship) do + instance[k] = v + end + setmetatable(instance, ships_mt) + return instance + end + + function ships:draw() + love.graphics.push() + love.graphics.translate(self.x, self.y) + love.graphics.setColor(1, 1, 1) + local width = self.sprite:getWidth() + local height = self.sprite:getHeight() + + local scale = 2 * game.ship.radius / math.max(width, height) + love.graphics.draw(game.ship.sprite, + 0, + 0, + (self.facing + phys.tau / 4) % phys.tau, + scale, + scale, + width / 2, + height / 2 + ) + -- TODO rocket exhaust + love.graphics.pop() + end + return { asteroids = asteroids, bullets = bullets, + ships = ships, } end diff --git a/asteroids/main.lua b/asteroids/main.lua index 9869fb5..5b77da5 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -65,15 +65,7 @@ local function initState() return { debug = true, actors = actors, - ship = { - x = game.width / 2, - y = game.height / 2, - angle = 0, - speed = 0, - spin = 0, - facing = phys.tau * 3 / 4, - radius = game.ship.radius, - }, + ship = actors.ships.new({}), bullets = {}, asteroids = asteroids, controls = { @@ -193,22 +185,7 @@ function love.draw() for x = -1, 1 do love.graphics.origin() love.graphics.translate(x * game.width, y * game.height) - - love.graphics.push() - love.graphics.translate(state.ship.x, state.ship.y) - love.graphics.setColor(1, 1, 1) - local scale = 2 * game.ship.radius / math.max(game.ship.sprite:getWidth(), game.ship.sprite:getHeight()) - love.graphics.draw(game.ship.sprite, - 0, - 0, - (state.ship.facing + phys.tau / 4) % phys.tau, - scale, - scale, - game.ship.sprite:getWidth() / 2, - game.ship.sprite:getHeight() / 2 - ) - -- TODO rocket exhaust - love.graphics.pop() + state.ship:draw() for _, bullet in ipairs(state.bullets) do bullet:draw() From e2fe2499d47e9044cd9276a698975effb8f60a96 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Thu, 20 Nov 2025 21:42:14 -0500 Subject: [PATCH 19/25] add throttle --- asteroids/actors.lua | 1 + asteroids/main.lua | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/asteroids/actors.lua b/asteroids/actors.lua index 0720d4c..31f2cf4 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -83,6 +83,7 @@ function actors.buildActors(game) spin = 0, facing = phys.tau * 3 / 4, radius = game.ship.radius, + throttle = 0, } for k, v in pairs(game.ship) do instance[k] = v diff --git a/asteroids/main.lua b/asteroids/main.lua index 5b77da5..e45fcb5 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -17,6 +17,7 @@ local function initGame() sound = love.sound.newSoundData('resources/bullet.mp3'), }, sprite = love.graphics.newImage('resources/playerShip1_blue.png'), + maxThrust = 200, }, asteroids = { stages = { @@ -29,7 +30,6 @@ local function initGame() controls = { ship = { turnRate = 10, - maxThrust = 200, }, }, } @@ -94,9 +94,10 @@ end function love.update(dt) if state.controls.joystick ~= nil then - local thrust = state.controls.joystick:getGamepadAxis('triggerright') * game.controls.ship.maxThrust - if thrust > 0 then - phys.apply(state.ship, { speed = thrust * dt, angle = state.ship.facing }) + state.ship.throttle = state.controls.joystick:getGamepadAxis('triggerright') + if state.ship.throttle > 0 then + local speed = state.ship.throttle * state.ship.maxThrust * dt + phys.apply(state.ship, { speed = speed, angle = state.ship.facing }) end local spin = state.controls.joystick:getGamepadAxis('leftx') * game.controls.ship.turnRate From 7eee00d7ead3889994c3c49b12b55c2482723069 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Thu, 20 Nov 2025 22:07:03 -0500 Subject: [PATCH 20/25] add engine burn --- asteroids/actors.lua | 3 +++ asteroids/main.lua | 18 ++++++++++++++++++ asteroids/resources/enginehum3.ogg | Bin 0 -> 367605 bytes 3 files changed, 21 insertions(+) create mode 100644 asteroids/resources/enginehum3.ogg diff --git a/asteroids/actors.lua b/asteroids/actors.lua index 31f2cf4..df15fd4 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -91,6 +91,9 @@ function actors.buildActors(game) for k, v in pairs(ship) do instance[k] = v end + instance.engineSound = love.audio.newSource(instance.engineSound) + instance.engineSound:setVolume(0) + instance.engineSound:setLooping(true) setmetatable(instance, ships_mt) return instance end diff --git a/asteroids/main.lua b/asteroids/main.lua index e45fcb5..f2cfbf8 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -18,6 +18,7 @@ local function initGame() }, sprite = love.graphics.newImage('resources/playerShip1_blue.png'), maxThrust = 200, + engineSound = love.sound.newSoundData('resources/enginehum3.ogg'), }, asteroids = { stages = { @@ -78,6 +79,12 @@ end local state = {} local function reset() + if state.ship then + state.ship.engineSound:stop() + for _, bullet in ipairs(state.bullets) do + bullet.sound:stop() + end + end state = initState() end @@ -98,6 +105,17 @@ function love.update(dt) if state.ship.throttle > 0 then local speed = state.ship.throttle * state.ship.maxThrust * dt phys.apply(state.ship, { speed = speed, angle = state.ship.facing }) + if not state.ship.engineSound:isPlaying() then + state.ship.engineSound:play() + end + end + state.ship.engineSound:setVolume(state.ship.throttle * 0.5) + -- TODO which is better, keeping the sound playing looping at 0 or checking the + -- state each update? + if state.ship.throttle == 0 then + if state.ship.engineSound:isPlaying() then + state.ship.engineSound:stop() + end end local spin = state.controls.joystick:getGamepadAxis('leftx') * game.controls.ship.turnRate diff --git a/asteroids/resources/enginehum3.ogg b/asteroids/resources/enginehum3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..26d89906f24a4c1b08c8fc9d37f4802322de3f13 GIT binary patch literal 367605 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%0D-D_w*;e8FaZ53FXjT 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 ^6JQMk#M{V+RIF$vRxq`0*Rz7~~1{g(fOB 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νS2=qq^*I{mJn-Gte%SYO;h>M@ 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 Date: Thu, 20 Nov 2025 22:53:33 -0500 Subject: [PATCH 21/25] constant rocket plume --- asteroids/actors.lua | 27 ++++++++++++++++++++++++++- asteroids/main.lua | 2 ++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/asteroids/actors.lua b/asteroids/actors.lua index df15fd4..20e118b 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -94,6 +94,22 @@ function actors.buildActors(game) instance.engineSound = love.audio.newSource(instance.engineSound) instance.engineSound:setVolume(0) instance.engineSound:setLooping(true) + instance.rocketPlume = love.graphics.newParticleSystem(instance.rocketPlume) + instance.rocketPlume:setColors(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) + instance.rocketPlume:setSizes(1.0, 0.9, 0.1) + instance.rocketPlume:setEmissionRate(1000) + -- TODO probably governed most by thrust + instance.rocketPlume:setParticleLifetime(0.1, 0.25) + instance.rocketPlume:setEmissionArea('normal', 10, 10) + instance.rocketPlume:setSpeed(150, 300) + instance.rocketPlume:setRadialAcceleration(40, 80) + instance.rocketPlume:setLinearDamping(0, 0) + instance.rocketPlume:setDirection(phys.tau * 3 / 4) + instance.rocketPlume:setSpread(0) + instance.rocketPlume:setSizeVariation(0) + instance.rocketPlume:setSpin(0.5, 1) + instance.rocketPlume:setTangentialAcceleration(0, 0) + setmetatable(instance, ships_mt) return instance end @@ -115,7 +131,16 @@ function actors.buildActors(game) width / 2, height / 2 ) - -- TODO rocket exhaust + --self.rocketPlume:setDirection(phys.tau * 3 / 4) + love.graphics.draw(self.rocketPlume, + 0, + 0, + (self.facing + phys.tau * 3 / 4) % phys.tau, + scale, + scale, + 0, + height * 0.75 + ) love.graphics.pop() end diff --git a/asteroids/main.lua b/asteroids/main.lua index f2cfbf8..830779b 100644 --- a/asteroids/main.lua +++ b/asteroids/main.lua @@ -19,6 +19,7 @@ local function initGame() sprite = love.graphics.newImage('resources/playerShip1_blue.png'), maxThrust = 200, engineSound = love.sound.newSoundData('resources/enginehum3.ogg'), + rocketPlume = love.graphics.newImage('resources/sparkle_cloud.png'), }, asteroids = { stages = { @@ -100,6 +101,7 @@ local function update(actor, dt) end function love.update(dt) + state.ship.rocketPlume:update(dt) if state.controls.joystick ~= nil then state.ship.throttle = state.controls.joystick:getGamepadAxis('triggerright') if state.ship.throttle > 0 then From e8363338c8b1a8d1daf10e4d942077dba15ac9f9 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Thu, 20 Nov 2025 23:28:48 -0500 Subject: [PATCH 22/25] throttle governed rocket plume --- asteroids/actors.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asteroids/actors.lua b/asteroids/actors.lua index 20e118b..f6a8708 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -131,7 +131,7 @@ function actors.buildActors(game) width / 2, height / 2 ) - --self.rocketPlume:setDirection(phys.tau * 3 / 4) + self.rocketPlume:setEmissionRate(1000 * self.throttle) love.graphics.draw(self.rocketPlume, 0, 0, From e8e4ba9d043b1cb1b3d52f08d856839e25a8a479 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Fri, 21 Nov 2025 22:32:03 -0500 Subject: [PATCH 23/25] better rocket plume --- asteroids/actors.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/asteroids/actors.lua b/asteroids/actors.lua index f6a8708..ce81b9e 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -95,12 +95,16 @@ function actors.buildActors(game) instance.engineSound:setVolume(0) instance.engineSound:setLooping(true) instance.rocketPlume = love.graphics.newParticleSystem(instance.rocketPlume) - instance.rocketPlume:setColors(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) + instance.rocketPlume:setColors( + 0.37, 0.65, 1.00, 0.8, + 0.45, 0.65, 0.9, 0.8, + 0.5, 0.6, 0.85, 0.8 + ) instance.rocketPlume:setSizes(1.0, 0.9, 0.1) instance.rocketPlume:setEmissionRate(1000) -- TODO probably governed most by thrust instance.rocketPlume:setParticleLifetime(0.1, 0.25) - instance.rocketPlume:setEmissionArea('normal', 10, 10) + instance.rocketPlume:setEmissionArea('normal', 1.5, 1.5) instance.rocketPlume:setSpeed(150, 300) instance.rocketPlume:setRadialAcceleration(40, 80) instance.rocketPlume:setLinearDamping(0, 0) @@ -139,7 +143,7 @@ function actors.buildActors(game) scale, scale, 0, - height * 0.75 + height * 0.6 ) love.graphics.pop() end From c1bf95005e1db6a0f56eb2ea447c8e4e1489af74 Mon Sep 17 00:00:00 2001 From: Donald Ball Date: Fri, 21 Nov 2025 23:34:14 -0500 Subject: [PATCH 24/25] add rocket plume particle sprite --- asteroids/resources/sparkle_cloud.png | Bin 0 -> 739 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 asteroids/resources/sparkle_cloud.png diff --git a/asteroids/resources/sparkle_cloud.png b/asteroids/resources/sparkle_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..fb4cfabfae981e8034b361adf2e711bdb64cb497 GIT binary patch literal 739 zcmV<90v!E`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00L7UzOH@%5M`xPM$xOp6jYQL4 zj*rQFWDlhfv@#JPiqtI27Yb5>_@NM~zW85HYmH~?ILw8`z4ttR`*HR@naZbBDrF%D zbx;p^XoPEU9a_@A^Vzhm_QQgU&;V{~gWGTi9zY)qK!5sot_f-jGpJY1&;!O_&P4qIJ=2>I7=xEE38QIDhAO^YtMQvqm*mQV7eMzPLTs9b&+rKp)qrn} zJb_9B?lZa*FZ}?MuC-Y72EM>5EW>x$1dV9SH80>D%)mV`pQneR+a^3LKLbTSzz_HZ zzu_Cag~y=SS6G2@xB_KC%b*(+a$)32QN28bzo4jsdZd7!>itJB4UG|UJLsJrX>AT% z;Qtor;UD-1N3abV($iP)9Ne#CSp_@66I+6HFpMc!fDJH@d!Xns9KcU79TVW*Uho`p zA!uE_29vIb3L44|7}k4O1I3L(qw}D53R?IUdtSj?U>C#*n>$6#mxAG?CvBJ`;F_oD z+kJ{!KCKGcYP#&8f}Wl^QeYAE)DZW2A<#(wsKhy$ud1A(b9d{beeJLbNEV&SEsTT4AqnQYPXyI_f#Z|_8NX-e#4 zE5!zB3BhVnTTu~(y)-)DDqMoN$pgpS=bcb4>}pXbY$GpEt$OvF<6KJ5InF Date: Fri, 21 Nov 2025 23:37:05 -0500 Subject: [PATCH 25/25] hot pink bullets --- asteroids/actors.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asteroids/actors.lua b/asteroids/actors.lua index ce81b9e..1d2ada6 100644 --- a/asteroids/actors.lua +++ b/asteroids/actors.lua @@ -66,7 +66,7 @@ function actors.buildActors(game) function bullets:draw() love.graphics.push() - love.graphics.setColor(0, 1, 0) + love.graphics.setColor(1, 0.16, 1) love.graphics.circle('fill', self.x, self.y, self.radius) love.graphics.pop() end