UNPKG

phaser

Version:

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

423 lines (370 loc) 13.6 kB
var Origin = require('../../../src/gameobjects/components/Origin'); function createMockObject(width, height) { var obj = { width: width !== undefined ? width : 100, height: height !== undefined ? height : 100, originX: 0.5, originY: 0.5, _displayOriginX: 0, _displayOriginY: 0 }; Object.defineProperty(obj, 'displayOriginX', { get: function () { return this._displayOriginX; }, set: function (value) { this._displayOriginX = value; this.originX = value / this.width; }, configurable: true }); Object.defineProperty(obj, 'displayOriginY', { get: function () { return this._displayOriginY; }, set: function (value) { this._displayOriginY = value; this.originY = value / this.height; }, configurable: true }); obj.setOrigin = Origin.setOrigin; obj.setOriginFromFrame = Origin.setOriginFromFrame; obj.setDisplayOrigin = Origin.setDisplayOrigin; obj.updateDisplayOrigin = Origin.updateDisplayOrigin; return obj; } describe('Origin', function () { describe('module defaults', function () { it('should export an object', function () { expect(typeof Origin).toBe('object'); }); it('should have originX default of 0.5', function () { expect(Origin.originX).toBe(0.5); }); it('should have originY default of 0.5', function () { expect(Origin.originY).toBe(0.5); }); it('should have _displayOriginX default of 0', function () { expect(Origin._displayOriginX).toBe(0); }); it('should have _displayOriginY default of 0', function () { expect(Origin._displayOriginY).toBe(0); }); it('should expose setOrigin as a function', function () { expect(typeof Origin.setOrigin).toBe('function'); }); it('should expose setOriginFromFrame as a function', function () { expect(typeof Origin.setOriginFromFrame).toBe('function'); }); it('should expose setDisplayOrigin as a function', function () { expect(typeof Origin.setDisplayOrigin).toBe('function'); }); it('should expose updateDisplayOrigin as a function', function () { expect(typeof Origin.updateDisplayOrigin).toBe('function'); }); }); describe('setOrigin', function () { it('should default both axes to 0.5 when called with no arguments', function () { var obj = createMockObject(100, 100); obj.setOrigin(); expect(obj.originX).toBe(0.5); expect(obj.originY).toBe(0.5); }); it('should set both axes to x when only x is provided', function () { var obj = createMockObject(100, 100); obj.setOrigin(0.25); expect(obj.originX).toBe(0.25); expect(obj.originY).toBe(0.25); }); it('should set both axes independently when x and y are provided', function () { var obj = createMockObject(100, 100); obj.setOrigin(0.2, 0.8); expect(obj.originX).toBe(0.2); expect(obj.originY).toBe(0.8); }); it('should set origin to 0', function () { var obj = createMockObject(100, 100); obj.setOrigin(0, 0); expect(obj.originX).toBe(0); expect(obj.originY).toBe(0); }); it('should set origin to 1', function () { var obj = createMockObject(100, 100); obj.setOrigin(1, 1); expect(obj.originX).toBe(1); expect(obj.originY).toBe(1); }); it('should accept values outside the 0-1 range', function () { var obj = createMockObject(100, 100); obj.setOrigin(2, -0.5); expect(obj.originX).toBe(2); expect(obj.originY).toBe(-0.5); }); it('should call updateDisplayOrigin and update _displayOriginX', function () { var obj = createMockObject(200, 80); obj.setOrigin(0.5, 0.25); expect(obj._displayOriginX).toBe(100); expect(obj._displayOriginY).toBe(20); }); it('should return the game object instance (this)', function () { var obj = createMockObject(100, 100); var result = obj.setOrigin(0.5, 0.5); expect(result).toBe(obj); }); }); describe('setOriginFromFrame', function () { it('should fall back to setOrigin when frame is not defined', function () { var obj = createMockObject(100, 100); obj.originX = 0.1; obj.originY = 0.1; obj.setOriginFromFrame(); expect(obj.originX).toBe(0.5); expect(obj.originY).toBe(0.5); }); it('should fall back to setOrigin when frame has no customPivot', function () { var obj = createMockObject(100, 100); obj.frame = { customPivot: false, pivotX: 0.3, pivotY: 0.7 }; obj.originX = 0.1; obj.originY = 0.1; obj.setOriginFromFrame(); expect(obj.originX).toBe(0.5); expect(obj.originY).toBe(0.5); }); it('should set origin from frame pivot values when customPivot is true', function () { var obj = createMockObject(100, 100); obj.frame = { customPivot: true, pivotX: 0.3, pivotY: 0.7 }; obj.setOriginFromFrame(); expect(obj.originX).toBe(0.3); expect(obj.originY).toBe(0.7); }); it('should call updateDisplayOrigin after setting from frame pivot', function () { var obj = createMockObject(200, 100); obj.frame = { customPivot: true, pivotX: 0.5, pivotY: 0.25 }; obj.setOriginFromFrame(); expect(obj._displayOriginX).toBe(100); expect(obj._displayOriginY).toBe(25); }); it('should call updateDisplayOrigin when falling back to setOrigin', function () { var obj = createMockObject(200, 100); obj.setOriginFromFrame(); expect(obj._displayOriginX).toBe(100); expect(obj._displayOriginY).toBe(50); }); it('should return the game object instance (this)', function () { var obj = createMockObject(100, 100); var result = obj.setOriginFromFrame(); expect(result).toBe(obj); }); it('should return the game object instance when using frame pivot', function () { var obj = createMockObject(100, 100); obj.frame = { customPivot: true, pivotX: 0.5, pivotY: 0.5 }; var result = obj.setOriginFromFrame(); expect(result).toBe(obj); }); }); describe('setDisplayOrigin', function () { it('should default both axes to 0 when called with no arguments', function () { var obj = createMockObject(100, 100); obj.setDisplayOrigin(); expect(obj._displayOriginX).toBe(0); expect(obj._displayOriginY).toBe(0); }); it('should set both axes to x when only x is provided', function () { var obj = createMockObject(100, 100); obj.setDisplayOrigin(50); expect(obj._displayOriginX).toBe(50); expect(obj._displayOriginY).toBe(50); }); it('should set both axes independently when x and y are provided', function () { var obj = createMockObject(100, 100); obj.setDisplayOrigin(25, 75); expect(obj._displayOriginX).toBe(25); expect(obj._displayOriginY).toBe(75); }); it('should update originX based on displayOriginX and width', function () { var obj = createMockObject(200, 100); obj.setDisplayOrigin(100, 50); expect(obj.originX).toBe(0.5); expect(obj.originY).toBe(0.5); }); it('should update originX correctly with arbitrary pixel values', function () { var obj = createMockObject(400, 200); obj.setDisplayOrigin(100, 50); expect(obj.originX).toBe(0.25); expect(obj.originY).toBe(0.25); }); it('should handle zero display origin', function () { var obj = createMockObject(100, 100); obj.setDisplayOrigin(0, 0); expect(obj._displayOriginX).toBe(0); expect(obj._displayOriginY).toBe(0); expect(obj.originX).toBe(0); expect(obj.originY).toBe(0); }); it('should return the game object instance (this)', function () { var obj = createMockObject(100, 100); var result = obj.setDisplayOrigin(50, 50); expect(result).toBe(obj); }); }); describe('updateDisplayOrigin', function () { it('should calculate _displayOriginX as originX * width', function () { var obj = createMockObject(200, 100); obj.originX = 0.5; obj.updateDisplayOrigin(); expect(obj._displayOriginX).toBe(100); }); it('should calculate _displayOriginY as originY * height', function () { var obj = createMockObject(200, 100); obj.originY = 0.5; obj.updateDisplayOrigin(); expect(obj._displayOriginY).toBe(50); }); it('should handle origin of 0', function () { var obj = createMockObject(200, 100); obj.originX = 0; obj.originY = 0; obj.updateDisplayOrigin(); expect(obj._displayOriginX).toBe(0); expect(obj._displayOriginY).toBe(0); }); it('should handle origin of 1', function () { var obj = createMockObject(200, 100); obj.originX = 1; obj.originY = 1; obj.updateDisplayOrigin(); expect(obj._displayOriginX).toBe(200); expect(obj._displayOriginY).toBe(100); }); it('should handle fractional origins and dimensions', function () { var obj = createMockObject(300, 150); obj.originX = 0.333; obj.originY = 0.667; obj.updateDisplayOrigin(); expect(obj._displayOriginX).toBeCloseTo(99.9, 1); expect(obj._displayOriginY).toBeCloseTo(100.05, 1); }); it('should return the game object instance (this)', function () { var obj = createMockObject(100, 100); var result = obj.updateDisplayOrigin(); expect(result).toBe(obj); }); }); describe('displayOriginX accessor', function () { it('should get the value of _displayOriginX', function () { var obj = createMockObject(100, 100); obj._displayOriginX = 42; expect(obj.displayOriginX).toBe(42); }); it('should set _displayOriginX when assigned', function () { var obj = createMockObject(100, 100); obj.displayOriginX = 75; expect(obj._displayOriginX).toBe(75); }); it('should update originX as value / width when set', function () { var obj = createMockObject(200, 100); obj.displayOriginX = 50; expect(obj.originX).toBe(0.25); }); it('should derive originX of 0.5 when display origin equals half width', function () { var obj = createMockObject(100, 100); obj.displayOriginX = 50; expect(obj.originX).toBe(0.5); }); it('should set originX to 0 when displayOriginX is 0', function () { var obj = createMockObject(100, 100); obj.displayOriginX = 0; expect(obj.originX).toBe(0); }); }); describe('displayOriginY accessor', function () { it('should get the value of _displayOriginY', function () { var obj = createMockObject(100, 100); obj._displayOriginY = 33; expect(obj.displayOriginY).toBe(33); }); it('should set _displayOriginY when assigned', function () { var obj = createMockObject(100, 100); obj.displayOriginY = 80; expect(obj._displayOriginY).toBe(80); }); it('should update originY as value / height when set', function () { var obj = createMockObject(100, 200); obj.displayOriginY = 50; expect(obj.originY).toBe(0.25); }); it('should derive originY of 0.5 when display origin equals half height', function () { var obj = createMockObject(100, 100); obj.displayOriginY = 50; expect(obj.originY).toBe(0.5); }); it('should set originY to 0 when displayOriginY is 0', function () { var obj = createMockObject(100, 100); obj.displayOriginY = 0; expect(obj.originY).toBe(0); }); }); });