const { BaseTextureCache, TextureCache } = require('@pixi/utils'); const { Rectangle, Point } = require('@pixi/math'); const { BaseTexture, Texture } = require('../'); const URL = 'foo.png'; const NAME = 'foo'; const NAME2 = 'bar'; function cleanCache() { delete BaseTextureCache[URL]; delete BaseTextureCache[NAME]; delete BaseTextureCache[NAME2]; delete TextureCache[URL]; delete TextureCache[NAME]; delete TextureCache[NAME2]; } describe('PIXI.Texture', function () { it('should register Texture from Loader', function () { cleanCache(); const image = new Image(); const texture = Texture.fromLoader(image, URL, NAME); expect(texture.baseTexture.resource.url).to.equal('foo.png'); expect(TextureCache[NAME]).to.equal(texture); expect(BaseTextureCache[NAME]).to.equal(texture.baseTexture); expect(TextureCache[URL]).to.equal(texture); expect(BaseTextureCache[URL]).to.equal(texture.baseTexture); }); it('should remove Texture from cache on destroy', function () { cleanCache(); const texture = new Texture(new BaseTexture()); Texture.addToCache(texture, NAME); Texture.addToCache(texture, NAME2); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(0); expect(texture.textureCacheIds.indexOf(NAME2)).to.equal(1); expect(TextureCache[NAME]).to.equal(texture); expect(TextureCache[NAME2]).to.equal(texture); texture.destroy(); expect(texture.textureCacheIds).to.equal(null); expect(TextureCache[NAME]).to.equal(undefined); expect(TextureCache[NAME2]).to.equal(undefined); }); it('should be added to the texture cache correctly, ' + 'and should remove only itself, not effecting the base texture and its cache', function () { cleanCache(); const texture = new Texture(new BaseTexture()); BaseTexture.addToCache(texture.baseTexture, NAME); Texture.addToCache(texture, NAME); expect(texture.baseTexture.textureCacheIds.indexOf(NAME)).to.equal(0); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(0); expect(BaseTextureCache[NAME]).to.equal(texture.baseTexture); expect(TextureCache[NAME]).to.equal(texture); Texture.removeFromCache(NAME); expect(texture.baseTexture.textureCacheIds.indexOf(NAME)).to.equal(0); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(-1); expect(BaseTextureCache[NAME]).to.equal(texture.baseTexture); expect(TextureCache[NAME]).to.equal(undefined); }); it('should remove Texture from entire cache using removeFromCache (by Texture instance)', function () { cleanCache(); const texture = new Texture(new BaseTexture()); Texture.addToCache(texture, NAME); Texture.addToCache(texture, NAME2); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(0); expect(texture.textureCacheIds.indexOf(NAME2)).to.equal(1); expect(TextureCache[NAME]).to.equal(texture); expect(TextureCache[NAME2]).to.equal(texture); Texture.removeFromCache(texture); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(-1); expect(texture.textureCacheIds.indexOf(NAME2)).to.equal(-1); expect(TextureCache[NAME]).to.equal(undefined); expect(TextureCache[NAME2]).to.equal(undefined); }); it('should remove Texture from single cache entry using removeFromCache (by id)', function () { cleanCache(); const texture = new Texture(new BaseTexture()); Texture.addToCache(texture, NAME); Texture.addToCache(texture, NAME2); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(0); expect(texture.textureCacheIds.indexOf(NAME2)).to.equal(1); expect(TextureCache[NAME]).to.equal(texture); expect(TextureCache[NAME2]).to.equal(texture); Texture.removeFromCache(NAME); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(-1); expect(texture.textureCacheIds.indexOf(NAME2)).to.equal(0); expect(TextureCache[NAME]).to.equal(undefined); expect(TextureCache[NAME2]).to.equal(texture); }); it('should not remove Texture from cache if Texture instance has been replaced', function () { cleanCache(); const texture = new Texture(new BaseTexture()); const texture2 = new Texture(new BaseTexture()); Texture.addToCache(texture, NAME); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(0); expect(TextureCache[NAME]).to.equal(texture); Texture.addToCache(texture2, NAME); expect(texture2.textureCacheIds.indexOf(NAME)).to.equal(0); expect(TextureCache[NAME]).to.equal(texture2); Texture.removeFromCache(texture); expect(texture.textureCacheIds.indexOf(NAME)).to.equal(-1); expect(texture2.textureCacheIds.indexOf(NAME)).to.equal(0); expect(TextureCache[NAME]).to.equal(texture2); }); it('destroying a destroyed texture should not throw an error', function () { const texture = new Texture(new BaseTexture()); texture.destroy(true); texture.destroy(true); }); it('should clone a texture', function () { const baseTexture = new BaseTexture(); const frame = new Rectangle(); const orig = new Rectangle(); const trim = new Rectangle(); const rotate = 2; const anchor = new Point(1, 0.5); const texture = new Texture(baseTexture, frame, orig, trim, rotate, anchor); const clone = texture.clone(); expect(clone.baseTexture).to.equal(baseTexture); expect(clone.defaultAnchor.x).to.equal(texture.defaultAnchor.x); expect(clone.defaultAnchor.y).to.equal(texture.defaultAnchor.y); expect(clone.frame).to.equal(texture.frame); expect(clone.trim).to.equal(texture.trim); expect(clone.orig).to.equal(texture.orig); expect(clone.rotate).to.equal(texture.rotate); clone.destroy(); texture.destroy(true); }); it('should update frame if its backed by canvas that was resized', function () { const canvas = document.createElement('canvas'); canvas.width = 50; canvas.height = 50; const texture = Texture.from(canvas); expect(texture.width).to.equal(50); canvas.width = 100; texture.update(); expect(texture.width).to.equal(100); canvas.height = 70; texture.update(); expect(texture.height).to.equal(70); texture.destroy(true); }); it('should update frame on baseTexture update only if user set it in constructor or in setter', function () { let baseTexture = new BaseTexture(); baseTexture.setSize(50, 50); let texture = new Texture(baseTexture); expect(texture.width).to.equal(50); baseTexture.setSize(100, 70); expect(texture.width).to.equal(100); expect(texture.height).to.equal(70); texture.frame = new Rectangle(1, 1, 10, 20); baseTexture.setSize(110, 80); expect(texture.width).to.equal(10); expect(texture.height).to.equal(20); texture.destroy(true); baseTexture = new BaseTexture(); texture = new Texture(baseTexture, new Rectangle(1, 1, 10, 20)); baseTexture.setSize(50, 50); expect(texture.width).to.equal(10); expect(texture.height).to.equal(20); texture.destroy(true); }); });