1import { afterEach, describe, expect, it, vi } from "vitest";
2import { Appearance } from "react-native";
5 disposeAppearanceSubscriptionImpl,
9} from "../src/Yoga/React/Native/Appearance.js";
11const originalAddChangeListener = Appearance.addChangeListener;
15 if (originalAddChangeListener === undefined) {
16 delete Appearance.addChangeListener;
18 Appearance.addChangeListener = originalAddChangeListener;
22describe("Appearance FFI", () => {
24 { nativeScheme: "light", expected: "light" },
25 { nativeScheme: "dark", expected: "dark" },
26 { nativeScheme: null, expected: null },
27 { nativeScheme: "sepia", expected: "sepia" },
28 { nativeScheme: { unexpected: true }, expected: null },
30 "normalizes native getter scheme $nativeScheme to $expected",
31 ({ nativeScheme, expected }) => {
32 vi.spyOn(Appearance, "getColorScheme").mockReturnValue(nativeScheme);
34 expect(getColorSchemeImpl()).toBe(expected);
38 it("passes primitive and null schemes through the uncurried setter bridge", () => {
39 const setColorScheme = vi.spyOn(Appearance, "setColorScheme");
41 setColorSchemeImpl("dark");
42 setColorSchemeImpl(null);
44 expect(setColorScheme.mock.calls).toEqual([["dark"], [null]]);
47 it("returns the hook's primitive scheme without an Effect thunk", () => {
48 expect(useColorSchemeImpl()).toBe("light");
51 it("delivers each native event once, preserves strings, and normalizes malformed values", () => {
53 Appearance.addChangeListener = vi.fn((listener) => {
54 nativeListener = listener;
55 return { remove: vi.fn() };
57 const callback = vi.fn();
59 addChangeListenerImpl(callback);
60 nativeListener({ colorScheme: "dark" });
61 nativeListener({ colorScheme: "sepia" });
62 nativeListener({ colorScheme: { unexpected: true } });
64 expect(callback.mock.calls).toEqual([["dark"], ["sepia"], [null]]);
67 it("removes the same native subscription only once when disposed twice", () => {
68 const remove = vi.fn();
69 Appearance.addChangeListener = vi.fn(() => ({ remove }));
70 const subscription = addChangeListenerImpl(vi.fn());
72 disposeAppearanceSubscriptionImpl(subscription);
73 disposeAppearanceSubscriptionImpl(subscription);
75 expect(remove).toHaveBeenCalledTimes(1);
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list