UNPKG

phaser

Version:

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

308 lines (233 loc) 9.23 kB
var GetTilesWithin = require('../../../src/tilemaps/components/GetTilesWithin'); describe('Phaser.Tilemaps.Components.GetTilesWithin', function () { function makeTile(index, collides, hasInterestingFace) { return { index: index === undefined ? 1 : index, collides: collides === undefined ? false : collides, hasInterestingFace: hasInterestingFace === undefined ? false : hasInterestingFace }; } function makeLayer(width, height) { var data = []; for (var y = 0; y < height; y++) { var row = []; for (var x = 0; x < width; x++) { row.push(makeTile(y * width + x + 1)); } data.push(row); } return { width: width, height: height, data: data }; } var layer; beforeEach(function () { layer = makeLayer(5, 5); }); it('should return all tiles when no filtering options are given', function () { var result = GetTilesWithin(0, 0, 5, 5, {}, layer); expect(result.length).toBe(25); }); it('should return tiles within the specified rectangular area', function () { var result = GetTilesWithin(1, 1, 2, 2, {}, layer); expect(result.length).toBe(4); expect(result[0]).toBe(layer.data[1][1]); expect(result[1]).toBe(layer.data[1][2]); expect(result[2]).toBe(layer.data[2][1]); expect(result[3]).toBe(layer.data[2][2]); }); it('should default tileX to 0 when undefined', function () { var result = GetTilesWithin(undefined, 0, 2, 2, {}, layer); expect(result[0]).toBe(layer.data[0][0]); }); it('should default tileY to 0 when undefined', function () { var result = GetTilesWithin(0, undefined, 2, 2, {}, layer); expect(result[0]).toBe(layer.data[0][0]); }); it('should default width to layer.width when undefined', function () { var result = GetTilesWithin(0, 0, undefined, 1, {}, layer); expect(result.length).toBe(5); }); it('should default height to layer.height when undefined', function () { var result = GetTilesWithin(0, 0, 1, undefined, {}, layer); expect(result.length).toBe(5); }); it('should default filteringOptions to empty object when falsy', function () { var result = GetTilesWithin(0, 0, 5, 5, null, layer); expect(result.length).toBe(25); }); it('should clip negative tileX to 0 and reduce width accordingly', function () { var result = GetTilesWithin(-2, 0, 4, 1, {}, layer); // tileX clipped to 0, width becomes 4 + (-2) = 2 expect(result.length).toBe(2); expect(result[0]).toBe(layer.data[0][0]); expect(result[1]).toBe(layer.data[0][1]); }); it('should clip negative tileY to 0 and reduce height accordingly', function () { var result = GetTilesWithin(0, -2, 1, 4, {}, layer); // tileY clipped to 0, height becomes 4 + (-2) = 2 expect(result.length).toBe(2); expect(result[0]).toBe(layer.data[0][0]); expect(result[1]).toBe(layer.data[1][0]); }); it('should clip width when tileX + width exceeds layer width', function () { var result = GetTilesWithin(3, 0, 5, 1, {}, layer); // Only columns 3 and 4 are valid expect(result.length).toBe(2); expect(result[0]).toBe(layer.data[0][3]); expect(result[1]).toBe(layer.data[0][4]); }); it('should clip height when tileY + height exceeds layer height', function () { var result = GetTilesWithin(0, 3, 1, 5, {}, layer); // Only rows 3 and 4 are valid expect(result.length).toBe(2); expect(result[0]).toBe(layer.data[3][0]); expect(result[1]).toBe(layer.data[4][0]); }); it('should return empty array when area is fully outside layer bounds', function () { var result = GetTilesWithin(10, 0, 2, 2, {}, layer); expect(result.length).toBe(0); }); it('should return empty array when tileX is so negative that width becomes zero or less', function () { var result = GetTilesWithin(-10, 0, 2, 2, {}, layer); expect(result.length).toBe(0); }); it('should skip null tiles', function () { layer.data[0][0] = null; layer.data[0][1] = null; var result = GetTilesWithin(0, 0, 3, 1, {}, layer); expect(result.length).toBe(1); expect(result[0]).toBe(layer.data[0][2]); }); it('should filter out empty tiles when isNotEmpty is true', function () { layer.data[0][0].index = -1; layer.data[0][2].index = -1; var result = GetTilesWithin(0, 0, 5, 1, { isNotEmpty: true }, layer); expect(result.length).toBe(3); expect(result.indexOf(layer.data[0][0])).toBe(-1); expect(result.indexOf(layer.data[0][2])).toBe(-1); }); it('should include empty tiles when isNotEmpty is false', function () { layer.data[0][0].index = -1; var result = GetTilesWithin(0, 0, 5, 1, { isNotEmpty: false }, layer); expect(result.length).toBe(5); }); it('should filter out non-colliding tiles when isColliding is true', function () { layer.data[0][1].collides = true; layer.data[0][3].collides = true; var result = GetTilesWithin(0, 0, 5, 1, { isColliding: true }, layer); expect(result.length).toBe(2); expect(result[0]).toBe(layer.data[0][1]); expect(result[1]).toBe(layer.data[0][3]); }); it('should include all tiles when isColliding is false', function () { var result = GetTilesWithin(0, 0, 5, 1, { isColliding: false }, layer); expect(result.length).toBe(5); }); it('should filter out tiles without interesting faces when hasInterestingFace is true', function () { layer.data[0][0].hasInterestingFace = true; layer.data[0][4].hasInterestingFace = true; var result = GetTilesWithin(0, 0, 5, 1, { hasInterestingFace: true }, layer); expect(result.length).toBe(2); expect(result[0]).toBe(layer.data[0][0]); expect(result[1]).toBe(layer.data[0][4]); }); it('should include all tiles when hasInterestingFace is false', function () { var result = GetTilesWithin(0, 0, 5, 1, { hasInterestingFace: false }, layer); expect(result.length).toBe(5); }); it('should apply multiple filters together', function () { // tile at [0][1]: not empty (index=1), collides, interesting face layer.data[0][1].index = 1; layer.data[0][1].collides = true; layer.data[0][1].hasInterestingFace = true; // tile at [0][2]: not empty but no collision layer.data[0][2].index = 1; layer.data[0][2].collides = false; layer.data[0][2].hasInterestingFace = true; // tile at [0][3]: empty but collides layer.data[0][3].index = -1; layer.data[0][3].collides = true; layer.data[0][3].hasInterestingFace = true; var result = GetTilesWithin(0, 0, 5, 1, { isNotEmpty: true, isColliding: true, hasInterestingFace: true }, layer); expect(result.length).toBe(1); expect(result[0]).toBe(layer.data[0][1]); }); it('should return tiles in row-major order', function () { var result = GetTilesWithin(0, 0, 2, 2, {}, layer); expect(result[0]).toBe(layer.data[0][0]); expect(result[1]).toBe(layer.data[0][1]); expect(result[2]).toBe(layer.data[1][0]); expect(result[3]).toBe(layer.data[1][1]); }); it('should return references to the original tile objects', function () { var result = GetTilesWithin(0, 0, 1, 1, {}, layer); expect(result[0]).toBe(layer.data[0][0]); }); it('should handle a 1x1 area', function () { var result = GetTilesWithin(2, 2, 1, 1, {}, layer); expect(result.length).toBe(1); expect(result[0]).toBe(layer.data[2][2]); }); it('should return empty array when width is 0', function () { var result = GetTilesWithin(0, 0, 0, 5, {}, layer); expect(result.length).toBe(0); }); it('should return empty array when height is 0', function () { var result = GetTilesWithin(0, 0, 5, 0, {}, layer); expect(result.length).toBe(0); }); it('should handle a single-row layer', function () { var singleRow = makeLayer(4, 1); var result = GetTilesWithin(0, 0, 4, 1, {}, singleRow); expect(result.length).toBe(4); }); it('should handle a single-column layer', function () { var singleCol = makeLayer(1, 4); var result = GetTilesWithin(0, 0, 1, 4, {}, singleCol); expect(result.length).toBe(4); }); it('should handle a 1x1 layer', function () { var tiny = makeLayer(1, 1); var result = GetTilesWithin(0, 0, 1, 1, {}, tiny); expect(result.length).toBe(1); expect(result[0]).toBe(tiny.data[0][0]); }); });