Skip to content

Commit 086c7cc

Browse files
authored
[WIP] add nested column headers tests (#125)
* refactor multiIndexCol function to allow for nested levels, update relevant tests * Add arrayUtils test suite * more array util tests * add nested column view tests
1 parent 0c9cf6d commit 086c7cc

File tree

4 files changed

+154
-6
lines changed

4 files changed

+154
-6
lines changed

src/tests/arrayUtils.test.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { DataGenerator } from './testUtils';
2+
import { ViewBasedJSONModel } from '../core/viewbasedjsonmodel';
3+
import { ArrayUtils } from '../utils';
4+
5+
describe('Test multi index array utilities', () => {
6+
const testData = DataGenerator.multiIndexCol({
7+
data: [
8+
{ name: "('year', '')", type: 'number', data: [2013, 2013, 2014, 2014] },
9+
{ name: "('visit', '')", type: 'number', data: [1, 2, 1, 2] },
10+
{ name: "('Bob', 'HR')", type: 'number', data: [41.0, 28.0, 42.0, 37.0] },
11+
{ name: "('Bob', 'Temp')", type: 'number', data: [37.1, 35.2, 37.3, 39.2] },
12+
{ name: "('Guido', 'HR')", type: 'number', data: [50.0, 35.0, 42.0, 31.0] },
13+
{ name: "('Guido', 'Temp')", type: 'number', data: [37.7, 37.1, 37.4, 35.1] },
14+
{ name: "('Sue', 'HR')", type: 'number', data: [23.0, 48.0, 44.0, 34.0] },
15+
{ name: "('Sue', 'Temp')", type: 'number', data: [37.5, 37.1, 37.5, 39.0] },
16+
{ name: "('ipydguuid', '')", type: 'number', data: [0, 1, 2, 3] },
17+
],
18+
length: 4,
19+
primaryKeyData: ["('year', '')", "('visit', '')", "('ipydguuid', '')"]
20+
},
21+
"('ipydguuid', '')"
22+
)
23+
24+
// Creating a model
25+
const testModel = new ViewBasedJSONModel(testData)
26+
// Generating an array with location of nested level headers
27+
const mutltiIndexArrayLocations = ArrayUtils.generateMultiIndexArrayLocations(testModel);
28+
29+
test("Test .generateMultiIndexArrayLocations()", async () => {
30+
expect(mutltiIndexArrayLocations).toEqual([2, 3, 4, 5, 6, 7]);
31+
})
32+
33+
// Generating an array with location of nested level headers
34+
const nestedColumnDataGridIndices = ArrayUtils.generateDataGridMergedCellLocations(testModel,
35+
mutltiIndexArrayLocations);
36+
37+
test("Test .mergedCellLocations()", async () => {
38+
expect(nestedColumnDataGridIndices)
39+
.toEqual([[[[0,0],[0,1]],[[0,2],[0,3]],[[0,4],[0,5]]],[[[1,0]],[[1,1]],[[1,2]],[[1,3]],[[1,4]],[[1,5]]]]);
40+
})
41+
42+
test("Test .validateMergingHierarchy()", async () => {
43+
expect(ArrayUtils.validateMergingHierarchy(nestedColumnDataGridIndices))
44+
.toBe(true);
45+
})
46+
});

src/tests/datagrid.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,8 @@ namespace Private {
317317
],
318318
length: 2,
319319
primaryKeyData: ['index1', 'index2', 'ipydguuid']
320-
}
320+
},
321+
'ipydguuid'
321322
);
322323

323324
const set1: DataGridModel.IData = {
@@ -339,7 +340,8 @@ namespace Private {
339340
],
340341
length: 2,
341342
primaryKeyData: ['index1', 'index2', 'ipydguuid']
342-
}
343+
},
344+
'ipydguuid'
343345
);
344346

