100 lines
4.7 KiB
TypeScript
100 lines
4.7 KiB
TypeScript
import { afterEach, describe, expect, it } from "vitest";
|
|
|
|
function loadModule(modulePath: string) {
|
|
const resolved = require.resolve(modulePath);
|
|
delete require.cache[resolved];
|
|
return require(modulePath);
|
|
}
|
|
|
|
function mockWxPlatform(platform: string) {
|
|
(
|
|
global as typeof globalThis & {
|
|
wx?: { getAppBaseInfo: () => { platform: string } };
|
|
}
|
|
).wx = {
|
|
getAppBaseInfo() {
|
|
return { platform };
|
|
}
|
|
};
|
|
}
|
|
|
|
function decodeSvgDataUri(uri: string) {
|
|
const prefix = "data:image/svg+xml;base64,";
|
|
if (!uri.startsWith(prefix)) {
|
|
throw new Error(`unexpected uri: ${uri.slice(0, 32)}`);
|
|
}
|
|
return Buffer.from(uri.slice(prefix.length), "base64").toString("utf8");
|
|
}
|
|
|
|
describe("miniprogram icon runtime policy", () => {
|
|
afterEach(() => {
|
|
delete (global as typeof globalThis & { wx?: unknown }).wx;
|
|
});
|
|
|
|
it("在 devtools 中也会生成带主题色的按钮图标", () => {
|
|
mockWxPlatform("devtools");
|
|
const { buildAccentButtonIconMap, buildActiveButtonIconMap, buildButtonIconMap, resolveButtonIcon } =
|
|
loadModule("./themedIcons.js");
|
|
const { buildTerminalToolActiveIconMap, buildTerminalToolIconMap } = loadModule("./terminalIcons.js");
|
|
|
|
const buttonIcons = buildButtonIconMap({ uiBtnColor: "#ABCDEF" });
|
|
const activeButtonIcons = buildActiveButtonIconMap({ uiTextColor: "#102030" });
|
|
const accentButtonIcons = buildAccentButtonIconMap({ uiAccentColor: "#3366FF" });
|
|
const terminalIcons = buildTerminalToolIconMap({
|
|
shellAccentColor: "#123456",
|
|
uiAccentColor: "#3366FF"
|
|
});
|
|
const terminalActiveIcons = buildTerminalToolActiveIconMap({
|
|
uiBgColor: "#FFFFFF",
|
|
uiAccentColor: "#AABBCC",
|
|
shellTextColor: "#102030"
|
|
});
|
|
|
|
expect(buttonIcons.about).toMatch(/^data:image\/svg\+xml;base64,/);
|
|
expect(resolveButtonIcon("/assets/icons/about.svg", buttonIcons)).toBe(buttonIcons.about);
|
|
expect(resolveButtonIcon("/assets/icons/add.svg", buttonIcons)).toBe(buttonIcons.add);
|
|
expect(resolveButtonIcon("/assets/icons/right.svg", buttonIcons)).toBe(buttonIcons.right);
|
|
expect(resolveButtonIcon("/assets/icons/share.svg", buttonIcons)).toBe("/assets/icons/share.svg");
|
|
expect(resolveButtonIcon("/assets/icons/shell.svg", buttonIcons)).toBe(buttonIcons.shell);
|
|
expect(decodeSvgDataUri(buttonIcons.about)).toContain('fill="#ABCDEF"');
|
|
expect(decodeSvgDataUri(buttonIcons.add)).toContain('fill="#ABCDEF"');
|
|
expect(decodeSvgDataUri(buttonIcons.right)).toContain('fill="#ABCDEF"');
|
|
expect(decodeSvgDataUri(buttonIcons.shell)).toContain('fill="#ABCDEF"');
|
|
expect(decodeSvgDataUri(activeButtonIcons.connect)).toContain('fill="#102030"');
|
|
expect(decodeSvgDataUri(accentButtonIcons.codex)).toContain('fill="#3366FF"');
|
|
expect(decodeSvgDataUri(accentButtonIcons.clear)).toContain('fill="#3366FF"');
|
|
expect(terminalIcons.keyboard).toMatch(/^data:image\/svg\+xml;base64,/);
|
|
expect(decodeSvgDataUri(terminalIcons.keyboard)).toContain('fill="#123456"');
|
|
expect(decodeSvgDataUri(terminalIcons.enter)).toContain('stroke="#123456"');
|
|
expect(decodeSvgDataUri(terminalIcons.home)).toContain('fill="#123456"');
|
|
expect(decodeSvgDataUri(terminalIcons.reading)).toContain('fill="#123456"');
|
|
expect(decodeSvgDataUri(terminalIcons.ctrlc)).toContain('fill="#123456"');
|
|
expect(decodeSvgDataUri(terminalIcons.ctrlc)).toContain('fill="#3366FF"');
|
|
expect(decodeSvgDataUri(terminalActiveIcons.keyboard)).toContain('fill="#102030"');
|
|
expect(decodeSvgDataUri(terminalIcons.stopreading)).toContain('fill="#123456"');
|
|
expect(decodeSvgDataUri(terminalActiveIcons.reading)).toContain('fill="#102030"');
|
|
expect(decodeSvgDataUri(terminalActiveIcons.ctrlc)).toContain('fill="#102030"');
|
|
expect(decodeSvgDataUri(terminalActiveIcons.ctrlc)).toContain('fill="#AABBCC"');
|
|
});
|
|
|
|
it("在非 devtools 运行环境中同样使用主题化 svg", () => {
|
|
mockWxPlatform("ios");
|
|
const { buildButtonIconMap } = loadModule("./themedIcons.js");
|
|
const { buildTerminalToolActiveIconMap, buildTerminalToolIconMap } = loadModule("./terminalIcons.js");
|
|
|
|
const buttonIcons = buildButtonIconMap({ uiBtnColor: "#445566" });
|
|
const terminalIcons = buildTerminalToolIconMap({ shellAccentColor: "#778899" });
|
|
const terminalActiveIcons = buildTerminalToolActiveIconMap({
|
|
uiBgColor: "#FFFFFF",
|
|
uiAccentColor: "#FEFEFE",
|
|
shellTextColor: "#224466"
|
|
});
|
|
|
|
expect(decodeSvgDataUri(buttonIcons.cancel)).toContain('fill="#445566"');
|
|
expect(decodeSvgDataUri(terminalIcons.voice)).toContain('fill="#778899"');
|
|
expect(decodeSvgDataUri(terminalIcons.home)).toContain('fill="#778899"');
|
|
expect(decodeSvgDataUri(terminalIcons.reading)).toContain('fill="#778899"');
|
|
expect(decodeSvgDataUri(terminalActiveIcons.reading)).toContain('fill="#224466"');
|
|
});
|
|
});
|