phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
280 lines (225 loc) • 9.54 kB
JavaScript
var Displacement = require('../../src/filters/Displacement');
function createMockCamera (width, height, glTexture)
{
if (width === undefined) { width = 800; }
if (height === undefined) { height = 600; }
if (glTexture === undefined) { glTexture = { id: 'mockTexture' }; }
return {
width: width,
height: height,
scene: {
sys: {
textures: {
getFrame: function (key)
{
if (key === '__MISSING') { return null; }
return { glTexture: glTexture };
}
}
}
}
};
}
describe('Displacement', function ()
{
var camera;
var glTexture;
beforeEach(function ()
{
glTexture = { id: 'mockGLTexture' };
camera = createMockCamera(800, 600, glTexture);
});
describe('constructor', function ()
{
it('should set default x and y values', function ()
{
var displacement = new Displacement(camera);
expect(displacement.x).toBeCloseTo(0.005);
expect(displacement.y).toBeCloseTo(0.005);
});
it('should accept custom x and y values', function ()
{
var displacement = new Displacement(camera, '__WHITE', 0.02, 0.03);
expect(displacement.x).toBeCloseTo(0.02);
expect(displacement.y).toBeCloseTo(0.03);
});
it('should set the renderNode to FilterDisplacement', function ()
{
var displacement = new Displacement(camera);
expect(displacement.renderNode).toBe('FilterDisplacement');
});
it('should store a reference to the camera', function ()
{
var displacement = new Displacement(camera);
expect(displacement.camera).toBe(camera);
});
it('should be active by default', function ()
{
var displacement = new Displacement(camera);
expect(displacement.active).toBe(true);
});
it('should set glTexture from the default texture', function ()
{
var displacement = new Displacement(camera);
expect(displacement.glTexture).toBe(glTexture);
});
it('should use __WHITE as the default texture key', function ()
{
var spy = vi.fn(function (key)
{
return { glTexture: { id: key } };
});
camera.scene.sys.textures.getFrame = spy;
new Displacement(camera);
expect(spy).toHaveBeenCalledWith('__WHITE');
});
it('should use a custom texture key when provided', function ()
{
var spy = vi.fn(function (key)
{
return { glTexture: { id: key } };
});
camera.scene.sys.textures.getFrame = spy;
new Displacement(camera, 'myTexture');
expect(spy).toHaveBeenCalledWith('myTexture');
});
it('should use zero for x when explicitly passed zero', function ()
{
var displacement = new Displacement(camera, '__WHITE', 0, 0);
expect(displacement.x).toBe(0);
expect(displacement.y).toBe(0);
});
it('should accept negative displacement values', function ()
{
var displacement = new Displacement(camera, '__WHITE', -0.01, -0.02);
expect(displacement.x).toBeCloseTo(-0.01);
expect(displacement.y).toBeCloseTo(-0.02);
});
});
describe('setTexture', function ()
{
it('should return this for chaining', function ()
{
var displacement = new Displacement(camera);
var result = displacement.setTexture('__WHITE');
expect(result).toBe(displacement);
});
it('should update glTexture when a valid texture key is given', function ()
{
var newGLTexture = { id: 'newTexture' };
camera.scene.sys.textures.getFrame = function (key)
{
return { glTexture: newGLTexture };
};
var displacement = new Displacement(camera);
displacement.setTexture('newTexture');
expect(displacement.glTexture).toBe(newGLTexture);
});
it('should not update glTexture when texture key is not found', function ()
{
var displacement = new Displacement(camera);
var originalGLTexture = displacement.glTexture;
displacement.setTexture('__MISSING');
expect(displacement.glTexture).toBe(originalGLTexture);
});
it('should update glTexture to the new frame glTexture', function ()
{
var firstGLTexture = { id: 'first' };
var secondGLTexture = { id: 'second' };
camera.scene.sys.textures.getFrame = function (key)
{
if (key === 'first') { return { glTexture: firstGLTexture }; }
if (key === 'second') { return { glTexture: secondGLTexture }; }
return null;
};
var displacement = new Displacement(camera, 'first');
expect(displacement.glTexture).toBe(firstGLTexture);
displacement.setTexture('second');
expect(displacement.glTexture).toBe(secondGLTexture);
});
});
describe('getPadding', function ()
{
it('should return the paddingOverride when it is set', function ()
{
var displacement = new Displacement(camera);
var override = displacement.paddingOverride;
var result = displacement.getPadding();
expect(result).toBe(override);
});
it('should return currentPadding when paddingOverride is null', function ()
{
var displacement = new Displacement(camera);
displacement.paddingOverride = null;
var result = displacement.getPadding();
expect(result).toBe(displacement.currentPadding);
});
it('should compute padding based on camera width and x value', function ()
{
var displacement = new Displacement(camera, '__WHITE', 0.01, 0.005);
displacement.paddingOverride = null;
displacement.getPadding();
// x = ceil(800 * 0.01 * 0.5) = ceil(4) = 4
// padding.x should be -4, width should be 8
expect(displacement.currentPadding.x).toBe(-4);
expect(displacement.currentPadding.width).toBe(8);
});
it('should compute padding based on camera height and y value', function ()
{
var displacement = new Displacement(camera, '__WHITE', 0.005, 0.01);
displacement.paddingOverride = null;
displacement.getPadding();
// y = ceil(600 * 0.01 * 0.5) = ceil(3) = 3
// padding.y should be -3, height should be 6
expect(displacement.currentPadding.y).toBe(-3);
expect(displacement.currentPadding.height).toBe(6);
});
it('should use Math.ceil on computed padding values', function ()
{
// 800 * 0.003 * 0.5 = 1.2, ceil = 2
var displacement = new Displacement(camera, '__WHITE', 0.003, 0.003);
displacement.paddingOverride = null;
displacement.getPadding();
expect(displacement.currentPadding.x).toBe(-2);
});
it('should return zero padding when x and y are zero', function ()
{
var displacement = new Displacement(camera, '__WHITE', 0, 0);
displacement.paddingOverride = null;
displacement.getPadding();
expect(displacement.currentPadding.x).toBeCloseTo(0);
expect(displacement.currentPadding.y).toBeCloseTo(0);
expect(displacement.currentPadding.width).toBeCloseTo(0);
expect(displacement.currentPadding.height).toBeCloseTo(0);
});
it('should update currentPadding when paddingOverride is active', function ()
{
var displacement = new Displacement(camera);
var override = displacement.paddingOverride;
// Manually set the override rectangle values
override.x = 10;
override.y = 20;
override.width = 30;
override.height = 40;
var result = displacement.getPadding();
expect(displacement.currentPadding.x).toBe(10);
expect(displacement.currentPadding.y).toBe(20);
expect(displacement.currentPadding.width).toBe(30);
expect(displacement.currentPadding.height).toBe(40);
expect(result).toBe(override);
});
it('should scale padding proportionally to camera size', function ()
{
var largeCamera = createMockCamera(1600, 1200, glTexture);
var displacement = new Displacement(largeCamera, '__WHITE', 0.01, 0.01);
displacement.paddingOverride = null;
displacement.getPadding();
// x = ceil(1600 * 0.01 * 0.5) = ceil(8) = 8
// y = ceil(1200 * 0.01 * 0.5) = ceil(6) = 6
expect(displacement.currentPadding.x).toBe(-8);
expect(displacement.currentPadding.y).toBe(-6);
expect(displacement.currentPadding.width).toBe(16);
expect(displacement.currentPadding.height).toBe(12);
});
});
});