226 lines
8.4 KiB
JavaScript
226 lines
8.4 KiB
JavaScript
|
|
defineSuite([
|
||
|
|
'Core/loadCRN',
|
||
|
|
'Core/PixelFormat',
|
||
|
|
'Core/Request',
|
||
|
|
'Core/RequestErrorEvent',
|
||
|
|
'Core/RequestScheduler',
|
||
|
|
'Core/Resource'
|
||
|
|
], function(
|
||
|
|
loadCRN,
|
||
|
|
PixelFormat,
|
||
|
|
Request,
|
||
|
|
RequestErrorEvent,
|
||
|
|
RequestScheduler,
|
||
|
|
Resource) {
|
||
|
|
'use strict';
|
||
|
|
|
||
|
|
var validCompressed = new Uint8Array([72, 120, 0, 74, 227, 123, 0, 0, 0, 138, 92, 167, 0, 4, 0, 4, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 22, 0, 1, 0, 0, 96, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 108, 0, 0, 0, 137, 0, 10, 96, 0, 0, 0, 0, 0, 0, 16, 4, 9, 130, 0, 0, 0, 0, 0, 0, 109, 4, 0, 0, 198, 96, 128, 0, 0, 0, 0, 0, 26, 80, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 16, 0, 51, 0, 0, 0, 0, 0, 0, 0, 128, 1, 152, 0, 0, 0, 0, 0, 0, 4, 0]);
|
||
|
|
var validCompressedMipmap = new Uint8Array([72, 120, 0, 82, 183, 141, 0, 0, 0, 148, 151, 24, 0, 4, 0, 4, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 22, 0, 1, 0, 0, 104, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 116, 0, 0, 0, 145, 0, 0, 0, 146, 0, 0, 0, 147, 0, 130, 97, 0, 0, 0, 0, 0, 4, 35, 37, 0, 3, 48, 0, 0, 0, 0, 0, 0, 8, 200, 0, 198, 96, 128, 0, 0, 0, 0, 0, 26, 80, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 16, 0, 51, 0, 0, 0, 0, 0, 0, 0, 128, 1, 152, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0]);
|
||
|
|
var fakeXHR;
|
||
|
|
|
||
|
|
beforeEach(function() {
|
||
|
|
fakeXHR = jasmine.createSpyObj('XMLHttpRequest', ['send', 'open', 'setRequestHeader', 'abort', 'getAllResponseHeaders']);
|
||
|
|
fakeXHR.simulateLoad = function(response) {
|
||
|
|
fakeXHR.simulateHttpResponse(200, response);
|
||
|
|
};
|
||
|
|
fakeXHR.simulateError = function() {
|
||
|
|
fakeXHR.response = '';
|
||
|
|
if (typeof fakeXHR.onerror === 'function') {
|
||
|
|
fakeXHR.onerror();
|
||
|
|
}
|
||
|
|
};
|
||
|
|
fakeXHR.simulateHttpResponse = function(statusCode, response) {
|
||
|
|
fakeXHR.status = statusCode;
|
||
|
|
fakeXHR.response = response;
|
||
|
|
if (typeof fakeXHR.onload === 'function') {
|
||
|
|
fakeXHR.onload();
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
spyOn(window, 'XMLHttpRequest').and.returnValue(fakeXHR);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('throws with no url', function() {
|
||
|
|
expect(function() {
|
||
|
|
loadCRN();
|
||
|
|
}).toThrowDeveloperError();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('creates and sends request without any custom headers', function() {
|
||
|
|
var testUrl = 'http://example.invalid/testuri';
|
||
|
|
loadCRN(testUrl);
|
||
|
|
|
||
|
|
expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true);
|
||
|
|
expect(fakeXHR.setRequestHeader).not.toHaveBeenCalled();
|
||
|
|
expect(fakeXHR.send).toHaveBeenCalled();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('creates and sends request with custom headers with Resource', function() {
|
||
|
|
var testUrl = 'http://example.invalid/testuri';
|
||
|
|
var resource = new Resource({
|
||
|
|
url: testUrl,
|
||
|
|
headers: {
|
||
|
|
'Accept' : 'application/json',
|
||
|
|
'Cache-Control' : 'no-cache'
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
loadCRN(resource);
|
||
|
|
|
||
|
|
expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true);
|
||
|
|
expect(fakeXHR.setRequestHeader.calls.count()).toEqual(2);
|
||
|
|
expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Accept', 'application/json');
|
||
|
|
expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache');
|
||
|
|
expect(fakeXHR.send).toHaveBeenCalled();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns a promise that rejects when the request errors', function() {
|
||
|
|
var testUrl = 'http://example.invalid/testuri';
|
||
|
|
var promise = loadCRN(testUrl);
|
||
|
|
|
||
|
|
expect(promise).toBeDefined();
|
||
|
|
|
||
|
|
var resolvedValue;
|
||
|
|
var rejectedError;
|
||
|
|
promise.then(function(value) {
|
||
|
|
resolvedValue = value;
|
||
|
|
}, function(error) {
|
||
|
|
rejectedError = error;
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(resolvedValue).toBeUndefined();
|
||
|
|
expect(rejectedError).toBeUndefined();
|
||
|
|
|
||
|
|
fakeXHR.simulateError();
|
||
|
|
expect(resolvedValue).toBeUndefined();
|
||
|
|
expect(rejectedError instanceof RequestErrorEvent).toBe(true);
|
||
|
|
expect(rejectedError.statusCode).toBeUndefined();
|
||
|
|
expect(rejectedError.response).toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns a promise that rejects when the request results in an HTTP error code', function() {
|
||
|
|
var testUrl = 'http://example.invalid/testuri';
|
||
|
|
var promise = loadCRN(testUrl);
|
||
|
|
|
||
|
|
expect(promise).toBeDefined();
|
||
|
|
|
||
|
|
var resolvedValue;
|
||
|
|
var rejectedError;
|
||
|
|
promise.then(function(value) {
|
||
|
|
resolvedValue = value;
|
||
|
|
}, function(error) {
|
||
|
|
rejectedError = error;
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(resolvedValue).toBeUndefined();
|
||
|
|
expect(rejectedError).toBeUndefined();
|
||
|
|
|
||
|
|
var error = 'some error';
|
||
|
|
fakeXHR.simulateHttpResponse(404, error);
|
||
|
|
expect(resolvedValue).toBeUndefined();
|
||
|
|
expect(rejectedError instanceof RequestErrorEvent).toBe(true);
|
||
|
|
expect(rejectedError.statusCode).toEqual(404);
|
||
|
|
expect(rejectedError.response).toEqual(error);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns a promise that resolves with undefined when statusCode is 204', function() {
|
||
|
|
var testUrl = 'http://example.invalid/testuri';
|
||
|
|
var promise = loadCRN(testUrl);
|
||
|
|
|
||
|
|
expect(promise).toBeDefined();
|
||
|
|
|
||
|
|
var resolved = false;
|
||
|
|
var resolvedValue;
|
||
|
|
var rejectedError;
|
||
|
|
promise.then(function(value) {
|
||
|
|
resolved = true;
|
||
|
|
resolvedValue = value;
|
||
|
|
}, function(error) {
|
||
|
|
rejectedError = error;
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(resolvedValue).toBeUndefined();
|
||
|
|
expect(rejectedError).toBeUndefined();
|
||
|
|
|
||
|
|
fakeXHR.simulateHttpResponse(204);
|
||
|
|
expect(resolved).toBe(true);
|
||
|
|
expect(resolvedValue).toBeUndefined();
|
||
|
|
expect(rejectedError).toBeUndefined();
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns a promise that resolves to a compressed texture when the request loads', function() {
|
||
|
|
var testUrl = 'http://example.invalid/testuri';
|
||
|
|
var promise = loadCRN(testUrl);
|
||
|
|
|
||
|
|
expect(promise).toBeDefined();
|
||
|
|
|
||
|
|
var resolvedValue;
|
||
|
|
var rejectedError;
|
||
|
|
var newPromise = promise.then(function(value) {
|
||
|
|
resolvedValue = value;
|
||
|
|
}, function(error) {
|
||
|
|
rejectedError = error;
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(resolvedValue).toBeUndefined();
|
||
|
|
expect(rejectedError).toBeUndefined();
|
||
|
|
|
||
|
|
var response = validCompressed.buffer;
|
||
|
|
fakeXHR.simulateLoad(response);
|
||
|
|
|
||
|
|
return newPromise.then(function() {
|
||
|
|
expect(resolvedValue).toBeDefined();
|
||
|
|
expect(resolvedValue.width).toEqual(4);
|
||
|
|
expect(resolvedValue.height).toEqual(4);
|
||
|
|
expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(true);
|
||
|
|
expect(resolvedValue.bufferView).toBeDefined();
|
||
|
|
expect(rejectedError).toBeUndefined();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns a promise that resolves to a compressed texture containing the first mip level of the original texture', function() {
|
||
|
|
var testUrl = 'http://example.invalid/testuri';
|
||
|
|
var promise = loadCRN(testUrl);
|
||
|
|
|
||
|
|
expect(promise).toBeDefined();
|
||
|
|
|
||
|
|
var resolvedValue;
|
||
|
|
var rejectedError;
|
||
|
|
var newPromise = promise.then(function(value) {
|
||
|
|
resolvedValue = value;
|
||
|
|
}, function(error) {
|
||
|
|
rejectedError = error;
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(resolvedValue).toBeUndefined();
|
||
|
|
expect(rejectedError).toBeUndefined();
|
||
|
|
|
||
|
|
var response = validCompressedMipmap.buffer;
|
||
|
|
fakeXHR.simulateLoad(response);
|
||
|
|
|
||
|
|
return newPromise.then(function() {
|
||
|
|
expect(resolvedValue).toBeDefined();
|
||
|
|
expect(resolvedValue.width).toEqual(4);
|
||
|
|
expect(resolvedValue.height).toEqual(4);
|
||
|
|
expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(true);
|
||
|
|
expect(resolvedValue.bufferView).toBeDefined();
|
||
|
|
expect(rejectedError).toBeUndefined();
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
it('returns undefined if the request is throttled', function() {
|
||
|
|
var oldMaximumRequests = RequestScheduler.maximumRequests;
|
||
|
|
RequestScheduler.maximumRequests = 0;
|
||
|
|
|
||
|
|
var promise = loadCRN(new Resource({
|
||
|
|
url: 'http://example.invalid/testuri',
|
||
|
|
request: new Request({
|
||
|
|
throttle: true
|
||
|
|
})
|
||
|
|
}));
|
||
|
|
expect(promise).toBeUndefined();
|
||
|
|
|
||
|
|
RequestScheduler.maximumRequests = oldMaximumRequests;
|
||
|
|
});
|
||
|
|
});
|