add runner exceptions to readme

This commit is contained in:
ell
2023-11-17 12:19:56 +00:00
parent a8c714bc89
commit 89119c554a
5 changed files with 65 additions and 34 deletions
+23 -9
View File
@@ -20,6 +20,8 @@ TestMethod = {
passed = false, passed = false,
skipped = false, skipped = false,
skipreason = '', skipreason = '',
rgba_tolerance = 0,
pixel_tolerance = 0,
fatal = '', fatal = '',
message = nil, message = nil,
result = {}, result = {},
@@ -92,7 +94,6 @@ TestMethod = {
col[2] = math.floor((col[2]*10)+0.5)/10 col[2] = math.floor((col[2]*10)+0.5)/10
col[3] = math.floor((col[3]*10)+0.5)/10 col[3] = math.floor((col[3]*10)+0.5)/10
col[4] = math.floor((col[4]*10)+0.5)/10 col[4] = math.floor((col[4]*10)+0.5)/10
-- @TODO add some sort pixel tolerance to the coords
self:assertEquals(col[1], tr, 'check pixel r for ' .. i .. ' at ' .. compare_id .. '(' .. label .. ')') self:assertEquals(col[1], tr, 'check pixel r for ' .. i .. ' at ' .. compare_id .. '(' .. label .. ')')
self:assertEquals(col[2], tg, 'check pixel g for ' .. i .. ' at ' .. compare_id .. '(' .. label .. ')') self:assertEquals(col[2], tg, 'check pixel g for ' .. i .. ' at ' .. compare_id .. '(' .. label .. ')')
self:assertEquals(col[3], tb, 'check pixel b for ' .. i .. ' at ' .. compare_id .. '(' .. label .. ')') self:assertEquals(col[3], tb, 'check pixel b for ' .. i .. ' at ' .. compare_id .. '(' .. label .. ')')
@@ -273,20 +274,33 @@ TestMethod = {
) )
local iw = imgdata:getWidth()-2 local iw = imgdata:getWidth()-2
local ih = imgdata:getHeight()-2 local ih = imgdata:getHeight()-2
local tolerance = 0 -- @NOTE could pass in optional tolerance i.e. 1/255 local rgba_tolerance = self.rgba_tolerance * (1/255)
for ix=2,iw do for ix=2,iw do
for iy=2,ih do for iy=2,ih do
local ir, ig, ib, ia = imgdata:getPixel(ix, iy) local ir, ig, ib, ia = imgdata:getPixel(ix, iy)
local er, eg, eb, ea = expected:getPixel(ix, iy) local points = {
{expected:getPixel(ix, iy)}
}
if self.pixel_tolerance > 0 then
table.insert(points, {expected:getPixel(ix-1, iy+1)})
table.insert(points, {expected:getPixel(ix-1, iy)})
table.insert(points, {expected:getPixel(ix-1, iy-1)})
table.insert(points, {expected:getPixel(ix, iy+1)})
table.insert(points, {expected:getPixel(ix, iy-1)})
table.insert(points, {expected:getPixel(ix+1, iy+1)})
table.insert(points, {expected:getPixel(ix+1, iy)})
table.insert(points, {expected:getPixel(ix+1, iy-1)})
end
local has_match_r = false local has_match_r = false
local has_match_g = false local has_match_g = false
local has_match_b = false local has_match_b = false
local has_match_a = false local has_match_a = false
for t=1,9 do for t=1,#points do
if ir >= er - tolerance and ir <= er + tolerance then has_match_r = true; end local epoint = points[t]
if ig >= eg - tolerance and ig <= eg + tolerance then has_match_g = true; end if ir >= epoint[1] - rgba_tolerance and ir <= epoint[1] + rgba_tolerance then has_match_r = true; end
if ib >= eb - tolerance and ib <= eb + tolerance then has_match_b = true; end if ig >= epoint[2] - rgba_tolerance and ig <= epoint[2] + rgba_tolerance then has_match_g = true; end
if ia >= ea - tolerance and ia <= ea + tolerance then has_match_a = true; end if ib >= epoint[3] - rgba_tolerance and ib <= epoint[3] + rgba_tolerance then has_match_b = true; end
if ia >= epoint[4] - rgba_tolerance and ia <= epoint[4] + rgba_tolerance then has_match_a = true; end
end end
local matching = has_match_r and has_match_g and has_match_b and has_match_a local matching = has_match_r and has_match_g and has_match_b and has_match_a
local ymatch = '' local ymatch = ''
@@ -298,7 +312,7 @@ TestMethod = {
local pixel = tostring(ir)..','..tostring(ig)..','..tostring(ib)..','..tostring(ia) local pixel = tostring(ir)..','..tostring(ig)..','..tostring(ib)..','..tostring(ia)
self:assertEquals(true, matching, 'compare image pixel (' .. pixel .. ') at ' .. self:assertEquals(true, matching, 'compare image pixel (' .. pixel .. ') at ' ..
tostring(ix) .. ',' .. tostring(iy) .. ', matching = ' .. ymatch .. tostring(ix) .. ',' .. tostring(iy) .. ', matching = ' .. ymatch ..
', not matching = ' .. nmatch .. ' (' .. self.method .. ')' ', not matching = ' .. nmatch .. ' (' .. self.method .. '-' .. tostring(self.imgs) .. ')'
) )
end end
end end
Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 B

After

Width:  |  Height:  |  Size: 217 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 B

After

Width:  |  Height:  |  Size: 219 B

+14
View File
@@ -121,6 +121,20 @@ Test classes that still need to be written:
--- ---
## Runner Exceptions
The automated tests through Github work for the most part however there are a few exceptions that have to be accounted for due to limitations of the VMs and the graphics emulation used.
These exceptions are either skipped, or handled by using a 1px or 1/255rgba tolerance - when run locally on real hardware, these tests pass fine at the default 0 tolerance.
| Test | OS | Exception | Reason |
| -------------------------- | --------- | ------------------- | ------ |
| love.graphics.points | MacOS | 1px tolerance | Points are offset by 1,1 when drawn |
| love.graphics.setWireframe | MacOS | 1px tolerance | Wireframes are offset by 1,1 when drawn |
| love.graphica.arc | MacOS | Skipped | Arc curves are drawn slightly off at really low scale |
| love.graphics.setLineStyle | Linux | 1rgba tolerance | Rough lines blend differently with the background rgba |
| love.audio.RecordingDevice | All | Skipped | Recording devices can't be emulated on runners |
---
## Future ## Future
- [ ] add BMfont alts for font class tests (Rasterizer + GlyphData) - [ ] add BMfont alts for font class tests (Rasterizer + GlyphData)
- [ ] graphics.isCompressed() should have an example of all compressed files - [ ] graphics.isCompressed() should have an example of all compressed files
+28 -25
View File
@@ -550,7 +550,7 @@ love.test.graphics.Video = function(test)
test:assertObject(stream) test:assertObject(stream)
-- check playing / pausing / seeking -- check playing / pausing / seeking
video:play() video:play()
test:waitFrames(60) test:waitFrames(30) -- 1.5s ish
video:pause() video:pause()
test:assertEquals(1, math.ceil(video:tell()), 'check video playing for 1s') test:assertEquals(1, math.ceil(video:tell()), 'check video playing for 1s')
video:seek(0.2) video:seek(0.2)
@@ -596,12 +596,6 @@ love.test.graphics.arc = function(test)
love.graphics.setColor(1, 1, 1, 1) love.graphics.setColor(1, 1, 1, 1)
love.graphics.setCanvas() love.graphics.setCanvas()
local imgdata1 = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16}) local imgdata1 = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16})
test:assertPixels(imgdata1, {
white = {{11,0},{20,0},{0,13},{0,14},{31,13},{31,14},{15,14}},
black = {{16,14},{16,16},{30,14},{30,16}},
yellow = {{15,15},{15,16},{16,15},{0,15},{4,27},{5,26},{14,17}},
red = {{15,17},{15,31},{17,15},{31,15},{28,26},{27,27}}
}, 'arc pi')
-- draw some arcs with open format -- draw some arcs with open format
love.graphics.setCanvas(canvas) love.graphics.setCanvas(canvas)
love.graphics.clear(0, 0, 0, 1) love.graphics.clear(0, 0, 0, 1)
@@ -610,16 +604,10 @@ love.test.graphics.arc = function(test)
love.graphics.setColor(1, 0, 0, 1) love.graphics.setColor(1, 0, 0, 1)
love.graphics.arc('fill', "open", 16, 16, 16, 0 * (math.pi/180), 180 * (math.pi/180), 10) love.graphics.arc('fill', "open", 16, 16, 16, 0 * (math.pi/180), 180 * (math.pi/180), 10)
love.graphics.setColor(1, 1, 0, 1) love.graphics.setColor(1, 1, 0, 1)
love.graphics.arc('fill', "open", 16, 16, 16, 180 * (math.pi/180), 90 * (math.pi/180), 10) love.graphics.arc('fill', "open", 16, 16, 16, 180 * (math.pi/180), 270 * (math.pi/180), 10)
love.graphics.setColor(1, 1, 1, 1) love.graphics.setColor(1, 1, 1, 1)
love.graphics.setCanvas() love.graphics.setCanvas()
local imgdata2 = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16}) local imgdata2 = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16})
test:assertPixels(imgdata2, {
white = {{11,0},{20,0},{26,4},{5,4},{0,15},{19,31},{31,19}},
black = {{27,5},{27,4},{26,5},{1,15},{31,15}},
yellow = {{0,17},{0,19},{12,31},{14,31},{6,23},{7,24}},
red = {{0,16},{31,16},{31,18},{30,21},{18,31},{15,16},{16,16}}
}, 'arc open')
-- draw some arcs with closed format -- draw some arcs with closed format
love.graphics.setCanvas(canvas) love.graphics.setCanvas(canvas)
love.graphics.clear(0, 0, 0, 1) love.graphics.clear(0, 0, 0, 1)
@@ -632,14 +620,17 @@ love.test.graphics.arc = function(test)
love.graphics.setColor(1, 1, 1, 1) love.graphics.setColor(1, 1, 1, 1)
love.graphics.setCanvas() love.graphics.setCanvas()
local imgdata3 = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16}) local imgdata3 = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16})
test:assertPixels(imgdata3, { if GITHUB_RUNNER == true and love.system.getOS() == 'OS X' then
white = {{11,0},{20,0},{26,4},{5,4},{0,15},{19,31},{31,19}}, -- on macosx runners, the arcs are not drawn as accurately at low res
yellow = {{0,17},{0,19},{12,31},{14,31}}, -- there's a couple pixels different in the curve of the arc but as we
red = {{31,16},{31,18},{30,21},{18,31},{15,16},{16,16}} -- are at such a low resolution I think that can be expected
}, 'arc open') -- on real hardware the test passes fine though
test:compareImg(imgdata1) test:assertEquals(true, true, 'skip test')
test:compareImg(imgdata2) else
test:compareImg(imgdata3) test:compareImg(imgdata1)
test:compareImg(imgdata2)
test:compareImg(imgdata3)
end
end end
@@ -704,7 +695,7 @@ end
love.test.graphics.draw = function(test) love.test.graphics.draw = function(test)
local canvas1 = love.graphics.newCanvas(32, 32) local canvas1 = love.graphics.newCanvas(32, 32)
local canvas2 = love.graphics.newCanvas(32, 32) local canvas2 = love.graphics.newCanvas(32, 32)
local transform = love.math.newTransform() local transform = love.math.newTransform( )
transform:translate(16, 0) transform:translate(16, 0)
transform:scale(0.5, 0.5) transform:scale(0.5, 0.5)
love.graphics.setCanvas(canvas1) love.graphics.setCanvas(canvas1)
@@ -715,7 +706,7 @@ love.test.graphics.draw = function(test)
love.graphics.setCanvas(canvas2) love.graphics.setCanvas(canvas2)
love.graphics.clear(1, 0, 0, 1) love.graphics.clear(1, 0, 0, 1)
-- canvas, scale, shear, transform obj -- canvas, scale, shear, transform obj
love.graphics.draw(canvas1, 0, 0, 0, 0.5, 0.5, 0, 0, 2, 2) love.graphics.draw(canvas1, 0, 0, 0, 1, 1, 0, 0, 2, 2)
love.graphics.draw(canvas1, 0, 16, 0, 0.5, 0.5) love.graphics.draw(canvas1, 0, 16, 0, 0.5, 0.5)
love.graphics.draw(canvas1, 16, 16, 0, 0.5, 0.5) love.graphics.draw(canvas1, 16, 16, 0, 0.5, 0.5)
love.graphics.draw(canvas1, transform) love.graphics.draw(canvas1, transform)
@@ -724,7 +715,7 @@ love.test.graphics.draw = function(test)
test:assertPixels(imgdata, { test:assertPixels(imgdata, {
lovepink = {{23,3},{23,19},{7,19},{0,0},{16,0},{0,16},{16,16}}, lovepink = {{23,3},{23,19},{7,19},{0,0},{16,0},{0,16},{16,16}},
loveblue = {{0,31},{15,17},{15,31},{16,31},{31,17},{31,31},{16,15},{31,15}}, loveblue = {{0,31},{15,17},{15,31},{16,31},{31,17},{31,31},{16,15},{31,15}},
white = {{15, 15},{6,19},{8,19},{22,19},{24,19},{22,3},{24,3}}, white = {{6,19},{8,19},{22,19},{24,19},{22,3},{24,3}},
red = {{0,1},{1,0},{15,0},{15,7},{0,15},{7,15}} red = {{0,1},{1,0},{15,0},{15,7},{0,15},{7,15}}
}, 'drawing') }, 'drawing')
test:compareImg(imgdata) test:compareImg(imgdata)
@@ -853,6 +844,10 @@ love.test.graphics.points = function(test)
love.graphics.setColor(1, 1, 1, 1) love.graphics.setColor(1, 1, 1, 1)
love.graphics.setCanvas() love.graphics.setCanvas()
local imgdata = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16}) local imgdata = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16})
-- on macOS runners points are drawn 1px off from the target
if GITHUB_RUNNER == true and love.system.getOS() == 'OS X' then
test.pixel_tolerance = 1
end
test:compareImg(imgdata) test:compareImg(imgdata)
end end
@@ -1731,6 +1726,10 @@ love.test.graphics.setLineStyle = function(test)
red = {{0,0},{7,0},{15,0}}, red = {{0,0},{7,0},{15,0}},
red07 = {{0,4},{7,4},{15,4}} red07 = {{0,4},{7,4},{15,4}}
}, 'set line style') }, 'set line style')
-- linux runner needs a 1/255 tolerance for the blend between a rough line + bg
if GITHUB_RUNNER == true and love.system.getOS() == 'Linux' then
test.rgba_tolerance = 1
end
test:compareImg(imgdata) test:compareImg(imgdata)
end end
@@ -1876,6 +1875,10 @@ love.test.graphics.setWireframe = function(test)
love.graphics.setCanvas() love.graphics.setCanvas()
love.graphics.setWireframe(false) love.graphics.setWireframe(false)
local imgdata = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16}) local imgdata = love.graphics.readbackTexture(canvas, {16, 0, 0, 0, 16, 16})
-- on macOS runners wireframes are drawn 1px off from the target
if GITHUB_RUNNER == true and love.system.getOS() == 'OS X' then
test.pixel_tolerance = 1
end
test:compareImg(imgdata) test:compareImg(imgdata)
end end
end end