UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

1 lines 17.3 kB
{"version":3,"file":"ng-zorro-antd-core-testing.mjs","sources":["../../components/core/testing/directionality.ts","../../components/core/testing/event-objects.ts","../../components/core/testing/dispatch-events.ts","../../components/core/testing/mock-ng-zone.ts","../../components/core/testing/type-in-element.ts","../../components/core/testing/zoneless-helpers.ts","../../components/core/testing/public-api.ts","../../components/core/testing/ng-zorro-antd-core-testing.ts"],"sourcesContent":["/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { Directionality } from '@angular/cdk/bidi';\nimport {\n type Type,\n DebugElement,\n EnvironmentProviders,\n makeEnvironmentProviders,\n Provider,\n signal\n} from '@angular/core';\nimport { ComponentFixture, TestBed } from '@angular/core/testing';\nimport { Subject } from 'rxjs';\n\nclass MockDirectionality {\n value = 'ltr';\n change = new Subject();\n valueSignal = signal('ltr');\n}\n\nexport function provideMockDirectionality(): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: Directionality, useClass: MockDirectionality }]);\n}\n\ntype Predicate<T> = (value: T) => boolean;\n\n/**\n * Creates a `describe('RTL', ...)` block that verifies the component correctly toggles\n * an RTL CSS class when `Directionality.valueSignal` changes between 'ltr' and 'rtl'.\n *\n * Must be called at the top level of a spec file (outside any `describe` that has its own\n * `beforeEach` configuring TestBed), because it configures its own TestBed internally.\n *\n * @param componentFn Thunk returning the component class. Using a thunk avoids class hoisting\n * issues — class declarations defined below the call site would be `undefined` at registration time.\n * @param predicate A `By.directive(...)` or `By.css(...)` predicate to locate the element\n * that carries the RTL class. Use `By.css` when the RTL class is on a child element rather\n * than the component host.\n * @param classnamePrefix The class prefix (e.g. `'ant-alert'`). The test asserts the presence\n * of `${classnamePrefix}-rtl`.\n * @param options.detectChangesFn Custom change detection callback for components that need\n * imperative updates beyond `fixture.detectChanges()` (e.g. calling a private method).\n * @param options.providers Additional providers needed by the component (e.g. `provideNzIconsTesting()`).\n */\nexport function testDirectionality<T>(\n componentFn: () => Type<T>,\n predicate: Predicate<DebugElement>,\n classnamePrefix: string,\n options?: {\n detectChangesFn?: (fixture: ComponentFixture<T>) => void;\n providers?: Array<Provider | EnvironmentProviders>;\n }\n): void {\n const rtlClass = `${classnamePrefix}-rtl`;\n describe('RTL', () => {\n let fixture: ComponentFixture<T>;\n let dir: Directionality;\n\n function detectChanges(): void {\n if (options?.detectChangesFn) {\n options.detectChangesFn(fixture);\n } else {\n fixture.detectChanges();\n }\n }\n\n beforeEach(() => {\n TestBed.configureTestingModule({\n providers: [provideMockDirectionality(), ...(options?.providers || [])]\n });\n dir = TestBed.inject(Directionality);\n fixture = TestBed.createComponent(componentFn());\n });\n\n it('should className correct on dir change', async () => {\n detectChanges();\n fixture.autoDetectChanges();\n await fixture.whenStable();\n const debugElement = fixture.debugElement.query(predicate);\n expect(debugElement).toBeTruthy();\n expect(debugElement.nativeElement.classList.contains(rtlClass)).toBe(false);\n\n dir.valueSignal.set('rtl');\n detectChanges();\n await fixture.whenStable();\n expect(debugElement.nativeElement.classList.contains(rtlClass)).toBe(true);\n\n dir.valueSignal.set('ltr');\n detectChanges();\n await fixture.whenStable();\n expect(debugElement.nativeElement.classList.contains(rtlClass)).toBe(false);\n });\n });\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\n/** Creates a browser MouseEvent with the specified options. */\nexport function createMouseEvent(type: string, x: number = 0, y: number = 0, button: number = 0): MouseEvent {\n const event = document.createEvent('MouseEvent');\n\n event.initMouseEvent(\n type,\n true /* canBubble */,\n false /* cancelable */,\n window /* view */,\n 0 /* detail */,\n x /* screenX */,\n y /* screenY */,\n x /* clientX */,\n y /* clientY */,\n false /* ctrlKey */,\n false /* altKey */,\n false /* shiftKey */,\n false /* metaKey */,\n button /* button */,\n null /* relatedTarget */\n );\n\n // `initMouseEvent` doesn't allow us to pass the `buttons` and\n // defaults it to 0 which looks like a fake event.\n Object.defineProperty(event, 'buttons', { get: () => 1 });\n\n return event;\n}\n\n/** Creates a browser TouchEvent with the specified pointer coordinates. */\nexport function createTouchEvent(type: string, pageX: number = 0, pageY: number = 0): UIEvent {\n // In favor of creating events that work for most of the browsers, the event is created\n // as a basic UI Event. The necessary details for the event will be set manually.\n const event = new UIEvent(type, { detail: 0, view: window });\n const touchDetails = { pageX, pageY, clientX: pageX, clientY: pageY };\n\n // Most of the browsers don't have a \"initTouchEvent\" method that can be used to define\n // the touch details.\n Object.defineProperties(event, {\n touches: { value: [touchDetails] },\n targetTouches: { value: [touchDetails] },\n changedTouches: { value: [touchDetails] }\n });\n\n return event;\n}\n\n/** Dispatches a keydown event from an element. */\nexport function createKeyboardEvent(\n type: string,\n keyCode: number,\n target?: Element,\n key?: string,\n ctrlKey?: boolean,\n metaKey?: boolean,\n shiftKey?: boolean\n): KeyboardEvent {\n const event = document.createEvent('KeyboardEvent') as NzSafeAny;\n\n // Firefox does not support `initKeyboardEvent`, but supports `initKeyEvent`.\n if (event.initKeyEvent) {\n event.initKeyEvent(type, true, true, window, 0, 0, 0, 0, 0, keyCode);\n } else {\n event.initKeyboardEvent(type, true, true, window, 0, key, 0, '', false);\n }\n\n // Webkit Browsers don't set the keyCode when calling the init function.\n // See related bug https://bugs.webkit.org/show_bug.cgi?id=16735\n Object.defineProperties(event, {\n keyCode: { get: () => keyCode },\n key: { get: () => key },\n target: { get: () => target },\n ctrlKey: { get: () => ctrlKey },\n metaKey: { get: () => metaKey },\n shiftKey: { get: () => shiftKey }\n });\n\n return event;\n}\n\n/** Creates a fake event object with any desired event type. */\nexport function createFakeEvent(type: string, canBubble: boolean = true, cancelable: boolean = true): Event {\n const event = document.createEvent('Event');\n event.initEvent(type, canBubble, cancelable);\n return event;\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { createFakeEvent, createKeyboardEvent, createMouseEvent, createTouchEvent } from './event-objects';\n\n/** Utility to dispatch any event on a Node. */\nexport function dispatchEvent(node: Node | Window, event: Event): Event {\n node.dispatchEvent(event);\n return event;\n}\n\n/** Shorthand to dispatch a fake event on a specified node. */\nexport function dispatchFakeEvent(node: Node | Window, type: string, canBubble?: boolean): Event {\n return dispatchEvent(node, createFakeEvent(type, canBubble));\n}\n\n/** Shorthand to dispatch a keyboard event with a specified key code. */\nexport function dispatchKeyboardEvent(node: Node, type: string, keyCode: number, target?: Element): KeyboardEvent {\n return dispatchEvent(node, createKeyboardEvent(type, keyCode, target)) as KeyboardEvent;\n}\n\n/** Shorthand to dispatch a mouse event on the specified coordinates. */\nexport function dispatchMouseEvent(\n node: Node,\n type: string,\n x: number = 0,\n y: number = 0,\n event: MouseEvent = createMouseEvent(type, x, y)\n): MouseEvent {\n return dispatchEvent(node, event) as MouseEvent;\n}\n\n/** Shorthand to dispatch a touch event on the specified coordinates. */\nexport function dispatchTouchEvent(node: Node, type: string, x: number = 0, y: number = 0): TouchEvent {\n return dispatchEvent(node, createTouchEvent(type, x, y)) as TouchEvent;\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { EventEmitter, Injectable, NgZone } from '@angular/core';\n\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\n\n/**\n * Mock synchronous NgZone implementation that can be used\n * to flush out `onStable` subscriptions in tests.\n *\n * via: https://github.com/angular/angular/blob/master/packages/core/testing/src/ng_zone_mock.ts\n *\n * @docs-private\n */\n@Injectable()\nexport class MockNgZone extends NgZone {\n override onStable = new EventEmitter<NzSafeAny>(false);\n\n constructor() {\n super({ enableLongStackTrace: false });\n }\n\n override run(fn: () => NzSafeAny): NzSafeAny {\n return fn();\n }\n\n override runOutsideAngular(fn: () => NzSafeAny): NzSafeAny {\n return fn();\n }\n\n simulateZoneExit(): void {\n this.onStable.emit(null);\n }\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { dispatchFakeEvent } from './dispatch-events';\n\n/**\n * Focuses an input, sets its value and dispatches\n * the `input` event, simulating the user typing.\n *\n * @param value Value to be set on the input.\n * @param element Element onto which to set the value.\n */\nexport function typeInElement(value: string, element: HTMLInputElement | HTMLTextAreaElement): void {\n element.focus();\n element.value = value;\n dispatchFakeEvent(element, 'input');\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport type { ComponentFixture } from '@angular/core/testing';\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport function nextAnimationFrame(): Promise<void> {\n return sleep(16);\n}\n\nexport async function updateNonSignalsInput<T>(fixture: ComponentFixture<T>, ms?: number): Promise<void> {\n fixture.changeDetectorRef.markForCheck();\n if (typeof ms === 'number') {\n await sleep(ms);\n }\n await fixture.whenStable();\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nexport * from './directionality';\nexport * from './dispatch-events';\nexport * from './event-objects';\nexport * from './mock-ng-zone';\nexport * from './type-in-element';\nexport * from './zoneless-helpers';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}