chore: webapi test now use chai (#3048)

This commit is contained in:
Juan Martín Seery 2022-04-10 22:29:46 -03:00 committed by GitHub
parent 47f20a189f
commit 1907255ca2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 510 additions and 785 deletions

View file

@ -54,10 +54,12 @@
"@rollup/plugin-inject": "^4.0.4",
"@rollup/plugin-node-resolve": "^13.1.3",
"@rollup/plugin-typescript": "^8.3.1",
"@types/chai": "^4.3.0",
"@types/mocha": "^9.1.0",
"@types/node": "^14.18.12",
"@ungap/structured-clone": "^0.3.4",
"abort-controller": "^3.0.0",
"chai": "^4.3.6",
"event-target-shim": "^6.0.2",
"fetch-blob": "^3.1.5",
"formdata-polyfill": "^4.0.10",

View file

@ -1,29 +0,0 @@
import { fileURLToPath } from 'url'
export { strict as assert } from 'assert'
export const pathFrom = (...args) =>
fileURLToPath(args.reduce((url, bit) => new URL(bit, url), new URL('file:')))
export const test = async (setup) => {
console.log(`Testing Node ${process.version}:`)
console.log('')
for (const test of setup()) {
try {
console.log(`- ${test.name}`)
await test.test()
} catch (error) {
console.error(error)
process.exit(1)
}
}
console.log('')
console.log('Pass!')
console.log('')
process.exit(0)
}

View file

@ -1,48 +1,29 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Supports Base64 Methods',
test() {
const target = {}
describe('Base64', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal('atob' in target, true)
assert.equal('btoa' in target, true)
assert.equal(typeof target['atob'], 'function')
assert.equal(typeof target['btoa'], 'function')
},
},
{
name: 'Supports atob(data)',
test() {
const target = {}
it('Supports Base64 Methods', () => {
expect(target).to.have.property('atob').that.is.a('function')
expect(target).to.have.property('btoa').that.is.a('function')
})
polyfill(target)
it('Supports atob(data)', () => {
const a = 'SGVsbG8sIHdvcmxk'
const b = target.atob(a)
const a = 'SGVsbG8sIHdvcmxk'
const b = target.atob(a)
expect(a).to.equal('SGVsbG8sIHdvcmxk')
expect(b).to.equal('Hello, world')
})
assert.equal(a, 'SGVsbG8sIHdvcmxk')
assert.equal(b, 'Hello, world')
},
},
{
name: 'Supports btoa(data)',
test() {
const target = {}
it('Supports btoa(data)', () => {
const b = 'Hello, world'
const a = target.btoa(b)
polyfill(target)
const b = 'Hello, world'
const a = target.btoa(b)
assert.equal(a, 'SGVsbG8sIHdvcmxk')
assert.equal(b, 'Hello, world')
},
},
]
expect(a).to.equal('SGVsbG8sIHdvcmxk')
expect(b).to.equal('Hello, world')
})
})

View file

