phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
249 lines (189 loc) • 10.2 kB
JavaScript
vi.mock('../../../../../src/renderer/webgl/renderNodes/filters/BaseFilterShader', function ()
{
function BaseFilterShader () {}
BaseFilterShader.prototype = {};
return BaseFilterShader;
});
vi.mock('../../../../../src/renderer/webgl/shaders/FilterGlow-frag.js', function ()
{
return 'void main() {}';
});
var FilterGlow = require('../../../../../src/renderer/webgl/renderNodes/filters/FilterGlow');
describe('FilterGlow', function ()
{
var instance;
var mockProgramManager;
beforeEach(function ()
{
mockProgramManager = {
uniforms: {},
additions: {
distance: [
{
name: 'distance_10.0',
additions: { fragmentDefine: '#define DISTANCE 10.0' },
tags: [ 'distance' ]
}
],
quality: [
{
name: 'quality_0.1',
additions: { fragmentDefine: '#define QUALITY 0.1' },
tags: [ 'quality' ]
}
]
},
getAdditionsByTag: function (tag)
{
return this.additions[tag] || [];
},
setUniform: function (name, value)
{
this.uniforms[name] = value;
}
};
instance = Object.create(FilterGlow.prototype);
instance.programManager = mockProgramManager;
});
describe('updateShaderConfig', function ()
{
it('should update distance addition name with controller distance', function ()
{
var controller = { distance: 15, quality: 0.1 };
var drawingContext = {};
FilterGlow.prototype.updateShaderConfig.call(instance, controller, drawingContext);
expect(mockProgramManager.additions.distance[0].name).toBe('distance_15.0');
});
it('should update distance fragmentDefine with undef and define', function ()
{
var controller = { distance: 20, quality: 0.1 };
var drawingContext = {};
FilterGlow.prototype.updateShaderConfig.call(instance, controller, drawingContext);
expect(mockProgramManager.additions.distance[0].additions.fragmentDefine).toBe('#undef DISTANCE\n#define DISTANCE 20.0');
});
it('should update quality addition name with controller quality', function ()
{
var controller = { distance: 10, quality: 3 };
var drawingContext = {};
FilterGlow.prototype.updateShaderConfig.call(instance, controller, drawingContext);
expect(mockProgramManager.additions.quality[0].name).toBe('quality_3.0');
});
it('should update quality fragmentDefine with undef and define', function ()
{
var controller = { distance: 10, quality: 5 };
var drawingContext = {};
FilterGlow.prototype.updateShaderConfig.call(instance, controller, drawingContext);
expect(mockProgramManager.additions.quality[0].additions.fragmentDefine).toBe('#undef QUALITY\n#define QUALITY 5.0');
});
it('should use toFixed(0) formatting, truncating decimal part of distance', function ()
{
var controller = { distance: 7.9, quality: 1 };
var drawingContext = {};
FilterGlow.prototype.updateShaderConfig.call(instance, controller, drawingContext);
expect(mockProgramManager.additions.distance[0].name).toBe('distance_8.0');
});
it('should use toFixed(0) formatting, truncating decimal part of quality', function ()
{
var controller = { distance: 10, quality: 2.7 };
var drawingContext = {};
FilterGlow.prototype.updateShaderConfig.call(instance, controller, drawingContext);
expect(mockProgramManager.additions.quality[0].name).toBe('quality_3.0');
});
it('should handle distance of zero', function ()
{
var controller = { distance: 0, quality: 1 };
var drawingContext = {};
FilterGlow.prototype.updateShaderConfig.call(instance, controller, drawingContext);
expect(mockProgramManager.additions.distance[0].name).toBe('distance_0.0');
expect(mockProgramManager.additions.distance[0].additions.fragmentDefine).toBe('#undef DISTANCE\n#define DISTANCE 0.0');
});
it('should handle large distance values', function ()
{
var controller = { distance: 100, quality: 1 };
var drawingContext = {};
FilterGlow.prototype.updateShaderConfig.call(instance, controller, drawingContext);
expect(mockProgramManager.additions.distance[0].name).toBe('distance_100.0');
expect(mockProgramManager.additions.distance[0].additions.fragmentDefine).toBe('#undef DISTANCE\n#define DISTANCE 100.0');
});
});
describe('setupUniforms', function ()
{
it('should set resolution uniform from drawingContext dimensions', function ()
{
var controller = { glcolor: [ 1, 0, 0, 1 ], outerStrength: 4, innerStrength: 0, scale: 1, knockout: false };
var drawingContext = { width: 800, height: 600 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['resolution']).toEqual([ 800, 600 ]);
});
it('should set glowColor uniform from controller glcolor', function ()
{
var glcolor = [ 0.5, 0.2, 1.0, 1.0 ];
var controller = { glcolor: glcolor, outerStrength: 4, innerStrength: 0, scale: 1, knockout: false };
var drawingContext = { width: 100, height: 100 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['glowColor']).toBe(glcolor);
});
it('should set outerStrength uniform from controller', function ()
{
var controller = { glcolor: [ 1, 1, 1, 1 ], outerStrength: 8, innerStrength: 0, scale: 1, knockout: false };
var drawingContext = { width: 100, height: 100 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['outerStrength']).toBe(8);
});
it('should set innerStrength uniform from controller', function ()
{
var controller = { glcolor: [ 1, 1, 1, 1 ], outerStrength: 0, innerStrength: 3, scale: 1, knockout: false };
var drawingContext = { width: 100, height: 100 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['innerStrength']).toBe(3);
});
it('should set scale uniform from controller', function ()
{
var controller = { glcolor: [ 1, 1, 1, 1 ], outerStrength: 0, innerStrength: 0, scale: 2.5, knockout: false };
var drawingContext = { width: 100, height: 100 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['scale']).toBe(2.5);
});
it('should set knockout uniform to true when controller knockout is true', function ()
{
var controller = { glcolor: [ 1, 1, 1, 1 ], outerStrength: 4, innerStrength: 0, scale: 1, knockout: true };
var drawingContext = { width: 100, height: 100 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['knockout']).toBe(true);
});
it('should set knockout uniform to false when controller knockout is false', function ()
{
var controller = { glcolor: [ 1, 1, 1, 1 ], outerStrength: 4, innerStrength: 0, scale: 1, knockout: false };
var drawingContext = { width: 100, height: 100 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['knockout']).toBe(false);
});
it('should set all six uniforms in a single call', function ()
{
var controller = { glcolor: [ 0, 1, 0, 1 ], outerStrength: 5, innerStrength: 2, scale: 0.5, knockout: true };
var drawingContext = { width: 1920, height: 1080 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['resolution']).toEqual([ 1920, 1080 ]);
expect(mockProgramManager.uniforms['glowColor']).toBe(controller.glcolor);
expect(mockProgramManager.uniforms['outerStrength']).toBe(5);
expect(mockProgramManager.uniforms['innerStrength']).toBe(2);
expect(mockProgramManager.uniforms['scale']).toBe(0.5);
expect(mockProgramManager.uniforms['knockout']).toBe(true);
});
it('should handle zero dimensions in drawingContext', function ()
{
var controller = { glcolor: [ 1, 1, 1, 1 ], outerStrength: 4, innerStrength: 0, scale: 1, knockout: false };
var drawingContext = { width: 0, height: 0 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['resolution']).toEqual([ 0, 0 ]);
});
it('should handle outerStrength and innerStrength of zero', function ()
{
var controller = { glcolor: [ 1, 1, 1, 1 ], outerStrength: 0, innerStrength: 0, scale: 1, knockout: false };
var drawingContext = { width: 100, height: 100 };
FilterGlow.prototype.setupUniforms.call(instance, controller, drawingContext);
expect(mockProgramManager.uniforms['outerStrength']).toBe(0);
expect(mockProgramManager.uniforms['innerStrength']).toBe(0);
});
});
});