import { assert, describe, it } from "@effect/vitest"; import * as Effect from "effect/Effect"; import { beforeEach, vi } from "vite-plus/test"; const { onMock, removeListenerMock, themeState } = vi.hoisted(() => ({ onMock: vi.fn(), removeListenerMock: vi.fn(), themeState: { shouldUseDarkColors: true, themeSource: "system", }, })); vi.mock("electron", () => ({ nativeTheme: { get shouldUseDarkColors() { return themeState.shouldUseDarkColors; }, set themeSource(value: string) { themeState.themeSource = value; }, on: onMock, removeListener: removeListenerMock, }, })); import * as ElectronTheme from "./ElectronTheme.ts"; describe("ElectronTheme", () => { beforeEach(() => { onMock.mockClear(); removeListenerMock.mockClear(); themeState.shouldUseDarkColors = true; themeState.themeSource = "system"; }); it.effect("scopes native theme update listeners", () => Effect.gen(function* () { const listener = vi.fn(); yield* Effect.scoped( Effect.gen(function* () { const electronTheme = yield* ElectronTheme.ElectronTheme; yield* electronTheme.onUpdated(listener); }), ); assert.deepEqual(onMock.mock.calls, [["updated", listener]]); assert.deepEqual(removeListenerMock.mock.calls, [["updated", listener]]); }).pipe(Effect.provide(ElectronTheme.layer)), ); });