@ -1,214 +1,185 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
polyfill(globalThis)
describe('Basic', () => {
before(() => polyfill(globalThis))
return [
{
name: 'Globals exist',
test() {
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',
]
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) {
assert.equal(typeof globalThis[name], 'function')
}
},
},
{
name: 'Constructs an Event',
test() {
const e = new Event('test')
for (const name of webAPIs) {
expect(globalThis[name]).to.be.a('function')
}
})
assert.equal(e.type, 'test')
},
},
{
name: 'Constructs an EventTarget',
test() {
const t = new EventTarget()
},
},
{
name: 'Dispatches an Event on an EventTarget',
test() {
const t = new EventTarget()
it('Constructs an Event', () => {
const e = new Event('test')
let pass = false
expect(e.type).to.equal('test')
})
t.addEventListener('test', (event) => {
pass = true
})
it('Constructs an EventTarget', () => {
const _t = new EventTarget()
})
const e = new Event('test')
it('Dispatches an Event on an EventTarget', () => {
const t = new EventTarget()
t.dispatchEvent(e)
let pass = false
assert.equal(pass, true)
},
},
{
name: 'Classes extend as expected',
test() {
assert.equal(HTMLElement.prototype instanceof Element, true)
assert.equal(Element.prototype instanceof Node, true)
assert.equal(Node.prototype instanceof EventTarget, true)
},
},
{
name: 'DOM Methods have no effect',
test() {
const element = document.createElement('div')
t.addEventListener('test', (event) => {
pass = true
})
assert.equal(element.innerHTML, '')
element.innerHTML = 'frozen'
assert.equal(element.innerHTML, '')
const e = new Event('test')
assert.equal(element.textContent, '')
element.textContent = 'frozen'
assert.equal(element.textContent, '')
},
},
{
name: 'globalThis.window === globalThis',
test() {
assert.equal(globalThis.window, globalThis)
},
},
{
name: 'Relative Indexing Method (String#at)',
test() {
assert.equal(typeof String.prototype.at, 'function')
assert.equal(String.prototype.at.length, 1)
t.dispatchEvent(e)
const example = 'The quick brown fox jumps over the lazy dog.'
expect(pass).to.equal(true)
})
assert.equal(example.at(2), 'e')
assert.equal(example.at(-2), 'g')
},
},
{
name: 'Relative Indexing Method (Array#at)',
test() {
assert.equal(typeof Array.prototype.at, 'function')
assert.equal(Array.prototype.at.length, 1)
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)
})
const example = [1, 3, 5, 7, 9]
it('DOM Methods have no effect', () => {
const element = document.createElement('div')
assert.equal(example.at(1), 3)
assert.equal(example.at(-1), 9)
},
},
{
name: 'Relative Indexing Method (TypedArray#at)',
test() {
assert.equal(typeof Int8Array.prototype.at, 'function')
assert.equal(Int8Array.prototype.at.length, 1)
expect(element.innerHTML).to.be.empty
element.innerHTML = 'frozen'
expect(element.innerHTML).to.be.empty
const example = new Int8Array([1, 3, 5, 7, 9])
expect(element.textContent).to.be.empty
element.textContent = 'frozen'
expect(element.textContent).to.be.empty
})
assert.equal(example.at(1), 3)
assert.equal(example.at(-1), 9)
},
},
{
name: 'Object.hasOwn',
test() {
assert.equal(typeof Object.hasOwn, 'function')
assert.equal(Object.hasOwn.length, 2)
it('globalThis.window === globalThis', () => {
expect(globalThis.window).to.equal(globalThis)
})
const example = {}
it('Relative Indexing Method (String#at)', () => {
expect(String.prototype.at).to.be.a('function')
expect(String.prototype.at.length).to.equal(1)
assert.equal(Object.hasOwn(example, 'prop'), false)
const example = 'The quick brown fox jumps over the lazy dog.'
example.prop = 'exists'
expect(example.at(2)).to.equal('e')
expect(example.at(-2)).to.equal('g')
})
assert.equal(Object.hasOwn(example, 'prop'), true)
},
},
{
name: 'Promise.any',
test() {
assert.equal(typeof Promise.any, 'function')
assert.equal(Promise.any.length, 1)
it('Relative Indexing Method (Array#at)', () => {
expect(Array.prototype.at).to.be.a('function')
expect(Array.prototype.at.length).to.equal(1)
Promise.any([
Promise.resolve(42),
Promise.reject(-1),
Promise.reject(Infinity),
]).then((result) => {
assert.equal(result, 42)
})
},
},
{
name: 'String#replaceAll',
test() {
assert.equal(typeof String.prototype.replaceAll, 'function')
assert.equal(String.prototype.replaceAll.length, 2)
const example = [1, 3, 5, 7, 9]
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(example.at(1)).to.equal(3)
expect(example.at(-1)).to.equal(9)
})
assert.equal(t2, t3)
},
},
]
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)
})
})

View file

