235 lines
8.4 KiB
JavaScript
235 lines
8.4 KiB
JavaScript
// Copyright 2011 The Closure Library Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
goog.provide('goog.testing.fs.FileReaderTest');
|
|
goog.setTestOnly('goog.testing.fs.FileReaderTest');
|
|
|
|
goog.require('goog.Timer');
|
|
goog.require('goog.async.Deferred');
|
|
goog.require('goog.events');
|
|
goog.require('goog.fs.Error');
|
|
goog.require('goog.fs.FileReader');
|
|
goog.require('goog.fs.FileSaver');
|
|
goog.require('goog.testing.AsyncTestCase');
|
|
goog.require('goog.testing.fs.FileReader');
|
|
goog.require('goog.testing.fs.FileSystem');
|
|
goog.require('goog.testing.jsunit');
|
|
|
|
var asyncTestCase = goog.testing.AsyncTestCase.createAndInstall();
|
|
var file, deferredReader;
|
|
var hasArrayBuffer = goog.isDef(goog.global.ArrayBuffer);
|
|
|
|
function setUp() {
|
|
var fs = new goog.testing.fs.FileSystem();
|
|
var fileEntry = fs.getRoot().createDirectorySync('foo').createFileSync('bar');
|
|
file = fileEntry.fileSync();
|
|
file.setDataInternal('test content');
|
|
|
|
deferredReader = new goog.async.Deferred();
|
|
goog.Timer.callOnce(
|
|
goog.bind(deferredReader.callback, deferredReader,
|
|
new goog.testing.fs.FileReader()));
|
|
}
|
|
|
|
function testRead() {
|
|
deferredReader.
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.INIT)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(readAsText)).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.LOADING)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD_START)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD_END)).
|
|
addCallback(goog.partial(checkResult, file.toString())).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.DONE)).
|
|
addBoth(continueTesting);
|
|
waitForAsync('testRead');
|
|
}
|
|
|
|
function testReadAsArrayBuffer() {
|
|
if (!hasArrayBuffer) {
|
|
// Skip if array buffer is not supported
|
|
return;
|
|
}
|
|
deferredReader.
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.INIT)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(readAsArrayBuffer)).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.LOADING)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD_START)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD_END)).
|
|
addCallback(goog.partial(checkResult, file.toArrayBuffer())).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.DONE)).
|
|
addBoth(continueTesting);
|
|
waitForAsync('testReadAsArrayBuffer');
|
|
}
|
|
|
|
function testReadAsDataUrl() {
|
|
deferredReader.
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.INIT)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(readAsDataUrl)).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.LOADING)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD_START)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD_END)).
|
|
addCallback(goog.partial(checkResult, file.toDataUrl())).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.DONE)).
|
|
addBoth(continueTesting);
|
|
waitForAsync('testReadAsDataUrl');
|
|
}
|
|
|
|
function testAbort() {
|
|
deferredReader.
|
|
addCallback(goog.partial(readAsText)).
|
|
addCallback(function(reader) { reader.abort(); }).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.LOADING)).
|
|
addCallback(goog.partial(waitForError, goog.fs.Error.ErrorCode.ABORT)).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.LOADING)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.ABORT)).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.LOADING)).
|
|
addCallback(goog.partial(waitForEvent,
|
|
goog.fs.FileReader.EventType.LOAD_END)).
|
|
addCallback(goog.partial(checkReadyState,
|
|
goog.fs.FileReader.ReadyState.DONE)).
|
|
addCallback(goog.partial(checkResult, undefined)).
|
|
addBoth(continueTesting);
|
|
waitForAsync('testAbort');
|
|
}
|
|
|
|
function testAbortBeforeRead() {
|
|
deferredReader.
|
|
addCallback(function(reader) { reader.abort(); }).
|
|
addErrback(function(err) {
|
|
assertEquals(goog.fs.Error.ErrorCode.INVALID_STATE, err.code);
|
|
return true;
|
|
}).
|
|
addCallback(function(calledErrback) {
|
|
assertTrue(calledErrback);
|
|
}).
|
|
addBoth(continueTesting);
|
|
waitForAsync('testAbortBeforeRead');
|
|
}
|
|
|
|
function testReadDuringRead() {
|
|
deferredReader.
|
|
addCallback(goog.partial(readAsText)).
|
|
addCallback(goog.partial(readAsText)).
|
|
addErrback(function(err) {
|
|
assertEquals(goog.fs.Error.ErrorCode.INVALID_STATE, err.code);
|
|
return true;
|
|
}).
|
|
addCallback(assertTrue).
|
|
addBoth(continueTesting);
|
|
waitForAsync('testReadDuringRead');
|
|
}
|
|
|
|
function continueTesting(result) {
|
|
asyncTestCase.continueTesting();
|
|
if (result instanceof Error) {
|
|
throw result;
|
|
}
|
|
}
|
|
|
|
function waitForAsync(msg) {
|
|
asyncTestCase.waitForAsync(msg);
|
|
}
|
|
|
|
function waitForEvent(type, target) {
|
|
var d = new goog.async.Deferred();
|
|
goog.events.listenOnce(target, type, goog.bind(d.callback, d, target));
|
|
return d;
|
|
}
|
|
|
|
function waitForError(type, target) {
|
|
var d = new goog.async.Deferred();
|
|
goog.events.listenOnce(
|
|
target, goog.fs.FileReader.EventType.ERROR, function(e) {
|
|
assertEquals(type, target.getError().code);
|
|
d.callback(target);
|
|
});
|
|
return d;
|
|
}
|
|
|
|
function readAsText(reader) {
|
|
reader.readAsText(file);
|
|
}
|
|
|
|
function readAsArrayBuffer(reader) {
|
|
reader.readAsArrayBuffer(file);
|
|
}
|
|
|
|
function readAsDataUrl(reader) {
|
|
reader.readAsDataUrl(file);
|
|
}
|
|
|
|
function readAndWait(reader) {
|
|
readAsText(reader);
|
|
return waitForEvent(goog.fs.FileSaver.EventType.LOAD_END, reader);
|
|
}
|
|
|
|
function checkResult(expectedResult, reader) {
|
|
checkEquals(expectedResult, reader.getResult());
|
|
}
|
|
|
|
function checkEquals(a, b) {
|
|
if (hasArrayBuffer &&
|
|
a instanceof ArrayBuffer && b instanceof ArrayBuffer) {
|
|
assertEquals(a.byteLength, b.byteLength);
|
|
var viewA = new Uint8Array(a);
|
|
var viewB = new Uint8Array(b);
|
|
for (var i = 0; i < a.byteLength; i++) {
|
|
assertEquals(viewA[i], viewB[i]);
|
|
}
|
|
} else {
|
|
assertEquals(a, b);
|
|
}
|
|
}
|
|
|
|
function checkReadyState(expectedState, reader) {
|
|
assertEquals(expectedState, reader.getReadyState());
|
|
}
|