import React from "react"; import { StyleFunctionContainer } from "../src/types"; import { borderColorProperties, borderProperties, } from "../src/style-properties"; import { getKeys, getNestedObject } from "../utils/type-helpers"; import { baseTheme } from "../src/base/index"; import { Dimensions, Text } from "react-native"; import { backgroundColorStyleFunction, borderStyleFunction, colorStyleFunction, layoutStyleFunction, opacityStyleFunction, positionStyleFunction, shadowStyleFunction, spacingStyleFunction, textShadowStyleFunction, typographyStyleFunction, } from "../src/style-functions"; import { render } from "@testing-library/react-native"; jest.useFakeTimers(); type ColorTransformTestComponentProps = { props: object; stylePropertyName: string; styleFunction: StyleFunctionContainer; }; const ColorTransformTestComponent: React.FC< ColorTransformTestComponentProps > = ({ props, stylePropertyName, styleFunction }) => { let value; try { value = styleFunction.func(props, { theme: baseTheme, dimensions: Dimensions.get("window"), }); } catch (e) { value = (e as any).message; } if (typeof value === "object") { return {value[stylePropertyName]}; } return {value}; }; describe("createStyleFunctions", () => { it("maps backgroundColor prop correctly", () => { const { getByText } = render( ); const targetBackgroundColor = baseTheme["palette"].white as string; expect(getByText(targetBackgroundColor)).toBeTruthy(); }); it("maps bg prop correctly", () => { const { getByText } = render( ); const targetBackgroundColor = baseTheme["palette"].white as string; expect(getByText(targetBackgroundColor)).toBeTruthy(); }); it("maps color prop correctly", () => { const { getByText } = render( ); const targetColor = baseTheme["palette"].white as string; expect(getByText(targetColor)).toBeTruthy(); }); it("maps oapcity prop correctly", () => { const props = { opacity: 0 }; const opacityStyle = opacityStyleFunction.func(props, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(opacityStyle.opacity).toBe(0); }); it("maps typography props correctly", () => { const props = { fontSize: "s" }; const fontSizeStyle = typographyStyleFunction[ typographyStyleFunction.length - 2 ].func(props, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(fontSizeStyle.fontSize).toBe(14); const props2 = { lineHeight: "s" }; const lineHeightStyle = typographyStyleFunction[ typographyStyleFunction.length - 1 ].func(props2, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(lineHeightStyle.lineHeight).toBe(18); const props3 = { fontFamily: "body" }; const fontFamilyStyle = typographyStyleFunction[ typographyStyleFunction.length - 4 ].func(props3, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(fontFamilyStyle.fontFamily).toBe("Poppins"); const props4 = { fontWeight: "hairline" }; const fontWeightStyle = typographyStyleFunction[ typographyStyleFunction.length - 3 ].func(props4, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(fontWeightStyle.fontWeight).toBe("100"); const props5 = { letterSpacing: "xs" }; const letterSpacingStyle = typographyStyleFunction[ typographyStyleFunction.length - 5 ].func(props5, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(letterSpacingStyle.letterSpacing).toBe(-2); }); it("maps layout props correctly", () => { const props = { width: 2 }; const widthStyle = layoutStyleFunction[0].func(props, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(widthStyle.width).toBe(2); }); it("maps spacing props correctly", () => { const props1 = { margin: "2" }; const spacingStyle1 = spacingStyleFunction[0].func(props1, { theme: baseTheme, dimensions: Dimensions.get("window"), }); const props2 = { m: "2" }; const spacingStyle2 = spacingStyleFunction[ spacingStyleFunction.length - 18 ].func(props2, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(spacingStyle1.margin).toBe(baseTheme.spacing[2]); expect(spacingStyle2.margin).toBe(baseTheme.spacing[2]); }); it("maps position props correctly", () => { const props = { zIndex: "docked" }; const zIndexStyle = positionStyleFunction[ positionStyleFunction.length - 1 ].func(props, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(zIndexStyle.zIndex).toBe(baseTheme.zIndices.docked); }); it("maps border props correctly", () => { const { getByText } = render( ); const targetBorderColor = baseTheme["palette"].black as string; expect(getByText(targetBorderColor)).toBeTruthy(); const borderRadiusProps = { borderRadius: "s" }; const borderRadiusStyle = borderStyleFunction[ getKeys(borderProperties).length + getKeys(borderColorProperties).length ].func(borderRadiusProps, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(borderRadiusStyle.borderRadius).toBe(baseTheme.borderRadii.s); }); it("maps shadow props correctly", () => { const props = { boxShadow: "s" }; const shadowStyle = shadowStyleFunction[ shadowStyleFunction.length - 2 ].func(props, { theme: baseTheme, dimensions: Dimensions.get("window"), }); expect(shadowStyle).toBe(baseTheme.elevation.s); const { getByText } = render( ); const targetShadowColor = getNestedObject(baseTheme, [ "palette", "neutral", "600", ]) as string; expect(getByText(targetShadowColor)).toBeTruthy(); }); it("maps textShadow props correctly", () => { const { getByText } = render( ); const targetTextShadowColor = baseTheme["palette"].black as string; expect(getByText(targetTextShadowColor)).toBeTruthy(); }); });