You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@annotator.apache.org by ge...@apache.org on 2020/05/25 18:03:27 UTC

[incubator-annotator] 03/08: Move test cases into own file

This is an automated email from the ASF dual-hosted git repository.

gerben pushed a commit to branch dom-tests
in repository https://gitbox.apache.org/repos/asf/incubator-annotator.git

commit d4d560226248f686c56c87c1bf407015d2e1c190
Author: Gerben <ge...@treora.com>
AuthorDate: Mon May 25 13:30:21 2020 +0200

    Move test cases into own file
---
 packages/dom/test/text-quote-match-cases.ts | 269 ++++++++++++++++++++++++++
 packages/dom/test/text-quote-match.ts       | 288 +---------------------------
 packages/dom/test/utils.ts                  |  18 ++
 3 files changed, 291 insertions(+), 284 deletions(-)

diff --git a/packages/dom/test/text-quote-match-cases.ts b/packages/dom/test/text-quote-match-cases.ts
new file mode 100644
index 0000000..33d66de
--- /dev/null
+++ b/packages/dom/test/text-quote-match-cases.ts
@@ -0,0 +1,269 @@
+import { TextQuoteSelector } from "../../selector/src";
+import { RangeInfo } from "./utils";
+
+const testCases: {
+  [name: string]: {
+    html: string,
+    selector: TextQuoteSelector,
+    expected: RangeInfo[],
+  }
+} = {
+  'simple': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'dolor am',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 12,
+        endContainerXPath: '//b/text()',
+        endOffset: 20,
+      },
+    ],
+  },
+  'first characters': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'lorem ipsum',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 0,
+        endContainerXPath: '//b/text()',
+        endOffset: 11,
+      },
+    ],
+  },
+  'last characters': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'yada yada',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 23,
+        endContainerXPath: '//b/text()',
+        endOffset: 32,
+      },
+    ],
+  },
+  'across elements': {
+    html: '<b>lorem <i>ipsum</i> dolor <u>amet</u> yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'dolor am',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()[2]',
+        startOffset: 1,
+        endContainerXPath: '//u/text()',
+        endOffset: 2,
+      },
+    ],
+  },
+  'exact element contents': {
+    html: '<b>lorem <i>ipsum dolor</i> amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'ipsum dolor',
+    },
+    expected: [
+      {
+        startContainerXPath: '//i/text()',
+        startOffset: 0,
+        endContainerXPath: '//b/text()[2]',
+        endOffset: 0,
+      },
+    ],
+  },
+  'text inside <head>': {
+    html: '<head><title>The title</title></head><b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'title',
+    },
+    expected: [
+      {
+        startContainerXPath: '//title/text()',
+        startOffset: 4,
+        endContainerXPath: '//b/text()[1]',
+        endOffset: 0,
+      },
+    ],
+  },
+  'two matches': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'yada',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 23,
+        endContainerXPath: '//b/text()',
+        endOffset: 27,
+      },
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 28,
+        endContainerXPath: '//b/text()',
+        endOffset: 32,
+      },
+    ],
+  },
+  'overlapping matches': {
+    html: '<b>bananas</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'ana',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 1,
+        endContainerXPath: '//b/text()',
+        endOffset: 4,
+      },
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 3,
+        endContainerXPath: '//b/text()',
+        endOffset: 6,
+      },
+    ],
+  },
+  'no matches': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'holy grail',
+    },
+    expected: [],
+  },
+  'with prefix': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'yada',
+      prefix: 't ',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 23,
+        endContainerXPath: '//b/text()',
+        endOffset: 27,
+      },
+    ],
+  },
+  'with suffix': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'o',
+      suffix: 'l',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 13,
+        endContainerXPath: '//b/text()',
+        endOffset: 14,
+      },
+    ],
+  },
+  'with prefix and suffix': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'o',
+      prefix: 'l',
+      suffix: 're',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 1,
+        endContainerXPath: '//b/text()',
+        endOffset: 2,
+      },
+    ],
+  },
+  'with prefix and suffix, two matches': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'o',
+      prefix: 'l',
+      suffix: 'r',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 1,
+        endContainerXPath: '//b/text()',
+        endOffset: 2,
+      },
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 15,
+        endContainerXPath: '//b/text()',
+        endOffset: 16,
+      },
+    ],
+  },
+  'with prefix, no matches': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'dolor',
+      prefix: 'oopsum ',
+    },
+    expected: [],
+  },
+  'with suffix, no matches': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'dolor',
+      suffix: ' amot',
+    },
+    expected: [],
+  },
+  'with suffix, no matches due to whitespace': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'dolor',
+      suffix: 'a',
+    },
+    expected: [],
+  },
+  'with empty prefix and suffix': {
+    html: '<b>lorem ipsum dolor amet yada yada</b>',
+    selector: {
+      type: 'TextQuoteSelector',
+      exact: 'dolor am',
+      prefix: '',
+      suffix: '',
+    },
+    expected: [
+      {
+        startContainerXPath: '//b/text()',
+        startOffset: 12,
+        endContainerXPath: '//b/text()',
+        endOffset: 20,
+      },
+    ],
+  },
+};
+
+export default testCases;
diff --git a/packages/dom/test/text-quote-match.ts b/packages/dom/test/text-quote-match.ts
index 77f8bd4..1144bc3 100644
--- a/packages/dom/test/text-quote-match.ts
+++ b/packages/dom/test/text-quote-match.ts
@@ -20,284 +20,13 @@
 
 import { assert } from 'chai';
 import { createTextQuoteSelectorMatcher } from '../src/text-quote/match';
