diff options
author | Paul Thompson <paul.thompson773@gmail.com> | 2020-08-11 22:00:53 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-11 14:00:53 +0200 |
commit | eed77aa0208e603dac908a240dd66ece422e9dd7 (patch) | |
tree | 263f539c6bfe40d19bb8b8c591466887e3a686a7 /cli/tests/unit/filereader_test.ts | |
parent | d7077b9073dec6fb1f4b07d5575ef416997c19a9 (diff) |
feat(web): FileReader API (#6673)
Diffstat (limited to 'cli/tests/unit/filereader_test.ts')
-rw-r--r-- | cli/tests/unit/filereader_test.ts | 220 |
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(); + }); +}); |