phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
522 lines (426 loc) • 15.2 kB
JavaScript
var SmoothedKeyControl = require('../../../src/cameras/controls/SmoothedKeyControl');
describe('SmoothedKeyControl', function ()
{
function makeCamera (scrollX, scrollY, zoom)
{
return {
scrollX: scrollX || 0,
scrollY: scrollY || 0,
zoom: zoom || 1
};
}
function makeKey (isDown)
{
return { isDown: !!isDown };
}
describe('constructor', function ()
{
it('should create with default values when given empty config', function ()
{
var ctrl = new SmoothedKeyControl({});
expect(ctrl.camera).toBeNull();
expect(ctrl.left).toBeNull();
expect(ctrl.right).toBeNull();
expect(ctrl.up).toBeNull();
expect(ctrl.down).toBeNull();
expect(ctrl.zoomIn).toBeNull();
expect(ctrl.zoomOut).toBeNull();
expect(ctrl.zoomSpeed).toBe(0.01);
expect(ctrl.minZoom).toBe(0.001);
expect(ctrl.maxZoom).toBe(1000);
expect(ctrl.accelX).toBe(0);
expect(ctrl.accelY).toBe(0);
expect(ctrl.dragX).toBe(0);
expect(ctrl.dragY).toBe(0);
expect(ctrl.maxSpeedX).toBe(0);
expect(ctrl.maxSpeedY).toBe(0);
expect(ctrl.active).toBe(false);
});
it('should set active to true when a camera is provided', function ()
{
var ctrl = new SmoothedKeyControl({ camera: makeCamera() });
expect(ctrl.active).toBe(true);
});
it('should set active to false when no camera is provided', function ()
{
var ctrl = new SmoothedKeyControl({});
expect(ctrl.active).toBe(false);
});
it('should assign key objects from config', function ()
{
var left = makeKey(false);
var right = makeKey(false);
var up = makeKey(false);
var down = makeKey(false);
var zoomIn = makeKey(false);
var zoomOut = makeKey(false);
var ctrl = new SmoothedKeyControl({
left: left,
right: right,
up: up,
down: down,
zoomIn: zoomIn,
zoomOut: zoomOut
});
expect(ctrl.left).toBe(left);
expect(ctrl.right).toBe(right);
expect(ctrl.up).toBe(up);
expect(ctrl.down).toBe(down);
expect(ctrl.zoomIn).toBe(zoomIn);
expect(ctrl.zoomOut).toBe(zoomOut);
});
it('should set zoomSpeed, minZoom, maxZoom from config', function ()
{
var ctrl = new SmoothedKeyControl({ zoomSpeed: 0.05, minZoom: 0.5, maxZoom: 4 });
expect(ctrl.zoomSpeed).toBe(0.05);
expect(ctrl.minZoom).toBe(0.5);
expect(ctrl.maxZoom).toBe(4);
});
it('should apply scalar acceleration to both axes', function ()
{
var ctrl = new SmoothedKeyControl({ acceleration: 0.06 });
expect(ctrl.accelX).toBe(0.06);
expect(ctrl.accelY).toBe(0.06);
});
it('should apply object acceleration to individual axes', function ()
{
var ctrl = new SmoothedKeyControl({ acceleration: { x: 0.1, y: 0.2 } });
expect(ctrl.accelX).toBe(0.1);
expect(ctrl.accelY).toBe(0.2);
});
it('should apply scalar drag to both axes', function ()
{
var ctrl = new SmoothedKeyControl({ drag: 0.0005 });
expect(ctrl.dragX).toBe(0.0005);
expect(ctrl.dragY).toBe(0.0005);
});
it('should apply object drag to individual axes', function ()
{
var ctrl = new SmoothedKeyControl({ drag: { x: 0.001, y: 0.002 } });
expect(ctrl.dragX).toBe(0.001);
expect(ctrl.dragY).toBe(0.002);
});
it('should apply scalar maxSpeed to both axes', function ()
{
var ctrl = new SmoothedKeyControl({ maxSpeed: 1.0 });
expect(ctrl.maxSpeedX).toBe(1.0);
expect(ctrl.maxSpeedY).toBe(1.0);
});
it('should apply object maxSpeed to individual axes', function ()
{
var ctrl = new SmoothedKeyControl({ maxSpeed: { x: 2.0, y: 3.0 } });
expect(ctrl.maxSpeedX).toBe(2.0);
expect(ctrl.maxSpeedY).toBe(3.0);
});
});
describe('start', function ()
{
it('should return this for chaining', function ()
{
var ctrl = new SmoothedKeyControl({});
expect(ctrl.start()).toBe(ctrl);
});
it('should set active true when camera is set', function ()
{
var ctrl = new SmoothedKeyControl({ camera: makeCamera() });
ctrl.active = false;
ctrl.start();
expect(ctrl.active).toBe(true);
});
it('should leave active false when no camera is set', function ()
{
var ctrl = new SmoothedKeyControl({});
ctrl.start();
expect(ctrl.active).toBe(false);
});
});
describe('stop', function ()
{
it('should return this for chaining', function ()
{
var ctrl = new SmoothedKeyControl({});
expect(ctrl.stop()).toBe(ctrl);
});
it('should set active to false', function ()
{
var ctrl = new SmoothedKeyControl({ camera: makeCamera() });
expect(ctrl.active).toBe(true);
ctrl.stop();
expect(ctrl.active).toBe(false);
});
});
describe('setCamera', function ()
{
it('should return this for chaining', function ()
{
var ctrl = new SmoothedKeyControl({});
expect(ctrl.setCamera(makeCamera())).toBe(ctrl);
});
it('should assign the camera', function ()
{
var ctrl = new SmoothedKeyControl({});
var cam = makeCamera();
ctrl.setCamera(cam);
expect(ctrl.camera).toBe(cam);
});
it('should replace an existing camera', function ()
{
var cam1 = makeCamera();
var cam2 = makeCamera();
var ctrl = new SmoothedKeyControl({ camera: cam1 });
ctrl.setCamera(cam2);
expect(ctrl.camera).toBe(cam2);
});
});
describe('update', function ()
{
it('should do nothing when inactive', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({ camera: cam });
ctrl.stop();
ctrl.update(16);
expect(cam.scrollX).toBe(0);
expect(cam.scrollY).toBe(0);
expect(cam.zoom).toBe(1);
});
it('should do nothing when no keys are pressed and speed is zero', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({ camera: cam, acceleration: 0.1, drag: 0.001, maxSpeed: 1 });
ctrl.update(16);
expect(cam.scrollX).toBe(0);
expect(cam.scrollY).toBe(0);
expect(cam.zoom).toBe(1);
});
it('should accelerate camera scroll when left key is held', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
left: makeKey(true),
acceleration: 0.5,
drag: 0,
maxSpeed: 10
});
ctrl.update(16);
expect(cam.scrollX).toBeLessThan(0);
});
it('should accelerate camera scroll when right key is held', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
right: makeKey(true),
acceleration: 0.5,
drag: 0,
maxSpeed: 10
});
ctrl.update(16);
expect(cam.scrollX).toBeGreaterThan(0);
});
it('should accelerate camera scroll when up key is held', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
up: makeKey(true),
acceleration: 0.5,
drag: 0,
maxSpeed: 10
});
ctrl.update(16);
expect(cam.scrollY).toBeLessThan(0);
});
it('should accelerate camera scroll when down key is held', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
down: makeKey(true),
acceleration: 0.5,
drag: 0,
maxSpeed: 10
});
ctrl.update(16);
expect(cam.scrollY).toBeGreaterThan(0);
});
it('should not exceed maxSpeedX when left key is held', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
left: makeKey(true),
acceleration: 5,
drag: 0,
maxSpeed: 2
});
// Run many frames to try to exceed maxSpeed
for (var i = 0; i < 100; i++)
{
ctrl.update(16);
}
expect(ctrl._speedX).toBeLessThanOrEqual(2);
});
it('should not exceed maxSpeedY when down key is held', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
down: makeKey(true),
acceleration: 5,
drag: 0,
maxSpeed: 2
});
for (var i = 0; i < 100; i++)
{
ctrl.update(16);
}
expect(ctrl._speedY).toBeGreaterThanOrEqual(-2);
});
it('should apply drag to decelerate _speedX over time', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
drag: 0.1,
maxSpeed: 10,
acceleration: 0
});
// Manually set internal speed
ctrl._speedX = 5;
ctrl.update(10);
expect(ctrl._speedX).toBeLessThan(5);
expect(ctrl._speedX).toBeGreaterThanOrEqual(0);
});
it('should apply drag to decelerate negative _speedX over time', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
drag: 0.1,
maxSpeed: 10,
acceleration: 0
});
ctrl._speedX = -5;
ctrl.update(10);
expect(ctrl._speedX).toBeGreaterThan(-5);
expect(ctrl._speedX).toBeLessThanOrEqual(0);
});
it('should clamp _speedX to zero when drag exceeds remaining speed', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
drag: 100,
maxSpeed: 10,
acceleration: 0
});
ctrl._speedX = 0.001;
ctrl.update(1);
expect(ctrl._speedX).toBe(0);
});
it('should zoom in when zoomIn key is held', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
zoomIn: makeKey(true),
zoomSpeed: 0.1
});
ctrl.update(16);
expect(cam.zoom).toBeLessThan(1);
});
it('should zoom out when zoomOut key is held', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
zoomOut: makeKey(true),
zoomSpeed: 0.1
});
ctrl.update(16);
expect(cam.zoom).toBeGreaterThan(1);
});
it('should not zoom below minZoom', function ()
{
var cam = makeCamera(0, 0, 0.002);
var ctrl = new SmoothedKeyControl({
camera: cam,
zoomIn: makeKey(true),
zoomSpeed: 0.1,
minZoom: 0.001
});
for (var i = 0; i < 100; i++)
{
ctrl.update(16);
}
expect(cam.zoom).toBeGreaterThanOrEqual(0.001);
});
it('should not zoom above maxZoom', function ()
{
var cam = makeCamera(0, 0, 999);
var ctrl = new SmoothedKeyControl({
camera: cam,
zoomOut: makeKey(true),
zoomSpeed: 0.1,
maxZoom: 1000
});
for (var i = 0; i < 100; i++)
{
ctrl.update(16);
}
expect(cam.zoom).toBeLessThanOrEqual(1000);
});
it('should not change zoom when neither zoomIn nor zoomOut is pressed', function ()
{
var cam = makeCamera(0, 0, 2);
var ctrl = new SmoothedKeyControl({
camera: cam,
zoomIn: makeKey(false),
zoomOut: makeKey(false),
zoomSpeed: 0.1
});
ctrl.update(16);
expect(cam.zoom).toBe(2);
});
it('should default delta to 1 when called with no argument', function ()
{
var cam = makeCamera(0, 0, 1);
var ctrl = new SmoothedKeyControl({
camera: cam,
left: makeKey(true),
acceleration: 2,
drag: 0,
maxSpeed: 10
});
// Should not throw and should move the camera
ctrl.update();
// _speedX should have been set, and scrollX adjusted
expect(cam.scrollX).toBeLessThan(0);
});
});
describe('destroy', function ()
{
it('should null out camera and key references', function ()
{
var ctrl = new SmoothedKeyControl({
camera: makeCamera(),
left: makeKey(false),
right: makeKey(false),
up: makeKey(false),
down: makeKey(false),
zoomIn: makeKey(false),
zoomOut: makeKey(false)
});
ctrl.destroy();
expect(ctrl.camera).toBeNull();
expect(ctrl.left).toBeNull();
expect(ctrl.right).toBeNull();
expect(ctrl.up).toBeNull();
expect(ctrl.down).toBeNull();
expect(ctrl.zoomIn).toBeNull();
expect(ctrl.zoomOut).toBeNull();
});
});
});