phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
890 lines (644 loc) • 24.7 kB
JavaScript
var ScenePlugin = require('../../src/scene/ScenePlugin');
function createMockScene (key)
{
if (key === undefined) { key = 'TestScene'; }
var events = {
once: vi.fn(),
on: vi.fn(),
off: vi.fn(),
emit: vi.fn()
};
var manager = {
queueOp: vi.fn(),
add: vi.fn(),
remove: vi.fn(),
getScene: vi.fn(),
getIndex: vi.fn(),
isSleeping: vi.fn(),
isActive: vi.fn(),
isPaused: vi.fn(),
isVisible: vi.fn(),
swapPosition: vi.fn(),
moveAbove: vi.fn(),
moveBelow: vi.fn(),
moveUp: vi.fn(),
moveDown: vi.fn(),
bringToTop: vi.fn(),
sendToBack: vi.fn(),
start: vi.fn(),
stop: vi.fn()
};
var sys = {
settings: { key: key },
events: events,
game: { scene: manager },
setActive: vi.fn(),
setVisible: vi.fn(),
isSleeping: vi.fn().mockReturnValue(false),
isActive: vi.fn().mockReturnValue(false),
isTransitioning: vi.fn().mockReturnValue(false),
sleep: vi.fn(),
wake: vi.fn(),
getStatus: vi.fn().mockReturnValue(0)
};
var scene = {
sys: sys
};
return scene;
}
function createPlugin (key)
{
var scene = createMockScene(key);
var plugin = new ScenePlugin(scene);
return plugin;
}
describe('ScenePlugin', function ()
{
describe('constructor', function ()
{
it('should set initial properties from scene', function ()
{
var scene = createMockScene('MyScene');
var plugin = new ScenePlugin(scene);
expect(plugin.scene).toBe(scene);
expect(plugin.systems).toBe(scene.sys);
expect(plugin.settings).toBe(scene.sys.settings);
expect(plugin.key).toBe('MyScene');
expect(plugin.manager).toBe(scene.sys.game.scene);
});
it('should initialise transitionProgress to 0', function ()
{
var plugin = createPlugin();
expect(plugin.transitionProgress).toBe(0);
});
it('should initialise _willSleep and _willRemove to false', function ()
{
var plugin = createPlugin();
expect(plugin._willSleep).toBe(false);
expect(plugin._willRemove).toBe(false);
});
it('should initialise _target to null and _duration to 0', function ()
{
var plugin = createPlugin();
expect(plugin._target).toBeNull();
expect(plugin._duration).toBe(0);
});
it('should register BOOT and START event listeners', function ()
{
var scene = createMockScene();
var plugin = new ScenePlugin(scene);
expect(scene.sys.events.once).toHaveBeenCalledWith(expect.any(String), plugin.boot, plugin);
expect(scene.sys.events.on).toHaveBeenCalledWith(expect.any(String), plugin.pluginStart, plugin);
});
});
describe('start', function ()
{
it('should queue stop on own key then start on target key', function ()
{
var plugin = createPlugin('SceneA');
plugin.start('SceneB');
expect(plugin.manager.queueOp).toHaveBeenNthCalledWith(1, 'stop', 'SceneA');
expect(plugin.manager.queueOp).toHaveBeenNthCalledWith(2, 'start', 'SceneB', undefined);
});
it('should default to own key when no key given', function ()
{
var plugin = createPlugin('SceneA');
plugin.start();
expect(plugin.manager.queueOp).toHaveBeenNthCalledWith(1, 'stop', 'SceneA');
expect(plugin.manager.queueOp).toHaveBeenNthCalledWith(2, 'start', 'SceneA', undefined);
});
it('should pass data to the start operation', function ()
{
var plugin = createPlugin('SceneA');
var data = { level: 1 };
plugin.start('SceneB', data);
expect(plugin.manager.queueOp).toHaveBeenNthCalledWith(2, 'start', 'SceneB', data);
});
it('should return this for chaining', function ()
{
var plugin = createPlugin();
expect(plugin.start('Other')).toBe(plugin);
});
});
describe('restart', function ()
{
it('should queue stop then start on own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.restart();
expect(plugin.manager.queueOp).toHaveBeenNthCalledWith(1, 'stop', 'SceneA');
expect(plugin.manager.queueOp).toHaveBeenNthCalledWith(2, 'start', 'SceneA', undefined);
});
it('should pass data through', function ()
{
var plugin = createPlugin('SceneA');
var data = { foo: 'bar' };
plugin.restart(data);
expect(plugin.manager.queueOp).toHaveBeenNthCalledWith(2, 'start', 'SceneA', data);
});
it('should return this for chaining', function ()
{
var plugin = createPlugin();
expect(plugin.restart()).toBe(plugin);
});
});
describe('launch', function ()
{
it('should queue start for the given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.launch('SceneB');
expect(plugin.manager.queueOp).toHaveBeenCalledWith('start', 'SceneB', undefined);
});
it('should not queue if key equals own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.launch('SceneA');
expect(plugin.manager.queueOp).not.toHaveBeenCalled();
});
it('should return this for chaining', function ()
{
var plugin = createPlugin('SceneA');
expect(plugin.launch('SceneB')).toBe(plugin);
});
});
describe('run', function ()
{
it('should queue run for the given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.run('SceneB');
expect(plugin.manager.queueOp).toHaveBeenCalledWith('run', 'SceneB', undefined);
});
it('should not queue if key equals own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.run('SceneA');
expect(plugin.manager.queueOp).not.toHaveBeenCalled();
});
it('should return this for chaining', function ()
{
var plugin = createPlugin('SceneA');
expect(plugin.run('SceneB')).toBe(plugin);
});
});
describe('pause', function ()
{
it('should queue pause on the given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.pause('SceneB');
expect(plugin.manager.queueOp).toHaveBeenCalledWith('pause', 'SceneB', undefined);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.pause();
expect(plugin.manager.queueOp).toHaveBeenCalledWith('pause', 'SceneA', undefined);
});
it('should return this for chaining', function ()
{
var plugin = createPlugin();
expect(plugin.pause()).toBe(plugin);
});
});
describe('resume', function ()
{
it('should queue resume on the given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.resume('SceneB');
expect(plugin.manager.queueOp).toHaveBeenCalledWith('resume', 'SceneB', undefined);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.resume();
expect(plugin.manager.queueOp).toHaveBeenCalledWith('resume', 'SceneA', undefined);
});
});
describe('sleep', function ()
{
it('should queue sleep on the given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.sleep('SceneB');
expect(plugin.manager.queueOp).toHaveBeenCalledWith('sleep', 'SceneB', undefined);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.sleep();
expect(plugin.manager.queueOp).toHaveBeenCalledWith('sleep', 'SceneA', undefined);
});
});
describe('stop', function ()
{
it('should queue stop on the given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.stop('SceneB');
expect(plugin.manager.queueOp).toHaveBeenCalledWith('stop', 'SceneB', undefined);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.stop();
expect(plugin.manager.queueOp).toHaveBeenCalledWith('stop', 'SceneA', undefined);
});
it('should return this for chaining', function ()
{
var plugin = createPlugin();
expect(plugin.stop()).toBe(plugin);
});
});
describe('switch', function ()
{
it('should queue a switch operation when key differs', function ()
{
var plugin = createPlugin('SceneA');
plugin.switch('SceneB');
expect(plugin.manager.queueOp).toHaveBeenCalledWith('switch', 'SceneA', 'SceneB', undefined);
});
it('should not queue if key equals own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.switch('SceneA');
expect(plugin.manager.queueOp).not.toHaveBeenCalled();
});
it('should return this for chaining', function ()
{
var plugin = createPlugin('SceneA');
expect(plugin.switch('SceneB')).toBe(plugin);
});
});
describe('setActive', function ()
{
it('should call sys.setActive on the target scene', function ()
{
var plugin = createPlugin('SceneA');
var targetScene = createMockScene('SceneB');
plugin.manager.getScene.mockReturnValue(targetScene);
plugin.setActive(true, 'SceneB');
expect(targetScene.sys.setActive).toHaveBeenCalledWith(true, undefined);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
var ownScene = plugin.scene;
plugin.manager.getScene.mockReturnValue(ownScene);
plugin.setActive(false);
expect(plugin.manager.getScene).toHaveBeenCalledWith('SceneA');
});
it('should do nothing if scene is not found', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.getScene.mockReturnValue(null);
expect(function () { plugin.setActive(true); }).not.toThrow();
});
it('should return this for chaining', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.getScene.mockReturnValue(null);
expect(plugin.setActive(true)).toBe(plugin);
});
});
describe('setVisible', function ()
{
it('should call sys.setVisible on the target scene', function ()
{
var plugin = createPlugin('SceneA');
var targetScene = createMockScene('SceneB');
plugin.manager.getScene.mockReturnValue(targetScene);
plugin.setVisible(true, 'SceneB');
expect(targetScene.sys.setVisible).toHaveBeenCalledWith(true);
});
it('should do nothing if scene is not found', function ()
{
var plugin = createPlugin();
plugin.manager.getScene.mockReturnValue(null);
expect(function () { plugin.setVisible(false); }).not.toThrow();
});
});
describe('isSleeping', function ()
{
it('should delegate to manager.isSleeping with given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.isSleeping.mockReturnValue(true);
var result = plugin.isSleeping('SceneB');
expect(plugin.manager.isSleeping).toHaveBeenCalledWith('SceneB');
expect(result).toBe(true);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.isSleeping.mockReturnValue(false);
plugin.isSleeping();
expect(plugin.manager.isSleeping).toHaveBeenCalledWith('SceneA');
});
});
describe('isActive', function ()
{
it('should delegate to manager.isActive with given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.isActive.mockReturnValue(true);
var result = plugin.isActive('SceneB');
expect(plugin.manager.isActive).toHaveBeenCalledWith('SceneB');
expect(result).toBe(true);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.isActive();
expect(plugin.manager.isActive).toHaveBeenCalledWith('SceneA');
});
});
describe('isPaused', function ()
{
it('should delegate to manager.isPaused', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.isPaused.mockReturnValue(true);
var result = plugin.isPaused('SceneB');
expect(result).toBe(true);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.isPaused();
expect(plugin.manager.isPaused).toHaveBeenCalledWith('SceneA');
});
});
describe('isVisible', function ()
{
it('should delegate to manager.isVisible', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.isVisible.mockReturnValue(true);
var result = plugin.isVisible('SceneB');
expect(result).toBe(true);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.isVisible();
expect(plugin.manager.isVisible).toHaveBeenCalledWith('SceneA');
});
});
describe('swapPosition', function ()
{
it('should call manager.swapPosition when keys differ', function ()
{
var plugin = createPlugin('SceneA');
plugin.swapPosition('SceneB', 'SceneC');
expect(plugin.manager.swapPosition).toHaveBeenCalledWith('SceneB', 'SceneC');
});
it('should default keyB to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.swapPosition('SceneB');
expect(plugin.manager.swapPosition).toHaveBeenCalledWith('SceneB', 'SceneA');
});
it('should not call swapPosition when keys are the same', function ()
{
var plugin = createPlugin('SceneA');
plugin.swapPosition('SceneA', 'SceneA');
expect(plugin.manager.swapPosition).not.toHaveBeenCalled();
});
it('should return this for chaining', function ()
{
var plugin = createPlugin('SceneA');
expect(plugin.swapPosition('SceneB')).toBe(plugin);
});
});
describe('moveAbove', function ()
{
it('should call manager.moveAbove when keys differ', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveAbove('SceneB', 'SceneC');
expect(plugin.manager.moveAbove).toHaveBeenCalledWith('SceneB', 'SceneC');
});
it('should default keyB to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveAbove('SceneB');
expect(plugin.manager.moveAbove).toHaveBeenCalledWith('SceneB', 'SceneA');
});
it('should not call moveAbove when keys are the same', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveAbove('SceneA', 'SceneA');
expect(plugin.manager.moveAbove).not.toHaveBeenCalled();
});
});
describe('moveBelow', function ()
{
it('should call manager.moveBelow when keys differ', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveBelow('SceneB', 'SceneC');
expect(plugin.manager.moveBelow).toHaveBeenCalledWith('SceneB', 'SceneC');
});
it('should default keyB to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveBelow('SceneB');
expect(plugin.manager.moveBelow).toHaveBeenCalledWith('SceneB', 'SceneA');
});
it('should not call moveBelow when keys are the same', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveBelow('SceneA', 'SceneA');
expect(plugin.manager.moveBelow).not.toHaveBeenCalled();
});
});
describe('remove', function ()
{
it('should call manager.remove with the given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.remove('SceneB');
expect(plugin.manager.remove).toHaveBeenCalledWith('SceneB');
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.remove();
expect(plugin.manager.remove).toHaveBeenCalledWith('SceneA');
});
it('should return this for chaining', function ()
{
var plugin = createPlugin();
expect(plugin.remove()).toBe(plugin);
});
});
describe('moveUp', function ()
{
it('should call manager.moveUp with given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveUp('SceneB');
expect(plugin.manager.moveUp).toHaveBeenCalledWith('SceneB');
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveUp();
expect(plugin.manager.moveUp).toHaveBeenCalledWith('SceneA');
});
});
describe('moveDown', function ()
{
it('should call manager.moveDown with given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveDown('SceneB');
expect(plugin.manager.moveDown).toHaveBeenCalledWith('SceneB');
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.moveDown();
expect(plugin.manager.moveDown).toHaveBeenCalledWith('SceneA');
});
});
describe('bringToTop', function ()
{
it('should call manager.bringToTop with given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.bringToTop('SceneB');
expect(plugin.manager.bringToTop).toHaveBeenCalledWith('SceneB');
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.bringToTop();
expect(plugin.manager.bringToTop).toHaveBeenCalledWith('SceneA');
});
});
describe('sendToBack', function ()
{
it('should call manager.sendToBack with given key', function ()
{
var plugin = createPlugin('SceneA');
plugin.sendToBack('SceneB');
expect(plugin.manager.sendToBack).toHaveBeenCalledWith('SceneB');
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.sendToBack();
expect(plugin.manager.sendToBack).toHaveBeenCalledWith('SceneA');
});
});
describe('get', function ()
{
it('should return the scene from manager.getScene', function ()
{
var plugin = createPlugin('SceneA');
var mockScene = createMockScene('SceneB');
plugin.manager.getScene.mockReturnValue(mockScene);
var result = plugin.get('SceneB');
expect(plugin.manager.getScene).toHaveBeenCalledWith('SceneB');
expect(result).toBe(mockScene);
});
it('should return null when scene is not found', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.getScene.mockReturnValue(null);
var result = plugin.get('Missing');
expect(result).toBeNull();
});
});
describe('getStatus', function ()
{
it('should return the status from the scene sys', function ()
{
var plugin = createPlugin('SceneA');
var targetScene = createMockScene('SceneB');
targetScene.sys.getStatus.mockReturnValue(5);
plugin.manager.getScene.mockReturnValue(targetScene);
var result = plugin.getStatus('SceneB');
expect(result).toBe(5);
});
it('should return undefined if scene is not found', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.getScene.mockReturnValue(null);
var result = plugin.getStatus('Missing');
expect(result).toBeUndefined();
});
});
describe('getIndex', function ()
{
it('should return the index from manager.getIndex', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.getIndex.mockReturnValue(3);
var result = plugin.getIndex('SceneB');
expect(plugin.manager.getIndex).toHaveBeenCalledWith('SceneB');
expect(result).toBe(3);
});
it('should default to own key', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.getIndex.mockReturnValue(0);
plugin.getIndex();
expect(plugin.manager.getIndex).toHaveBeenCalledWith('SceneA');
});
});
describe('add', function ()
{
it('should delegate to manager.add and return the result', function ()
{
var plugin = createPlugin('SceneA');
var newScene = createMockScene('NewScene');
plugin.manager.add.mockReturnValue(newScene);
var result = plugin.add('NewScene', {}, true, { foo: 'bar' });
expect(plugin.manager.add).toHaveBeenCalledWith('NewScene', {}, true, { foo: 'bar' });
expect(result).toBe(newScene);
});
it('should return null when manager.add returns null', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.add.mockReturnValue(null);
var result = plugin.add('NewScene', {});
expect(result).toBeNull();
});
});
describe('transition', function ()
{
it('should return false when no target key is provided', function ()
{
var plugin = createPlugin('SceneA');
var result = plugin.transition({});
expect(result).toBe(false);
});
it('should return false when target scene is not found', function ()
{
var plugin = createPlugin('SceneA');
plugin.manager.getScene.mockReturnValue(null);
var result = plugin.transition({ target: 'SceneB' });
expect(result).toBe(false);
});
it('should return false when target scene is already active', function ()
{
var plugin = createPlugin('SceneA');
var targetScene = createMockScene('SceneB');
targetScene.sys.isActive.mockReturnValue(true);
plugin.manager.getScene.mockReturnValue(targetScene);
var result = plugin.transition({ target: 'SceneB' });
expect(result).toBe(false);
});
it('should return false with empty config', function ()
{
var plugin = createPlugin('SceneA');
var result = plugin.transition();
expect(result).toBe(false);
});
});
});