Add a DOM pinned properties dataset generator

Signed-off-by: Victor Porof <victorporof@chromium.org>
Bug: 1325812
Change-Id: I292d49d273d74d33a82e25179478405395159537
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/3695372
Reviewed-by: Mathias Bynens <mathias@chromium.org>
diff --git a/scripts/webidl-properties/tests.js b/scripts/webidl-properties/tests.js
new file mode 100644
index 0000000..7301840
--- /dev/null
+++ b/scripts/webidl-properties/tests.js
@@ -0,0 +1,118 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// eslint-disable-next-line rulesdir/es_modules_import
+import idl from '@webref/idl';
+import * as assert from 'assert';
+
+import {SPECS} from './config.js';
+import {addMetadata, getIDLProps, minimize} from './get-props.js';
+import {getMissingTypes} from './util.js';
+
+describe('DOM pinned properties dataset generation', function() {
+  let output;
+
+  this.beforeEach(async () => {
+    const files = await idl.listAll();
+    const names = Object.keys(SPECS);
+    const specs = await Promise.all(names.map(name => files[name].parse().then(idls => ({name, idls}))));
+    output = addMetadata(getIDLProps(specs));
+  });
+
+  it('doesn\'t have missing types', () => {
+    const missing = getMissingTypes(output);
+    assert.strictEqual(missing.length, 0);
+  });
+
+  it('generates valid data for HTMLElement', () => {
+    const type = output.HTMLElement;
+    assert.strictEqual(type.inheritance, 'Element');
+    assert.deepEqual(type.includes, [
+      'GlobalEventHandlers',
+      'DocumentAndElementEventHandlers',
+      'ElementContentEditable',
+      'HTMLOrSVGElement',
+      'ElementCSSInlineStyle',
+    ]);
+    assert.deepEqual(type.props.title, {
+      global: true,
+      specs: ['html'],
+    });
+    assert.strictEqual(type.states, undefined);
+  });
+
+  it('generates valid data for HTMLInputElement', () => {
+    const type = output.HTMLInputElement;
+    assert.strictEqual(type.inheritance, 'HTMLElement');
+    assert.deepEqual(type.includes, []);
+    assert.deepEqual(type.props.checked, {
+      global: false,
+      specs: ['html'],
+    });
+    assert.deepEqual(type.states['[type=checkbox]'], {
+      checked: {global: false, specs: ['html']},
+      required: {global: false, specs: ['html']},
+      value: {global: false, specs: ['html']},
+    });
+  });
+
+  it('generates valid data for MouseEvent', () => {
+    const type = output.MouseEvent;
+    assert.strictEqual(type.inheritance, 'UIEvent');
+    assert.deepEqual(type.includes, []);
+    assert.deepEqual(type.props.screenX, {
+      global: false,
+      specs: ['uievents'],
+    });
+    assert.strictEqual(type.states, undefined);
+  });
+
+  it('generates valid data for PointerEvent', () => {
+    const type = output.PointerEvent;
+    assert.strictEqual(type.inheritance, 'MouseEvent');
+    assert.deepEqual(type.includes, []);
+    assert.deepEqual(type.props.pressure, {
+      global: false,
+      specs: ['pointerevents'],
+    });
+    assert.strictEqual(type.states, undefined);
+  });
+
+  it('generates an entry for DOMParser', () => {
+    const type = output.DOMParser;
+    assert.strictEqual(type.inheritance, null);
+    assert.deepEqual(type.includes, []);
+    assert.deepEqual(type.props, {});
+    assert.strictEqual(type.states, undefined);
+  });
+
+  it('minimizes the data for HTMLInputElement', () => {
+    const minimized = minimize(output);
+    const type = minimized.HTMLInputElement;
+    assert.strictEqual(type.inheritance, 'HTMLElement');
+    assert.strictEqual(type.includes, undefined);
+    assert.deepEqual(type.props.checked, {});
+    assert.deepEqual(type.states['[type=checkbox]'], {
+      checked: {},
+      required: {},
+      value: {},
+    });
+  });
+
+  it('minimizes the data for PointerEvent', () => {
+    const minimized = minimize(output);
+    const type = minimized.PointerEvent;
+    assert.strictEqual(type.inheritance, 'MouseEvent');
+    assert.strictEqual(type.includes, undefined);
+    assert.deepEqual(type.props.pressure, {
+      specs: 8,
+    });
+    assert.strictEqual(type.states, undefined);
+  });
+
+  it('removes the entry for DOMParser in the minimized output', () => {
+    const minimized = minimize(output);
+    assert.strictEqual(minimized.DOMParser, undefined);
+  });
+});