Skip to content

Commit e5b23e9

Browse files
committed
Add scripts/assertions unit tests
1 parent 56a9e34 commit e5b23e9

3 files changed

Lines changed: 104 additions & 0 deletions

File tree

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// @vitest-environment jsdom
2+
import { describe, expect, it } from 'vitest'
3+
import {
4+
isAnchorElement,
5+
isBodyElement,
6+
isButtonElement,
7+
isDivElement,
8+
isFormElement,
9+
isHeaderElement,
10+
isHtmlElement,
11+
isImageElement,
12+
isInputElement,
13+
isLabelElement,
14+
isMetaElement,
15+
isNavElement,
16+
isShadowRoot,
17+
isSlotElement,
18+
isSpanElement,
19+
isType1Element,
20+
isUlElement,
21+
} from '../elements'
22+
23+
describe('element assertions', () => {
24+
const createElement = <K extends keyof HTMLElementTagNameMap>(tagName: K) =>
25+
document.createElement(tagName)
26+
27+
it('identifies basic type 1 elements and rejects non-elements', () => {
28+
const div = createElement('div')
29+
const text = document.createTextNode('text-only')
30+
31+
expect(isType1Element(div)).toBe(true)
32+
expect(isType1Element(text)).toBe(false)
33+
expect(isType1Element(null)).toBe(false)
34+
})
35+
36+
it('matches tag specific guards', () => {
37+
expect(isAnchorElement(createElement('a'))).toBe(true)
38+
expect(isBodyElement(document.body)).toBe(true)
39+
expect(isButtonElement(createElement('button'))).toBe(true)
40+
expect(isDivElement(createElement('div'))).toBe(true)
41+
expect(isFormElement(createElement('form'))).toBe(true)
42+
expect(isHeaderElement(createElement('header'))).toBe(true)
43+
expect(isHtmlElement(document.documentElement)).toBe(true)
44+
expect(isImageElement(createElement('img'))).toBe(true)
45+
expect(isInputElement(createElement('input'))).toBe(true)
46+
expect(isLabelElement(createElement('label'))).toBe(true)
47+
expect(isMetaElement(createElement('meta'))).toBe(true)
48+
expect(isNavElement(createElement('nav'))).toBe(true)
49+
expect(isSlotElement(createElement('slot'))).toBe(true)
50+
expect(isSpanElement(createElement('span'))).toBe(true)
51+
expect(isUlElement(createElement('ul'))).toBe(true)
52+
})
53+
54+
it('rejects mismatched tag names', () => {
55+
const div = createElement('div')
56+
expect(isAnchorElement(div)).toBe(false)
57+
expect(isFormElement(div)).toBe(false)
58+
expect(isInputElement(div)).toBe(false)
59+
})
60+
61+
it('validates open shadow roots only', () => {
62+
const openHost = createElement('div')
63+
const closedHost = createElement('div')
64+
const openRoot = openHost.attachShadow({ mode: 'open' })
65+
const closedRoot = closedHost.attachShadow({ mode: 'closed' })
66+
67+
expect(isShadowRoot(openRoot)).toBe(true)
68+
expect(isShadowRoot(closedRoot)).toBe(false)
69+
expect(isShadowRoot({})).toBe(false)
70+
})
71+
})
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// @vitest-environment jsdom
2+
import { describe, expect, it } from 'vitest'
3+
import { isKeyboardEvent } from '../events'
4+
5+
describe('event assertions', () => {
6+
it('accepts keyboard events', () => {
7+
const event = new KeyboardEvent('keydown', { key: 'Enter' })
8+
expect(isKeyboardEvent(event)).toBe(true)
9+
})
10+
11+
it('rejects non-keyboard events', () => {
12+
const mouseEvent = new MouseEvent('click')
13+
expect(isKeyboardEvent(mouseEvent)).toBe(false)
14+
})
15+
})
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { isString } from '../primitives'
3+
4+
describe('primitive assertions', () => {
5+
it('returns true for primitive strings', () => {
6+
expect(isString('plain')).toBe(true)
7+
})
8+
9+
it('returns true for String objects', () => {
10+
expect(isString(new String('wrapped'))).toBe(true)
11+
})
12+
13+
it('rejects non-string values', () => {
14+
expect(isString(42)).toBe(false)
15+
expect(isString(undefined)).toBe(false)
16+
expect(isString({})).toBe(false)
17+
})
18+
})

0 commit comments

Comments
 (0)