phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
545 lines (418 loc) • 16.7 kB
JavaScript
vi.mock('../../../src/gameobjects/GameObject', function ()
{
return { RENDER_MASK: 15 };
});
var DOMElementCSSRenderer = require('../../../src/gameobjects/domelement/DOMElementCSSRenderer');
var TransformMatrix = require('../../../src/gameobjects/components/TransformMatrix');
var CSSBlendModes = require('../../../src/gameobjects/domelement/CSSBlendModes');
var RENDER_MASK = 15;
function makeStyle ()
{
return {
display: '',
opacity: '',
zIndex: '',
pointerEvents: '',
mixBlendMode: '',
transform: '',
transformOrigin: ''
};
}
function makeSrc (overrides)
{
var style = makeStyle();
var src = {
node: { style: style },
scene: { sys: { settings: { visible: true } } },
renderFlags: RENDER_MASK,
cameraFilter: 0,
alpha: 1,
width: 100,
height: 100,
originX: 0.5,
originY: 0.5,
scrollFactorX: 1,
scrollFactorY: 1,
x: 0,
y: 0,
rotation: 0,
scaleX: 1,
scaleY: 1,
skewX: 0,
skewY: 0,
rotate3d: { x: 0, y: 0, z: 1, w: 0 },
rotate3dAngle: 'deg',
_depth: 0,
_blendMode: 0,
pointerEvents: 'auto',
transformOnly: false,
parentContainer: null
};
if (overrides)
{
for (var key in overrides)
{
src[key] = overrides[key];
}
}
return src;
}
function makeCamera (overrides)
{
var camera = {
alpha: 1,
id: 1,
scrollX: 0,
scrollY: 0,
matrix: new TransformMatrix()
};
if (overrides)
{
for (var key in overrides)
{
camera[key] = overrides[key];
}
}
return camera;
}
describe('DOMElementCSSRenderer', function ()
{
var renderer;
beforeEach(function ()
{
renderer = {};
});
describe('module export', function ()
{
it('should export a function', function ()
{
expect(typeof DOMElementCSSRenderer).toBe('function');
});
});
describe('early return when src.node is missing', function ()
{
it('should return without error when src.node is null', function ()
{
var src = makeSrc({ node: null });
var camera = makeCamera();
expect(function () { DOMElementCSSRenderer(renderer, src, camera); }).not.toThrow();
});
it('should return without error when src.node is undefined', function ()
{
var src = makeSrc();
src.node = undefined;
var camera = makeCamera();
expect(function () { DOMElementCSSRenderer(renderer, src, camera); }).not.toThrow();
});
it('should not modify style when src.node is null', function ()
{
var externalStyle = makeStyle();
var src = makeSrc({ node: null });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
// externalStyle is untouched since src.node was null
expect(externalStyle.display).toBe('');
});
});
describe('camera unwrapping', function ()
{
it('should unwrap camera.camera when camera is a DrawingContext wrapper', function ()
{
var src = makeSrc();
var realCamera = makeCamera({ alpha: 0.5 });
var drawingContext = { camera: realCamera };
DOMElementCSSRenderer(renderer, src, drawingContext);
expect(src.node.style.opacity).toBe(0.5);
});
it('should use camera directly when camera.camera is not set', function ()
{
var src = makeSrc();
var camera = makeCamera({ alpha: 0.75 });
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.opacity).toBe(0.75);
});
});
describe('display none conditions', function ()
{
it('should set style.display to none when settings.visible is false', function ()
{
var src = makeSrc();
src.scene.sys.settings.visible = false;
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('none');
});
it('should set style.display to none when renderFlags does not match RENDER_MASK', function ()
{
var src = makeSrc({ renderFlags: 0 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('none');
});
it('should set style.display to none when renderFlags is partially set', function ()
{
var src = makeSrc({ renderFlags: 7 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('none');
});
it('should set style.display to none when cameraFilter matches camera.id via bitwise AND', function ()
{
var camera = makeCamera({ id: 4 });
var src = makeSrc({ cameraFilter: 4 });
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('none');
});
it('should not hide when cameraFilter is non-zero but does not match camera.id', function ()
{
var camera = makeCamera({ id: 2 });
var src = makeSrc({ cameraFilter: 4 });
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('block');
});
it('should not hide when cameraFilter is zero regardless of camera.id', function ()
{
var camera = makeCamera({ id: 1 });
var src = makeSrc({ cameraFilter: 0 });
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('block');
});
it('should set style.display to none when parentContainer.willRender returns false', function ()
{
var src = makeSrc({
parentContainer: {
alpha: 1,
willRender: function () { return false; }
}
});
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('none');
});
it('should not hide when parentContainer.willRender returns true', function ()
{
var src = makeSrc({
parentContainer: {
alpha: 1,
willRender: function () { return true; }
}
});
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('block');
});
});
describe('style properties when rendering', function ()
{
it('should set style.display to block when all conditions pass and transformOnly is false', function ()
{
var src = makeSrc({ transformOnly: false });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('block');
});
it('should not override style.display when transformOnly is true', function ()
{
var src = makeSrc({ transformOnly: true });
src.node.style.display = 'inline';
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.display).toBe('inline');
});
it('should set style.opacity to camera alpha times src alpha', function ()
{
var src = makeSrc({ alpha: 0.5 });
var camera = makeCamera({ alpha: 0.8 });
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.opacity).toBeCloseTo(0.4);
});
it('should set style.opacity to 1 when both camera and src alpha are 1', function ()
{
var src = makeSrc({ alpha: 1 });
var camera = makeCamera({ alpha: 1 });
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.opacity).toBe(1);
});
it('should multiply parent container alpha into opacity', function ()
{
var src = makeSrc({
alpha: 0.5,
parentContainer: {
alpha: 0.5,
willRender: function () { return true; }
}
});
var camera = makeCamera({ alpha: 1 });
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.opacity).toBeCloseTo(0.25);
});
it('should set style.zIndex from src._depth', function ()
{
var src = makeSrc({ _depth: 5 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.zIndex).toBe(5);
});
it('should set style.zIndex to zero when _depth is 0', function ()
{
var src = makeSrc({ _depth: 0 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.zIndex).toBe(0);
});
it('should set style.pointerEvents from src.pointerEvents', function ()
{
var src = makeSrc({ pointerEvents: 'none' });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.pointerEvents).toBe('none');
});
it('should set style.pointerEvents to auto by default', function ()
{
var src = makeSrc({ pointerEvents: 'auto' });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.pointerEvents).toBe('auto');
});
it('should set style.mixBlendMode to normal for blend mode 0', function ()
{
var src = makeSrc({ _blendMode: 0 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.mixBlendMode).toBe('normal');
});
it('should set style.mixBlendMode to multiply for blend mode 1', function ()
{
var src = makeSrc({ _blendMode: 1 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.mixBlendMode).toBe(CSSBlendModes[1]);
expect(src.node.style.mixBlendMode).toBe('multiply');
});
it('should set style.mixBlendMode to screen for blend mode 3', function ()
{
var src = makeSrc({ _blendMode: 3 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.mixBlendMode).toBe('screen');
});
it('should not set style.opacity or display when transformOnly is true', function ()
{
var src = makeSrc({ transformOnly: true, alpha: 0.3 });
src.node.style.opacity = '';
var camera = makeCamera({ alpha: 1 });
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.opacity).toBe('');
});
});
describe('style.transform', function ()
{
it('should set style.transform containing skew values', function ()
{
var src = makeSrc({ skewX: 0.1, skewY: 0.2 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.transform).toContain('skew(0.1rad, 0.2rad)');
});
it('should set style.transform with zero skew values', function ()
{
var src = makeSrc({ skewX: 0, skewY: 0 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.transform).toContain('skew(0rad, 0rad)');
});
it('should set style.transform containing rotate3d values', function ()
{
var src = makeSrc({
rotate3d: { x: 0, y: 0, z: 1, w: 45 },
rotate3dAngle: 'deg'
});
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.transform).toContain('rotate3d(0,0,1,45deg)');
});
it('should set style.transform even when transformOnly is true', function ()
{
var src = makeSrc({ transformOnly: true });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(typeof src.node.style.transform).toBe('string');
expect(src.node.style.transform.length).toBeGreaterThan(0);
expect(src.node.style.transform).toContain('skew(');
expect(src.node.style.transform).toContain('rotate3d(');
});
it('should include a CSS matrix in style.transform', function ()
{
var src = makeSrc();
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.transform).toContain('matrix(');
});
});
describe('style.transformOrigin', function ()
{
it('should set transformOrigin to 50% 50% when originX and originY are 0.5 with no parentMatrix', function ()
{
var src = makeSrc({ originX: 0.5, originY: 0.5 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.transformOrigin).toBe('50% 50%');
});
it('should set transformOrigin to 0% 0% when origins are 0 and no parentMatrix', function ()
{
var src = makeSrc({ originX: 0, originY: 0 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.transformOrigin).toBe('0% 0%');
});
it('should set transformOrigin to 100% 100% when origins are 1 and no parentMatrix', function ()
{
var src = makeSrc({ originX: 1, originY: 1 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.transformOrigin).toBe('100% 100%');
});
it('should set transformOrigin to 25% 75% when originX is 0.25 and originY is 0.75', function ()
{
var src = makeSrc({ originX: 0.25, originY: 0.75 });
var camera = makeCamera();
DOMElementCSSRenderer(renderer, src, camera);
expect(src.node.style.transformOrigin).toBe('25% 75%');
});
it('should set transformOrigin to 0% 0% when parentMatrix is provided', function ()
{
var src = makeSrc({ originX: 0.5, originY: 0.5 });
var camera = makeCamera();
var parentMatrix = new TransformMatrix();
DOMElementCSSRenderer(renderer, src, camera, parentMatrix);
expect(src.node.style.transformOrigin).toBe('0% 0%');
});
});
describe('parentMatrix handling', function ()
{
it('should accept a parentMatrix without throwing', function ()
{
var src = makeSrc();
var camera = makeCamera();
var parentMatrix = new TransformMatrix();
expect(function () { DOMElementCSSRenderer(renderer, src, camera, parentMatrix); }).not.toThrow();
});
it('should still set display and transform when parentMatrix is provided', function ()
{
var src = makeSrc();
var camera = makeCamera();
var parentMatrix = new TransformMatrix();
DOMElementCSSRenderer(renderer, src, camera, parentMatrix);
expect(src.node.style.display).toBe('block');
expect(src.node.style.transform).toBeTruthy();
});
it('should use 0% 0% as transformOrigin when parentMatrix is provided regardless of origin values', function ()
{
var src = makeSrc({ originX: 1, originY: 1 });
var camera = makeCamera();
var parentMatrix = new TransformMatrix();
DOMElementCSSRenderer(renderer, src, camera, parentMatrix);
expect(src.node.style.transformOrigin).toBe('0% 0%');
});
});
});