@ -1,65 +1,42 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Includes CharacterData functionality',
test() {
const target = {}
describe('CharacterData', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal(Reflect.has(target, 'CharacterData'), true)
assert.equal(Reflect.has(target, 'Text'), true)
assert.equal(Reflect.has(target, 'Comment'), true)
},
},
{
name: 'Throws new CharacterData',
test() {
const target = {}
it('Includes CharacterData functionality', () => {
expect(target).to.have.property('CharacterData')
expect(target).to.have.property('Text')
expect(target).to.have.property('Comment')
})
polyfill(target)
},
},
{
name: 'Supports new Comment',
test() {
const target = polyfill({})
it('Supports new Comment', () => {
expect(() => {
new target.Comment()
}).not.to.throw()
assert.doesNotThrow(() => {
new target.Comment()
})
expect(new target.Comment().constructor.name).to.equal('Comment')
expect(Object.prototype.toString.call(new target.Comment())).to.equal(
'[object Comment]'
)
assert.equal(new target.Comment().constructor.name, 'Comment')
assert.equal(
Object.prototype.toString.call(new target.Comment()),
'[object Comment]'
)
expect(new target.Comment('hello').data).to.equal('hello')
expect(new target.Comment('hello').textContent).to.equal('hello')
})
assert.equal(new target.Comment('hello').data, 'hello')
assert.equal(new target.Comment('hello').textContent, 'hello')
},
},
{
name: 'Supports new Text',
test() {
const target = polyfill({})
it('Supports new Text', () => {
expect(() => {
new target.Text()
}).not.to.throw()
assert.doesNotThrow(() => {
new target.Text()
})
expect(new target.Text().constructor.name).to.equal('Text')
expect(Object.prototype.toString.call(new target.Text())).to.equals(
'[object Text]'
)
assert.equal(new target.Text().constructor.name, 'Text')
assert.equal(
Object.prototype.toString.call(new target.Text()),
'[object Text]'
)
assert.equal(new target.Text('hello').data, 'hello')
assert.equal(new target.Text('hello').textContent, 'hello')
},
},
]
expect(new target.Text('hello').data).to.equal('hello')
expect(new target.Text('hello').textContent).to.equal('hello')
})
})

View file

@ -1,96 +1,70 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Includes Custom Element functionality',
test() {
const target = {}
describe('Custom Elements', () => {
const target = {}
polyfill(target)
beforeEach(() => polyfill(target))
assert.equal(Reflect.has(target, 'CustomElementRegistry'), true)
assert.equal(Reflect.has(target, 'customElements'), true)
assert.equal(Reflect.has(target, 'HTMLElement'), true)
},
},
{
name: 'Supports Custom Element creation',
test() {
const target = {}
it('Includes Custom Element functionality', () => {
expect(target).to.have.property('CustomElementRegistry')
expect(target).to.have.property('customElements')
expect(target).to.have.property('HTMLElement')
})
polyfill(target)
it('Supports Custom Element creation', () => {
const CustomElement = class HTMLCustomElement extends target.HTMLElement {}
const CustomElement = class HTMLCustomElement extends target.HTMLElement {}
target.customElements.define('custom-element', CustomElement)
target.customElements.define('custom-element', CustomElement)
expect(target.customElements.get('custom-element')).to.equal(CustomElement)
expect(target.customElements.getName(CustomElement)).to.equal(
'custom-element'
)
})
assert.equal(target.customElements.get('custom-element'), CustomElement)
assert.equal(
target.customElements.getName(CustomElement),
'custom-element'
)
},
},
{
name: 'Supports Custom Elements created from Document',
test() {
const target = {}
it('Supports Custom Elements created from Document', () => {
expect(target.document.body.localName).to.equal('body')
expect(target.document.body.tagName).to.equal('BODY')
polyfill(target)
expect(
target.document.createElement('custom-element').constructor.name
).to.equal('HTMLUnknownElement')
assert.equal(target.document.body.localName, 'body')
assert.equal(target.document.body.tagName, 'BODY')
const CustomElement = class HTMLCustomElement extends target.HTMLElement {}
assert.equal(
target.document.createElement('custom-element').constructor.name,
'HTMLUnknownElement'
)
target.customElements.define('custom-element', CustomElement)
const CustomElement = class HTMLCustomElement extends target.HTMLElement {}
expect(
target.document.createElement('custom-element').constructor.name
).to.equal('HTMLCustomElement')
})
target.customElements.define('custom-element', CustomElement)
it('Supports Custom Elements with properties', () => {
const testSymbol = Symbol.for('webapi.test')
assert.equal(
target.document.createElement('custom-element').constructor.name,
'HTMLCustomElement'
)
},
},
{
name: 'Supports Custom Elements with properties',
test() {
const target = {}
const CustomElement = class HTMLCustomElement extends target.HTMLElement {
otherMethod = () => testSymbol
polyfill(target)
method() {
return this.otherMethod()
}
const testSymbol = Symbol.for('webapi.test')
static method() {
return this.otherMethod()
}
const CustomElement = class HTMLCustomElement extends target.HTMLElement {
otherMethod = () => testSymbol
static otherMethod() {
return testSymbol
}
}
method() {
return this.otherMethod()
}
target.customElements.define('custom-element', CustomElement)
static method() {
return this.otherMethod()
}
expect(CustomElement.method()).to.equal(testSymbol)
static otherMethod() {
return testSymbol
}
}
const customElement = new CustomElement()
target.customElements.define('custom-element', CustomElement)
assert.equal(CustomElement.method(), testSymbol)
const customElement = new CustomElement()
assert.equal(customElement.method(), testSymbol)
},
},
]
expect(customElement.method()).to.equal(testSymbol)
})
})

