mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-04-20 00:04:22 +02:00
CODEBASE: Validate theme, editor theme, and styles (#1789)
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
import { assertAndSanitizeEditorTheme } from "../../../src/JsonSchema/JSONSchemaAssertion";
|
||||
import { JsonSchemaValidator } from "../../../src/JsonSchema/JsonSchemaValidator";
|
||||
import { defaultMonacoTheme } from "../../../src/ScriptEditor/ui/themes";
|
||||
|
||||
const invalidHexColor = "#FFFF";
|
||||
|
||||
function getCloneOfDefaultEditorTheme() {
|
||||
return structuredClone(defaultMonacoTheme) as unknown as Record<string, unknown>;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function does not support objects containing Map, Set, etc. It's till good for our purposes, though.
|
||||
*/
|
||||
function traverseObject(
|
||||
object: Record<string, unknown>,
|
||||
keyPath: string[],
|
||||
callback: (key: string, keyPath: string[]) => void,
|
||||
): void {
|
||||
for (const key of Object.getOwnPropertyNames(object)) {
|
||||
callback(key, keyPath);
|
||||
if (typeof object[key] === "object" && object[key] != null) {
|
||||
traverseObject(object[key] as Record<string, unknown>, [...keyPath, key], callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
describe("Valid", () => {
|
||||
test("Default editor theme", () => {
|
||||
expect(JsonSchemaValidator.EditorTheme(getCloneOfDefaultEditorTheme())).toStrictEqual(true);
|
||||
});
|
||||
test("Partial theme", () => {
|
||||
const theme = {
|
||||
inherit: true,
|
||||
};
|
||||
expect(JsonSchemaValidator.EditorTheme(theme)).toStrictEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Invalid", () => {
|
||||
const theme = getCloneOfDefaultEditorTheme();
|
||||
traverseObject(theme, [], (key, keyPath) => {
|
||||
test(`Invalid [${keyPath}].${key}`, () => {
|
||||
const theme = getCloneOfDefaultEditorTheme();
|
||||
let nestedObject = theme;
|
||||
for (const outerKey of keyPath) {
|
||||
if (typeof nestedObject[outerKey] !== "object" || nestedObject[outerKey] == null) {
|
||||
throw new Error(
|
||||
`Error occurred while traversing default editor theme. outerKey: ${outerKey}. keyPath: ${keyPath}. Theme: ${JSON.stringify(
|
||||
theme,
|
||||
)}`,
|
||||
);
|
||||
}
|
||||
nestedObject = nestedObject[outerKey] as Record<string, unknown>;
|
||||
}
|
||||
nestedObject[key] = invalidHexColor;
|
||||
expect(JsonSchemaValidator.EditorTheme(theme)).toStrictEqual(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("assertAndSanitizeEditorTheme", () => {
|
||||
test("Unknown properties are removed", () => {
|
||||
const theme = {
|
||||
inherit: true,
|
||||
unknownProperty: {},
|
||||
};
|
||||
assertAndSanitizeEditorTheme(theme);
|
||||
expect(theme.unknownProperty).toStrictEqual(undefined);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user