mirror of https://github.com/aseprite/aseprite.git
				
				
				
			
		
			
				
	
	
		
			137 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Lua
		
	
	
	
| -- Copyright (C) 2021  Igara Studio S.A.
 | |
| --
 | |
| -- This file is released under the terms of the MIT license.
 | |
| -- Read LICENSE.txt for more information.
 | |
| 
 | |
| dofile('./test_utils.lua')
 | |
| 
 | |
| -- Test app.events
 | |
| do
 | |
|   local i = 0
 | |
|   local listener = app.events:on('sitechange',
 | |
|                                  function() i = i + 1 end)
 | |
|   assert(i == 0)
 | |
|   local a = Sprite(32, 32)
 | |
|   expect_eq(a, app.activeSprite)
 | |
|   expect_eq(1, i)
 | |
|   local b = Sprite(32, 32)
 | |
|   expect_eq(b, app.activeSprite)
 | |
|   expect_eq(2, i)
 | |
|   app.activeSprite = a
 | |
|   expect_eq(3, i)
 | |
|   app.events:off(listener)
 | |
|   app.activeSprite = b
 | |
|   expect_eq(3, i)
 | |
| end
 | |
| 
 | |
| do
 | |
|   local pref = app.preferences
 | |
|   pref.color_bar.fg_color = Color(0, 0, 0)
 | |
|   pref.color_bar.bg_color = Color(0, 0, 0)
 | |
| 
 | |
|   local fg, bg = 0, 0
 | |
|   local a = app.events:on('fgcolorchange', function() fg = fg + 1 end)
 | |
|   local b = app.events:on('bgcolorchange', function() bg = bg + 1 end)
 | |
|   assert(fg == 0)
 | |
|   assert(bg == 0)
 | |
| 
 | |
|   pref.color_bar.fg_color = Color(255, 0, 0)
 | |
|   pref.color_bar.bg_color = Color(255, 0, 0)
 | |
|   assert(fg == 1)
 | |
|   assert(bg == 1)
 | |
|   pref.color_bar.fg_color = Color(255, 0, 0) -- No change (same color)
 | |
|   assert(fg == 1)
 | |
|   pref.color_bar.fg_color = Color(0, 0, 0)
 | |
|   assert(fg == 2)
 | |
|   app.events:off(a)
 | |
|   app.events:off(b)
 | |
|   pref.color_bar.fg_color = Color(255, 0, 0)
 | |
|   assert(fg == 2)
 | |
| end
 | |
| 
 | |
| -- Test Sprite.events
 | |
| do
 | |
|   local spr = Sprite(32, 64)
 | |
|   local changes = 0
 | |
|   function incChanges() changes = changes + 1 end
 | |
|   spr.events:on('change', incChanges)
 | |
|   expect_eq(0, changes)
 | |
|   spr.width = 64
 | |
|   expect_eq(1, changes)
 | |
|   app.undo()
 | |
|   expect_eq(2, changes)
 | |
|   app.redo()
 | |
|   expect_eq(3, changes)
 | |
|   spr.events:off(incChanges)
 | |
|   app.undo()
 | |
|   expect_eq(3, changes)
 | |
| end
 | |
| 
 | |
| -- Multiple listeners
 | |
| do
 | |
|   local spr = Sprite(2, 2)
 | |
|   local ai, bi = 0, 0
 | |
|   function a() ai = ai + 1 end
 | |
|   function b() bi = bi + 1 end
 | |
| 
 | |
|   spr.events:on('change', a)
 | |
|   spr.events:on('change', b)
 | |
|   spr.width = 4
 | |
|   expect_eq(1, ai)
 | |
|   expect_eq(1, bi)
 | |
| 
 | |
|   spr.events:off(a)
 | |
|   spr.width = 8
 | |
|   expect_eq(1, ai)
 | |
|   expect_eq(2, bi)
 | |
| 
 | |
|   spr.events:off(b)
 | |
|   spr.width = 16
 | |
|   expect_eq(1, ai)
 | |
|   expect_eq(2, bi)
 | |
| end
 | |
| 
 | |
| -- Avoid removing invalid listener when we use Events:off(function)
 | |
| do
 | |
|   local spr = Sprite(2, 2)
 | |
| 
 | |
|   local i = 0
 | |
|   function inc() i = i + 1 end
 | |
|   spr.events:on('change', inc)
 | |
| 
 | |
|   spr.width = 4
 | |
|   expect_eq(1, i)
 | |
| 
 | |
|   app.events:off(inc)
 | |
|   spr.width = 8
 | |
| 
 | |
|   -- If this fails is because app.events:off(inc) removed the sprite
 | |
|   -- listener instead of doing nothing.
 | |
|   expect_eq(2, i)
 | |
| end
 | |
| 
 | |
| -- Accessing Sprite.events when closing the same sprite will call
 | |
| -- push_sprite_events() creating a new app::script::SpriteEvents
 | |
| -- instance again even when we've just destroyed the old one (because
 | |
| -- we're just closing the sprite).
 | |
| do
 | |
|   local s = Sprite(32, 32)
 | |
|   function onSpriteChange()
 | |
|     -- Do nothing
 | |
|   end
 | |
|   -- Here we access s.events for first time, creating the
 | |
|   -- app::script::SpriteEvents for this sprite.
 | |
|   s.events:on('change', onSpriteChange)
 | |
|   function onSiteChange()
 | |
|     -- Accessing s.events again on 'sitechange' when we're just
 | |
|     -- closing the sprite, re-generating its SpriteEvents instance.
 | |
|     -- We've to have special care of this case.
 | |
|     s.events:off(onSpriteChange)
 | |
|   end
 | |
|   app.events:on('sitechange', onSiteChange)
 | |
|   -- Closing the sprite will create a 'sitechange' event calling
 | |
|   -- onSiteChange() function.
 | |
|   s:close()
 | |
|   app.events:off(onSiteChange)
 | |
| end
 |