/* 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 . */
// @flow
/**
* 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 type {
ActorId,
Breakpoint,
DisplaySource,
Expression,
Frame,
FrameId,
Scope,
Source,
SourceId,
SourceWithContentAndType,
SourceWithContent,
TextSourceContent,
URL,
WasmSourceContent,
Why,
Thread,
} from "../types";
import * as asyncValue from "./async-value";
import { initialState } from "../reducers/index";
import type { SourceBase } from "../reducers/sources";
import type { State } from "../reducers/types";
import type { FulfilledValue } from "./async-value";
function makeMockSource(url: URL = "url", id: SourceId = "source"): SourceBase {
return {
id,
url,
isBlackBoxed: false,
isPrettyPrinted: false,
relativeUrl: url,
isWasm: false,
extensionName: null,
isExtension: false,
isOriginal: id.includes("originalSource"),
};
}
function makeMockDisplaySource(
url: URL = "url",
id: SourceId = "source"
): DisplaySource {
return {
...makeMockSource(url, id),
displayURL: url,
};
}
function makeMockSourceWithContent(
url?: string,
id?: SourceId,
contentType?: string = "text/javascript",
text?: string = ""
): SourceWithContent {
const source = makeMockSource(url, id);
return {
...source,
content: text
? asyncValue.fulfilled({
type: "text",
value: text,
contentType,
})
: null,
};
}
function makeMockSourceAndContent(
url?: string,
id?: SourceId,
contentType?: string = "text/javascript",
text: string = ""
): { ...SourceBase, content: TextSourceContent } {
const source = makeMockSource(url, id);
return {
...source,
content: {
type: "text",
value: text,
contentType,
},
};
}
function makeFullfilledMockSourceContent(
text: string = "",
contentType?: string = "text/javascript"
): FulfilledValue {
return asyncValue.fulfilled({
type: "text",
value: text,
contentType,
});
}
function makeMockWasmSource(): SourceBase {
return {
id: "wasm-source-id",
url: "url",
isBlackBoxed: false,
isPrettyPrinted: false,
relativeUrl: "url",
isWasm: true,
extensionName: null,
isExtension: false,
isOriginal: false,
};
}
function makeMockWasmSourceWithContent(text: {|
binary: Object,
|}): SourceWithContentAndType {
const source = makeMockWasmSource();
return {
...source,
content: asyncValue.fulfilled({
type: "wasm",
value: text,
}),
};
}
function makeMockScope(
actor: ActorId = "scope-actor",
type: string = "block",
parent: ?Scope = null
): Scope {
return {
actor,
parent,
bindings: {
arguments: [],
variables: {},
},
object: null,
function: null,
type,
scopeKind: "",
};
}
function mockScopeAddVariable(scope: Scope, name: string) {
if (!scope.bindings) {
throw new Error("no scope bindings");
}
scope.bindings.variables[name] = { value: null };
}
function makeMockBreakpoint(
source: Source = makeMockSource(),
line: number = 1,
column: ?number
): Breakpoint {
const location = column
? { sourceId: source.id, line, column }
: { sourceId: source.id, line };
return {
id: "breakpoint",
location,
astLocation: null,
generatedLocation: location,
disabled: false,
text: "text",
originalText: "text",
options: {},
};
}
function makeMockFrame(
id: FrameId = "frame",
source: Source = makeMockSource("url"),
scope: Scope = makeMockScope(),
line: number = 4,
displayName: string = `display-${id}`,
index: number = 0
): Frame {
const location = { sourceId: source.id, line };
return {
id,
thread: "FakeThread",
displayName,
location,
generatedLocation: location,
source,
scope,
this: {},
index,
asyncCause: null,
state: "on-stack",
type: "call",
};
}
function makeMockFrameWithURL(url: URL): Frame {
return makeMockFrame(undefined, makeMockSource(url));
}
function makeWhyNormal(frameReturnValue: any = undefined): Why {
if (frameReturnValue) {
return { type: "why-normal", frameFinished: { return: frameReturnValue } };
}
return { type: "why-normal" };
}
function makeWhyThrow(frameThrowValue: any): Why {
return { type: "why-throw", frameFinished: { throw: frameThrowValue } };
}
function makeMockExpression(value: Object): Expression {
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: $Shape) {
return {
actor: "test",
url: "example.com",
type: "worker",
name: "test",
...fields,
};
}
function makeMockState(state: $Shape) {
return {
...initialState(),
...state,
};
}
export {
makeMockDisplaySource,
makeMockSource,
makeMockSourceWithContent,
makeMockSourceAndContent,
makeMockWasmSource,
makeMockWasmSourceWithContent,
makeMockScope,
mockScopeAddVariable,
makeMockBreakpoint,
makeMockFrame,
makeMockFrameWithURL,
makeWhyNormal,
makeWhyThrow,
makeMockExpression,
mockcx,
mockthreadcx,
makeMockState,
makeMockThread,
makeFullfilledMockSourceContent,
};