UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

340 lines (290 loc) 12.3 kB
var RenderNodes = require('../../../src/gameobjects/components/RenderNodes'); describe('RenderNodes', function () { var gameObject; var mockNode; var mockManager; var mockRenderer; beforeEach(function () { mockNode = { name: 'MockNode' }; mockManager = { getNode: function (name) { if (name === 'MockNode') { return mockNode; } return null; } }; mockRenderer = { renderNodes: mockManager }; gameObject = Object.assign({}, RenderNodes, { customRenderNodes: null, defaultRenderNodes: null, renderNodeData: null, scene: { sys: { renderer: mockRenderer } } }); }); // --- Module shape --- describe('module', function () { it('should export an object', function () { expect(typeof RenderNodes).toBe('object'); }); it('should have customRenderNodes property defaulting to null', function () { expect(RenderNodes.customRenderNodes).toBeNull(); }); it('should have defaultRenderNodes property defaulting to null', function () { expect(RenderNodes.defaultRenderNodes).toBeNull(); }); it('should have renderNodeData property defaulting to null', function () { expect(RenderNodes.renderNodeData).toBeNull(); }); it('should expose initRenderNodes as a function', function () { expect(typeof RenderNodes.initRenderNodes).toBe('function'); }); it('should expose setRenderNodeRole as a function', function () { expect(typeof RenderNodes.setRenderNodeRole).toBe('function'); }); it('should expose setRenderNodeData as a function', function () { expect(typeof RenderNodes.setRenderNodeData).toBe('function'); }); }); // --- initRenderNodes --- describe('initRenderNodes', function () { it('should initialise customRenderNodes as empty object', function () { gameObject.initRenderNodes(null); expect(typeof gameObject.customRenderNodes).toBe('object'); expect(gameObject.customRenderNodes).not.toBeNull(); }); it('should initialise defaultRenderNodes as empty object', function () { gameObject.initRenderNodes(null); expect(typeof gameObject.defaultRenderNodes).toBe('object'); expect(gameObject.defaultRenderNodes).not.toBeNull(); }); it('should initialise renderNodeData as empty object', function () { gameObject.initRenderNodes(null); expect(typeof gameObject.renderNodeData).toBe('object'); expect(gameObject.renderNodeData).not.toBeNull(); }); it('should return early without populating defaultRenderNodes when renderer is missing', function () { gameObject.scene.sys.renderer = null; var defaultNodes = { each: function (cb) { cb('Submitter', 'MockNode'); } }; gameObject.initRenderNodes(defaultNodes); expect(Object.keys(gameObject.defaultRenderNodes).length).toBe(0); }); it('should return early when renderNodes manager is missing', function () { mockRenderer.renderNodes = null; var defaultNodes = { each: function (cb) { cb('Submitter', 'MockNode'); } }; gameObject.initRenderNodes(defaultNodes); expect(Object.keys(gameObject.defaultRenderNodes).length).toBe(0); }); it('should return early when defaultNodes argument is null', function () { gameObject.initRenderNodes(null); expect(Object.keys(gameObject.defaultRenderNodes).length).toBe(0); }); it('should populate defaultRenderNodes from the Map using getNode', function () { var defaultNodes = { each: function (cb) { cb('Submitter', 'MockNode'); } }; gameObject.initRenderNodes(defaultNodes); expect(gameObject.defaultRenderNodes['Submitter']).toBe(mockNode); }); it('should populate multiple roles from the Map', function () { var secondNode = { name: 'SecondNode' }; mockManager.getNode = function (name) { if (name === 'MockNode') { return mockNode; } if (name === 'SecondNode') { return secondNode; } return null; }; var defaultNodes = { each: function (cb) { cb('Submitter', 'MockNode'); cb('Transformer', 'SecondNode'); } }; gameObject.initRenderNodes(defaultNodes); expect(gameObject.defaultRenderNodes['Submitter']).toBe(mockNode); expect(gameObject.defaultRenderNodes['Transformer']).toBe(secondNode); }); }); // --- setRenderNodeRole --- describe('setRenderNodeRole', function () { beforeEach(function () { gameObject.customRenderNodes = {}; gameObject.defaultRenderNodes = {}; gameObject.renderNodeData = {}; }); it('should return this for chaining', function () { var result = gameObject.setRenderNodeRole('Submitter', mockNode); expect(result).toBe(gameObject); }); it('should return this when renderer is missing', function () { gameObject.scene.sys.renderer = null; var result = gameObject.setRenderNodeRole('Submitter', mockNode); expect(result).toBe(gameObject); }); it('should not modify nodes when renderer is missing', function () { gameObject.scene.sys.renderer = null; gameObject.setRenderNodeRole('Submitter', mockNode); expect(gameObject.customRenderNodes['Submitter']).toBeUndefined(); }); it('should return this when renderNodes manager is missing', function () { mockRenderer.renderNodes = null; var result = gameObject.setRenderNodeRole('Submitter', mockNode); expect(result).toBe(gameObject); }); it('should set a render node instance directly by object', function () { gameObject.setRenderNodeRole('Submitter', mockNode); expect(gameObject.customRenderNodes['Submitter']).toBe(mockNode); }); it('should resolve a render node by string name', function () { gameObject.setRenderNodeRole('Submitter', 'MockNode'); expect(gameObject.customRenderNodes['Submitter']).toBe(mockNode); }); it('should return this without changes when string resolves to no node', function () { var result = gameObject.setRenderNodeRole('Submitter', 'NonExistentNode'); expect(result).toBe(gameObject); expect(gameObject.customRenderNodes['Submitter']).toBeUndefined(); }); it('should store empty renderNodeData when none is provided', function () { gameObject.setRenderNodeRole('Submitter', mockNode); expect(gameObject.renderNodeData['MockNode']).toBeDefined(); expect(typeof gameObject.renderNodeData['MockNode']).toBe('object'); }); it('should assign renderNodeData by reference when copyData is false', function () { var data = { alpha: 1 }; gameObject.setRenderNodeRole('Submitter', mockNode, data, false); expect(gameObject.renderNodeData['MockNode']).toBe(data); }); it('should deep copy renderNodeData when copyData is true', function () { var data = { alpha: 1, nested: { x: 2 } }; gameObject.setRenderNodeRole('Submitter', mockNode, data, true); var stored = gameObject.renderNodeData['MockNode']; expect(stored).not.toBe(data); expect(stored.alpha).toBe(1); expect(stored.nested.x).toBe(2); expect(stored.nested).not.toBe(data.nested); }); it('should remove the node when renderNode is null', function () { gameObject.customRenderNodes['Submitter'] = mockNode; gameObject.renderNodeData['MockNode'] = { alpha: 1 }; gameObject.setRenderNodeRole('Submitter', null); expect(gameObject.customRenderNodes['Submitter']).toBeUndefined(); }); it('should remove renderNodeData when renderNode is null', function () { gameObject.customRenderNodes['Submitter'] = mockNode; gameObject.renderNodeData['MockNode'] = { alpha: 1 }; gameObject.setRenderNodeRole('Submitter', null); expect(gameObject.renderNodeData['MockNode']).toBeUndefined(); }); it('should do nothing silently when removing a role that was never set', function () { expect(function () { gameObject.setRenderNodeRole('NonExistent', null); }).not.toThrow(); }); it('should return this when removing a role that was never set', function () { var result = gameObject.setRenderNodeRole('NonExistent', null); expect(result).toBe(gameObject); }); }); // --- setRenderNodeData --- describe('setRenderNodeData', function () { beforeEach(function () { gameObject.customRenderNodes = {}; gameObject.defaultRenderNodes = {}; gameObject.renderNodeData = { MockNode: {} }; }); it('should return this for chaining', function () { var result = gameObject.setRenderNodeData('MockNode', 'alpha', 1); expect(result).toBe(gameObject); }); it('should set a property on the data object when given a string node name', function () { gameObject.setRenderNodeData('MockNode', 'alpha', 0.5); expect(gameObject.renderNodeData['MockNode']['alpha']).toBe(0.5); }); it('should resolve node name from an object with a name property', function () { gameObject.setRenderNodeData(mockNode, 'tint', 0xff0000); expect(gameObject.renderNodeData['MockNode']['tint']).toBe(0xff0000); }); it('should update an existing property', function () { gameObject.renderNodeData['MockNode']['alpha'] = 0.5; gameObject.setRenderNodeData('MockNode', 'alpha', 1); expect(gameObject.renderNodeData['MockNode']['alpha']).toBe(1); }); it('should delete the key when value is undefined', function () { gameObject.renderNodeData['MockNode']['alpha'] = 0.5; gameObject.setRenderNodeData('MockNode', 'alpha', undefined); expect(gameObject.renderNodeData['MockNode'].hasOwnProperty('alpha')).toBe(false); }); it('should set a boolean value correctly', function () { gameObject.setRenderNodeData('MockNode', 'enabled', false); expect(gameObject.renderNodeData['MockNode']['enabled']).toBe(false); }); it('should set a null value correctly', function () { gameObject.setRenderNodeData('MockNode', 'texture', null); expect(gameObject.renderNodeData['MockNode']['texture']).toBeNull(); }); it('should set an object value correctly', function () { var obj = { x: 1, y: 2 }; gameObject.setRenderNodeData('MockNode', 'offset', obj); expect(gameObject.renderNodeData['MockNode']['offset']).toBe(obj); }); it('should set a zero value correctly and not treat it as falsy removal', function () { gameObject.setRenderNodeData('MockNode', 'count', 0); expect(gameObject.renderNodeData['MockNode']['count']).toBe(0); }); }); });