summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/utils/test-mockup.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/src/utils/test-mockup.js')
-rw-r--r--devtools/client/debugger/src/utils/test-mockup.js270
1 files changed, 270 insertions, 0 deletions
diff --git a/devtools/client/debugger/src/utils/test-mockup.js b/devtools/client/debugger/src/utils/test-mockup.js
new file mode 100644
index 0000000000..3c3851a3d6
--- /dev/null
+++ b/devtools/client/debugger/src/utils/test-mockup.js
@@ -0,0 +1,270 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This file is for use by unit tests for isolated debugger components that do
+ * not need to interact with the redux store. When these tests need to construct
+ * debugger objects, these interfaces should be used instead of plain object
+ * literals.
+ */
+
+import * as asyncValue from "./async-value";
+
+import { initialState } from "../reducers/index";
+
+import { getDisplayURL } from "./sources-tree/getURL";
+import { createLocation } from "./location";
+
+function makeMockSource(url = "url", id = "source", thread = "FakeThread") {
+ return {
+ id,
+ url,
+ displayURL: getDisplayURL(url),
+ thread,
+ isPrettyPrinted: false,
+ isWasm: false,
+ extensionName: null,
+ isExtension: false,
+ isOriginal: id.includes("originalSource"),
+ };
+}
+
+function makeMockDisplaySource(
+ url = "url",
+ id = "source",
+ thread = "FakeThread"
+) {
+ return makeMockSource(url, id, thread);
+}
+
+function makeMockSourceWithContent(
+ url,
+ id,
+ contentType = "text/javascript",
+ text = ""
+) {
+ const source = makeMockSource(url, id);
+
+ return {
+ ...source,
+ content: text
+ ? asyncValue.fulfilled({
+ type: "text",
+ value: text,
+ contentType,
+ })
+ : null,
+ };
+}
+
+function makeMockSourceAndContent(
+ url,
+ id,
+ contentType = "text/javascript",
+ text = ""
+) {
+ const source = makeMockSource(url, id);
+
+ return {
+ ...source,
+ content: {
+ type: "text",
+ value: text,
+ contentType,
+ },
+ };
+}
+
+function makeFullfilledMockSourceContent(
+ text = "",
+ contentType = "text/javascript"
+) {
+ return asyncValue.fulfilled({
+ type: "text",
+ value: text,
+ contentType,
+ });
+}
+
+function makeMockWasmSource() {
+ return {
+ id: "wasm-source-id",
+ url: "url",
+ displayURL: getDisplayURL("url"),
+ thread: "FakeThread",
+ isPrettyPrinted: false,
+ isWasm: true,
+ extensionName: null,
+ isExtension: false,
+ isOriginal: false,
+ };
+}
+
+function makeMockWasmSourceWithContent(text) {
+ const source = makeMockWasmSource();
+
+ return {
+ ...source,
+ content: asyncValue.fulfilled({
+ type: "wasm",
+ value: text,
+ }),
+ };
+}
+
+function makeMockScope(actor = "scope-actor", type = "block", parent = null) {
+ return {
+ actor,
+ parent,
+ bindings: {
+ arguments: [],
+ variables: {},
+ },
+ object: null,
+ function: null,
+ type,
+ scopeKind: "",
+ };
+}
+
+function mockScopeAddVariable(scope, name) {
+ if (!scope.bindings) {
+ throw new Error("no scope bindings");
+ }
+ scope.bindings.variables[name] = { value: null };
+}
+
+function makeMockBreakpoint(source = makeMockSource(), line = 1, column) {
+ const location = column
+ ? { sourceId: source.id, source: { id: source.id }, line, column }
+ : { sourceId: source.id, source: { id: source.id }, line };
+ return {
+ id: "breakpoint",
+ location,
+ generatedLocation: location,
+ disabled: false,
+ text: "text",
+ originalText: "text",
+ options: {},
+ };
+}
+
+function makeMockFrame(
+ id = "frame",
+ source = makeMockSource("url"),
+ scope = makeMockScope(),
+ line = 4,
+ displayName = `display-${id}`,
+ index = 0
+) {
+ const sourceActor = {
+ id: `${source.id}-actor`,
+ actor: `${source.id}-actor`,
+ source: source.id,
+ sourceObject: source,
+ };
+ const location = createLocation({ source, sourceActor, line });
+ return {
+ id,
+ thread: "FakeThread",
+ displayName,
+ location,
+ generatedLocation: location,
+ source,
+ scope,
+ this: {},
+ index,
+ asyncCause: null,
+ state: "on-stack",
+ type: "call",
+ };
+}
+
+function makeMockFrameWithURL(url) {
+ return makeMockFrame(undefined, makeMockSource(url));
+}
+
+function makeWhyNormal(frameReturnValue = undefined) {
+ if (frameReturnValue) {
+ return { type: "why-normal", frameFinished: { return: frameReturnValue } };
+ }
+ return { type: "why-normal" };
+}
+
+function makeWhyThrow(frameThrowValue) {
+ return { type: "why-throw", frameFinished: { throw: frameThrowValue } };
+}
+
+function makeMockExpression(value) {
+ return {
+ input: "input",
+ value,
+ from: "from",
+ updating: false,
+ };
+}
+
+// Mock contexts for use in tests that do not create a redux store.
+const mockcx = { navigateCounter: 0 };
+const mockthreadcx = {
+ navigateCounter: 0,
+ thread: "FakeThread",
+ pauseCounter: 0,
+ isPaused: false,
+};
+
+function makeMockThread(fields) {
+ return {
+ actor: "test",
+ url: "example.com",
+ type: "worker",
+ name: "test",
+ ...fields,
+ };
+}
+
+function makeMockState(state) {
+ return {
+ ...initialState(),
+ ...state,
+ };
+}
+
+function formatTree(tree, depth = 0, str = "") {
+ const whitespace = new Array(depth * 2).join(" ");
+
+ if (tree.type === "directory") {
+ str += `${whitespace} - ${tree.name} path=${tree.path} \n`;
+ tree.contents.forEach(t => {
+ str = formatTree(t, depth + 1, str);
+ });
+ } else {
+ str += `${whitespace} - ${tree.name} path=${tree.path} source_id=${tree.contents.id} \n`;
+ }
+
+ return str;
+}
+
+export {
+ makeMockDisplaySource,
+ makeMockSource,
+ makeMockSourceWithContent,
+ makeMockSourceAndContent,
+ makeMockWasmSource,
+ makeMockWasmSourceWithContent,
+ makeMockScope,
+ mockScopeAddVariable,
+ makeMockBreakpoint,
+ makeMockFrame,
+ makeMockFrameWithURL,
+ makeWhyNormal,
+ makeWhyThrow,
+ makeMockExpression,
+ mockcx,
+ mockthreadcx,
+ makeMockState,
+ makeMockThread,
+ makeFullfilledMockSourceContent,
+ formatTree,
+};