UNPKG

phaser

Version:

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

289 lines (228 loc) 9.26 kB
var GetPoints = require('../../../src/geom/triangle/GetPoints'); // 3-4-5 right triangle: A=(0,0), B=(4,0), C=(0,3) // LineA: (0,0)->(4,0), length=4 // LineB: (4,0)->(0,3), length=5 // LineC: (0,3)->(0,0), length=3 // Perimeter = 12 function makeMockTriangle () { return { getLineA: function () { return { x1: 0, y1: 0, x2: 4, y2: 0 }; }, getLineB: function () { return { x1: 4, y1: 0, x2: 0, y2: 3 }; }, getLineC: function () { return { x1: 0, y1: 3, x2: 0, y2: 0 }; } }; } // Equilateral-ish triangle with integer side lengths for easy reasoning // A=(0,0), B=(6,0), C=(6,0): degenerate — avoid. // Use a simple 3-4-5 triangle (perimeter=12) as above. describe('Phaser.Geom.Triangle.GetPoints', function () { it('should return an empty array when quantity is 0 and stepRate is 0', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 0, 0); expect(Array.isArray(result)).toBe(true); expect(result.length).toBe(0); }); it('should return an empty array when quantity is 0 and stepRate is falsy', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 0, 0); expect(result.length).toBe(0); }); it('should return the correct number of points when quantity is specified', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 6, 0); expect(result.length).toBe(6); }); it('should return one point when quantity is 1', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 1, 0); expect(result.length).toBe(1); }); it('should place the first point at the start of line A when quantity is 1', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 1, 0); // i=0: p = 12 * (0/1) = 0, on line1, localPos=0, x=0, y=0 expect(result[0].x).toBeCloseTo(0); expect(result[0].y).toBeCloseTo(0); }); it('should return Vector2-like objects with x and y properties', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 4, 0); for (var i = 0; i < result.length; i++) { expect(typeof result[i].x).toBe('number'); expect(typeof result[i].y).toBe('number'); } }); it('should distribute 12 points evenly across a 3-4-5 triangle', function () { var tri = makeMockTriangle(); // Perimeter=12, quantity=12 => step=1 unit apart var result = GetPoints(tri, 12, 0); expect(result.length).toBe(12); // i=0: p=0, line1, localPos=0/4=0, (0,0) expect(result[0].x).toBeCloseTo(0); expect(result[0].y).toBeCloseTo(0); // i=1: p=1, line1, localPos=1/4=0.25, (1,0) expect(result[1].x).toBeCloseTo(1); expect(result[1].y).toBeCloseTo(0); // i=2: p=2, line1, localPos=2/4=0.5, (2,0) expect(result[2].x).toBeCloseTo(2); expect(result[2].y).toBeCloseTo(0); // i=3: p=3, line1, localPos=3/4=0.75, (3,0) expect(result[3].x).toBeCloseTo(3); expect(result[3].y).toBeCloseTo(0); // i=4: p=4, NOT < 4 and NOT > 9, line2, p-=4=0, localPos=0, (4,0) expect(result[4].x).toBeCloseTo(4); expect(result[4].y).toBeCloseTo(0); // i=9: p=9, NOT < 4 and NOT > 9, line2, p-=4=5, localPos=1, (0,3) expect(result[9].x).toBeCloseTo(0); expect(result[9].y).toBeCloseTo(3); // i=10: p=10, > 9, line3, p-=9=1, localPos=1/3, x=0, y=3+(0-3)*(1/3)=2 expect(result[10].x).toBeCloseTo(0); expect(result[10].y).toBeCloseTo(2); // i=11: p=11, > 9, line3, p-=9=2, localPos=2/3, x=0, y=3+(0-3)*(2/3)=1 expect(result[11].x).toBeCloseTo(0); expect(result[11].y).toBeCloseTo(1); }); it('should use stepRate to determine quantity when quantity is 0', function () { var tri = makeMockTriangle(); // perimeter=12, stepRate=1 => quantity=12 var result = GetPoints(tri, 0, 1); expect(result.length).toBe(12); }); it('should use stepRate=2 to produce 6 points on a perimeter-12 triangle', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 0, 2); expect(result.length).toBe(6); }); it('should use stepRate=4 to produce 3 points on a perimeter-12 triangle', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 0, 4); expect(result.length).toBe(3); }); it('should ignore stepRate when quantity is non-zero', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 5, 1); expect(result.length).toBe(5); }); it('should append to an existing out array', function () { var tri = makeMockTriangle(); var out = []; var returned = GetPoints(tri, 3, 0, out); expect(returned).toBe(out); expect(out.length).toBe(3); }); it('should return the same array reference that was passed in', function () { var tri = makeMockTriangle(); var out = []; var result = GetPoints(tri, 4, 0, out); expect(result).toBe(out); }); it('should append points to a pre-populated out array', function () { var tri = makeMockTriangle(); var out = [ { x: 99, y: 99 } ]; GetPoints(tri, 3, 0, out); expect(out.length).toBe(4); expect(out[0].x).toBe(99); }); it('should create a new array when out is not provided', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 3, 0); expect(Array.isArray(result)).toBe(true); expect(result.length).toBe(3); }); it('should place points on line A for positions within the first edge', function () { var tri = makeMockTriangle(); // With quantity=4, step=3 units: p values = 0, 3, 6, 9 // i=0: p=0, line1, (0,0) // i=1: p=3, line1, localPos=3/4=0.75, (3,0) var result = GetPoints(tri, 4, 0); expect(result[0].y).toBeCloseTo(0); // on line A (y=0) expect(result[1].y).toBeCloseTo(0); // still on line A }); it('should place points on line B for positions in the middle edge range', function () { var tri = makeMockTriangle(); // i=5 with quantity=12: p=5, line2, p-=4=1, localPos=0.2 // x=4+(-4)*0.2=3.2, y=0+(3)*0.2=0.6 var result = GetPoints(tri, 12, 0); expect(result[5].x).toBeCloseTo(3.2); expect(result[5].y).toBeCloseTo(0.6); }); it('should place points on line C for positions beyond line A + B lengths', function () { var tri = makeMockTriangle(); // i=10 with quantity=12: p=10 > 9, line3, p-=9=1, localPos=1/3 // x=0+(0-0)*(1/3)=0, y=3+(0-3)*(1/3)=2 var result = GetPoints(tri, 12, 0); expect(result[10].x).toBeCloseTo(0); expect(result[10].y).toBeCloseTo(2); }); it('should work with a degenerate triangle where all points are the same', function () { var degenerateTri = { getLineA: function () { return { x1: 5, y1: 5, x2: 5, y2: 5 }; }, getLineB: function () { return { x1: 5, y1: 5, x2: 5, y2: 5 }; }, getLineC: function () { return { x1: 5, y1: 5, x2: 5, y2: 5 }; } }; var result = GetPoints(degenerateTri, 0, 1); // perimeter=0, quantity=0/1=0, so no points expect(result.length).toBe(0); }); it('should handle a flat horizontal triangle', function () { // All vertices on y=0: A=(0,0), B=(10,0), C=(5,0) // LineA: (0,0)->(10,0), len=10; LineB: (10,0)->(5,0), len=5; LineC: (5,0)->(0,0), len=5 // Perimeter=20 var flatTri = { getLineA: function () { return { x1: 0, y1: 0, x2: 10, y2: 0 }; }, getLineB: function () { return { x1: 10, y1: 0, x2: 5, y2: 0 }; }, getLineC: function () { return { x1: 5, y1: 0, x2: 0, y2: 0 }; } }; var result = GetPoints(flatTri, 4, 0); expect(result.length).toBe(4); for (var i = 0; i < result.length; i++) { expect(result[i].y).toBeCloseTo(0); } }); it('should use falsy quantity values (null, false, undefined) the same as 0', function () { var tri = makeMockTriangle(); var r1 = GetPoints(tri, null, 2); var r2 = GetPoints(tri, false, 2); var r3 = GetPoints(tri, undefined, 2); // perimeter=12, stepRate=2 => 6 points each expect(r1.length).toBe(6); expect(r2.length).toBe(6); expect(r3.length).toBe(6); }); it('should not add points if stepRate is 0 and quantity is falsy', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, false, 0); expect(result.length).toBe(0); }); it('should not add points if stepRate is negative and quantity is falsy', function () { var tri = makeMockTriangle(); var result = GetPoints(tri, 0, -1); expect(result.length).toBe(0); }); });