Skip to content

Commit 0341fae

Browse files
author
Tim Berners-Lee
committed
table tests
1 parent 9a97900 commit 0341fae

2 files changed

Lines changed: 161 additions & 6 deletions

File tree

src/table.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ module.exports = function renderTableViewPane (doc, options) {
325325
function SubjectType (type) {
326326
this.type = type
327327
this.columns = null
328-
this.allColumns = null
328+
this.allColumns = []
329329
this.useCount = 0
330330

331331
// Get a list of all columns used by this type.
@@ -656,7 +656,8 @@ module.exports = function renderTableViewPane (doc, options) {
656656
return column
657657
}
658658
}
659-
return null
659+
throw new Error(`getColumnForVariable: no column for variable ${variableNT}`)
660+
// return null
660661
}
661662

662663
// Find the column for a given predicate, creating a new column object
@@ -1664,7 +1665,7 @@ module.exports = function renderTableViewPane (doc, options) {
16641665
literalSort(rows, column, options.sortReverse)
16651666
}
16661667

1667-
if (options.onDone) options.onDone()
1668+
if (options.onDone) options.onDone(resultDiv) // return div makes testing easier
16681669
}
16691670
kb.query(query, onResult, undefined, onDone)
16701671
}

test/unit/table.test.ts

Lines changed: 157 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,171 @@ import { silenceDebugMessages } from '../helpers/setup'
22
import { JSDOM } from 'jsdom'
33
import renderTableViewPane from '../../src/table'
44

5+
import store from '../../src/store'
6+
const kb = store
7+
8+
import * as $rdf from 'rdflib'
9+
510
silenceDebugMessages()
611
const window = new JSDOM('<!DOCTYPE html><p>Hello world</p>').window
712
const dom = window.document
813

