const path = require('path'); const { spritesheetParser, Resource, Loader, getResourcePath } = require('../'); const { Texture, BaseTexture } = require('@pixi/core'); describe('PIXI.loaders.spritesheetParser', function () { it('should exist and return a function', function () { expect(spritesheetParser).to.be.a('function'); expect(spritesheetParser()).to.be.a('function'); }); it('should do nothing if the resource is not JSON', function () { const spy = sinon.spy(); const res = {}; spritesheetParser()(res, spy); expect(spy).to.have.been.calledOnce; expect(res.textures).to.be.undefined; }); it('should do nothing if the resource is JSON, but improper format', function () { const spy = sinon.spy(); const res = createMockResource(Resource.TYPE.JSON, {}); spritesheetParser()(res, spy); expect(spy).to.have.been.calledOnce; expect(res.textures).to.be.undefined; }); it('should load the image & create textures if json is properly formatted', function () { const spy = sinon.spy(); const res = createMockResource(Resource.TYPE.JSON, getJsonSpritesheet()); const loader = new Loader(); const addStub = sinon.stub(loader, 'add'); const imgRes = createMockResource(Resource.TYPE.IMAGE, new Image()); imgRes.texture = new Texture(new BaseTexture(imgRes.data)); addStub.yields(imgRes); spritesheetParser().call(loader, res, spy); addStub.restore(); expect(spy).to.have.been.calledOnce; expect(addStub).to.have.been.calledWith( `${res.name}_image`, `${path.dirname(res.url)}/${res.data.meta.image}` ); expect(res).to.have.property('textures') .that.is.an('object') .with.keys(Object.keys(getJsonSpritesheet().frames)) .and.has.property('0.png') .that.is.an.instanceof(Texture); }); it('should build the image url', function () { function getPath(url, image) { return getResourcePath({ url, data: { meta: { image } }, }); } let result = getPath('http://some.com/spritesheet.json', 'img.png'); expect(result).to.be.equals('http://some.com/img.png'); result = getPath('http://some.com/some/dir/spritesheet.json', 'img.png'); expect(result).to.be.equals('http://some.com/some/dir/img.png'); result = getPath('http://some.com/some/dir/spritesheet.json', './img.png'); expect(result).to.be.equals('http://some.com/some/dir/img.png'); result = getPath('http://some.com/some/dir/spritesheet.json', '../img.png'); expect(result).to.be.equals('http://some.com/some/img.png'); result = getPath('/spritesheet.json', 'img.png'); expect(result).to.be.equals('/img.png'); result = getPath('/some/dir/spritesheet.json', 'img.png'); expect(result).to.be.equals('/some/dir/img.png'); result = getPath('/some/dir/spritesheet.json', './img.png'); expect(result).to.be.equals('/some/dir/img.png'); result = getPath('/some/dir/spritesheet.json', '../img.png'); expect(result).to.be.equals('/some/img.png'); }); // TODO: Test that rectangles are created correctly. // TODO: Test that bathc processing works correctly. // TODO: Test that resolution processing works correctly. // TODO: Test that metadata is honored. }); function createMockResource(type, data) { const name = `${Math.floor(Date.now() * Math.random())}`; return { url: `http://localhost/doesnt_exist/${name}`, name, type, data, metadata: {}, }; } function getJsonSpritesheet() { /* eslint-disable */ return {"frames": { "0.png": { "frame": {"x":14,"y":28,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, "1.png": { "frame": {"x":14,"y":42,"w":12,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":12,"h":14}, "sourceSize": {"w":12,"h":14} }, "2.png": { "frame": {"x":14,"y":14,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, "3.png": { "frame": {"x":42,"y":0,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, "4.png": { "frame": {"x":28,"y":0,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, "5.png": { "frame": {"x":14,"y":0,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, "6.png": { "frame": {"x":0,"y":42,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, "7.png": { "frame": {"x":0,"y":28,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, "8.png": { "frame": {"x":0,"y":14,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }, "9.png": { "frame": {"x":0,"y":0,"w":14,"h":14}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":14,"h":14}, "sourceSize": {"w":14,"h":14} }}, "meta": { "app": "http://www.texturepacker.com", "version": "1.0", "image": "hud.png", "format": "RGBA8888", "size": {"w":64,"h":64}, "scale": "1", "smartupdate": "$TexturePacker:SmartUpdate:47025c98c8b10634b75172d4ed7e7edc$" } }; /* eslint-enable */ }