345347
const set2: DataGridModel.IData = {

src/tests/testUtils.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,14 @@ export namespace DataGenerator {
7878
*
7979
* @param options - The options for creating a table.
8080
*/
81-
export function multiIndexCol(options: IMultiIndexColOptions): ViewBasedJSONModel.IData {
81+
export function multiIndexCol(options: IMultiIndexColOptions, primaryKeyUuid: string): ViewBasedJSONModel.IData {
8282

8383
const fields = options.data.map(val => {
84-
return { name: val.name, type: val.type, rows:[val.name] }
84+
return {
85+
name: val.name,
86+
type: val.type,
87+
rows: typeof val.name === 'number' ? [val.name] : val.name.replace(/[^\w\s]/gi, '').split(" ")
88+
}
8589
});
8690
const rows = [];
8791

@@ -90,15 +94,15 @@ export namespace DataGenerator {
9094
options.data.forEach(col => {
9195
row[col.name] = col.data[i];
9296
});
93-
row[IPYDG_UUID] = i;
97+
row[primaryKeyUuid] = i;
9498
rows.push(row);
9599
}
96100

97101
return {
98102
'schema': {
99103
'fields': fields,
100104
'primaryKey': options.primaryKeyData,
101-
'primaryKeyUuid': IPYDG_UUID
105+
'primaryKeyUuid': primaryKeyUuid
102106
},
103107
'data': rows
104108
}

src/tests/view.test.ts

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,33 @@ describe('Test .rowCount()', () => {
4040
});
4141
})
4242

43+
describe('Test .rowCount() nestedColumns', () => {
44+
const testData = DataGenerator.multiIndexCol({
45+
data: [
46+
{ name: "('year', '')", type: 'number', data: [2013, 2013, 2014, 2014] },
47+
{ name: "('visit', '')", type: 'number', data: [1, 2, 1, 2] },
48+
{ name: "('Bob', 'HR')", type: 'number', data: [41.0, 28.0, 42.0, 37.0] },
49+
{ name: "('Bob', 'Temp')", type: 'number', data: [37.1, 35.2, 37.3, 39.2] },
50+
{ name: "('Guido', 'HR')", type: 'number', data: [50.0, 35.0, 42.0, 31.0] },
51+
{ name: "('Guido', 'Temp')", type: 'number', data: [37.7, 37.1, 37.4, 35.1] },
52+
{ name: "('Sue', 'HR')", type: 'number', data: [23.0, 48.0, 44.0, 34.0] },
53+
{ name: "('Sue', 'Temp')", type: 'number', data: [37.5, 37.1, 37.5, 39.0] },
54+
{ name: "('ipydguuid', '')", type: 'number', data: [0, 1, 2, 3] },
55+
],
56+
length: 4,
57+
primaryKeyData: ["('year', '')", "('visit', '')", "('ipydguuid', '')"]
58+
},
59+
"('ipydguuid', '')"
60+
)
61+
const testView = new View(testData)
62+
test('cellregion-body', () => {
63+
expect(testView.rowCount('body')).toBe(4)
64+
});
65+
test('cellregion-column-header', () => {
66+
expect(testView.rowCount('column-header')).toBe(2)
67+
});
68+
})
69+
4370
describe('Test .columnCount()', () => {
4471
const testData = DataGenerator.multiCol({
4572
length: 3, data: [
@@ -56,6 +83,33 @@ describe('Test .columnCount()', () => {
5683
});
5784
})
5885

86+
describe('Test .columnCount() nestedColumns', () => {
87+
const testData = DataGenerator.multiIndexCol({
88+
data: [
89+
{ name: "('year', '')", type: 'number', data: [2013, 2013, 2014, 2014] },
90+
{ name: "('visit', '')", type: 'number', data: [1, 2, 1, 2] },
91+
{ name: "('Bob', 'HR')", type: 'number', data: [41.0, 28.0, 42.0, 37.0] },
92+
{ name: "('Bob', 'Temp')", type: 'number', data: [37.1, 35.2, 37.3, 39.2] },
93+
{ name: "('Guido', 'HR')", type: 'number', data: [50.0, 35.0, 42.0, 31.0] },
94+
{ name: "('Guido', 'Temp')", type: 'number', data: [37.7, 37.1, 37.4, 35.1] },
95+
{ name: "('Sue', 'HR')", type: 'number', data: [23.0, 48.0, 44.0, 34.0] },
96+
{ name: "('Sue', 'Temp')", type: 'number', data: [37.5, 37.1, 37.5, 39.0] },
97+
{ name: "('ipydguuid', '')", type: 'number', data: [0, 1, 2, 3] },
98+
],
99+
length: 4,
100+
primaryKeyData: ["('year', '')", "('visit', '')", "('ipydguuid', '')"]
101+
},
102+
"('ipydguuid', '')"
103+
)
104+
const testView = new View(testData)
105+
test('cellregion-body', () => {
106+
expect(testView.columnCount('body')).toBe(6)
107+
});
108+
test('cellregion-row-header', () => {
109+
expect(testView.columnCount('row-header')).toBe(3) // Including primary key uuid
110+
});
111+
})
112+
59113
describe('Test .data()', () => {
60114
const testData = DataGenerator.multiCol({
61115
length: 3, data: [
@@ -81,6 +135,48 @@ describe('Test .data()', () => {
81135
})
82136
});
83137

138+
describe('Test .data() nestedColumns', () => {
139+
const testData = DataGenerator.multiIndexCol({
140+
data: [
141+
{ name: "('year', '')", type: 'number', data: [2013, 2013, 2014, 2014] },
142+
{ name: "('visit', '')", type: 'number', data: [1, 2, 1, 2] },
143+
{ name: "('Bob', 'HR')", type: 'number', data: [41.0, 28.0, 42.0, 37.0] },
144+
{ name: "('Bob', 'Temp')", type: 'number', data: [37.1, 35.2, 37.3, 39.2] },
145+
{ name: "('Guido', 'HR')", type: 'number', data: [50.0, 35.0, 42.0, 31.0] },
146+
{ name: "('Guido', 'Temp')", type: 'number', data: [37.7, 37.1, 37.4, 35.1] },
147+
{ name: "('Sue', 'HR')", type: 'number', data: [23.0, 48.0, 44.0, 34.0] },
148+
{ name: "('Sue', 'Temp')", type: 'number', data: [37.5, 37.1, 37.5, 39.0] },
149+
{ name: "('ipydguuid', '')", type: 'number', data: [0, 1, 2, 3] },
150+
],
151+
length: 4,
152+
primaryKeyData: ["('year', '')", "('visit', '')", "('ipydguuid', '')"]
153+
},
154+
"('ipydguuid', '')"
155+
)
156+
const testView = new View(testData)
157+
const testCases: Private.DataTestCase[] = [
158+
{ region: 'body', row: 0, column: 0, expected: 41.0 },
159+
{ region: 'body', row: 1, column: 3, expected: 37.1 },
160+
{ region: 'body', row: 2, column: 2, expected: 42.0 },
161+
{ region: 'body', row: 3, column: 5, expected: 39.0 },
162+
{ region: 'column-header', row: 0, column: 0, expected: "Bob" },
163+
{ region: 'column-header', row: 0, column: 1, expected: "Bob" },
164+
{ region: 'column-header', row: 1, column: 4, expected: "HR" },
165+
{ region: 'column-header', row: 1, column: 5, expected: "Temp" },
166+
{ region: 'row-header', row: 0, column: 0, expected: 2013 },
167+
{ region: 'row-header', row: 0, column: 1, expected: 1 },
168+
{ region: 'row-header', row: 1, column: 1, expected: 2 },
169+
{ region: 'row-header', row: 3, column: 0, expected: 2014 }
170+
];
171+
testCases.forEach(val => {
172+
test(`cellregion-${val.region}-${val.row},${val.column}`, () => {
173+
expect(testView.data(val.region, val.row, val.column)).toBe(val.expected)
174+
});
175+
})
176+
});
177+
178+
179+
84180
/**
85181
* The namespace for the module implementation details.
86182
*/

0 commit comments

Comments
 (0)