View file

@ -1,142 +1,100 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Fetch functionality',
test() {
const target = {}
describe('Fetch', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal(Reflect.has(target, 'fetch'), true)
assert.equal(typeof target.fetch, 'function')
},
},
{
name: 'Fetch with https',
async test() {
const target = {}
it('Fetch functionality', () => {
expect(target).to.have.property('fetch').that.is.a('function')
})
polyfill(target)
it('Fetch with https', async () => {
const { fetch } = target
const { fetch } = target
const response = await fetch('https://api.openbrewerydb.org/breweries')
const response = await fetch('https://api.openbrewerydb.org/breweries')
expect(response.constructor).to.equal(target.Response)
assert.equal(response.constructor, target.Response)
const json = await response.json()
const json = await response.json()
expect(json).to.be.an('array')
})
assert.equal(Array.isArray(json), true)
},
},
{
name: 'Fetch with file',
async test() {
const target = {}
it('Fetch with file', async () => {
const { fetch } = target
polyfill(target)
const url = new URL('../package.json', import.meta.url)
const { fetch } = target
const response = await fetch(url)
const url = new URL('../package.json', import.meta.url)
expect(response.constructor).to.equal(target.Response)
const response = await fetch(url)
expect(response.status).to.equal(200)
expect(response.statusText).to.be.empty
expect(response.headers.has('date')).to.equal(true)
expect(response.headers.has('content-length')).to.equal(true)
expect(response.headers.has('last-modified')).to.equal(true)
assert.equal(response.constructor, target.Response)
const json = await response.json()
assert.equal(response.status, 200)
assert.equal(response.statusText, '')
assert.equal(response.headers.has('date'), true)
assert.equal(response.headers.has('content-length'), true)
assert.equal(response.headers.has('last-modified'), true)
expect(json.name).to.equal('@astrojs/webapi')
})
const json = await response.json()
it('Fetch with missing file', async () => {
const { fetch } = target
assert.equal(json.name, '@astrojs/webapi')
},
},
{
name: 'Fetch with missing file',
async test() {
const target = {}
const url = new URL('../missing.json', import.meta.url)
polyfill(target)
const response = await fetch(url)
const { fetch } = target
expect(response.constructor).to.equal(target.Response)
const url = new URL('../missing.json', import.meta.url)
expect(response.status).to.equal(404)
expect(response.statusText).to.be.empty
expect(response.headers.has('date')).to.equal(true)
expect(response.headers.has('content-length')).to.equal(false)
expect(response.headers.has('last-modified')).to.equal(false)
})
const response = await fetch(url)
it('Fetch with (file) Request', async () => {
const { Request, fetch } = target
assert.equal(response.constructor, target.Response)
const request = new Request(new URL('../package.json', import.meta.url))
assert.equal(response.status, 404)
assert.equal(response.statusText, '')
assert.equal(response.headers.has('date'), true)
assert.equal(response.headers.has('content-length'), false)
assert.equal(response.headers.has('last-modified'), false)
},
},
{
name: 'Fetch with (file) Request',
async test() {
const target = {}
const response = await fetch(request)
polyfill(target)
expect(response.constructor).to.equal(target.Response)
const { Request, fetch } = target
const json = await response.json()
const request = new Request(new URL('../package.json', import.meta.url))
expect(json.name).to.equal('@astrojs/webapi')
})
const response = await fetch(request)
it('Fetch with relative file', async () => {
const { fetch } = target
assert.equal(response.constructor, target.Response)
const response = await fetch('package.json')
const json = await response.json()
const json = await response.json()
assert.equal(json.name, '@astrojs/webapi')
},
},
{
name: 'Fetch with relative file',
async test() {
const target = {}
expect(json.name).to.equal('@astrojs/webapi')
})
polyfill(target)
it('Fetch with data', async () => {
const { fetch } = target
const { fetch } = target
const jsonURI = `data:application/json,${encodeURIComponent(
JSON.stringify({
name: '@astrojs/webapi',
})
)}`
const response = await fetch('package.json')
const response = await fetch(jsonURI)
const json = await response.json()
const json = await response.json()
assert.equal(json.name, '@astrojs/webapi')
},
},
{
name: 'Fetch with data',
async test() {
const target = {}
polyfill(target)
const { fetch } = target
const jsonURI = `data:application/json,${encodeURIComponent(
JSON.stringify({
name: '@astrojs/webapi',
})
)}`
const response = await fetch(jsonURI)
const json = await response.json()
assert.equal(json.name, '@astrojs/webapi')
},
},
]
expect(json.name).to.equal('@astrojs/webapi')
})
})

