phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers from the team at Phaser Studio Inc.
258 lines (205 loc) • 6.73 kB
JavaScript
var Randomize = require('../../../src/tilemaps/components/Randomize');
function makeTile(index)
{
return { index: index, collides: false, hasInterestingFace: false };
}
function makeLayer(tileIndexes2D)
{
var height = tileIndexes2D.length;
var width = height > 0 ? tileIndexes2D[0].length : 0;
var data = [];
for (var y = 0; y < height; y++)
{
data[y] = [];
for (var x = 0; x < width; x++)
{
data[y][x] = makeTile(tileIndexes2D[y][x]);
}
}
return { data: data, width: width, height: height };
}
function getAllTileIndexes(layer)
{
var indexes = [];
for (var y = 0; y < layer.data.length; y++)
{
for (var x = 0; x < layer.data[y].length; x++)
{
indexes.push(layer.data[y][x].index);
}
}
return indexes;
}
describe('Phaser.Tilemaps.Components.Randomize', function ()
{
it('should assign each tile an index from the provided indexes array', function ()
{
var layer = makeLayer([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]);
var indexes = [10, 20, 30];
Randomize(0, 0, 3, 3, indexes, layer);
var result = getAllTileIndexes(layer);
for (var i = 0; i < result.length; i++)
{
expect(indexes).toContain(result[i]);
}
});
it('should assign all tiles new indexes when given a single-value array', function ()
{
var layer = makeLayer([
[1, 2],
[3, 4]
]);
Randomize(0, 0, 2, 2, [99], layer);
var result = getAllTileIndexes(layer);
for (var i = 0; i < result.length; i++)
{
expect(result[i]).toBe(99);
}
});
it('should collect unique indexes from tiles when no indexes array is provided', function ()
{
var layer = makeLayer([
[1, 2, 3],
[1, 2, 3]
]);
Randomize(0, 0, 3, 2, null, layer);
var result = getAllTileIndexes(layer);
for (var i = 0; i < result.length; i++)
{
expect([1, 2, 3]).toContain(result[i]);
}
});
it('should only randomize tiles within the specified region', function ()
{
var layer = makeLayer([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]);
Randomize(1, 1, 1, 1, [99], layer);
// Tiles outside the 1x1 region at (1,1) should be unchanged
expect(layer.data[0][0].index).toBe(1);
expect(layer.data[0][1].index).toBe(2);
expect(layer.data[0][2].index).toBe(3);
expect(layer.data[1][0].index).toBe(4);
expect(layer.data[1][2].index).toBe(6);
expect(layer.data[2][0].index).toBe(7);
expect(layer.data[2][1].index).toBe(8);
expect(layer.data[2][2].index).toBe(9);
// The tile at (1,1) should be 99
expect(layer.data[1][1].index).toBe(99);
});
it('should only randomize tiles within a sub-region of the layer', function ()
{
var layer = makeLayer([
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]
]);
Randomize(1, 1, 2, 2, [5, 6, 7], layer);
// Corner tiles outside the 2x2 sub-region should remain 0
expect(layer.data[0][0].index).toBe(0);
expect(layer.data[0][3].index).toBe(0);
expect(layer.data[3][0].index).toBe(0);
expect(layer.data[3][3].index).toBe(0);
// Tiles inside the 2x2 sub-region should be from [5, 6, 7]
expect([5, 6, 7]).toContain(layer.data[1][1].index);
expect([5, 6, 7]).toContain(layer.data[1][2].index);
expect([5, 6, 7]).toContain(layer.data[2][1].index);
expect([5, 6, 7]).toContain(layer.data[2][2].index);
});
it('should produce varying indexes across many iterations when given multiple options', function ()
{
var layer = makeLayer([
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]
]);
var indexes = [1, 2, 3, 4, 5];
var seen = {};
for (var iter = 0; iter < 50; iter++)
{
Randomize(0, 0, 5, 5, indexes, layer);
for (var y = 0; y < 5; y++)
{
for (var x = 0; x < 5; x++)
{
seen[layer.data[y][x].index] = true;
}
}
}
// After many iterations across a 5x5 grid, all 5 values should appear
expect(Object.keys(seen).length).toBe(5);
});
it('should use unique indexes from the region when no indexes are passed and tiles have repeats', function ()
{
var layer = makeLayer([
[3, 3, 3],
[3, 3, 3]
]);
Randomize(0, 0, 3, 2, null, layer);
var result = getAllTileIndexes(layer);
for (var i = 0; i < result.length; i++)
{
expect(result[i]).toBe(3);
}
});
it('should handle a single tile layer', function ()
{
var layer = makeLayer([
[42]
]);
Randomize(0, 0, 1, 1, [7, 8, 9], layer);
expect([7, 8, 9]).toContain(layer.data[0][0].index);
});
it('should handle a single tile with no indexes provided', function ()
{
var layer = makeLayer([
[42]
]);
Randomize(0, 0, 1, 1, null, layer);
// Only index available is 42, so result must be 42
expect(layer.data[0][0].index).toBe(42);
});
it('should not modify tiles outside the layer bounds when coordinates are at the edge', function ()
{
var layer = makeLayer([
[1, 2],
[3, 4]
]);
// Width/height larger than layer — should clip to layer bounds
Randomize(0, 0, 100, 100, [99], layer);
var result = getAllTileIndexes(layer);
for (var i = 0; i < result.length; i++)
{
expect(result[i]).toBe(99);
}
});
it('should keep all resulting indexes within the provided indexes range over many calls', function ()
{
var layer = makeLayer([
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]
]);
var indexes = [100, 200, 300];
for (var iter = 0; iter < 100; iter++)
{
Randomize(0, 0, 3, 3, indexes, layer);
for (var y = 0; y < 3; y++)
{
for (var x = 0; x < 3; x++)
{
expect(indexes).toContain(layer.data[y][x].index);
}
}
}
});
});