-import { TextQuoteSelector } from '../../selector/src';
+import { TextQuoteSelector } from '../../selector/src/types';
 import { DomScope } from '../src/types';
+import testCases from './text-quote-match-cases';
+import { evaluateXPath, RangeInfo } from './utils';
 
 const domParser = new window.DOMParser();
 
-// RangeInfo serialises a Range’s start and end containers as XPaths.
-type RangeInfo = {
-  startContainerXPath: string,
-  startOffset: number,
-  endContainerXPath: string,
-  endOffset: number,
-};
-
-const testCases: {
-  [name: string]: {
-    html: string,
-    selector: TextQuoteSelector,
-    expected: RangeInfo[],
-  }
-} = {
-  'simple': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'dolor am',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 12,
-        endContainerXPath: '//b/text()',
-        endOffset: 20,
-      },
-    ]
-  },
-  'first characters': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'lorem ipsum',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 0,
-        endContainerXPath: '//b/text()',
-        endOffset: 11,
-      },
-    ]
-  },
-  'last characters': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'yada yada',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 23,
-        endContainerXPath: '//b/text()',
-        endOffset: 32,
-      },
-    ]
-  },
-  'across elements': {
-    html: '<b>lorem <i>ipsum</i> dolor <u>amet</u> yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'dolor am',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()[2]',
-        startOffset: 1,
-        endContainerXPath: '//u/text()',
-        endOffset: 2,
-      },
-    ]
-  },
-  'exact element contents': {
-    html: '<b>lorem <i>ipsum dolor</i> amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'ipsum dolor',
-    },
-    expected: [
-      {
-        startContainerXPath: '//i/text()',
-        startOffset: 0,
-        endContainerXPath: '//b/text()[2]',
-        endOffset: 0,
-      },
-    ]
-  },
-  'text inside <head>': {
-    html: '<head><title>The title</title></head><b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'title',
-    },
-    expected: [
-      {
-        startContainerXPath: '//title/text()',
-        startOffset: 4,
-        endContainerXPath: '//b/text()[1]',
-        endOffset: 0,
-      },
-    ]
-  },
-  'two matches': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'yada',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 23,
-        endContainerXPath: '//b/text()',
-        endOffset: 27,
-      },
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 28,
-        endContainerXPath: '//b/text()',
-        endOffset: 32,
-      },
-    ]
-  },
-  'overlapping matches': {
-    html: '<b>bananas</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'ana',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 1,
-        endContainerXPath: '//b/text()',
-        endOffset: 4,
-      },
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 3,
-        endContainerXPath: '//b/text()',
-        endOffset: 6,
-      },
-    ]
-  },
-  'no matches': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'holy grail',
-    },
-    expected: []
-  },
-  'with prefix': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'yada',
-      prefix: 't ',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 23,
-        endContainerXPath: '//b/text()',
-        endOffset: 27,
-      },
-    ]
-  },
-  'with suffix': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'o',
-      suffix: 'l',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 13,
-        endContainerXPath: '//b/text()',
-        endOffset: 14,
-      },
-    ]
-  },
-  'with prefix and suffix': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'o',
-      prefix: 'l',
-      suffix: 're',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 1,
-        endContainerXPath: '//b/text()',
-        endOffset: 2,
-      },
-    ]
-  },
-  'with prefix and suffix, two matches': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'o',
-      prefix: 'l',
-      suffix: 'r',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 1,
-        endContainerXPath: '//b/text()',
-        endOffset: 2,
-      },
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 15,
-        endContainerXPath: '//b/text()',
-        endOffset: 16,
-      },
-    ]
-  },
-  'with prefix, no matches': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'dolor',
-      prefix: 'oopsum ',
-    },
-    expected: []
-  },
-  'with suffix, no matches': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'dolor',
-      suffix: ' amot',
-    },
-    expected: []
-  },
-  'with suffix, no matches due to whitespace': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'dolor',
-      suffix: 'a',
-    },
-    expected: []
-  },
-  'with empty prefix and suffix': {
-    html: '<b>lorem ipsum dolor amet yada yada</b>',
-    selector: {
-      type: 'TextQuoteSelector',
-      exact: 'dolor am',
-      prefix: '',
-      suffix: '',
-    },
-    expected: [
-      {
-        startContainerXPath: '//b/text()',
-        startOffset: 12,
-        endContainerXPath: '//b/text()',
-        endOffset: 20,
-      },
-    ]
-  },
-};
-
 describe('createTextQuoteSelectorMatcher', () => {
   for (const [name, { html, selector, expected }] of Object.entries(testCases)) {
     it(`works for case: '${name}'`, async () => {
@@ -420,7 +149,7 @@ async function testMatcher(
   doc: Document,
   scope: DomScope,
   selector: TextQuoteSelector,
-  expected: RangeInfo[]
+  expected: RangeInfo[],
 ) {
   const matcher = createTextQuoteSelectorMatcher(selector);
   const matches = [];
@@ -444,15 +173,6 @@ async function testMatcher(
   });
 }
 
-function evaluateXPath(doc: Document, xpath: string): Node {
-  const result = doc.evaluate(xpath, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
-  const nodes = new Array(result.snapshotLength).fill(undefined).map((_, i) => result.snapshotItem(i));
-  assert.equal(nodes.length, 1,
-    `Test suite contains XPath with ${nodes.length} results instead of 1: '${xpath}'`
-  );
-  return nodes[0];
-}
-
 function prettyNodeName(node: Node) {
   switch (node.nodeType) {
     case Node.TEXT_NODE:
diff --git a/packages/dom/test/utils.ts b/packages/dom/test/utils.ts
new file mode 100644
index 0000000..7aaa9c9
--- /dev/null
+++ b/packages/dom/test/utils.ts
@@ -0,0 +1,18 @@
+import { assert } from "chai";
+
+// RangeInfo serialises a Range’s start and end containers as XPaths.
+export type RangeInfo = {
+  startContainerXPath: string,
+  startOffset: number,
+  endContainerXPath: string,
+  endOffset: number,
+};
+
+export function evaluateXPath(doc: Document, xpath: string): Node {
+  const result = doc.evaluate(xpath, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE);
+  const nodes = new Array(result.snapshotLength).fill(undefined).map((_, i) => result.snapshotItem(i));
+  assert.equal(nodes.length, 1,
+    `Test suite contains XPath with ${nodes.length} results instead of 1: '${xpath}'`
+  );
+  return nodes[0];
+}