View file

@ -1,84 +1,54 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Supports ImageData',
test() {
const target = {}
describe('ImageData', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal('ImageData' in target, true)
assert.equal(typeof target['ImageData'], 'function')
},
},
{
name: 'Supports new (data: Uint8ClampedArray, width: number, height: number): ImageData',
test() {
const target = {}
it('Supports ImageData', () => {
expect(target).to.have.property('ImageData').that.is.a('function')
})
polyfill(target)
it('Supports new (data: Uint8ClampedArray, width: number, height: number): ImageData', () => {
const w = 640
const h = 480
const d = new Uint8ClampedArray(w * h * 4)
const w = 640
const h = 480
const d = new Uint8ClampedArray(w * h * 4)
const id = new target.ImageData(d, w, h)
const id = new target.ImageData(d, w, h)
expect(id.data).to.equal(d)
expect(id.width).to.equal(w)
expect(id.height).to.equal(h)
})
assert.equal(id.data, d)
assert.equal(id.width, w)
assert.equal(id.height, h)
},
},
{
name: 'Supports new (data: Uint8ClampedArray, width: number): ImageData',
test() {
const target = {}
it('Supports new (data: Uint8ClampedArray, width: number): ImageData', () => {
const w = 640
const h = 480
const d = new Uint8ClampedArray(w * h * 4)
polyfill(target)
const id = new target.ImageData(d, w)
const w = 640
const h = 480
const d = new Uint8ClampedArray(w * h * 4)
expect(id.data).to.equal(d)
expect(id.width).to.equal(w)
expect(id.height).to.equal(h)
})
const id = new target.ImageData(d, w)
it('Supports new (width: number, height: number): ImageData', () => {
const w = 640
const h = 480
assert.equal(id.data, d)
assert.equal(id.width, w)
assert.equal(id.height, h)
},
},
{
name: 'Supports new (width: number, height: number): ImageData',
test() {
const target = {}
const id = new target.ImageData(w, h)
polyfill(target)
expect(id.data).to.have.lengthOf(w * h * 4)
expect(id.width).to.equal(w)
expect(id.height).to.equal(h)
})
const w = 640
const h = 480
it('Supports Object.keys(new ImageData(640, 480))', () => {
const keys = Object.keys(new target.ImageData(640, 480))
const id = new target.ImageData(w, h)
assert.equal(id.data.length, w * h * 4)
assert.equal(id.width, w)
assert.equal(id.height, h)
},
},
{
name: 'Supports Object.keys(new ImageData(640, 480))',
test() {
const target = {}
polyfill(target)
const keys = Object.keys(new target.ImageData(640, 480))
assert.equal(keys.length, 1)
assert.equal(keys[0], 'data')
},
},
]
expect(keys).to.have.lengthOf(1)
expect(keys[0]).to.equal('data')
})
})

