phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
130 lines (99 loc) • 3.75 kB
JavaScript
var CircumferencePoint = require('../../../src/geom/circle/CircumferencePoint');
var Vector2 = require('../../../src/math/Vector2');
describe('Phaser.Geom.Circle.CircumferencePoint', function ()
{
var circle;
beforeEach(function ()
{
circle = { x: 0, y: 0, radius: 1 };
});
it('should return a Vector2 when no out parameter is given', function ()
{
var result = CircumferencePoint(circle, 0);
expect(result).toBeInstanceOf(Vector2);
});
it('should return the provided out object', function ()
{
var out = new Vector2();
var result = CircumferencePoint(circle, 0, out);
expect(result).toBe(out);
});
it('should return the rightmost point at angle 0', function ()
{
var result = CircumferencePoint(circle, 0);
expect(result.x).toBeCloseTo(1);
expect(result.y).toBeCloseTo(0);
});
it('should return the bottom point at angle PI/2', function ()
{
var result = CircumferencePoint(circle, Math.PI / 2);
expect(result.x).toBeCloseTo(0);
expect(result.y).toBeCloseTo(1);
});
it('should return the leftmost point at angle PI', function ()
{
var result = CircumferencePoint(circle, Math.PI);
expect(result.x).toBeCloseTo(-1);
expect(result.y).toBeCloseTo(0);
});
it('should return the top point at angle 3*PI/2', function ()
{
var result = CircumferencePoint(circle, 3 * Math.PI / 2);
expect(result.x).toBeCloseTo(0);
expect(result.y).toBeCloseTo(-1);
});
it('should account for circle x and y offsets', function ()
{
var offsetCircle = { x: 10, y: 20, radius: 5 };
var result = CircumferencePoint(offsetCircle, 0);
expect(result.x).toBeCloseTo(15);
expect(result.y).toBeCloseTo(20);
});
it('should scale with circle radius', function ()
{
var largeCircle = { x: 0, y: 0, radius: 100 };
var result = CircumferencePoint(largeCircle, 0);
expect(result.x).toBeCloseTo(100);
expect(result.y).toBeCloseTo(0);
});
it('should handle a zero radius circle', function ()
{
var zeroCircle = { x: 5, y: 5, radius: 0 };
var result = CircumferencePoint(zeroCircle, Math.PI / 4);
expect(result.x).toBeCloseTo(5);
expect(result.y).toBeCloseTo(5);
});
it('should handle negative angles', function ()
{
var result = CircumferencePoint(circle, -Math.PI / 2);
expect(result.x).toBeCloseTo(0);
expect(result.y).toBeCloseTo(-1);
});
it('should handle a full rotation (2*PI) same as angle 0', function ()
{
var result = CircumferencePoint(circle, 2 * Math.PI);
expect(result.x).toBeCloseTo(1);
expect(result.y).toBeCloseTo(0);
});
it('should write results into a plain object with x and y if provided', function ()
{
var out = { x: 0, y: 0 };
var result = CircumferencePoint(circle, 0, out);
expect(result).toBe(out);
expect(out.x).toBeCloseTo(1);
expect(out.y).toBeCloseTo(0);
});
it('should handle floating point angle values', function ()
{
var result = CircumferencePoint(circle, 1.234);
expect(result.x).toBeCloseTo(Math.cos(1.234));
expect(result.y).toBeCloseTo(Math.sin(1.234));
});
it('should combine offset circle with radius correctly at PI/4', function ()
{
var c = { x: 3, y: 4, radius: 10 };
var result = CircumferencePoint(c, Math.PI / 4);
expect(result.x).toBeCloseTo(3 + 10 * Math.cos(Math.PI / 4));
expect(result.y).toBeCloseTo(4 + 10 * Math.sin(Math.PI / 4));
});
});