UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.

195 lines (149 loc) 5.99 kB
var GetPoints = require('../../../src/geom/ellipse/GetPoints'); var Circumference = require('../../../src/geom/ellipse/Circumference'); describe('Phaser.Geom.Ellipse.GetPoints', function () { var ellipse; beforeEach(function () { ellipse = { x: 0, y: 0, width: 100, height: 100 }; }); it('should return an empty array when quantity is zero and stepRate is not set', function () { var result = GetPoints(ellipse, 0); expect(Array.isArray(result)).toBe(true); expect(result.length).toBe(0); }); it('should return the correct number of points for a given quantity', function () { var result = GetPoints(ellipse, 8); expect(result.length).toBe(8); }); it('should return Vector2-like objects with x and y properties', function () { var result = GetPoints(ellipse, 4); for (var i = 0; i < result.length; i++) { expect(typeof result[i].x).toBe('number'); expect(typeof result[i].y).toBe('number'); } }); it('should derive quantity from stepRate when quantity is falsy', function () { var circumference = Circumference(ellipse); var stepRate = 10; var expectedQuantity = Math.ceil(circumference / stepRate); var result = GetPoints(ellipse, 0, stepRate); expect(result.length).toBe(expectedQuantity); }); it('should use quantity over stepRate when quantity is truthy', function () { var result = GetPoints(ellipse, 5, 1); expect(result.length).toBe(5); }); it('should use a provided output array', function () { var out = []; var result = GetPoints(ellipse, 4, 0, out); expect(result).toBe(out); expect(out.length).toBe(4); }); it('should append to an existing output array', function () { var out = []; var fakeVec = { x: 999, y: 999 }; out.push(fakeVec); GetPoints(ellipse, 3, 0, out); expect(out.length).toBe(4); expect(out[0]).toBe(fakeVec); }); it('should create a new array when out is not provided', function () { var result = GetPoints(ellipse, 4); expect(Array.isArray(result)).toBe(true); expect(result.length).toBe(4); }); it('should place points on the circumference of a circle', function () { var radius = 50; var circle = { x: 0, y: 0, width: radius * 2, height: radius * 2 }; var result = GetPoints(circle, 8); for (var i = 0; i < result.length; i++) { var dist = Math.sqrt(result[i].x * result[i].x + result[i].y * result[i].y); expect(dist).toBeCloseTo(radius, 5); } }); it('should start at angle 0 (rightmost point) for the first point', function () { var result = GetPoints(ellipse, 4); // i=0: angle = FromPercent(0/4, 0, TAU) = 0 // cos(0) = 1, sin(0) = 0 => x = ellipse.x + halfWidth, y = ellipse.y expect(result[0].x).toBeCloseTo(ellipse.x + ellipse.width / 2, 5); expect(result[0].y).toBeCloseTo(ellipse.y, 5); }); it('should distribute points evenly around a circle', function () { var circle = { x: 0, y: 0, width: 200, height: 200 }; var quantity = 4; var result = GetPoints(circle, quantity); // For a circle with 4 points, angles should be 0, PI/2, PI, 3PI/2 expect(result[0].x).toBeCloseTo(100, 5); expect(result[0].y).toBeCloseTo(0, 5); expect(result[1].x).toBeCloseTo(0, 5); expect(result[1].y).toBeCloseTo(100, 5); expect(result[2].x).toBeCloseTo(-100, 5); expect(result[2].y).toBeCloseTo(0, 5); expect(result[3].x).toBeCloseTo(0, 5); expect(result[3].y).toBeCloseTo(-100, 5); }); it('should respect ellipse x and y offset', function () { var offsetEllipse = { x: 50, y: 75, width: 100, height: 100 }; var result = GetPoints(offsetEllipse, 4); // First point at angle 0: x = 50 + 50 = 100, y = 75 expect(result[0].x).toBeCloseTo(100, 5); expect(result[0].y).toBeCloseTo(75, 5); }); it('should handle non-circular (stretched) ellipse correctly', function () { var stretched = { x: 0, y: 0, width: 200, height: 100 }; var result = GetPoints(stretched, 4); // At angle 0: x = halfWidth = 100, y = 0 expect(result[0].x).toBeCloseTo(100, 5); expect(result[0].y).toBeCloseTo(0, 5); // At angle PI/2: x = 0, y = halfHeight = 50 expect(result[1].x).toBeCloseTo(0, 5); expect(result[1].y).toBeCloseTo(50, 5); }); it('should return an empty array when quantity is null and stepRate is not positive', function () { var result = GetPoints(ellipse, null, 0); expect(result.length).toBe(0); }); it('should return an empty array when quantity is undefined and stepRate is not provided', function () { var result = GetPoints(ellipse, undefined); expect(result.length).toBe(0); }); it('should handle large quantities without error', function () { var result = GetPoints(ellipse, 360); expect(result.length).toBe(360); }); it('should return 1 point when quantity is 1', function () { var result = GetPoints(ellipse, 1); expect(result.length).toBe(1); // Only point at i=0, angle=0 expect(result[0].x).toBeCloseTo(ellipse.x + ellipse.width / 2, 5); expect(result[0].y).toBeCloseTo(ellipse.y, 5); }); it('should derive quantity from stepRate when quantity is false', function () { var circumference = Circumference(ellipse); var stepRate = 5; var expectedQuantity = Math.ceil(circumference / stepRate); var result = GetPoints(ellipse, false, stepRate); expect(result.length).toBe(expectedQuantity); }); });