View file

@ -1,34 +1,26 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Includes polyfill.internals functionality',
test() {
const target = {}
it('Includes polyfill.internals functionality', () => {
const target = {}
polyfill(target, { exclude: 'window document' })
polyfill(target, { exclude: 'window document' })
const pseudo = { ...target }
const pseudo = { ...target }
assert.equal(Reflect.has(pseudo, 'document'), false)
expect(pseudo).to.not.have.property('document')
const CustomElement = class extends pseudo.HTMLElement {}
const CustomElement = class extends pseudo.HTMLElement {}
pseudo.customElements.define('custom-element', CustomElement)
pseudo.customElements.define('custom-element', CustomElement)
polyfill.internals(pseudo, 'Document')
polyfill.internals(pseudo, 'Document')
assert.equal(Reflect.has(pseudo, 'document'), true)
expect(pseudo).to.have.property('document')
assert.equal(
CustomElement.prototype.isPrototypeOf(
pseudo.document.createElement('custom-element')
),
true
)
},
},
]
expect(
CustomElement.prototype.isPrototypeOf(
pseudo.document.createElement('custom-element')
)
).to.equal(true)
})

View file

@ -1,31 +1,20 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Includes MediaQueryList functionality',
test() {
const target = {}
describe('Media', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal(Reflect.has(target, 'MediaQueryList'), true)
assert.equal(Reflect.has(target, 'matchMedia'), true)
},
},
{
name: 'Supports matchMedia creation',
test() {
const target = {}
it('Includes MediaQueryList functionality', () => {
expect(target).to.have.property('MediaQueryList')
expect(target).to.have.property('matchMedia')
})
polyfill(target)
it('Supports matchMedia creation', () => {
const mql = target.matchMedia('(min-width: 640px)')
const mql = target.matchMedia('(min-width: 640px)')
assert.equal(mql.matches, false)
assert.equal(mql.media, '(min-width: 640px)')
},
},
]
expect(mql.matches).to.equal(false)
expect(mql.media).to.equal('(min-width: 640px)')
})
})

View file

@ -1,57 +1,39 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Supports OffscreenCanvas',
test() {
const target = {}
describe('OffscreenCanvas', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal('OffscreenCanvas' in target, true)
assert.equal(typeof target['OffscreenCanvas'], 'function')
},
},
{
name: 'Supports new (width: number, height: number): OffscreenCanvas',
test() {
const target = {}
it('Supports OffscreenCanvas', () => {
expect(target).to.have.property('OffscreenCanvas').that.is.a('function')
})
polyfill(target)
it('Supports new (width: number, height: number): OffscreenCanvas', () => {
const w = 640
const h = 480
const w = 640
const h = 480
const canvas = new target.OffscreenCanvas(w, h)
const canvas = new target.OffscreenCanvas(w, h)
expect(canvas.width).to.equal(w)
expect(canvas.height).to.equal(h)
})
assert.equal(canvas.width, w)
assert.equal(canvas.height, h)
},
},
{
name: 'Supports OffscreenCanvas#getContext',
test() {
const target = {}
it('Supports OffscreenCanvas#getContext', () => {
const w = 640
const h = 480
polyfill(target)
const canvas = new target.OffscreenCanvas(w, h)
const w = 640
const h = 480
const context = canvas.getContext('2d')
const canvas = new target.OffscreenCanvas(w, h)
expect(context.canvas).to.equal(canvas)
const context = canvas.getContext('2d')
const imageData = context.createImageData(w, h)
assert.equal(context.canvas, canvas)
const imageData = context.createImageData(w, h)
assert.equal(imageData.width, w)
assert.equal(imageData.height, h)
assert.equal(imageData.data.length, w * h * 4)
},
},
]
expect(imageData.width).to.equal(w)
expect(imageData.height).to.equal(h)
expect(imageData.data).to.have.lengthOf(w * h * 4)
})
})

