defineSuite([ 'Scene/ArcGisMapServerImageryProvider', 'Core/appendForwardSlash', 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Cartographic', 'Core/DefaultProxy', 'Core/defined', 'Core/GeographicTilingScheme', 'Core/getAbsoluteUri', 'Core/objectToQuery', 'Core/queryToObject', 'Core/Rectangle', 'Core/RequestScheduler', 'Core/Resource', 'Core/WebMercatorProjection', 'Core/WebMercatorTilingScheme', 'Scene/DiscardMissingTileImagePolicy', 'Scene/Imagery', 'Scene/ImageryLayer', 'Scene/ImageryLayerFeatureInfo', 'Scene/ImageryProvider', 'Scene/ImageryState', 'Specs/pollToPromise', 'ThirdParty/Uri' ], function( ArcGisMapServerImageryProvider, appendForwardSlash, Cartesian2, Cartesian3, Cartographic, DefaultProxy, defined, GeographicTilingScheme, getAbsoluteUri, objectToQuery, queryToObject, Rectangle, RequestScheduler, Resource, WebMercatorProjection, WebMercatorTilingScheme, DiscardMissingTileImagePolicy, Imagery, ImageryLayer, ImageryLayerFeatureInfo, ImageryProvider, ImageryState, pollToPromise, Uri) { 'use strict'; beforeEach(function() { RequestScheduler.clearForSpecs(); }); afterEach(function() { Resource._Implementations.loadAndExecuteScript = Resource._DefaultImplementations.loadAndExecuteScript; Resource._Implementations.createImage = Resource._DefaultImplementations.createImage; Resource._Implementations.loadWithXhr = Resource._DefaultImplementations.loadWithXhr; }); function expectCorrectUrl(expectedBaseUrl, actualUrl, functionName, withProxy, token) { var uri = new Uri(actualUrl); if (withProxy) { uri = new Uri(decodeURIComponent(uri.query)); } var params = queryToObject(uri.query); var uriWithoutQuery = new Uri(uri); uriWithoutQuery.query = ''; expect(uriWithoutQuery.toString()).toEqual(appendForwardSlash(expectedBaseUrl)); var expectedParams = { callback : functionName, 'f' : 'json' }; if (defined(token)) { expectedParams.token = token; } expect(params).toEqual(expectedParams); } function stubJSONPCall(baseUrl, result, withProxy, token) { Resource._Implementations.loadAndExecuteScript = function(url, functionName) { expectCorrectUrl(baseUrl, url, functionName, withProxy, token); setTimeout(function() { window[functionName](result); }, 1); }; } it('conforms to ImageryProvider interface', function() { expect(ArcGisMapServerImageryProvider).toConformToInterface(ImageryProvider); }); it('constructor throws if url is not specified', function() { expect(function() { return new ArcGisMapServerImageryProvider({}); }).toThrowDeveloperError(); }); var webMercatorResult = { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text', 'tileInfo' : { 'rows' : 128, 'cols' : 256, 'origin' : { 'x' : -20037508.342787, 'y' : 20037508.342787 }, 'spatialReference' : { 'wkid' : 102100 }, 'lods' : [{ 'level' : 0, 'resolution' : 156543.033928, 'scale' : 591657527.591555 }, { 'level' : 1, 'resolution' : 78271.5169639999, 'scale' : 295828763.795777 }, { 'level' : 2, 'resolution' : 39135.7584820001, 'scale' : 147914381.897889 }] } }; it('resolves readyPromise', function() { var baseUrl = '//tiledArcGisMapServer.invalid'; stubJSONPCall(baseUrl, webMercatorResult); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); return provider.readyPromise.then(function(result) { expect(result).toBe(true); expect(provider.ready).toBe(true); }); }); it('resolves readyPromise with Resource', function() { var baseUrl = '//tiledArcGisMapServer.invalid'; stubJSONPCall(baseUrl, webMercatorResult); var resource = new Resource({ url : baseUrl }); var provider = new ArcGisMapServerImageryProvider({ url : resource }); return provider.readyPromise.then(function(result) { expect(result).toBe(true); expect(provider.ready).toBe(true); }); }); it('rejects readyPromise on error', function() { var baseUrl = '//tiledArcGisMapServer.invalid'; var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); return provider.readyPromise.then(function () { fail('should not resolve'); }).otherwise(function (e) { expect(e.message).toContain(baseUrl); expect(provider.ready).toBe(false); }); }); it('supports tiled servers in web mercator projection', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; stubJSONPCall(baseUrl, webMercatorResult); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.tileWidth).toEqual(128); expect(provider.tileHeight).toEqual(256); expect(provider.maximumLevel).toEqual(2); expect(provider.tilingScheme).toBeInstanceOf(WebMercatorTilingScheme); expect(provider.credit).toBeDefined(); expect(provider.tileDiscardPolicy).toBeInstanceOf(DiscardMissingTileImagePolicy); expect(provider.rectangle).toEqual(new WebMercatorTilingScheme().rectangle); expect(provider.usingPrecachedTiles).toEqual(true); expect(provider.hasAlphaChannel).toBeDefined(); Resource._Implementations.createImage = function(url, crossOrigin, deferred) { if (/^blob:/.test(url)) { // load blob url normally Resource._DefaultImplementations.createImage(url, crossOrigin, deferred); } else { expect(url).toEqual(getAbsoluteUri(baseUrl + 'tile/0/0/0')); // Just return any old image. Resource._DefaultImplementations.createImage('Data/Images/Red16x16.png', crossOrigin, deferred); } }; Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) { expect(url).toEqual(getAbsoluteUri(baseUrl + 'tile/0/0/0')); // Just return any old image. Resource._DefaultImplementations.loadWithXhr('Data/Images/Red16x16.png', responseType, method, data, headers, deferred); }; return provider.requestImage(0, 0, 0).then(function(image) { expect(image).toBeInstanceOf(Image); }); }); }); var geographicResult = { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text', 'tileInfo' : { 'rows' : 128, 'cols' : 256, 'origin' : { 'x' : -180, 'y' : 90 }, 'spatialReference' : { 'wkid' : 4326 }, 'lods' : [{ 'level' : 0, 'resolution' : 0.3515625, 'scale' : 147748799.285417 }, { 'level' : 1, 'resolution' : 0.17578125, 'scale' : 73874399.6427087 }, { 'level' : 2, 'resolution' : 0.087890625, 'scale' : 36937199.8213544 }] } }; it('supports tiled servers in geographic projection', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; stubJSONPCall(baseUrl, geographicResult); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.tileWidth).toEqual(128); expect(provider.tileHeight).toEqual(256); expect(provider.maximumLevel).toEqual(2); expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); expect(provider.credit).toBeDefined(); expect(provider.tileDiscardPolicy).toBeInstanceOf(DiscardMissingTileImagePolicy); expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); expect(provider.usingPrecachedTiles).toEqual(true); Resource._Implementations.createImage = function(url, crossOrigin, deferred) { if (/^blob:/.test(url)) { // load blob url normally Resource._DefaultImplementations.createImage(url, crossOrigin, deferred); } else { expect(url).toEqual(getAbsoluteUri(baseUrl + 'tile/0/0/0')); // Just return any old image. Resource._DefaultImplementations.createImage('Data/Images/Red16x16.png', crossOrigin, deferred); } }; Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) { expect(url).toEqual(getAbsoluteUri(baseUrl + 'tile/0/0/0')); // Just return any old image. Resource._DefaultImplementations.loadWithXhr('Data/Images/Red16x16.png', responseType, method, data, headers, deferred); }; return provider.requestImage(0, 0, 0).then(function(image) { expect(image).toBeInstanceOf(Image); }); }); }); it('supports non-tiled servers', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; stubJSONPCall(baseUrl, { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text' }); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.tileWidth).toEqual(256); expect(provider.tileHeight).toEqual(256); expect(provider.maximumLevel).toBeUndefined(); expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); expect(provider.credit).toBeDefined(); expect(provider.tileDiscardPolicy).toBeUndefined(); expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); expect(provider.usingPrecachedTiles).toEqual(false); expect(provider.enablePickFeatures).toBe(true); Resource._Implementations.createImage = function(url, crossOrigin, deferred) { var uri = new Uri(url); var params = queryToObject(uri.query); var uriWithoutQuery = new Uri(uri); uriWithoutQuery.query = ''; expect(uriWithoutQuery.toString()).toEqual(getAbsoluteUri(baseUrl + 'export')); expect(params.f).toEqual('image'); expect(params.bboxSR).toEqual('4326'); expect(params.imageSR).toEqual('4326'); expect(params.format).toEqual('png'); expect(params.transparent).toEqual('true'); expect(params.size).toEqual('256,256'); // Just return any old image. Resource._DefaultImplementations.createImage('Data/Images/Red16x16.png', crossOrigin, deferred); }; return provider.requestImage(0, 0, 0).then(function(image) { expect(image).toBeInstanceOf(Image); }); }); }); it('supports non-tiled servers with various constructor parameters', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; var token = '5e(u|2!7Y'; stubJSONPCall(baseUrl, { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text' }, undefined, token); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl, token: token, tileWidth: 128, tileHeight: 512, tilingScheme: new WebMercatorTilingScheme(), rectangle: Rectangle.fromDegrees(1.0, 2.0, 3.0, 4.0), layers: 'foo,bar', enablePickFeatures: false }); expect(provider.url).toEqual(baseUrl); return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.tileWidth).toEqual(128); expect(provider.tileHeight).toEqual(512); expect(provider.maximumLevel).toBeUndefined(); expect(provider.tilingScheme).toBeInstanceOf(WebMercatorTilingScheme); expect(provider.credit).toBeDefined(); expect(provider.tileDiscardPolicy).toBeUndefined(); expect(provider.rectangle).toEqual(Rectangle.fromDegrees(1.0, 2.0, 3.0, 4.0)); expect(provider.usingPrecachedTiles).toBe(false); expect(provider.enablePickFeatures).toBe(false); expect(provider.layers).toEqual('foo,bar'); Resource._Implementations.createImage = function(url, crossOrigin, deferred) { var uri = new Uri(url); var params = queryToObject(uri.query); var uriWithoutQuery = new Uri(uri); uriWithoutQuery.query = ''; expect(uriWithoutQuery.toString()).toEqual(getAbsoluteUri(baseUrl + 'export')); expect(params.f).toEqual('image'); expect(params.bboxSR).toEqual('3857'); expect(params.imageSR).toEqual('3857'); expect(params.format).toEqual('png'); expect(params.transparent).toEqual('true'); expect(params.size).toEqual('128,512'); expect(params.layers).toEqual('show:foo,bar'); expect(params.token).toEqual(token); // Just return any old image. Resource._DefaultImplementations.createImage('Data/Images/Red16x16.png', crossOrigin, deferred); }; return provider.requestImage(0, 0, 0).then(function(image) { expect(image).toBeInstanceOf(Image); }); }); }); it('includes security token in requests if one is specified', function() { var baseUrl = '//tiledArcGisMapServer.invalid/', token = '5e(u|2!7Y'; stubJSONPCall(baseUrl, webMercatorResult, false, token); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl, token : token }); var expectedTileUrl = getAbsoluteUri(baseUrl + 'tile/0/0/0?' + objectToQuery({ token: token })); expect(provider.url).toEqual(baseUrl); expect(provider.token).toEqual(token); return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.tileWidth).toEqual(128); expect(provider.tileHeight).toEqual(256); expect(provider.maximumLevel).toEqual(2); expect(provider.tilingScheme).toBeInstanceOf(WebMercatorTilingScheme); expect(provider.credit).toBeDefined(); expect(provider.tileDiscardPolicy).toBeInstanceOf(DiscardMissingTileImagePolicy); expect(provider.rectangle).toEqual(new WebMercatorTilingScheme().rectangle); expect(provider.usingPrecachedTiles).toEqual(true); expect(provider.hasAlphaChannel).toBeDefined(); Resource._Implementations.createImage = function(url, crossOrigin, deferred) { if (/^blob:/.test(url)) { // load blob url normally Resource._DefaultImplementations.createImage(url, crossOrigin, deferred); } else { expect(url).toEqual(expectedTileUrl); // Just return any old image. Resource._DefaultImplementations.createImage('Data/Images/Red16x16.png', crossOrigin, deferred); } }; Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) { expect(url).toEqual(expectedTileUrl); // Just return any old image. Resource._DefaultImplementations.loadWithXhr('Data/Images/Red16x16.png', responseType, method, data, headers, deferred); }; return provider.requestImage(0, 0, 0).then(function(image) { expect(image).toBeInstanceOf(Image); }); }); }); it('raises error on unsupported WKID', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; var unsupportedWKIDResult = { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text', 'tileInfo' : { 'rows' : 128, 'cols' : 256, 'origin' : { 'x' : -180, 'y' : 90 }, 'spatialReference' : { 'wkid' : 1234 }, 'lods' : [{ 'level' : 0, 'resolution' : 0.3515625, 'scale' : 147748799.285417 }, { 'level' : 1, 'resolution' : 0.17578125, 'scale' : 73874399.6427087 }, { 'level' : 2, 'resolution' : 0.087890625, 'scale' : 36937199.8213544 }] } }; stubJSONPCall(baseUrl, unsupportedWKIDResult); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); var tries = 0; provider.errorEvent.addEventListener(function(error) { expect(error.message.indexOf('WKID') >= 0).toEqual(true); ++tries; if (tries < 3) { error.retry = true; } }); return pollToPromise(function() { return provider.ready || tries >= 3; }).then(function() { expect(provider.ready).toEqual(false); expect(tries).toEqual(3); }); }); it('raises error on invalid URL', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); var errorEventRaised = false; provider.errorEvent.addEventListener(function(error) { expect(error.message.indexOf(baseUrl) >= 0).toEqual(true); errorEventRaised = true; }); return pollToPromise(function() { return provider.ready || errorEventRaised; }).then(function() { expect(provider.ready).toEqual(false); expect(errorEventRaised).toEqual(true); }); }); it('raises error event when image cannot be loaded', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; stubJSONPCall(baseUrl, { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text' }); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); var layer = new ImageryLayer(provider); var tries = 0; provider.errorEvent.addEventListener(function(error) { expect(error.timesRetried).toEqual(tries); ++tries; if (tries < 3) { error.retry = true; } setTimeout(function() { RequestScheduler.update(); }, 1); }); Resource._Implementations.createImage = function(url, crossOrigin, deferred) { if (tries === 2) { // Succeed after 2 tries Resource._DefaultImplementations.createImage('Data/Images/Red16x16.png', crossOrigin, deferred); } else { // fail setTimeout(function() { deferred.reject(); }, 1); } }; return pollToPromise(function() { return provider.ready; }).then(function() { var imagery = new Imagery(layer, 0, 0, 0); imagery.addReference(); layer._requestImagery(imagery); RequestScheduler.update(); return pollToPromise(function() { return imagery.state === ImageryState.RECEIVED; }).then(function() { expect(imagery.image).toBeInstanceOf(Image); expect(tries).toEqual(2); imagery.releaseReference(); }); }); }); it('honors fullExtent of tiled server with web mercator projection', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; var webMercatorFullExtentResult = { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text', 'tileInfo' : { 'rows' : 128, 'cols' : 256, 'origin' : { 'x' : -20037508.342787, 'y' : 20037508.342787 }, 'spatialReference' : { 'wkid' : 102100 }, 'lods' : [{ 'level' : 0, 'resolution' : 156543.033928, 'scale' : 591657527.591555 }, { 'level' : 1, 'resolution' : 78271.5169639999, 'scale' : 295828763.795777 }, { 'level' : 2, 'resolution' : 39135.7584820001, 'scale' : 147914381.897889 }] }, fullExtent : { 'xmin' : 1.1148026611962173E7, 'ymin' : -6443518.758206591, 'xmax' : 1.8830976498143446E7, 'ymax' : -265936.19697360107, 'spatialReference' : { 'wkid' : 102100 } } }; stubJSONPCall(baseUrl, webMercatorFullExtentResult); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); return pollToPromise(function() { return provider.ready; }).then(function() { var projection = new WebMercatorProjection(); var sw = projection.unproject(new Cartesian2(1.1148026611962173E7, -6443518.758206591)); var ne = projection.unproject(new Cartesian2(1.8830976498143446E7, -265936.19697360107)); var rectangle = new Rectangle(sw.longitude, sw.latitude, ne.longitude, ne.latitude); expect(provider.rectangle).toEqual(rectangle); }); }); it('constrains extent to the tiling scheme\'s rectangle', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; var webMercatorOutsideBoundsResult = { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text', 'tileInfo' : { 'rows' : 128, 'cols' : 256, 'origin' : { 'x' : -20037508.342787, 'y' : 20037508.342787 }, 'spatialReference' : { 'wkid' : 102100 }, 'lods' : [{ 'level' : 0, 'resolution' : 156543.033928, 'scale' : 591657527.591555 }, { 'level' : 1, 'resolution' : 78271.5169639999, 'scale' : 295828763.795777 }, { 'level' : 2, 'resolution' : 39135.7584820001, 'scale' : 147914381.897889 }] }, fullExtent : { 'xmin' : -2.0037507067161843E7, 'ymin' : -1.4745615008589065E7, 'xmax' : 2.0037507067161843E7, 'ymax' : 3.0240971958386205E7, 'spatialReference' : { 'wkid' : 102100 } } }; stubJSONPCall(baseUrl, webMercatorOutsideBoundsResult); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.rectangle.west >= -Math.PI).toBe(true); expect(provider.rectangle.east <= Math.PI).toBe(true); expect(provider.rectangle.south >= -WebMercatorProjection.MaximumLatitude).toBe(true); expect(provider.rectangle.north <= WebMercatorProjection.MaximumLatitude).toBe(true); }); }); it('honors fullExtent of tiled server with geographic projection', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; var geographicFullExtentResult = { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text', 'tileInfo' : { 'rows' : 128, 'cols' : 256, 'origin' : { 'x' : -20037508.342787, 'y' : 20037508.342787 }, 'spatialReference' : { 'wkid' : 102100 }, 'lods' : [{ 'level' : 0, 'resolution' : 156543.033928, 'scale' : 591657527.591555 }, { 'level' : 1, 'resolution' : 78271.5169639999, 'scale' : 295828763.795777 }, { 'level' : 2, 'resolution' : 39135.7584820001, 'scale' : 147914381.897889 }] }, fullExtent : { 'xmin' : -123.4, 'ymin' : -23.2, 'xmax' : 100.7, 'ymax' : 45.2, 'spatialReference' : { 'wkid' : 4326 } } }; stubJSONPCall(baseUrl, geographicFullExtentResult); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.rectangle).toEqual(Rectangle.fromDegrees(-123.4, -23.2, 100.7, 45.2)); }); }); it('raises error if the spatialReference of the fullExtent is unknown', function() { var baseUrl = '//tiledArcGisMapServer.invalid/'; var unknownSpatialReferenceResult = { 'currentVersion' : 10.01, 'copyrightText' : 'Test copyright text', 'tileInfo' : { 'rows' : 128, 'cols' : 256, 'origin' : { 'x' : -180, 'y' : 90 }, 'spatialReference' : { 'wkid' : 1234 }, 'lods' : [{ 'level' : 0, 'resolution' : 0.3515625, 'scale' : 147748799.285417 }, { 'level' : 1, 'resolution' : 0.17578125, 'scale' : 73874399.6427087 }, { 'level' : 2, 'resolution' : 0.087890625, 'scale' : 36937199.8213544 }] }, fullExtent : { 'xmin' : -123.4, 'ymin' : -23.2, 'xmax' : 100.7, 'ymax' : 45.2, 'spatialReference' : { 'wkid' : 1234 } } }; stubJSONPCall(baseUrl, unknownSpatialReferenceResult); var provider = new ArcGisMapServerImageryProvider({ url : baseUrl }); expect(provider.url).toEqual(baseUrl); var tries = 0; provider.errorEvent.addEventListener(function(error) { expect(error.message.indexOf('WKID') >= 0).toEqual(true); ++tries; if (tries < 3) { error.retry = true; } }); return pollToPromise(function() { return provider.ready || tries >= 3; }).then(function() { expect(provider.ready).toEqual(false); expect(tries).toEqual(3); }); }); describe('pickFeatures', function() { it('works with WebMercator geometry', function() { var provider = new ArcGisMapServerImageryProvider({ url : 'made/up/map/server', usePreCachedTilesIfAvailable : false }); Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) { expect(url).toContain('identify'); Resource._DefaultImplementations.loadWithXhr('Data/ArcGIS/identify-WebMercator.json', responseType, method, data, headers, deferred, overrideMimeType); }; return pollToPromise(function() { return provider.ready; }).then(function() { return provider.pickFeatures(0, 0, 0, 0.5, 0.5).then(function(pickResult) { expect(pickResult.length).toBe(1); var firstResult = pickResult[0]; expect(firstResult).toBeInstanceOf(ImageryLayerFeatureInfo); expect(firstResult.description).toContain('Hummock Grasses'); expect(firstResult.position).toEqual(new WebMercatorProjection().unproject(new Cartesian3(1.481682457042425E7, -2710890.117898505))); }); }); }); it('works with Geographic geometry', function() { var provider = new ArcGisMapServerImageryProvider({ url : 'made/up/map/server', usePreCachedTilesIfAvailable : false }); Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) { expect(url).toContain('identify'); Resource._DefaultImplementations.loadWithXhr('Data/ArcGIS/identify-Geographic.json', responseType, method, data, headers, deferred, overrideMimeType); }; return pollToPromise(function() { return provider.ready; }).then(function() { return provider.pickFeatures(0, 0, 0, 0.5, 0.5).then(function(pickResult) { expect(pickResult.length).toBe(1); var firstResult = pickResult[0]; expect(firstResult).toBeInstanceOf(ImageryLayerFeatureInfo); expect(firstResult.description).toContain('Hummock Grasses'); expect(firstResult.position).toEqual(Cartographic.fromDegrees(123.45, -34.2)); }); }); }); it('returns undefined if enablePickFeatures is false', function() { var provider = new ArcGisMapServerImageryProvider({ url : 'made/up/map/server', usePreCachedTilesIfAvailable : false, enablePickFeatures : false }); return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.pickFeatures(0, 0, 0, 0.5, 0.5)).toBeUndefined(); }); }); it('returns undefined if enablePickFeatures is dynamically set to false', function() { var provider = new ArcGisMapServerImageryProvider({ url : 'made/up/map/server', usePreCachedTilesIfAvailable : false, enablePickFeatures : true }); provider.enablePickFeatures = false; return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.pickFeatures(0, 0, 0, 0.5, 0.5)).toBeUndefined(); }); }); it('does not return undefined if enablePickFeatures is dynamically set to true', function() { var provider = new ArcGisMapServerImageryProvider({ url : 'made/up/map/server', usePreCachedTilesIfAvailable : false, enablePickFeatures : false }); provider.enablePickFeatures = true; return pollToPromise(function() { return provider.ready; }).then(function() { expect(provider.pickFeatures(0, 0, 0, 0.5, 0.5)).not.toBeUndefined(); }); }); it('picks from individual layers', function() { var provider = new ArcGisMapServerImageryProvider({ url : 'made/up/map/server', usePreCachedTilesIfAvailable : false, layers : 'someLayer,anotherLayerYay' }); Resource._Implementations.loadWithXhr = function(url, responseType, method, data, headers, deferred, overrideMimeType) { var uri = new Uri(url); var query = queryToObject(uri.getQuery()); expect(query.layers).toContain('visible:someLayer,anotherLayerYay'); Resource._DefaultImplementations.loadWithXhr('Data/ArcGIS/identify-WebMercator.json', responseType, method, data, headers, deferred, overrideMimeType); }; return pollToPromise(function() { return provider.ready; }).then(function() { return provider.pickFeatures(0, 0, 0, 0.5, 0.5).then(function(pickResult) { expect(pickResult.length).toBe(1); }); }); }); }); });