14+
const tableData = `@prefix : <https://example.com/tests#> .
15+
:Alice :age 21; :name "Alice"; :hobby "Fishing"; :dob 1999-07-04Z .
16+
:Bob :age 18; :name "Bob"; :hobby "Hockey"; :dob 2002-05-12Z .
17+
:Charlie :age 15; :name "Charlie"; :hobby "Gym"; :dob 2005-01-31Z .
18+
`
19+
20+
const tableQuery = ` PREFIX : <https://example.com/tests#>
21+
SELECT ?who, ?name WHERE { ?who :name ?name . }
22+
`
23+
const doc = $rdf.sym('https://example.com/tests')
24+
$rdf.parse(tableData, kb, doc.uri)
25+
// const query = $rdf.SPARQLToQuery(tableQuery) // TypeError: $rdf.SPARQLToQuery is not a function
26+
27+
const query = new $rdf.Query()
28+
const vars = ['person', 'name', 'age', 'hobby']
29+
var v = {} // The RDF variable objects for each variable name
30+
vars.map(function (x) {
31+
query.vars.push((v[x] = $rdf.variable(x)))
32+
})
33+
const EX = new $rdf.Namespace('https://example.com/tests#')
34+
query.pat.add(v.person, EX('name'), v.name)
35+
query.pat.add(v.person, EX('age'), v.age)
36+
query.pat.add(v.person, EX('hobby'), v.hobby)
37+
38+
const tableOptions = { query }
39+
40+
kb.fetcher = null // @@@@@ kludge turn off link following
41+
942
describe('renderTableViewPane', () => {
1043
it('exists', () => {
1144
expect(renderTableViewPane).toBeInstanceOf(Function)
1245
})
13-
/*
1446
it('runs', () => {
1547
const options = { sourceDocument: null, tableClass: null, query: null }
16-
expect(renderTableViewPane(document, options)).toEqual(undefined)
17-
}) */
48+
expect(renderTableViewPane(document, options).innerHTML).toMatch(/.*<table.*/)
49+
})
50+
it('makes the table header', () => {
51+
expect(renderTableViewPane(document, tableOptions).innerHTML).toMatch(/.*<table.*person.*name.*age.*hobby.*/)
52+
})
53+
it('calls onDone', async () => {
54+
var result
55+
const onDone = jest.fn() // mock function
56+
const widget = renderTableViewPane(document, {query, onDone}).innerHTML
57+
await new Promise(resolve => setTimeout(resolve, 1000));
58+
expect(onDone).toHaveBeenCalled()
59+
})
60+
it('includes the data', async () => {
61+
const options = { sourceDocument: null, tableClass: null, query: null }
62+
var result
63+
const widget = renderTableViewPane(document, {query, onDone})
64+
65+
function onDone (ele) {
66+
result = ele.innerHTML
67+
// console.log('***** onDone called! ' + result)
68+
}
69+
70+
await new Promise(resolve => setTimeout(resolve, 3000));
71+
console.log('After delay, widget.innerHTML = ' + widget.innerHTML)
72+
expect(result).toMatch(/.*Alice.*/)
73+
// console.log('@@@ >>>> ' + renderTableViewPane(document, tableOptions).innerHTML + '<<<<<')
74+
// expect(renderTableViewPane(document, tableOptions).innerHTML).toMatch(/.*<table.*person.*name.*age.*hobby.*/)
75+
})
76+
it('includes the data', async () => {
77+
const options = { sourceDocument: null, tableClass: null, query: null }
78+
var result
79+
const widget = renderTableViewPane(document, {query, onDone})
80+
81+
function onDone (ele) {
82+
result = ele.innerHTML
83+
// console.log('***** onDone called! ' + result)
84+
}
85+
86+
await new Promise(resolve => setTimeout(resolve, 3000));
87+
console.log('After delay, widget.innerHTML = ' + widget.innerHTML)
88+
expect(result).toMatch(/.*Alice.*/)
89+
})
90+
it('orders by age', async () => {
91+
const options = { query, onDone, sortBy: '?age', sortReverse: false}
92+
var result
93+
const widget = renderTableViewPane(document, options)
94+
function onDone (ele) {
95+
result = widget.innerHTML
96+
// result = ele.innerHTML
97+
//console.log('***** onDone called! ' + result)
98+
}
99+
await new Promise(resolve => setTimeout(resolve, 3000));
100+
console.log('After delay, widget.innerHTML = ' + widget.innerHTML)
101+
expect(result).toMatch(/.*Charlie.*Bob.*Alice.*/)
102+
})
103+
104+
it('orders by reverse age', async () => {
105+
const options = { query, onDone, sortBy: '?age', sortReverse: true}
106+
var result
107+
const widget = renderTableViewPane(document, options)
108+
function onDone (ele) {
109+
result = ele.innerHTML
110+
console.log('***** onDone called! ' + result)
111+
}
112+
await new Promise(resolve => setTimeout(resolve, 3000));
113+
console.log('After delay, widget.innerHTML = ' + widget.innerHTML)
114+
expect(result).toMatch(/.*Alice.*Bob.*Charlie.*/)
115+
})
116+
117+
it('orders by name', async () => {
118+
const options = { query, onDone, sortBy: '?name', sortReverse: false}
119+
var result
120+
const widget = renderTableViewPane(document, options)
121+
function onDone (ele) {
122+
result = ele.innerHTML
123+
console.log('***** onDone called! ' + result)
124+
}
125+
await new Promise(resolve => setTimeout(resolve, 3000));
126+
// console.log('After delay, widget.innerHTML = ' + widget.innerHTML)
127+
expect(result).toMatch(/.*Alice.*Bob.*Charlie.*/)
128+
})
129+
130+
it('orders by hobby', async () => {
131+
const options = { query, onDone, sortBy: '?hobby', sortReverse: false}
132+
var result
133+
const widget = renderTableViewPane(document, options)
134+
function onDone (ele) {
135+
result = ele.innerHTML
136+
console.log('***** onDone called! ' + result)
137+
}
138+
await new Promise(resolve => setTimeout(resolve, 3000));
139+
console.log('After delay, widget.innerHTML = ' + widget.innerHTML)
140+
expect(result).toMatch(/.*Alice.*Charlie.*Bob.*/)
141+
})
142+
143+
it('renames columns', async () => {
144+
const options = { query, onDone, hints: {
145+
'?person': {label: 'WHO'},
146+
'?name': {label: 'WHAT'},
147+
'?age': {label: 'WHEN'},
148+
'?hobby': {label: 'WHY'}
149+
}}
150+
var result
151+
const widget = renderTableViewPane(document, options)
152+
function onDone (ele) {
153+
result = ele.innerHTML
154+
console.log('***** onDone called! ' + result)
155+
}
156+
await new Promise(resolve => setTimeout(resolve, 3000));
157+
// console.log('After delay, widget.innerHTML = ' + widget.innerHTML)
158+
expect(result).toMatch(/.*WHO.*WHAT.*WHEN.*WHY.*/)
159+
})
160+
161+
162+
163+
164+
/*
165+
hints: {
166+
'?issue': { linkFunction: exposeThisOverlay, label: 'Title' },
167+
'?created': { cellFormat: 'shortDate' },
168+
'?state': { initialSelection: selectedStates, label: 'Status' }
169+
}
170+
*/
171+
18172
})

0 commit comments

Comments
 (0)