View file

@ -1,53 +1,44 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Can exclude HTMLElement+',
test() {
const target = {}
describe('Options', () => {
it('Can exclude HTMLElement+', () => {
const target = {}
polyfill(target, {
exclude: 'HTMLElement+',
})
polyfill(target, {
exclude: 'HTMLElement+',
})
assert.equal(Reflect.has(target, 'Event'), true)
assert.equal(Reflect.has(target, 'EventTarget'), true)
assert.equal(Reflect.has(target, 'Element'), true)
assert.equal(Reflect.has(target, 'HTMLElement'), false)
assert.equal(Reflect.has(target, 'HTMLDivElement'), false)
},
},
{
name: 'Can exclude Event+',
test() {
const target = {}
expect(target).to.have.property('Event')
expect(target).to.have.property('EventTarget')
expect(target).to.have.property('Element')
expect(target).to.not.have.property('HTMLElement')
expect(target).to.not.have.property('HTMLDivElement')
})
polyfill(target, {
exclude: 'Event+',
})
it('Can exclude Event+', () => {
const target = {}
assert.equal(Reflect.has(target, 'Event'), false)
assert.equal(Reflect.has(target, 'EventTarget'), false)
assert.equal(Reflect.has(target, 'Element'), false)
assert.equal(Reflect.has(target, 'HTMLElement'), false)
assert.equal(Reflect.has(target, 'HTMLDivElement'), false)
},
},
{
name: 'Can exclude document',
test() {
const target = {}
polyfill(target, {
exclude: 'Event+',
})
polyfill(target, {
exclude: 'document',
})
expect(target).to.not.have.property('Event')
expect(target).to.not.have.property('EventTarget')
expect(target).to.not.have.property('Element')
expect(target).to.not.have.property('HTMLElement')
expect(target).to.not.have.property('HTMLDivElement')
})
assert.equal(Reflect.has(target, 'Document'), true)
assert.equal(Reflect.has(target, 'HTMLDocument'), true)
assert.equal(Reflect.has(target, 'document'), false)
},
},
]
it('Can exclude document', () => {
const target = {}
polyfill(target, {
exclude: 'document',
})
expect(target).to.have.property('Document')
expect(target).to.have.property('HTMLDocument')
expect(target).to.not.have.property('document')
})
})

View file

@ -1,45 +1,32 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Includes Storage functionality',
test() {
const target = {}
describe('Storage', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal(Reflect.has(target, 'Storage'), true)
assert.equal(Reflect.has(target, 'localStorage'), true)
assert.equal(typeof target.Storage, 'function')
assert.equal(typeof target.localStorage, 'object')
},
},
{
name: 'Supports Storage methods',
test() {
const target = {}
it('Includes Storage functionality', () => {
expect(target).to.have.property('Storage').that.is.a('function')
expect(target).to.have.property('localStorage').that.is.an('object')
})
polyfill(target)
assert.equal(target.localStorage.setItem('hello', 'world'), undefined)
assert.equal(target.localStorage.getItem('hello'), 'world')
assert.equal(target.localStorage.key(0), 'hello')
assert.equal(target.localStorage.key(1), null)
assert.equal(target.localStorage.length, 1)
assert.equal(target.localStorage.setItem('world', 'hello'), undefined)
assert.equal(target.localStorage.key(1), 'world')
assert.equal(target.localStorage.key(2), null)
assert.equal(target.localStorage.length, 2)
assert.equal(target.localStorage.removeItem('hello'), undefined)
assert.equal(target.localStorage.key(0), 'world')
assert.equal(target.localStorage.key(1), null)
assert.equal(target.localStorage.length, 1)
assert.equal(target.localStorage.clear(), undefined)
assert.equal(target.localStorage.key(0), null)
assert.equal(target.localStorage.length, 0)
},
},
]
it('Supports Storage methods', () => {
expect(target.localStorage.setItem('hello', 'world')).to.equal(undefined)
expect(target.localStorage.getItem('hello')).to.equal('world')
expect(target.localStorage.key(0)).to.equal('hello')
expect(target.localStorage.key(1)).to.equal(null)
expect(target.localStorage.length).to.equal(1)
expect(target.localStorage.setItem('world', 'hello')).to.equal(undefined)
expect(target.localStorage.key(1)).to.equal('world')
expect(target.localStorage.key(2)).to.equal(null)
expect(target.localStorage.length).to.equal(2)
expect(target.localStorage.removeItem('hello')).to.equal(undefined)
expect(target.localStorage.key(0)).to.equal('world')
expect(target.localStorage.key(1)).to.equal(null)
expect(target.localStorage.length).to.equal(1)
expect(target.localStorage.clear()).to.equal(undefined)
expect(target.localStorage.key(0)).to.equal(null)
expect(target.localStorage.length).to.equal(0)
})
})

