From 75c8e54840f6754b98f85ed96ec9d79ded674347 Mon Sep 17 00:00:00 2001 From: Scott Bell Date: Fri, 20 Oct 2023 13:19:02 +0200 Subject: [PATCH 1/4] bump index on update row in place --- .../collections/TableRowCollection.js | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/plugins/telemetryTable/collections/TableRowCollection.js b/src/plugins/telemetryTable/collections/TableRowCollection.js index a803bb1f1e3..55732167dfa 100644 --- a/src/plugins/telemetryTable/collections/TableRowCollection.js +++ b/src/plugins/telemetryTable/collections/TableRowCollection.js @@ -153,40 +153,41 @@ define(['lodash', 'EventEmitter'], function (_, EventEmitter) { }); } - mergeSortedRows(rows) { + mergeSortedRows(incomingRows) { const mergedRows = []; - let i = 0; - let j = 0; + let existingRowIndex = 0; + let incomingRowIndex = 0; - while (i < this.rows.length && j < rows.length) { - const existingRow = this.rows[i]; - const incomingRow = rows[j]; + while (existingRowIndex < this.rows.length && incomingRowIndex < incomingRows.length) { + const existingRow = this.rows[existingRowIndex]; + const incomingRow = incomingRows[incomingRowIndex]; - const index = this.getInPlaceUpdateIndex(incomingRow); - if (index > -1) { - this.updateRowInPlace(incomingRow, index); + const inPlaceIndex = this.getInPlaceUpdateIndex(incomingRow); + if (inPlaceIndex > -1) { + this.updateRowInPlace(incomingRow, inPlaceIndex); + incomingRowIndex++; } else { if (this.firstRowInSortOrder(existingRow, incomingRow) === existingRow) { mergedRows.push(existingRow); - i++; + existingRowIndex++; } else { mergedRows.push(incomingRow); - j++; + incomingRowIndex++; } } } // tail of existing rows is all that is left to merge - if (i < this.rows.length) { - for (i; i < this.rows.length; i++) { - mergedRows.push(this.rows[i]); + if (existingRowIndex < this.rows.length) { + for (existingRowIndex; existingRowIndex < this.rows.length; existingRowIndex++) { + mergedRows.push(this.rows[existingRowIndex]); } } // tail of incoming rows is all that is left to merge - if (j < rows.length) { - for (j; j < rows.length; j++) { - mergedRows.push(rows[j]); + if (incomingRowIndex < incomingRows.length) { + for (incomingRowIndex; incomingRowIndex < incomingRows.length; incomingRowIndex++) { + mergedRows.push(incomingRows[incomingRowIndex]); } } From 01d85a9a3c7f1f119524ea706a47653cb2605bed Mon Sep 17 00:00:00 2001 From: Scott Bell Date: Fri, 20 Oct 2023 15:36:28 +0200 Subject: [PATCH 2/4] add test --- src/plugins/telemetryTable/pluginSpec.js | 77 ++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/src/plugins/telemetryTable/pluginSpec.js b/src/plugins/telemetryTable/pluginSpec.js index eb15767e0b1..f32c9ea766b 100644 --- a/src/plugins/telemetryTable/pluginSpec.js +++ b/src/plugins/telemetryTable/pluginSpec.js @@ -49,7 +49,7 @@ describe('the plugin', () => { let tablePlugin; let element; let child; - let historicalProvider; + let historicalTelemetryProvider; let originalRouterPath; let unlistenConfigMutation; @@ -61,12 +61,12 @@ describe('the plugin', () => { tablePlugin = new TablePlugin(); openmct.install(tablePlugin); - historicalProvider = { + historicalTelemetryProvider = { request: () => { return Promise.resolve([]); } }; - spyOn(openmct.telemetry, 'findRequestProvider').and.returnValue(historicalProvider); + spyOn(openmct.telemetry, 'findRequestProvider').and.returnValue(historicalTelemetryProvider); element = document.createElement('div'); child = document.createElement('div'); @@ -137,11 +137,12 @@ describe('the plugin', () => { let tableView; let tableInstance; let mockClock; + let telemetryCallback; beforeEach(async () => { openmct.time.timeSystem('utc', { start: 0, - end: 4 + end: 10 }); mockClock = jasmine.createSpyObj('clock', ['on', 'off', 'currentValue']); @@ -151,7 +152,7 @@ describe('the plugin', () => { openmct.time.addClock(mockClock); openmct.time.clock('mockClock', { start: 0, - end: 4 + end: 10 }); testTelemetryObject = { @@ -214,7 +215,21 @@ describe('the plugin', () => { } ]; - historicalProvider.request = () => Promise.resolve(testTelemetry); + historicalTelemetryProvider.request = () => { + return Promise.resolve(testTelemetry); + }; + + const realtimeTelemetryProvider = { + supportsSubscribe: () => true, + subscribe: (domainObject, passedCallback) => { + telemetryCallback = passedCallback; + return Promise.resolve(() => {}); + } + }; + + spyOn(openmct.telemetry, 'findSubscriptionProvider').and.returnValue( + realtimeTelemetryProvider + ); openmct.router.path = [testTelemetryObject]; @@ -256,6 +271,56 @@ describe('the plugin', () => { expect(rows.length).toBe(3); }); + it('Adds a row when updating with new telemetry', async () => { + let rows = element.querySelectorAll('table.c-telemetry-table__body tr'); + await nextTick(); + expect(rows.length).toBe(3); + // fire some telemetry + const newTelemetry = { + utc: 6, + 'some-key': 'some-value 6', + 'some-other-key': 'some-other-value 6' + }; + + // Create a spy on the addRows function. + spyOn(tableInstance.tableRows, 'addRows').and.callThrough(); + + telemetryCallback(newTelemetry); + + await nextTick(); + + await new Promise((resolve) => { + // Wait for rows to render + const checkInterval = setInterval(() => { + const foundRows = element.querySelectorAll('table.c-telemetry-table__body tr'); + if (foundRows.length === 4) { + clearInterval(checkInterval); + resolve(); + } + }, 100); + }); + + rows = element.querySelectorAll('table.c-telemetry-table__body tr'); + expect(rows.length).toBe(4); + }); + + it('Adds a row in place when updating with existing telemetry', async () => { + let rows = element.querySelectorAll('table.c-telemetry-table__body tr'); + await nextTick(); + expect(rows.length).toBe(3); + // fire some telemetry + const newTelemetry = { + utc: 2, + 'some-key': 'some-value 2', + 'some-other-key': 'duuuude' + }; + spyOn(tableInstance.tableRows, 'getInPlaceUpdateIndex').and.returnValue(1); + spyOn(tableInstance.tableRows, 'updateRowInPlace').and.callThrough(); + telemetryCallback(newTelemetry); + + expect(tableInstance.tableRows.updateRowInPlace.calls.count()).toBeGreaterThan(0); + }); + it('Renders a column for every item in telemetry metadata', () => { let headers = element.querySelectorAll('span.c-telemetry-table__headers__label'); expect(headers.length).toBe(4); From d1d5edc719e785ceac37ce258ca6418b0b8314b2 Mon Sep 17 00:00:00 2001 From: Scott Bell Date: Fri, 20 Oct 2023 15:36:45 +0200 Subject: [PATCH 3/4] Removing problematic test --- src/plugins/telemetryTable/pluginSpec.js | 33 ------------------------ 1 file changed, 33 deletions(-) diff --git a/src/plugins/telemetryTable/pluginSpec.js b/src/plugins/telemetryTable/pluginSpec.js index f32c9ea766b..7d23cfa1d53 100644 --- a/src/plugins/telemetryTable/pluginSpec.js +++ b/src/plugins/telemetryTable/pluginSpec.js @@ -271,39 +271,6 @@ describe('the plugin', () => { expect(rows.length).toBe(3); }); - it('Adds a row when updating with new telemetry', async () => { - let rows = element.querySelectorAll('table.c-telemetry-table__body tr'); - await nextTick(); - expect(rows.length).toBe(3); - // fire some telemetry - const newTelemetry = { - utc: 6, - 'some-key': 'some-value 6', - 'some-other-key': 'some-other-value 6' - }; - - // Create a spy on the addRows function. - spyOn(tableInstance.tableRows, 'addRows').and.callThrough(); - - telemetryCallback(newTelemetry); - - await nextTick(); - - await new Promise((resolve) => { - // Wait for rows to render - const checkInterval = setInterval(() => { - const foundRows = element.querySelectorAll('table.c-telemetry-table__body tr'); - if (foundRows.length === 4) { - clearInterval(checkInterval); - resolve(); - } - }, 100); - }); - - rows = element.querySelectorAll('table.c-telemetry-table__body tr'); - expect(rows.length).toBe(4); - }); - it('Adds a row in place when updating with existing telemetry', async () => { let rows = element.querySelectorAll('table.c-telemetry-table__body tr'); await nextTick(); From a214ca0b2e78bc4b26e7fe5c37497eca0ad369c2 Mon Sep 17 00:00:00 2001 From: Scott Bell Date: Fri, 20 Oct 2023 15:41:23 +0200 Subject: [PATCH 4/4] spelling --- src/plugins/telemetryTable/pluginSpec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/telemetryTable/pluginSpec.js b/src/plugins/telemetryTable/pluginSpec.js index 7d23cfa1d53..7a11825868c 100644 --- a/src/plugins/telemetryTable/pluginSpec.js +++ b/src/plugins/telemetryTable/pluginSpec.js @@ -279,7 +279,7 @@ describe('the plugin', () => { const newTelemetry = { utc: 2, 'some-key': 'some-value 2', - 'some-other-key': 'duuuude' + 'some-other-key': 'spacecraft' }; spyOn(tableInstance.tableRows, 'getInPlaceUpdateIndex').and.returnValue(1); spyOn(tableInstance.tableRows, 'updateRowInPlace').and.callThrough();