@birhaus/test-utils
Version:
BIRHAUS Testing & Validation Framework - Comprehensive testing utilities for cognitive load, accessibility, and BIRHAUS principle compliance
1 lines • 24.8 kB
Source Map (JSON)
{"version":3,"sources":["../../src/cognitive/MillersLawValidator.ts"],"names":["options"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * BIRHAUS Miller's Law Validator\n * \n * Automated testing utilities to validate Miller's Law (7±2) compliance\n * across all BIRHAUS components and applications.\n * \n * Features:\n * - Navigation item counting and validation\n * - Form field cognitive load analysis\n * - Select option overflow detection\n * - Tab count validation (4-3-1 rule)\n * - Real-time cognitive load monitoring\n */\n\n// import { screen, within } from '@testing-library/react' // Available for future test extensions\n\nexport interface MillersLawViolation {\n type: 'navigation' | 'form' | 'select' | 'tabs' | 'actions'\n element: Element\n count: number\n maxRecommended: number\n severity: 'low' | 'medium' | 'high' | 'critical'\n message: string\n messageEs: string\n birhausPrinciple: number\n suggestions: string[]\n}\n\nexport interface MillersLawTestOptions {\n // Cognitive limits\n maxNavigationItems?: number\n maxFormFields?: number\n maxSelectOptions?: number\n maxTabs?: number\n maxActions?: number\n \n // Test configuration\n strict?: boolean\n includeDisabled?: boolean\n checkHidden?: boolean\n \n // Selectors for custom components\n navigationSelector?: string\n formSelector?: string\n selectSelector?: string\n tabSelector?: string\n actionSelector?: string\n}\n\nexport class MillersLawValidator {\n private options: Required<MillersLawTestOptions>\n \n constructor(options: MillersLawTestOptions = {}) {\n this.options = {\n maxNavigationItems: 7,\n maxFormFields: 7,\n maxSelectOptions: 7,\n maxTabs: 4,\n maxActions: 4,\n strict: false,\n includeDisabled: false,\n checkHidden: false,\n navigationSelector: 'nav, [role=\"navigation\"], [data-birhaus-component=\"navigation\"]',\n formSelector: 'form, [data-birhaus-component=\"form\"]',\n selectSelector: 'select, [data-birhaus-component=\"select\"]',\n tabSelector: '[role=\"tablist\"], [data-birhaus-component=\"tabs\"]',\n actionSelector: 'button, [role=\"button\"], a[href], [data-birhaus-component=\"button\"]',\n ...options\n }\n }\n \n /**\n * Validate all Miller's Law compliance issues in the current DOM\n */\n validateAll(container: HTMLElement = document.body): MillersLawViolation[] {\n const violations: MillersLawViolation[] = []\n \n violations.push(...this.validateNavigation(container))\n violations.push(...this.validateForms(container))\n violations.push(...this.validateSelects(container))\n violations.push(...this.validateTabs(container))\n violations.push(...this.validateActions(container))\n \n return violations\n }\n \n /**\n * Validate navigation items (BIRHAUS Principle #1)\n */\n validateNavigation(container: HTMLElement = document.body): MillersLawViolation[] {\n const violations: MillersLawViolation[] = []\n const navElements = container.querySelectorAll(this.options.navigationSelector)\n \n navElements.forEach(nav => {\n const items = this.getNavigationItems(nav)\n \n if (items.length > this.options.maxNavigationItems) {\n const severity = this.getSeverity(items.length, this.options.maxNavigationItems)\n \n violations.push({\n type: 'navigation',\n element: nav,\n count: items.length,\n maxRecommended: this.options.maxNavigationItems,\n severity,\n message: `Navigation has ${items.length} items (Miller's Law recommends max ${this.options.maxNavigationItems})`,\n messageEs: `Navegación tiene ${items.length} elementos (Ley de Miller recomienda máximo ${this.options.maxNavigationItems})`,\n birhausPrinciple: 1,\n suggestions: [\n 'Group related navigation items into dropdown menus',\n 'Use progressive disclosure to hide secondary navigation',\n 'Consider using breadcrumbs for deep navigation',\n 'Implement search functionality for large menus'\n ]\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate form field counts (BIRHAUS Principle #4)\n */\n validateForms(container: HTMLElement = document.body): MillersLawViolation[] {\n const violations: MillersLawViolation[] = []\n const formElements = container.querySelectorAll(this.options.formSelector)\n \n formElements.forEach(form => {\n const fields = this.getFormFields(form)\n \n if (fields.length > this.options.maxFormFields) {\n const severity = this.getSeverity(fields.length, this.options.maxFormFields)\n \n violations.push({\n type: 'form',\n element: form,\n count: fields.length,\n maxRecommended: this.options.maxFormFields,\n severity,\n message: `Form has ${fields.length} fields (Miller's Law recommends max ${this.options.maxFormFields})`,\n messageEs: `Formulario tiene ${fields.length} campos (Ley de Miller recomienda máximo ${this.options.maxFormFields})`,\n birhausPrinciple: 4,\n suggestions: [\n 'Split form into multiple steps using BirhausForm',\n 'Use progressive disclosure to reveal fields conditionally',\n 'Group related fields into collapsible sections',\n 'Consider using a wizard pattern for complex forms'\n ]\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate select option counts\n */\n validateSelects(container: HTMLElement = document.body): MillersLawViolation[] {\n const violations: MillersLawViolation[] = []\n const selectElements = container.querySelectorAll(this.options.selectSelector)\n \n selectElements.forEach(select => {\n const options = this.getSelectOptions(select)\n \n if (options.length > this.options.maxSelectOptions) {\n const severity = this.getSeverity(options.length, this.options.maxSelectOptions)\n \n violations.push({\n type: 'select',\n element: select,\n count: options.length,\n maxRecommended: this.options.maxSelectOptions,\n severity,\n message: `Select has ${options.length} options (Miller's Law recommends max ${this.options.maxSelectOptions})`,\n messageEs: `Lista desplegable tiene ${options.length} opciones (Ley de Miller recomienda máximo ${this.options.maxSelectOptions})`,\n birhausPrinciple: 1,\n suggestions: [\n 'Use BirhausCombobox with search functionality',\n 'Group options into categories',\n 'Implement progressive filtering',\n 'Consider using autocomplete instead of select'\n ]\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate tab counts (BIRHAUS 4-3-1 Rule)\n */\n validateTabs(container: HTMLElement = document.body): MillersLawViolation[] {\n const violations: MillersLawViolation[] = []\n const tabElements = container.querySelectorAll(this.options.tabSelector)\n \n tabElements.forEach(tabContainer => {\n const tabs = this.getTabs(tabContainer)\n \n if (tabs.length > this.options.maxTabs) {\n const severity = this.getSeverity(tabs.length, this.options.maxTabs)\n \n violations.push({\n type: 'tabs',\n element: tabContainer,\n count: tabs.length,\n maxRecommended: this.options.maxTabs,\n severity,\n message: `Tabs have ${tabs.length} items (BIRHAUS 4-3-1 rule recommends max ${this.options.maxTabs})`,\n messageEs: `Pestañas tienen ${tabs.length} elementos (regla BIRHAUS 4-3-1 recomienda máximo ${this.options.maxTabs})`,\n birhausPrinciple: 1,\n suggestions: [\n 'Use BirhausTabs with overflow dropdown',\n 'Group related tabs into sections',\n 'Consider using accordion instead of tabs',\n 'Implement nested navigation structure'\n ]\n })\n }\n })\n \n return violations\n }\n \n /**\n * Validate action button counts\n */\n validateActions(container: HTMLElement = document.body): MillersLawViolation[] {\n const violations: MillersLawViolation[] = []\n \n // Check each form, dialog, or card for action overload\n const containers = container.querySelectorAll('form, [role=\"dialog\"], [data-birhaus-component=\"card\"], .actions')\n \n containers.forEach(actionContainer => {\n const actions = this.getActions(actionContainer)\n \n if (actions.length > this.options.maxActions) {\n const severity = this.getSeverity(actions.length, this.options.maxActions)\n \n violations.push({\n type: 'actions',\n element: actionContainer,\n count: actions.length,\n maxRecommended: this.options.maxActions,\n severity,\n message: `Container has ${actions.length} actions (BIRHAUS 4-3-1 rule recommends max ${this.options.maxActions})`,\n messageEs: `Contenedor tiene ${actions.length} acciones (regla BIRHAUS 4-3-1 recomienda máximo ${this.options.maxActions})`,\n birhausPrinciple: 3,\n suggestions: [\n 'Combine related actions into dropdown menus',\n 'Use progressive disclosure for secondary actions',\n 'Implement one clear primary action pattern',\n 'Move less important actions to overflow menu'\n ]\n })\n }\n })\n \n return violations\n }\n \n /**\n * Get navigation items from a navigation element\n */\n private getNavigationItems(nav: Element): Element[] {\n const items = nav.querySelectorAll('a, button, [role=\"menuitem\"], [role=\"link\"]')\n return this.filterElements(Array.from(items))\n }\n \n /**\n * Get form fields from a form element\n */\n private getFormFields(form: Element): Element[] {\n const fields = form.querySelectorAll('input, select, textarea, [role=\"textbox\"], [role=\"combobox\"], [role=\"listbox\"]')\n return this.filterElements(Array.from(fields))\n }\n \n /**\n * Get options from a select element\n */\n private getSelectOptions(select: Element): Element[] {\n if (select.tagName.toLowerCase() === 'select') {\n const options = select.querySelectorAll('option')\n return this.filterElements(Array.from(options))\n }\n \n // For custom select components\n const options = select.querySelectorAll('[role=\"option\"], [data-value]')\n return this.filterElements(Array.from(options))\n }\n \n /**\n * Get tabs from a tab container\n */\n private getTabs(tabContainer: Element): Element[] {\n const tabs = tabContainer.querySelectorAll('[role=\"tab\"], [data-birhaus-component=\"tab\"]')\n return this.filterElements(Array.from(tabs))\n }\n \n /**\n * Get action buttons from a container\n */\n private getActions(container: Element): Element[] {\n const actions = container.querySelectorAll(this.options.actionSelector)\n return this.filterElements(Array.from(actions))\n }\n \n /**\n * Filter elements based on options (hidden, disabled, etc.)\n */\n private filterElements(elements: Element[]): Element[] {\n return elements.filter(element => {\n // Skip disabled elements if not included\n if (!this.options.includeDisabled && element.hasAttribute('disabled')) {\n return false\n }\n \n // Skip hidden elements if not included\n if (!this.options.checkHidden) {\n const style = getComputedStyle(element)\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false\n }\n }\n \n return true\n })\n }\n \n /**\n * Calculate severity based on how much the count exceeds the limit\n */\n private getSeverity(count: number, maxRecommended: number): 'low' | 'medium' | 'high' | 'critical' {\n const excess = count - maxRecommended\n const excessPercentage = (excess / maxRecommended) * 100\n \n if (excessPercentage > 100) return 'critical' // More than double\n if (excessPercentage > 50) return 'high' // 50%+ over limit\n if (excessPercentage > 25) return 'medium' // 25-50% over limit\n return 'low' // Up to 25% over limit\n }\n}\n\n/**\n * Test helper functions for common assertions\n */\n\n/**\n * Assert that Miller's Law is followed for navigation\n */\nexport function expectNavigationCompliance(\n container?: HTMLElement,\n maxItems: number = 7\n): void {\n const validator = new MillersLawValidator({ maxNavigationItems: maxItems })\n const violations = validator.validateNavigation(container)\n \n if (violations.length > 0) {\n const violation = violations[0]\n throw new Error(\n `Miller's Law violation: ${violation.message}\\n` +\n `Suggestions: ${violation.suggestions.join(', ')}`\n )\n }\n}\n\n/**\n * Assert that forms follow Miller's Law for field count\n */\nexport function expectFormCompliance(\n container?: HTMLElement,\n maxFields: number = 7\n): void {\n const validator = new MillersLawValidator({ maxFormFields: maxFields })\n const violations = validator.validateForms(container)\n \n if (violations.length > 0) {\n const violation = violations[0]\n throw new Error(\n `Miller's Law violation: ${violation.message}\\n` +\n `Suggestions: ${violation.suggestions.join(', ')}`\n )\n }\n}\n\n/**\n * Assert that the 4-3-1 rule is followed for tabs\n */\nexport function expectTabCompliance(\n container?: HTMLElement,\n maxTabs: number = 4\n): void {\n const validator = new MillersLawValidator({ maxTabs })\n const violations = validator.validateTabs(container)\n \n if (violations.length > 0) {\n const violation = violations[0]\n throw new Error(\n `BIRHAUS 4-3-1 Rule violation: ${violation.message}\\n` +\n `Suggestions: ${violation.suggestions.join(', ')}`\n )\n }\n}\n\n/**\n * Assert overall Miller's Law compliance\n */\nexport function expectMillersLawCompliance(\n container?: HTMLElement,\n options?: MillersLawTestOptions\n): void {\n const validator = new MillersLawValidator(options)\n const violations = validator.validateAll(container)\n \n if (violations.length > 0) {\n const criticalViolations = violations.filter(v => v.severity === 'critical')\n const highViolations = violations.filter(v => v.severity === 'high')\n \n if (criticalViolations.length > 0 || highViolations.length > 0) {\n const errorMessages = [...criticalViolations, ...highViolations]\n .map(v => `${v.type}: ${v.message}`)\n .join('\\n')\n \n throw new Error(\n `Miller's Law violations detected:\\n${errorMessages}\\n\\n` +\n `Total violations: ${violations.length} (${criticalViolations.length} critical, ${highViolations.length} high)`\n )\n }\n }\n}\n\n"]}