View file

@ -1,40 +1,28 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Includes structuredClone',
test() {
const target = {}
describe('structuredClone', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal(Reflect.has(target, 'structuredClone'), true)
assert.equal(typeof target.structuredClone, 'function')
it('Includes structuredClone', () => {
expect(target).to.have.property('structuredClone').that.is.a('function')
})
it('Supports structuredClone usage', () => {
const obj = {
foo: 'bar',
baz: {
qux: 'quux',
},
},
{
name: 'Supports structuredClone usage',
test() {
const target = {}
}
polyfill(target)
const clone = target.structuredClone(obj)
const obj = {
foo: 'bar',
baz: {
qux: 'quux',
},
}
expect(obj).to.not.equal(clone)
expect(obj.baz).to.not.equal(clone.baz)
const clone = target.structuredClone(obj)
assert.notEqual(obj, clone)
assert.notEqual(obj.baz, clone.baz)
assert.equal(obj.baz.qux, clone.baz.qux)
},
},
]
expect(obj.baz.qux).to.equal(clone.baz.qux)
})
})

View file

@ -1,31 +1,19 @@
import { assert, test } from '../run/test.setup.js'
import { expect } from 'chai'
import { polyfill } from '../mod.js'
test(() => {
return [
{
name: 'Includes URLPattern',
test() {
const target = {}
describe('URLPattern', () => {
const target = {}
polyfill(target)
before(() => polyfill(target))
assert.equal(Reflect.has(target, 'URLPattern'), true)
assert.equal(typeof target.URLPattern, 'function')
},
},
{
name: 'Supports URLPattern usage',
test() {
const target = {}
it('Includes URLPattern', () => {
expect(target).to.have.property('URLPattern').that.is.a('function')
})
polyfill(target)
it('Supports URLPattern usage', () => {
const pattern = new target.URLPattern({ pathname: '/hello/:name' })
const match = pattern.exec('https://example.com/hello/Deno')
const pattern = new target.URLPattern({ pathname: '/hello/:name' })
const match = pattern.exec('https://example.com/hello/Deno')
assert.deepEqual(match.pathname.groups, { name: 'Deno' })
},
},
]
expect(match.pathname.groups).to.deep.equal({ name: 'Deno' })
})
})

View file

@ -1526,10 +1526,12 @@ importers:
'@rollup/plugin-inject': ^4.0.4
'@rollup/plugin-node-resolve': ^13.1.3
'@rollup/plugin-typescript': ^8.3.1
'@types/chai': ^4.3.0
'@types/mocha': ^9.1.0
'@types/node': ^14.18.12
'@ungap/structured-clone': ^0.3.4
abort-controller: ^3.0.0
chai: ^4.3.6
event-target-shim: ^6.0.2
fetch-blob: ^3.1.5
formdata-polyfill: ^4.0.10
@ -1546,10 +1548,12 @@ importers:
'@rollup/plugin-inject': 4.0.4_rollup@2.70.1
'@rollup/plugin-node-resolve': 13.1.3_rollup@2.70.1
'@rollup/plugin-typescript': 8.3.1_8fb0118e9d69f3600cbb8f144f7d456c
'@types/chai': 4.3.0
'@types/mocha': 9.1.0
'@types/node': 14.18.12
'@ungap/structured-clone': 0.3.4
abort-controller: 3.0.0
chai: 4.3.6
event-target-shim: 6.0.2
fetch-blob: 3.1.5
formdata-polyfill: 4.0.10