summaryrefslogtreecommitdiff
path: root/cli/tests/unit/filereader_test.ts
diff options
context:
space:
mode:
authorPaul Thompson <paul.thompson773@gmail.com>2020-08-11 22:00:53 +1000
committerGitHub <noreply@github.com>2020-08-11 14:00:53 +0200
commiteed77aa0208e603dac908a240dd66ece422e9dd7 (patch)
tree263f539c6bfe40d19bb8b8c591466887e3a686a7 /cli/tests/unit/filereader_test.ts
parentd7077b9073dec6fb1f4b07d5575ef416997c19a9 (diff)
feat(web): FileReader API (#6673)
Diffstat (limited to 'cli/tests/unit/filereader_test.ts')
-rw-r--r--cli/tests/unit/filereader_test.ts220
1 files changed, 220 insertions, 0 deletions
diff --git a/cli/tests/unit/filereader_test.ts b/cli/tests/unit/filereader_test.ts
new file mode 100644
index 000000000..9b2cf1d12
--- /dev/null
+++ b/cli/tests/unit/filereader_test.ts
@@ -0,0 +1,220 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+import { unitTest, assertEquals } from "./test_util.ts";
+
+unitTest(function fileReaderConstruct(): void {
+ const fr = new FileReader();
+ assertEquals(fr.readyState, FileReader.EMPTY);
+
+ assertEquals(FileReader.EMPTY, 0);
+ assertEquals(FileReader.LOADING, 1);
+ assertEquals(FileReader.DONE, 2);
+});
+
+unitTest(async function fileReaderLoadBlob(): Promise<void> {
+ await new Promise<void>((resolve) => {
+ const fr = new FileReader();
+ const b1 = new Blob(["Hello World"]);
+
+ assertEquals(fr.readyState, FileReader.EMPTY);
+
+ const hasOnEvents = {
+ load: false,
+ loadend: false,
+ loadstart: false,
+ progress: 0,
+ };
+ const hasDispatchedEvents = {
+ load: false,
+ loadend: false,
+ loadstart: false,
+ progress: 0,
+ };
+ let result: string | null = null;
+
+ fr.addEventListener("load", () => {
+ hasDispatchedEvents.load = true;
+ });
+ fr.addEventListener("loadend", () => {
+ hasDispatchedEvents.loadend = true;
+ });
+ fr.addEventListener("loadstart", () => {
+ hasDispatchedEvents.loadstart = true;
+ });
+ fr.addEventListener("progress", () => {
+ hasDispatchedEvents.progress += 1;
+ });
+
+ fr.onloadstart = (): void => {
+ hasOnEvents.loadstart = true;
+ };
+ fr.onprogress = (): void => {
+ assertEquals(fr.readyState, FileReader.LOADING);
+
+ hasOnEvents.progress += 1;
+ };
+ fr.onload = (): void => {
+ hasOnEvents.load = true;
+ };
+ fr.onloadend = (ev): void => {
+ hasOnEvents.loadend = true;
+ result = fr.result as string;
+
+ assertEquals(hasOnEvents.loadstart, true);
+ assertEquals(hasDispatchedEvents.loadstart, true);
+ assertEquals(hasOnEvents.load, true);
+ assertEquals(hasDispatchedEvents.load, true);
+ assertEquals(hasOnEvents.loadend, true);
+ assertEquals(hasDispatchedEvents.loadend, true);
+
+ assertEquals(fr.readyState, FileReader.DONE);
+
+ assertEquals(result, "Hello World");
+ assertEquals(ev.lengthComputable, true);
+ resolve();
+ };
+
+ fr.readAsText(b1);
+ });
+});
+
+unitTest(async function fileReaderLoadBlobDouble(): Promise<void> {
+ // impl note from https://w3c.github.io/FileAPI/
+ // Event handler for the load or error events could have started another load,
+ // if that happens the loadend event for the first load is not fired
+
+ const fr = new FileReader();
+ const b1 = new Blob(["First load"]);
+ const b2 = new Blob(["Second load"]);
+
+ await new Promise<void>((resolve) => {
+ let result: string | null = null;
+
+ fr.onload = (): void => {
+ result = fr.result as string;
+ assertEquals(result === "First load" || result === "Second load", true);
+
+ if (result === "First load") {
+ fr.readAsText(b2);
+ }
+ };
+ fr.onloadend = (): void => {
+ assertEquals(result, "Second load");
+
+ resolve();
+ };
+
+ fr.readAsText(b1);
+ });
+});
+
+unitTest(async function fileReaderLoadBlobArrayBuffer(): Promise<void> {
+ await new Promise<void>((resolve) => {
+ const fr = new FileReader();
+ const b1 = new Blob(["Hello World"]);
+ let result: ArrayBuffer | null = null;
+
+ fr.onloadend = (ev): void => {
+ assertEquals(fr.result instanceof ArrayBuffer, true);
+ result = fr.result as ArrayBuffer;
+
+ const decoder = new TextDecoder();
+ const text = decoder.decode(result);
+
+ assertEquals(text, "Hello World");
+ assertEquals(ev.lengthComputable, true);
+ resolve();
+ };
+
+ fr.readAsArrayBuffer(b1);
+ });
+});
+
+unitTest(async function fileReaderLoadBlobDataUrl(): Promise<void> {
+ await new Promise<void>((resolve) => {
+ const fr = new FileReader();
+ const b1 = new Blob(["Hello World"]);
+ let result: string | null = null;
+
+ fr.onloadend = (ev): void => {
+ result = fr.result as string;
+ assertEquals(
+ result,
+ "data:application/octet-stream;base64,SGVsbG8gV29ybGQ=",
+ );
+ assertEquals(ev.lengthComputable, true);
+ resolve();
+ };
+
+ fr.readAsDataURL(b1);
+ });
+});
+
+unitTest(async function fileReaderLoadBlobAbort(): Promise<void> {
+ await new Promise<void>((resolve) => {
+ const fr = new FileReader();
+ const b1 = new Blob(["Hello World"]);
+
+ const hasOnEvents = {
+ load: false,
+ loadend: false,
+ abort: false,
+ };
+
+ fr.onload = (): void => {
+ hasOnEvents.load = true;
+ };
+ fr.onloadend = (ev): void => {
+ hasOnEvents.loadend = true;
+
+ assertEquals(hasOnEvents.load, false);
+ assertEquals(hasOnEvents.loadend, true);
+ assertEquals(hasOnEvents.abort, true);
+
+ assertEquals(fr.readyState, FileReader.DONE);
+ assertEquals(fr.result, null);
+ assertEquals(ev.lengthComputable, false);
+ resolve();
+ };
+ fr.onabort = (): void => {
+ hasOnEvents.abort = true;
+ };
+
+ fr.readAsDataURL(b1);
+ fr.abort();
+ });
+});
+
+unitTest(async function fileReaderLoadBlobAbort(): Promise<void> {
+ await new Promise<void>((resolve) => {
+ const fr = new FileReader();
+ const b1 = new Blob(["Hello World"]);
+
+ const hasOnEvents = {
+ load: false,
+ loadend: false,
+ abort: false,
+ };
+
+ fr.onload = (): void => {
+ hasOnEvents.load = true;
+ };
+ fr.onloadend = (ev): void => {
+ hasOnEvents.loadend = true;
+
+ assertEquals(hasOnEvents.load, false);
+ assertEquals(hasOnEvents.loadend, true);
+ assertEquals(hasOnEvents.abort, true);
+
+ assertEquals(fr.readyState, FileReader.DONE);
+ assertEquals(fr.result, null);
+ assertEquals(ev.lengthComputable, false);
+ resolve();
+ };
+ fr.onabort = (): void => {
+ hasOnEvents.abort = true;
+ };
+
+ fr.readAsDataURL(b1);
+ fr.abort();
+ });
+});