phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
254 lines (191 loc) • 7.99 kB
JavaScript
var CaptureFrameWebGLRenderer = require('../../../src/gameobjects/captureframe/CaptureFrameWebGLRenderer');
describe('CaptureFrameWebGLRenderer', function ()
{
var renderer;
var src;
var drawingContext;
var mockBatch;
var mockCamera;
var mockSrcDrawingContext;
beforeEach(function ()
{
mockBatch = vi.fn();
mockCamera = { addToRenderList: vi.fn() };
mockSrcDrawingContext = {
resize: vi.fn(),
use: vi.fn(),
release: vi.fn()
};
renderer = {};
src = {
customRenderNodes: {},
defaultRenderNodes: {
BatchHandler: { batch: mockBatch }
},
drawingContext: mockSrcDrawingContext
};
drawingContext = {
useCanvas: false,
camera: mockCamera,
width: 800,
height: 600,
texture: {}
};
});
it('should be importable', function ()
{
expect(CaptureFrameWebGLRenderer).toBeDefined();
});
it('should be a function', function ()
{
expect(typeof CaptureFrameWebGLRenderer).toBe('function');
});
it('should call addToRenderList with src when useCanvas is false', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockCamera.addToRenderList).toHaveBeenCalledWith(src);
});
it('should not call addToRenderList when useCanvas is true', function ()
{
drawingContext.useCanvas = true;
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockCamera.addToRenderList).not.toHaveBeenCalled();
});
it('should resize src drawingContext to match drawingContext dimensions', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockSrcDrawingContext.resize).toHaveBeenCalledWith(800, 600);
});
it('should call use() on src drawingContext', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockSrcDrawingContext.use).toHaveBeenCalled();
});
it('should call release() on src drawingContext', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockSrcDrawingContext.release).toHaveBeenCalled();
});
it('should call batch on defaultRenderNodes.BatchHandler when no custom handler', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockBatch).toHaveBeenCalled();
});
it('should prefer customRenderNodes.BatchHandler over default when present', function ()
{
var customBatch = vi.fn();
src.customRenderNodes.BatchHandler = { batch: customBatch };
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(customBatch).toHaveBeenCalled();
expect(mockBatch).not.toHaveBeenCalled();
});
it('should pass src.drawingContext as first argument to batch', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockBatch.mock.calls[0][0]).toBe(mockSrcDrawingContext);
});
it('should pass drawingContext.texture as second argument to batch', function ()
{
var mockTexture = { id: 'texture' };
drawingContext.texture = mockTexture;
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockBatch.mock.calls[0][1]).toBe(mockTexture);
});
it('should pass correct quad coordinates using width and height', function ()
{
drawingContext.width = 320;
drawingContext.height = 240;
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
var args = mockBatch.mock.calls[0];
// Quad in order TL, BL, TR, BR: x, y pairs
expect(args[2]).toBe(0); // TL x
expect(args[3]).toBe(240); // TL y (height)
expect(args[4]).toBe(0); // BL x
expect(args[5]).toBe(0); // BL y
expect(args[6]).toBe(320); // TR x (width)
expect(args[7]).toBe(240); // TR y (height)
expect(args[8]).toBe(320); // BR x (width)
expect(args[9]).toBe(0); // BR y
});
it('should pass correct texture coordinates to batch', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
var args = mockBatch.mock.calls[0];
// Texture coords: x=0, y=0, w=1, h=1
expect(args[10]).toBe(0);
expect(args[11]).toBe(0);
expect(args[12]).toBe(1);
expect(args[13]).toBe(1);
});
it('should pass false for tint color flag', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
var args = mockBatch.mock.calls[0];
expect(args[14]).toBe(false);
});
it('should pass white tint colors for all four corners', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
var args = mockBatch.mock.calls[0];
expect(args[15]).toBe(0xffffffff);
expect(args[16]).toBe(0xffffffff);
expect(args[17]).toBe(0xffffffff);
expect(args[18]).toBe(0xffffffff);
});
it('should pass an empty object as render options', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
var args = mockBatch.mock.calls[0];
expect(typeof args[19]).toBe('object');
});
it('should return early without calling batch when useCanvas is true', function ()
{
drawingContext.useCanvas = true;
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockBatch).not.toHaveBeenCalled();
});
it('should return early without resizing src drawingContext when useCanvas is true', function ()
{
drawingContext.useCanvas = true;
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockSrcDrawingContext.resize).not.toHaveBeenCalled();
});
it('should call use() before batch', function ()
{
var callOrder = [];
mockSrcDrawingContext.use = vi.fn(function () { callOrder.push('use'); });
mockBatch = vi.fn(function () { callOrder.push('batch'); });
src.defaultRenderNodes.BatchHandler.batch = mockBatch;
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(callOrder.indexOf('use')).toBeLessThan(callOrder.indexOf('batch'));
});
it('should call batch before release', function ()
{
var callOrder = [];
mockBatch = vi.fn(function () { callOrder.push('batch'); });
src.defaultRenderNodes.BatchHandler.batch = mockBatch;
mockSrcDrawingContext.release = vi.fn(function () { callOrder.push('release'); });
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(callOrder.indexOf('batch')).toBeLessThan(callOrder.indexOf('release'));
});
it('should handle different width and height values correctly', function ()
{
drawingContext.width = 1920;
drawingContext.height = 1080;
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockSrcDrawingContext.resize).toHaveBeenCalledWith(1920, 1080);
var args = mockBatch.mock.calls[0];
expect(args[3]).toBe(1080); // TL y = height
expect(args[6]).toBe(1920); // TR x = width
expect(args[7]).toBe(1080); // TR y = height
expect(args[8]).toBe(1920); // BR x = width
});
it('should not produce unexpected side effects when called multiple times with useCanvas false', function ()
{
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
CaptureFrameWebGLRenderer(renderer, src, drawingContext);
expect(mockCamera.addToRenderList).toHaveBeenCalledTimes(2);
expect(mockBatch).toHaveBeenCalledTimes(2);
expect(mockSrcDrawingContext.release).toHaveBeenCalledTimes(2);
});
});