astro/packages/webapi/test/basic.js
2022-04-10 18:29:46 -07:00

185 lines
4.2 KiB
JavaScript

import { expect } from 'chai'
import { polyfill } from '../mod.js'
describe('Basic', () => {
before(() => polyfill(globalThis))
it('Globals exist', () => {
const webAPIs = [
'AbortController',
'AbortSignal',
'Blob',
'ByteLengthQueuingStrategy',
'CSSStyleSheet',
'CountQueuingStrategy',
'CustomElementRegistry',
'CustomEvent',
'DOMException',
'Document',
'DocumentFragment',
'Element',
'Event',
'EventTarget',
'File',
'FormData',
'HTMLDocument',
'HTMLElement',
'HTMLDivElement',
'HTMLHeadElement',
'HTMLHtmlElement',
'HTMLImageElement',
'HTMLStyleElement',
'HTMLTemplateElement',
'HTMLUnknownElement',
'Headers',
'IntersectionObserver',
'Image',
'MediaQueryList',
'MutationObserver',
'Node',
'ReadableByteStreamController',
'ReadableStream',
'ReadableStreamBYOBReader',
'ReadableStreamBYOBRequest',
'ReadableStreamDefaultController',
'ReadableStreamDefaultReader',
'Request',
'Response',
'ShadowRoot',
'StyleSheet',
'TransformStream',
'WritableStream',
'WritableStreamDefaultController',
'WritableStreamDefaultWriter',
'Window',
'cancelAnimationFrame',
'cancelIdleCallback',
'clearTimeout',
'fetch',
'requestAnimationFrame',
'requestIdleCallback',
'setTimeout',
]
for (const name of webAPIs) {
expect(globalThis[name]).to.be.a('function')
}
})
it('Constructs an Event', () => {
const e = new Event('test')
expect(e.type).to.equal('test')
})
it('Constructs an EventTarget', () => {
const _t = new EventTarget()
})
it('Dispatches an Event on an EventTarget', () => {
const t = new EventTarget()
let pass = false
t.addEventListener('test', (event) => {
pass = true
})
const e = new Event('test')
t.dispatchEvent(e)
expect(pass).to.equal(true)
})
it('Classes extend as expected', () => {
expect(HTMLElement.prototype).to.be.an.instanceof(Element)
expect(Element.prototype).to.be.an.instanceof(Node)
expect(Node.prototype).to.be.an.instanceof(EventTarget)
})
it('DOM Methods have no effect', () => {
const element = document.createElement('div')
expect(element.innerHTML).to.be.empty
element.innerHTML = 'frozen'
expect(element.innerHTML).to.be.empty
expect(element.textContent).to.be.empty
element.textContent = 'frozen'
expect(element.textContent).to.be.empty
})
it('globalThis.window === globalThis', () => {
expect(globalThis.window).to.equal(globalThis)
})
it('Relative Indexing Method (String#at)', () => {
expect(String.prototype.at).to.be.a('function')
expect(String.prototype.at.length).to.equal(1)
const example = 'The quick brown fox jumps over the lazy dog.'
expect(example.at(2)).to.equal('e')
expect(example.at(-2)).to.equal('g')
})
it('Relative Indexing Method (Array#at)', () => {
expect(Array.prototype.at).to.be.a('function')
expect(Array.prototype.at.length).to.equal(1)
const example = [1, 3, 5, 7, 9]
expect(example.at(1)).to.equal(3)
expect(example.at(-1)).to.equal(9)
})
it('Relative Indexing Method (TypedArray#at)', () => {
expect(Int8Array.prototype.at).to.be.a('function')
expect(Int8Array.prototype.at.length).to.equal(1)
const example = new Int8Array([1, 3, 5, 7, 9])
expect(example.at(1)).to.equal(3)
expect(example.at(-1)).to.equal(9)
})
it('Object.hasOwn', () => {
expect(Object.hasOwn).to.be.a('function')
expect(Object.hasOwn.length).to.equal(2)
const example = {}
expect(Object.hasOwn(example, 'prop')).to.equal(false)
example.prop = 'exists'
expect(Object.hasOwn(example, 'prop')).to.equal(true)
})
it('Promise.any', () => {
expect(Promise.any).to.be.a('function')
expect(Promise.any.length).to.equal(1)
Promise.any([
Promise.resolve(42),
Promise.reject(-1),
Promise.reject(Infinity),
]).then((result) => {
expect(result).to.equal(42)
})
})
it('String#replaceAll', () => {
expect(String.prototype.replaceAll).to.be.a('function')
expect(String.prototype.replaceAll.length).to.equal(2)
const t1 =
'Of all the sorcerers in Harry Potter, Halo is my favorite sorcerer.'
const t2 = t1.replaceAll('sorcerer', 'philosopher')
const t3 =
'Of all the philosophers in Harry Potter, Halo is my favorite philosopher.'
expect(t2).to.equal(t3)
})
})