phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
351 lines (311 loc) • 10.9 kB
JavaScript
var Button = require('../../../src/input/gamepad/Button');
function createMockPad ()
{
var manager = {
emitted: [],
emit: function (event)
{
this.emitted.push(Array.prototype.slice.call(arguments));
}
};
var pad = {
emitted: [],
manager: manager,
emit: function (event)
{
this.emitted.push(Array.prototype.slice.call(arguments));
}
};
return pad;
}
describe('Button', function ()
{
describe('constructor', function ()
{
it('should set pad reference from argument', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
expect(btn.pad).toBe(pad);
});
it('should set events to pad.manager', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
expect(btn.events).toBe(pad.manager);
});
it('should set index from argument', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 3);
expect(btn.index).toBe(3);
});
it('should default value to 0', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
expect(btn.value).toBe(0);
});
it('should default threshold to 1', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
expect(btn.threshold).toBe(1);
});
it('should default pressed to false when isPressed is not provided', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
expect(btn.pressed).toBe(false);
});
it('should set pressed to false when isPressed is explicitly false', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0, false);
expect(btn.pressed).toBe(false);
});
it('should set pressed to true when isPressed is true', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0, true);
expect(btn.pressed).toBe(true);
});
it('should store index 0', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
expect(btn.index).toBe(0);
});
it('should store large index values', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 15);
expect(btn.index).toBe(15);
});
});
describe('update', function ()
{
it('should set the value property', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(0.5);
expect(btn.value).toBe(0.5);
});
it('should set value to 0', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(0);
expect(btn.value).toBe(0);
});
it('should set value to 1', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(1);
expect(btn.value).toBe(1);
});
it('should set pressed to true when value meets threshold', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(1);
expect(btn.pressed).toBe(true);
});
it('should set pressed to true when value exceeds threshold', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.threshold = 0.5;
btn.update(0.8);
expect(btn.pressed).toBe(true);
});
it('should not set pressed when value is below threshold', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(0.5);
expect(btn.pressed).toBe(false);
});
it('should emit BUTTON_DOWN on pad.manager when button is first pressed', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 2);
btn.update(1);
expect(pad.manager.emitted.length).toBe(1);
expect(pad.manager.emitted[0][0]).toBe('down');
});
it('should emit GAMEPAD_BUTTON_DOWN on pad when button is first pressed', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 2);
btn.update(1);
expect(pad.emitted.length).toBe(1);
expect(pad.emitted[0][0]).toBe('down');
});
it('should pass pad, button, and value to BUTTON_DOWN event', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 2);
btn.update(1);
var args = pad.manager.emitted[0];
expect(args[1]).toBe(pad);
expect(args[2]).toBe(btn);
expect(args[3]).toBe(1);
});
it('should pass index, value, and button to GAMEPAD_BUTTON_DOWN event', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 2);
btn.update(1);
var args = pad.emitted[0];
expect(args[1]).toBe(2);
expect(args[2]).toBe(1);
expect(args[3]).toBe(btn);
});
it('should not emit BUTTON_DOWN again if already pressed', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(1);
btn.update(1);
expect(pad.manager.emitted.length).toBe(1);
});
it('should emit BUTTON_UP when button is released', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(1);
pad.manager.emitted = [];
pad.emitted = [];
btn.update(0);
expect(pad.manager.emitted.length).toBe(1);
expect(pad.manager.emitted[0][0]).toBe('up');
});
it('should emit GAMEPAD_BUTTON_UP on pad when button is released', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(1);
pad.emitted = [];
btn.update(0);
expect(pad.emitted.length).toBe(1);
expect(pad.emitted[0][0]).toBe('up');
});
it('should set pressed to false when button is released', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(1);
expect(btn.pressed).toBe(true);
btn.update(0);
expect(btn.pressed).toBe(false);
});
it('should pass pad, button, and value to BUTTON_UP event', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 1);
btn.update(1);
pad.manager.emitted = [];
btn.update(0);
var args = pad.manager.emitted[0];
expect(args[1]).toBe(pad);
expect(args[2]).toBe(btn);
expect(args[3]).toBe(0);
});
it('should not emit BUTTON_UP when already released', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(0);
expect(pad.manager.emitted.length).toBe(0);
});
it('should not emit any events when value stays below threshold', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(0.3);
btn.update(0.5);
btn.update(0.9);
expect(pad.manager.emitted.length).toBe(0);
});
it('should emit down then up on press and release cycle', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(1);
btn.update(0);
expect(pad.manager.emitted.length).toBe(2);
expect(pad.manager.emitted[0][0]).toBe('down');
expect(pad.manager.emitted[1][0]).toBe('up');
});
it('should respect a custom lower threshold', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.threshold = 0.5;
btn.update(0.5);
expect(btn.pressed).toBe(true);
});
it('should not trigger pressed when value is just below custom threshold', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.threshold = 0.5;
btn.update(0.49);
expect(btn.pressed).toBe(false);
});
it('should not emit down event when constructed with isPressed true and updated with high value', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0, true);
btn.update(1);
expect(pad.manager.emitted.length).toBe(0);
});
it('should emit up event when constructed with isPressed true and updated with low value', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0, true);
btn.update(0);
expect(btn.pressed).toBe(false);
expect(pad.manager.emitted.length).toBe(1);
expect(pad.manager.emitted[0][0]).toBe('up');
});
it('should update value even when no state change occurs', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.update(0.3);
expect(btn.value).toBeCloseTo(0.3);
btn.update(0.7);
expect(btn.value).toBeCloseTo(0.7);
});
});
describe('destroy', function ()
{
it('should set pad to null', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.destroy();
expect(btn.pad).toBeNull();
});
it('should set events to null', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 0);
btn.destroy();
expect(btn.events).toBeNull();
});
it('should not affect index or value after destroy', function ()
{
var pad = createMockPad();
var btn = new Button(pad, 5);
btn.update(0.8);
btn.destroy();
expect(btn.index).toBe(5);
expect(btn.value).toBeCloseTo(0.8);
});
});
});