| 
									
										
										
										
											2020-02-11 20:36:48 +08:00
										 |  |  | -- Copyright (C) 2019-2020  Igara Studio S.A. | 
					
						
							| 
									
										
										
										
											2019-04-19 09:34:27 +08:00
										 |  |  | -- | 
					
						
							|  |  |  | -- This file is released under the terms of the MIT license. | 
					
						
							|  |  |  | -- Read LICENSE.txt for more information. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function expect_eq(a, b) | 
					
						
							|  |  |  |   if a ~= b then | 
					
						
							|  |  |  |     print(debug.traceback()) | 
					
						
							|  |  |  |     print('Expected A == B but:') | 
					
						
							|  |  |  |     print(' - Value A = ' .. tostring(a)) | 
					
						
							|  |  |  |     print(' - Value B = ' .. tostring(b)) | 
					
						
							|  |  |  |     assert(a == b) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-11 20:36:48 +08:00
										 |  |  | local function dump_img(image) | 
					
						
							|  |  |  |   local w = image.width | 
					
						
							|  |  |  |   local h = image.height | 
					
						
							|  |  |  |   print('Image(' .. tostring(w) .. 'x' .. tostring(h) .. ') = {') | 
					
						
							|  |  |  |   for v=0,h-1 do | 
					
						
							|  |  |  |     local lineStr = '  ' | 
					
						
							|  |  |  |     for u=0,w-1 do | 
					
						
							|  |  |  |       lineStr = lineStr .. image:getPixel(u, v) .. ',' | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     print(lineStr) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  |   print('}') | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-19 09:34:27 +08:00
										 |  |  | function expect_img(image, expectedPixels) | 
					
						
							|  |  |  |   local w = image.width | 
					
						
							|  |  |  |   local h = image.height | 
					
						
							| 
									
										
										
										
											2019-08-14 05:25:37 +08:00
										 |  |  |   if w*h ~= #expectedPixels then | 
					
						
							|  |  |  |     print(debug.traceback()) | 
					
						
							| 
									
										
										
										
											2023-01-07 02:47:38 +08:00
										 |  |  |     print('Expected pixels: #=' .. #expectedPixels) | 
					
						
							| 
									
										
										
										
											2021-05-21 03:37:33 +08:00
										 |  |  |     print('Image size: w=' .. w .. ' h=' .. h .. ' #=' .. w*h) | 
					
						
							| 
									
										
										
										
											2020-02-11 20:36:48 +08:00
										 |  |  |     dump_img(image) | 
					
						
							| 
									
										
										
										
											2019-08-14 05:25:37 +08:00
										 |  |  |     assert(w*h == #expectedPixels) | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2019-04-19 09:34:27 +08:00
										 |  |  |   for y=0,h-1 do | 
					
						
							|  |  |  |     for x=0,w-1 do | 
					
						
							|  |  |  |       local value = image:getPixel(x, y) | 
					
						
							|  |  |  |       local expected = expectedPixels[1+y*w+x] | 
					
						
							|  |  |  |       if value ~= expected then | 
					
						
							| 
									
										
										
										
											2020-02-11 20:36:48 +08:00
										 |  |  | 	dump_img(image) | 
					
						
							| 
									
										
										
										
											2019-04-19 09:34:27 +08:00
										 |  |  |         print('In pixel (' .. x .. ', ' .. y .. '):') | 
					
						
							| 
									
										
										
										
											2019-07-18 22:46:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	local a = value | 
					
						
							|  |  |  | 	local b = expected | 
					
						
							|  |  |  | 	print(debug.traceback()) | 
					
						
							|  |  |  | 	print('Expected A == B but:') | 
					
						
							|  |  |  | 	if image.colorMode == ColorMode.RGB then | 
					
						
							|  |  |  | 	  print(string.format(' - Value A = rgba(%d,%d,%d,%d)', | 
					
						
							|  |  |  | 			      app.pixelColor.rgbaR(a), | 
					
						
							|  |  |  | 			      app.pixelColor.rgbaG(a), | 
					
						
							|  |  |  | 			      app.pixelColor.rgbaB(a), | 
					
						
							|  |  |  | 			      app.pixelColor.rgbaA(a))) | 
					
						
							|  |  |  | 	  print(string.format(' - Value B = rgba(%d,%d,%d,%d)', | 
					
						
							|  |  |  | 			      app.pixelColor.rgbaR(b), | 
					
						
							|  |  |  | 			      app.pixelColor.rgbaG(b), | 
					
						
							|  |  |  | 			      app.pixelColor.rgbaB(b), | 
					
						
							|  |  |  | 			      app.pixelColor.rgbaA(b))) | 
					
						
							| 
									
										
										
										
											2020-02-11 20:36:48 +08:00
										 |  |  | 	elseif image.colorMode == ColorMode.GRAY then | 
					
						
							| 
									
										
										
										
											2019-07-18 22:46:42 +08:00
										 |  |  | 	  print(string.format(' - Value A = gray(%d,%d)', | 
					
						
							| 
									
										
										
										
											2020-05-21 05:17:17 +08:00
										 |  |  | 			      app.pixelColor.grayaV(a), | 
					
						
							|  |  |  | 			      app.pixelColor.grayaA(a))) | 
					
						
							| 
									
										
										
										
											2019-07-18 22:46:42 +08:00
										 |  |  | 	  print(string.format(' - Value B = gray(%d,%d)', | 
					
						
							| 
									
										
										
										
											2020-05-21 05:17:17 +08:00
										 |  |  | 			      app.pixelColor.grayaV(b), | 
					
						
							|  |  |  | 			      app.pixelColor.grayaA(b))) | 
					
						
							| 
									
										
										
										
											2019-07-18 22:46:42 +08:00
										 |  |  | 	else | 
					
						
							|  |  |  | 	  print(' - Value A = ' .. tostring(a)) | 
					
						
							|  |  |  | 	  print(' - Value B = ' .. tostring(b)) | 
					
						
							|  |  |  | 	end | 
					
						
							|  |  |  | 	assert(a == b) | 
					
						
							| 
									
										
										
										
											2019-04-19 09:34:27 +08:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2019-08-14 05:25:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-21 03:37:33 +08:00
										 |  |  | function expect_img_msg(image, expectedPixels, msg) | 
					
						
							|  |  |  |   local status, err = pcall(expect_img, image, expectedPixels) | 
					
						
							|  |  |  |   if not status then | 
					
						
							|  |  |  |     print(msg) | 
					
						
							|  |  |  |     error(err) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-14 05:25:37 +08:00
										 |  |  | function array_to_pixels(array, image) | 
					
						
							|  |  |  |   local w = image.width | 
					
						
							|  |  |  |   local h = image.height | 
					
						
							|  |  |  |   assert(w*h == #array) | 
					
						
							|  |  |  |   local i = 1 | 
					
						
							|  |  |  |   for y=0,h-1 do | 
					
						
							|  |  |  |     for x=0,w-1 do | 
					
						
							|  |  |  |       image:drawPixel(x, y, array[i]) | 
					
						
							|  |  |  |       i = i+1 | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2019-08-30 04:07:49 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | -- Returns true if the given array (layers) of layers | 
					
						
							|  |  |  | function expect_rendered_layers(expectedImage, sprite, layerNames, frame) | 
					
						
							|  |  |  |   function contains_layer(name) | 
					
						
							|  |  |  |     for _,n in ipairs(layerNames) do | 
					
						
							|  |  |  |       if name == n then return true end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     return false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if frame == nil then frame = 1 end | 
					
						
							|  |  |  |   local render = Image(sprite.spec) | 
					
						
							|  |  |  |   function render_layers(prefix, layers) | 
					
						
							|  |  |  |     for _,layer in ipairs(layers) do | 
					
						
							|  |  |  |       if layer.isGroup then | 
					
						
							|  |  |  | 	render_layers(layer.name.."/", layer.layers) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       if contains_layer(prefix..layer.name) then | 
					
						
							|  |  |  | 	local cel = layer:cel(frame) | 
					
						
							|  |  |  | 	if cel then | 
					
						
							|  |  |  | 	  render:drawImage(cel.image, cel.position) | 
					
						
							|  |  |  | 	end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   render_layers("", sprite.layers) | 
					
						
							|  |  |  |   if not expectedImage:isEqual(render) then | 
					
						
							|  |  |  |     print("Rendering:") | 
					
						
							|  |  |  |     for _,n in ipairs(layerNames) do | 
					
						
							|  |  |  |       print("  - " .. n) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     error("render doesn't match to the expected image") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2023-01-07 02:47:38 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | -- Asserts that the passed sprites are equals without taking | 
					
						
							|  |  |  | -- into account: | 
					
						
							|  |  |  | -- * User data custom properties. | 
					
						
							|  |  |  | -- * Filename. | 
					
						
							|  |  |  | -- * Pixel ratio. | 
					
						
							|  |  |  | -- * Grid bounds. | 
					
						
							|  |  |  | function assert_sprites_eq(expectedSprite, sprite) | 
					
						
							|  |  |  |   assert(expectedSprite.width == sprite.width) | 
					
						
							|  |  |  |   assert(expectedSprite.height == sprite.height) | 
					
						
							|  |  |  |   assert(expectedSprite.colorMode == sprite.colorMode) | 
					
						
							|  |  |  |   assert(expectedSprite.transparentColor == sprite.transparentColor) | 
					
						
							|  |  |  |   assert_layers_eq(expectedSprite.layers, sprite.layers) | 
					
						
							|  |  |  |   assert_frames_eq(expectedSprite.frames, sprite.frames) | 
					
						
							|  |  |  |   assert_tags_eq(expectedSprite.tags, sprite.tags) | 
					
						
							|  |  |  |   assert_slices_eq(expectedSprite.slices, sprite.slices) | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function assert_layers_eq(expectedLayers, layers) | 
					
						
							|  |  |  |   assert(#expectedLayers == #layers) | 
					
						
							|  |  |  |   for i = 1,#layers do | 
					
						
							|  |  |  |     assert_layer_eq(expectedLayers[i], layers[i]) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function assert_layer_eq(expectedLayer, layer) | 
					
						
							|  |  |  |   assert(expectedLayer.name == layer.name) | 
					
						
							|  |  |  |   assert(expectedLayer.opacity == layer.opacity) | 
					
						
							|  |  |  |   assert(expectedLayer.blendMode == layer.blendMode) | 
					
						
							|  |  |  |   assert(expectedLayer.stackIndex == layer.stackIndex) | 
					
						
							|  |  |  |   assert(expectedLayer.isGroup == layer.isGroup) | 
					
						
							|  |  |  |   assert(expectedLayer.isImage == layer.isImage) | 
					
						
							|  |  |  |   assert(expectedLayer.isTransparent == layer.isTransparent) | 
					
						
							|  |  |  |   assert(expectedLayer.isGroup == layer.isGroup) | 
					
						
							|  |  |  |   assert(expectedLayer.isBackground == layer.isBackground) | 
					
						
							|  |  |  |   assert(expectedLayer.isContinuous == layer.isContinuous) | 
					
						
							|  |  |  |   assert(expectedLayer.isReference == layer.isReference) | 
					
						
							|  |  |  |   assert(expectedLayer.color == layer.color) | 
					
						
							|  |  |  |   assert(expectedLayer.data == layer.data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if expectedLayer.isGroup then | 
					
						
							|  |  |  |     assert_layers_eq(expectedLayer.layers, layer.layers); | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     assert_cels_eq(expectedLayer.cels, layer.cels) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function assert_frames_eq(expectedFrames, frames) | 
					
						
							|  |  |  |   assert(#expectedFrames == #frames) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for i = 1,#frames do | 
					
						
							|  |  |  |     assert(expectedFrames[i].frameNumber == frames[i].frameNumber) | 
					
						
							|  |  |  |     assert(expectedFrames[i].duration == frames[i].duration) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function assert_cels_eq(expectedCels, cels) | 
					
						
							|  |  |  |   assert(#expectedCels == #cels) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for i = 1,#cels do | 
					
						
							|  |  |  |     local expCel = expectedCels[i] | 
					
						
							|  |  |  |     local cel = cels[i] | 
					
						
							|  |  |  |     assert(expCel.frameNumber == cel.frameNumber) | 
					
						
							|  |  |  |     assert(expCel.bounds.x == cel.bounds.x) | 
					
						
							|  |  |  |     assert(expCel.bounds.y == cel.bounds.y) | 
					
						
							|  |  |  |     assert(expCel.bounds.width == cel.bounds.width) | 
					
						
							|  |  |  |     assert(expCel.bounds.height == cel.bounds.height) | 
					
						
							|  |  |  |     assert(expCel.position.x == cel.position.x) | 
					
						
							|  |  |  |     assert(expCel.position.y == cel.position.y) | 
					
						
							|  |  |  |     assert(expCel.opacity == cel.opacity) | 
					
						
							|  |  |  |     assert(expCel.color == cel.color) | 
					
						
							|  |  |  |     assert(expCel.data == cel.data) | 
					
						
							|  |  |  |     assert(expCel.image:isEqual(cel.image)) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function assert_tags_eq(expectedTags, tags) | 
					
						
							|  |  |  |   assert(#expectedTags == #tags) | 
					
						
							|  |  |  |   for i = 1,#tags do | 
					
						
							|  |  |  |     local expTag = expectedTags[i] | 
					
						
							|  |  |  |     local tag = tags[i] | 
					
						
							|  |  |  |     local a = expTag.fromFrame | 
					
						
							|  |  |  |     local b = tag.fromFrame | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     assert(expTag.fromFrame.frameNumber == tag.fromFrame.frameNumber) | 
					
						
							|  |  |  |     assert(expTag.toFrame.frameNumber == tag.toFrame.frameNumber) | 
					
						
							|  |  |  |     assert(expTag.name == tag.name) | 
					
						
							|  |  |  |     assert(expTag.aniDir == tag.aniDir) | 
					
						
							|  |  |  |     assert(expTag.color == tag.color) | 
					
						
							|  |  |  |     assert(expTag.data == tag.data) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function assert_slices_eq(expectedSlices, slices) | 
					
						
							|  |  |  |   assert(#expectedSlices == #slices) | 
					
						
							|  |  |  |   for i = 1,#slices do | 
					
						
							|  |  |  |     local expSlice = expectedSlices[i] | 
					
						
							|  |  |  |     local slice = slices[i] | 
					
						
							|  |  |  |     assert(expSlice.bounds.x == slice.bounds.x) | 
					
						
							|  |  |  |     assert(expSlice.bounds.y == slice.bounds.y) | 
					
						
							|  |  |  |     assert(expSlice.bounds.width == slice.bounds.width) | 
					
						
							|  |  |  |     assert(expSlice.bounds.height == slice.bounds.height) | 
					
						
							|  |  |  |     assert(expSlice.color == slice.color) | 
					
						
							|  |  |  |     assert(expSlice.data == slice.data) | 
					
						
							|  |  |  |     assert(expSlice.name == slice.name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if expSlice.center == nil or slice.center == nil then | 
					
						
							|  |  |  |       assert(expSlice.center == slice.center) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       assert(expSlice.center.x == slice.center.x) | 
					
						
							|  |  |  |       assert(expSlice.center.y == slice.center.y) | 
					
						
							|  |  |  |       assert(expSlice.center.width == slice.center.width) | 
					
						
							|  |  |  |       assert(expSlice.center.height == slice.center.height) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if expSlice.pivot == nil or slice.pivot == nil then | 
					
						
							|  |  |  |       assert(expSlice.pivot == slice.pivot) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       assert(expSlice.pivot.x == slice.pivot.x) | 
					
						
							|  |  |  |       assert(expSlice.pivot.y == slice.pivot.y) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |