import IIIFInfo from '../../../../src/ol/format/IIIFInfo.js'; import {Versions} from '../../../../src/ol/format/IIIFInfo.js'; describe('ol.format.IIIFInfo', function() { const iiifInfo = new IIIFInfo(); describe('setImageInfo', function() { it('can handle image info JSON as object or as string serialization', function() { iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/3/context.json', '@id': 'http://iiif.test/id' }); expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION3); iiifInfo.setImageInfo('{"@context": "http://iiif.io/api/image/2/context.json","@id":"http://iiif.test/id"}'); expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION2); }); }); describe('getImageApiVersion', function() { it('provides the correct Image API version', function() { iiifInfo.setImageInfo({ '@id': 'http://iiif.test/id' }); expect(function() { iiifInfo.getImageApiVersion(); }).to.throwException(); iiifInfo.setImageInfo({ identifier: 'http://iiif.test/id', profile: 'this is no valid profile' }); expect(function() { iiifInfo.getImageApiVersion(); }).to.throwException(); iiifInfo.setImageInfo({ '@context': 'this is no valid context', '@id': 'http://iiif.test/id' }); expect(function() { iiifInfo.getImageApiVersion(); }).to.throwException(); iiifInfo.setImageInfo({ identifier: 'http://iiif.test/id', profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level0' }); expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION1); iiifInfo.setImageInfo({ '@context': 'http://library.stanford.edu/iiif/image-api/1.1/context.json', '@id': 'http://iiif.test/id' }); expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION1); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/1/context.json', identifier: 'http://iiif.test/id' }); expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION1); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/id' }); expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION2); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/3/context.json', id: 'http://iiif.test/id' }); expect(iiifInfo.getImageApiVersion()).to.be(Versions.VERSION3); }); }); describe('getComplianceLevelFromProfile', function() { it('detects the correct compliance level', function() { iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', profile: 'level0' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', profile: 'http://iiif.io/api/image/level3.json' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', profile: 'level1' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', profile: 'http://iiif.io/api/image/2/level2.json' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be('level2'); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', profile: ['http://iiif.io/api/image/2/level1.json'] }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be('level1'); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/3/context.json', profile: 'level4' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/3/context.json', profile: 'http://iiif.io/api/image/3/level3.json' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/3/context.json', profile: 'http://iiif.io/api/image/2/level1.json' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be(undefined); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/3/context.json', profile: 'level2' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be('level2'); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/3/context.json', profile: 'http://iiif.io/api/image/3/level1.json' }); expect(iiifInfo.getComplianceLevelFromProfile()).to.be('level1'); }); }); describe('getComplianceLevelSupportedFeatures', function() { it('provides the correct features for given versions and compliance levels', function() { iiifInfo.setImageInfo({ '@context': 'http://library.stanford.edu/iiif/image-api/1.1/context.json', profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level0' }); let level = iiifInfo.getComplianceLevelSupportedFeatures(); expect(level.supports).to.be.empty(); iiifInfo.setImageInfo({ '@context': 'http://library.stanford.edu/iiif/image-api/1.1/context.json', profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level1' }); level = iiifInfo.getComplianceLevelSupportedFeatures(); expect(level.supports).to.have.length(4); expect(level.supports).to.contain('regionByPx'); expect(level.supports).to.contain('sizeByW'); expect(level.supports).to.contain('sizeByH'); expect(level.supports).to.contain('sizeByPct'); iiifInfo.setImageInfo({ '@context': 'http://library.stanford.edu/iiif/image-api/1.1/context.json', profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level2' }); level = iiifInfo.getComplianceLevelSupportedFeatures(); expect(level.supports).to.have.length(7); expect(level.supports).to.contain('regionByPx'); expect(level.supports).to.contain('regionByPct'); expect(level.supports).to.contain('sizeByW'); expect(level.supports).to.contain('sizeByH'); expect(level.supports).to.contain('sizeByPct'); expect(level.supports).to.contain('sizeByConfinedWh'); expect(level.supports).to.contain('sizeByWh'); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', profile: 'http://iiif.io/api/image/2/level0.json' }); level = iiifInfo.getComplianceLevelSupportedFeatures(); expect(level.supports).to.be.empty(); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', profile: 'http://iiif.io/api/image/2/level1.json' }); level = iiifInfo.getComplianceLevelSupportedFeatures(); expect(level.supports).to.have.length(4); expect(level.supports).to.contain('regionByPx'); expect(level.supports).to.contain('sizeByW'); expect(level.supports).to.contain('sizeByH'); expect(level.supports).to.contain('sizeByPct'); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', profile: 'http://iiif.io/api/image/2/level2.json' }); level = iiifInfo.getComplianceLevelSupportedFeatures(); expect(level.supports).to.have.length(8); expect(level.supports).to.contain('regionByPx'); expect(level.supports).to.contain('regionByPct'); expect(level.supports).to.contain('sizeByW'); expect(level.supports).to.contain('sizeByH'); expect(level.supports).to.contain('sizeByPct'); expect(level.supports).to.contain('sizeByConfinedWh'); expect(level.supports).to.contain('sizeByDistortedWh'); expect(level.supports).to.contain('sizeByWh'); // TODO test version 3 compliance level features once version 3 is final }); }); describe('getTileSourceOptions', function() { it('produces options from minimal information responses', function() { expect(function() { iiifInfo.setImageInfo({ width: 2000, height: 1500 }); iiifInfo.getTileSourceOptions(); }).to.throwException(); iiifInfo.setImageInfo({ identifier: 'id', profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level0' }); let options = iiifInfo.getTileSourceOptions(); expect(options).to.be.an('object'); expect(options).to.have.property('version', Versions.VERSION1); iiifInfo.setImageInfo({ identifier: 'identifier-version-1.0', width: 2000, height: 1500, profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level0' }); options = iiifInfo.getTileSourceOptions(); expect(options).to.not.be(undefined); expect(options).to.not.be(null); expect(options).to.have.property('version', Versions.VERSION1); expect(options).to.have.property('size'); expect(options.size).to.be.an('array'); expect(options.size.length).to.be(2); expect(options.size[0]).to.be(2000); expect(options.size[1]).to.be(1500); expect(options.quality).to.be('native'); expect(options.url).to.be(undefined); expect(options.sizes).to.be(undefined); expect(options.tileSize).to.be(undefined); expect(options.format).to.be('jpg'); expect(options.supports).to.be.empty(); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/version2/id' }); options = iiifInfo.getTileSourceOptions(); expect(options).to.be.an('object'); expect(options).to.have.property('version', Versions.VERSION2); expect(options).to.have.property('url', 'http://iiif.test/version2/id'); expect(options).to.have.property('format', 'jpg'); }); it('uses preferred options if applicable', function() { iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/version2/id', width: 2000, height: 1500, profile: ['http://iiif.io/api/image/2/level2.json'] }); const options = iiifInfo.getTileSourceOptions({ quality: 'bitonal', format: 'png' }); expect(options).to.have.property('quality', 'bitonal'); expect(options).to.have.property('format', 'png'); }); it('ignores preferred options that are not supported', function() { iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/version2/id', width: 2000, height: 1500, profile: ['http://iiif.io/api/image/2/level1.json'] }); const options = iiifInfo.getTileSourceOptions({ quality: 'bitonal', format: 'png' }); expect(options).to.have.property('quality', 'default'); expect(options).to.have.property('format', 'jpg'); }); it('combines supported features indicated by compliance level and explicitly stated in image info', function() { iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/id', profile: ['http://iiif.io/api/image/2/level1.json', { supports: ['regionByPct', 'sizeByWh'] }] }); let options = iiifInfo.getTileSourceOptions(); expect(options.supports).to.contain('regionByPct'); expect(options.supports).to.contain('sizeByWh'); expect(options.supports).to.contain('regionByPx'); expect(options.supports).to.contain('sizeByW'); expect(options.supports).to.contain('sizeByH'); expect(options.supports).to.contain('sizeByPct'); expect(options.supports).to.have.length(6); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/3/context.json', id: 'http://iiif.test/id', profile: 'level1', extraFeatures: ['regionByPct', 'sizeByPct'] }); options = iiifInfo.getTileSourceOptions(); expect(options.supports).to.contain('regionByPct'); expect(options.supports).to.contain('sizeByPct'); expect(options.supports).to.contain('regionByPx'); expect(options.supports).to.contain('regionSquare'); expect(options.supports).to.contain('sizeByW'); expect(options.supports).to.contain('sizeByH'); expect(options.supports).to.have.length(6); }); it('uses the first available scale factors and tile sizes', function() { iiifInfo.setImageInfo({ '@context': 'http://library.stanford.edu/iiif/image-api/1.1/context.json', '@id': 'http://iiif.test/id', profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level0' }); let options = iiifInfo.getTileSourceOptions(); expect(options.resolutions).to.be(undefined); expect(options.tileSize).to.be(undefined); iiifInfo.setImageInfo({ '@context': 'http://library.stanford.edu/iiif/image-api/1.1/context.json', '@id': 'http://iiif.test/id', profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level0', scale_factors: [1, 2, 4], tile_width: 512 }); options = iiifInfo.getTileSourceOptions(); expect(options.resolutions).to.have.length(3); expect(options.resolutions).to.contain(1); expect(options.resolutions).to.contain(2); expect(options.resolutions).to.contain(4); expect(options.tileSize).to.have.length(2); expect(options.tileSize[0]).to.be(512); expect(options.tileSize[1]).to.be(512); iiifInfo.setImageInfo({ '@context': 'http://library.stanford.edu/iiif/image-api/1.1/context.json', '@id': 'http://iiif.test/id', profile: 'http://library.stanford.edu/iiif/image-api/compliance.html#level0', scale_factors: [1, 2, 4], tile_width: 512, tile_height: 1024 }); options = iiifInfo.getTileSourceOptions(); expect(options.resolutions).to.have.length(3); expect(options.resolutions).to.contain(1); expect(options.resolutions).to.contain(2); expect(options.resolutions).to.contain(4); expect(options.tileSize).to.have.length(2); expect(options.tileSize[0]).to.be(512); expect(options.tileSize[1]).to.be(1024); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/id', profile: 'http://iiif.io/api/image/2/level0.json' }); options = iiifInfo.getTileSourceOptions(); expect(options.resolutions).to.be(undefined); expect(options.tileSize).to.be(undefined); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/id', profile: 'http://iiif.io/api/image/2/level0.json', tiles: [{ scaleFactors: [1, 2, 4], width: 512 }, { scaleFactors: [1, 2, 4, 8, 16], width: 256 }] }); options = iiifInfo.getTileSourceOptions(); expect(options.resolutions).to.have.length(3); expect(options.resolutions).to.contain(1); expect(options.resolutions).to.contain(2); expect(options.resolutions).to.contain(4); expect(options.tileSize).to.have.length(2); expect(options.tileSize[0]).to.be(512); expect(options.tileSize[1]).to.be(512); iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/id', profile: 'http://iiif.io/api/image/2/level0.json', tiles: [{ scaleFactors: [1, 2, 4], width: 512, height: 1024 }] }); options = iiifInfo.getTileSourceOptions(); expect(options.resolutions).to.have.length(3); expect(options.resolutions).to.contain(1); expect(options.resolutions).to.contain(2); expect(options.resolutions).to.contain(4); expect(options.tileSize).to.have.length(2); expect(options.tileSize[0]).to.be(512); expect(options.tileSize[1]).to.be(1024); }); }); it('provides each given size in sizes as OpenLayers Size', function() { iiifInfo.setImageInfo({ '@context': 'http://iiif.io/api/image/2/context.json', '@id': 'http://iiif.test/id', 'sizes': [{ width: 2000, height: 1000 }, { width: 1000, height: 500 }, { width: 500, height: 250 }] }); const options = iiifInfo.getTileSourceOptions(); expect(options.sizes).to.have.length(3); expect(options.sizes[0]).to.have.length(2); expect(options.sizes[0][0]).to.be(2000); expect(options.sizes[0][1]).to.be(1000); expect(options.sizes[1]).to.have.length(2); expect(options.sizes[1][0]).to.be(1000); expect(options.sizes[1][1]).to.be(500); expect(options.sizes[2]).to.have.length(2); expect(options.sizes[2][0]).to.be(500); expect(options.sizes[2][1]).to.be(250); }); });