import { expect } from "vitest";

// 스타일 관련 인변언트(전역 규칙)를 검증하기 위한 공통 테스트 유틸리티.
// - 퍼블릭/익스포트 토큰에서 px 단위 값 사용을 금지하거나,
// - border-width 등 꼭 필요한 px 사용만 예외로 허용할 때 사용한다.
export type StyleObject = Record<string, unknown>;

export function expectNoPxInStyleObject(style: unknown, options?: { allowKeys?: string[] }) {
  if (!style || typeof style !== "object") return;
  const allow = new Set(options?.allowKeys ?? []);

  for (const [key, value] of Object.entries(style as StyleObject)) {
    if (value == null) continue;
    if (allow.has(key)) continue;
    if (typeof value === "object") continue;

    const str = String(value);
    expect(str).not.toContain("px");
  }
}

export function expectNoPxInStyleString(style: string | undefined | null, options?: { allowPatterns?: RegExp[] }) {
  if (!style) return;
  const allowPatterns = options?.allowPatterns ?? [];
  if (allowPatterns.some((re) => re.test(style))) return;

  expect(style).not.toContain("px");
}

export function expectNoPxInStyleParts(parts: string[] | undefined | null, options?: { allowPatterns?: RegExp[] }) {
  if (!parts || parts.length === 0) return;
  const combined = parts.join(";");
  expectNoPxInStyleString(combined, options);
}
