diff options
author | Matt Mastracci <matthew@mastracci.com> | 2024-02-10 13:22:13 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-10 20:22:13 +0000 |
commit | f5e46c9bf2f50d66a953fa133161fc829cecff06 (patch) | |
tree | 8faf2f5831c1c7b11d842cd9908d141082c869a5 /tests/unit/globals_test.ts | |
parent | d2477f780630a812bfd65e3987b70c0d309385bb (diff) |
chore: move cli/tests/ -> tests/ (#22369)
This looks like a massive PR, but it's only a move from cli/tests ->
tests, and updates of relative paths for files.
This is the first step towards aggregate all of the integration test
files under tests/, which will lead to a set of integration tests that
can run without the CLI binary being built.
While we could leave these tests under `cli`, it would require us to
keep a more complex directory structure for the various test runners. In
addition, we have a lot of complexity to ignore various test files in
the `cli` project itself (cargo publish exclusion rules, autotests =
false, etc).
And finally, the `tests/` folder will eventually house the `test_ffi`,
`test_napi` and other testing code, reducing the size of the root repo
directory.
For easier review, the extremely large and noisy "move" is in the first
commit (with no changes -- just a move), while the remainder of the
changes to actual files is in the second commit.
Diffstat (limited to 'tests/unit/globals_test.ts')
-rw-r--r-- | tests/unit/globals_test.ts | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/tests/unit/globals_test.ts b/tests/unit/globals_test.ts new file mode 100644 index 000000000..00be3f451 --- /dev/null +++ b/tests/unit/globals_test.ts @@ -0,0 +1,225 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +// deno-lint-ignore-file no-window-prefix +import { assert, assertEquals, assertRejects } from "./test_util.ts"; + +Deno.test(function globalThisExists() { + assert(globalThis != null); +}); + +Deno.test(function noInternalGlobals() { + // globalThis.__bootstrap should not be there. + for (const key of Object.keys(globalThis)) { + assert(!key.startsWith("_")); + } +}); + +Deno.test(function windowExists() { + assert(window != null); +}); + +Deno.test(function selfExists() { + assert(self != null); +}); + +Deno.test(function windowWindowExists() { + assert(window.window === window); +}); + +Deno.test(function windowSelfExists() { + assert(window.self === window); +}); + +Deno.test(function globalThisEqualsWindow() { + assert(globalThis === window); +}); + +Deno.test(function globalThisEqualsSelf() { + assert(globalThis === self); +}); + +Deno.test(function globalThisInstanceofWindow() { + assert(globalThis instanceof Window); +}); + +Deno.test(function globalThisConstructorLength() { + assert(globalThis.constructor.length === 0); +}); + +Deno.test(function globalThisInstanceofEventTarget() { + assert(globalThis instanceof EventTarget); +}); + +Deno.test(function navigatorInstanceofNavigator() { + // TODO(nayeemrmn): Add `Navigator` to deno_lint globals. + // deno-lint-ignore no-undef + assert(navigator instanceof Navigator); +}); + +Deno.test(function DenoNamespaceExists() { + assert(Deno != null); +}); + +Deno.test(function DenoNamespaceEqualsWindowDeno() { + assert(Deno === window.Deno); +}); + +Deno.test(function DenoNamespaceIsNotFrozen() { + assert(!Object.isFrozen(Deno)); +}); + +Deno.test(function webAssemblyExists() { + assert(typeof WebAssembly.compile === "function"); +}); + +// @ts-ignore This is not publicly typed namespace, but it's there for sure. +const core = Deno[Deno.internal].core; + +Deno.test(function DenoNamespaceConfigurable() { + const desc = Object.getOwnPropertyDescriptor(globalThis, "Deno"); + assert(desc); + assert(desc.configurable); + assert(!desc.writable); +}); + +Deno.test(function DenoCoreNamespaceIsImmutable() { + const { print } = core; + try { + core.print = 1; + } catch { + // pass + } + assert(print === core.print); + try { + delete core.print; + } catch { + // pass + } + assert(print === core.print); +}); + +Deno.test(async function windowQueueMicrotask() { + let resolve1: () => void | undefined; + let resolve2: () => void | undefined; + let microtaskDone = false; + const p1 = new Promise<void>((res) => { + resolve1 = () => { + microtaskDone = true; + res(); + }; + }); + const p2 = new Promise<void>((res) => { + resolve2 = () => { + assert(microtaskDone); + res(); + }; + }); + window.queueMicrotask(resolve1!); + setTimeout(resolve2!, 0); + await p1; + await p2; +}); + +Deno.test(function webApiGlobalThis() { + assert(globalThis.FormData !== null); + assert(globalThis.TextEncoder !== null); + assert(globalThis.TextEncoderStream !== null); + assert(globalThis.TextDecoder !== null); + assert(globalThis.TextDecoderStream !== null); + assert(globalThis.CountQueuingStrategy !== null); + assert(globalThis.ByteLengthQueuingStrategy !== null); +}); + +Deno.test(function windowNameIsDefined() { + assertEquals(typeof globalThis.name, "string"); + assertEquals(name, ""); + assertEquals(window.name, name); + name = "foobar"; + assertEquals(window.name, "foobar"); + assertEquals(name, "foobar"); + name = ""; + assertEquals(window.name, ""); + assertEquals(name, ""); +}); + +Deno.test(async function promiseWithResolvers() { + { + const { promise, resolve } = Promise.withResolvers(); + resolve(true); + assert(await promise); + } + { + const { promise, reject } = Promise.withResolvers(); + reject(new Error("boom!")); + await assertRejects(() => promise, Error, "boom!"); + } +}); + +Deno.test(async function arrayFromAsync() { + // Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fromAsync#examples + // Thank you. + const asyncIterable = (async function* () { + for (let i = 0; i < 5; i++) { + await new Promise((resolve) => setTimeout(resolve, 10 * i)); + yield i; + } + })(); + + const a = await Array.fromAsync(asyncIterable); + assertEquals(a, [0, 1, 2, 3, 4]); + + const b = await Array.fromAsync(new Map([[1, 2], [3, 4]])); + assertEquals(b, [[1, 2], [3, 4]]); +}); + +// Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/groupBy#examples +Deno.test(function objectGroupBy() { + const inventory = [ + { name: "asparagus", type: "vegetables", quantity: 5 }, + { name: "bananas", type: "fruit", quantity: 0 }, + { name: "goat", type: "meat", quantity: 23 }, + { name: "cherries", type: "fruit", quantity: 5 }, + { name: "fish", type: "meat", quantity: 22 }, + ]; + const result = Object.groupBy(inventory, ({ type }) => type); + assertEquals(result, { + vegetables: [ + { name: "asparagus", type: "vegetables", quantity: 5 }, + ], + fruit: [ + { name: "bananas", type: "fruit", quantity: 0 }, + { name: "cherries", type: "fruit", quantity: 5 }, + ], + meat: [ + { name: "goat", type: "meat", quantity: 23 }, + { name: "fish", type: "meat", quantity: 22 }, + ], + }); +}); + +Deno.test(function objectGroupByEmpty() { + const empty: string[] = []; + const result = Object.groupBy(empty, () => "abc"); + assertEquals(result.abc, undefined); +}); + +// Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map/groupBy#examples +Deno.test(function mapGroupBy() { + const inventory = [ + { name: "asparagus", type: "vegetables", quantity: 9 }, + { name: "bananas", type: "fruit", quantity: 5 }, + { name: "goat", type: "meat", quantity: 23 }, + { name: "cherries", type: "fruit", quantity: 12 }, + { name: "fish", type: "meat", quantity: 22 }, + ]; + const restock = { restock: true }; + const sufficient = { restock: false }; + const result = Map.groupBy( + inventory, + ({ quantity }) => quantity < 6 ? restock : sufficient, + ); + assertEquals(result.get(restock), [{ + name: "bananas", + type: "fruit", + quantity: 5, + }]); +}); |