require('source-map-support').install(); import {Latus} from '@latus/core'; import {expect} from 'chai'; describe('Tiles', () => { let latus; beforeEach(async () => { latus = Latus.mock({ '@avocado/resource': require('@avocado/resource'), '@avocado/topdown': require('../src'), }); await Promise.all(latus.invokeFlat('@latus/core/starting')); }); it("has sane defaults", async () => { const {Tiles} = latus.get('%resources'); const tiles = new Tiles(); expect(tiles.size).to.deep.equal([0, 0]); expect(tiles.data.length).to.equal(0); }); it("gets and sets tile data", async () => { const {Tiles} = latus.get('%resources'); const tiles = new Tiles({data: [0, 1, 2, 3], size: [2, 2]}); expect(tiles.tileAt([0, 0])).to.equal(0); expect(tiles.tileAt([1, 0])).to.equal(1); expect(tiles.tileAt([0, 1])).to.equal(2); expect(tiles.tileAt([1, 1])).to.equal(3); tiles.setTileAt([0, 0], 69); tiles.setTileAt([1, 0], 420); tiles.setTileAt([0, 1], 311); tiles.setTileAt([1, 1], 42); expect(tiles.data).to.deep.equal([69, 420, 311, 42]); }); it("can get a data slice", async () => { const {Tiles} = latus.get('%resources'); const tiles = new Tiles( { data: [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ], size: [4, 4], }, ); expect(tiles.slice([1, 1, 2, 2])).to.deep.equal([5, 6, 9, 10]); expect(tiles.slice([1, 0, 3, 3])).to.deep.equal([1, 2, 3, 5, 6, 7, 9, 10, 11]); expect(tiles.slice([-1, -1, 5, 5])).to.deep.equal([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); expect(tiles.slice([1, 1, 1, 1])).to.deep.equal([5]); expect(tiles.slice([1, 1, 0, 0])).to.deep.equal([]); }); it("can get convex hulls around indices", () => { const {Tiles} = latus.get('%resources'); const hulls = [ [ [2, 0], [3, 0], [3, 3], [1, 3], [1, 1], ], [ [4, 2], [6, 2], [7, 3], [7, 4], [4, 4], ], ]; const tiles = new Tiles( { data: [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ], size: [8, 4], }, ); expect(tiles.indexHulls(1)).to.deep.equal(hulls); }); it("can stamp at", async () => { const {Tiles} = latus.get('%resources'); const tiles = new Tiles( { data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ], size: [4, 4], }, ); tiles.stampAt([0, 0, 2, 3], [1, 1, 1, 1, 1, 1]) expect(tiles.data).to.deep.equal([ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, ]); expect(tiles.packetsFor()).to.deep.equal([ [ 'TilesUpdate', { position: [0, 0], size: [2, 3], tiles: [1, 1, 1, 1, 1, 1], }, ], ]); }); it("can handle pathological hulls", () => { const {Tiles} = latus.get('%resources'); const hulls = [ [ [ 0, 0 ], [ 3, 0 ], [ 4, 2 ], [ 6, 2 ], [ 6, 4 ], [ 4, 4 ], [ 3, 3 ], [ 1, 2 ], [ 0, 1 ], ], ]; const tiles = new Tiles( { data: [ 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, ], size: [8, 4], }, ); expect(tiles.indexHulls(1)).to.deep.equal(hulls); }); });