mirror of
https://github.com/nasa/openmct.git
synced 2025-05-28 21:24:20 +00:00
Merge pull request #451 from nasa/open116
[Time Conductor] Improve test coverage
This commit is contained in:
commit
05a909f66f
@ -22,8 +22,8 @@
|
|||||||
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/
|
||||||
|
|
||||||
define(
|
define(
|
||||||
["../../src/controllers/DateTimePickerController"],
|
["../../src/controllers/DateTimePickerController", "moment"],
|
||||||
function (DateTimePickerController) {
|
function (DateTimePickerController, moment) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
describe("The DateTimePickerController", function () {
|
describe("The DateTimePickerController", function () {
|
||||||
@ -39,6 +39,14 @@ define(
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function fireWatchCollection(expr, value) {
|
||||||
|
mockScope.$watchCollection.calls.forEach(function (call) {
|
||||||
|
if (call.args[0] === expr) {
|
||||||
|
call.args[1](value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
mockScope = jasmine.createSpyObj(
|
mockScope = jasmine.createSpyObj(
|
||||||
"$scope",
|
"$scope",
|
||||||
@ -57,6 +65,131 @@ define(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("updates value in model when values in scope change", function () {
|
||||||
|
mockScope.date = {
|
||||||
|
year: 1998,
|
||||||
|
month: 0,
|
||||||
|
day: 6
|
||||||
|
};
|
||||||
|
mockScope.time = {
|
||||||
|
hours: 12,
|
||||||
|
minutes: 34,
|
||||||
|
seconds: 56
|
||||||
|
};
|
||||||
|
fireWatchCollection("date", mockScope.date);
|
||||||
|
expect(mockScope.ngModel[mockScope.field])
|
||||||
|
.toEqual(moment.utc("1998-01-06 12:34:56").valueOf());
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("once initialized with model state", function () {
|
||||||
|
var testTime = moment.utc("1998-01-06 12:34:56").valueOf();
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
fireWatch("ngModel[field]", testTime);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("exposes date/time values in scope", function () {
|
||||||
|
expect(mockScope.date.year).toEqual(1998);
|
||||||
|
expect(mockScope.date.month).toEqual(0); // Months are zero-indexed
|
||||||
|
expect(mockScope.date.day).toEqual(6);
|
||||||
|
expect(mockScope.time.hours).toEqual(12);
|
||||||
|
expect(mockScope.time.minutes).toEqual(34);
|
||||||
|
expect(mockScope.time.seconds).toEqual(56);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("provides names for time properties", function () {
|
||||||
|
Object.keys(mockScope.time).forEach(function (key) {
|
||||||
|
expect(mockScope.nameFor(key))
|
||||||
|
.toEqual(jasmine.any(String));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("provides options for time properties", function () {
|
||||||
|
Object.keys(mockScope.time).forEach(function (key) {
|
||||||
|
expect(mockScope.optionsFor(key))
|
||||||
|
.toEqual(jasmine.any(Array));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("exposes times to populate calendar as a table", function () {
|
||||||
|
// Verify that data structure is as expected by template
|
||||||
|
expect(mockScope.table).toEqual(jasmine.any(Array));
|
||||||
|
expect(mockScope.table[0]).toEqual(jasmine.any(Array));
|
||||||
|
expect(mockScope.table[0][0]).toEqual({
|
||||||
|
year: jasmine.any(Number),
|
||||||
|
month: jasmine.any(Number),
|
||||||
|
day: jasmine.any(Number),
|
||||||
|
dayOfYear: jasmine.any(Number)
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("contains the current date in its initial table", function () {
|
||||||
|
var matchingCell;
|
||||||
|
// Should be able to find the selected date
|
||||||
|
mockScope.table.forEach(function (row) {
|
||||||
|
row.forEach(function (cell) {
|
||||||
|
if (cell.dayOfYear === 6) {
|
||||||
|
matchingCell = cell;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
expect(matchingCell).toEqual({
|
||||||
|
year: 1998,
|
||||||
|
month: 0,
|
||||||
|
day: 6,
|
||||||
|
dayOfYear: 6
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("allows the displayed month to be advanced", function () {
|
||||||
|
// Around the edges of the displayed calendar we
|
||||||
|
// may be in previous or subsequent month, so
|
||||||
|
// test around the middle.
|
||||||
|
var i, originalMonth = mockScope.table[2][0].month;
|
||||||
|
|
||||||
|
function mod12(month) {
|
||||||
|
return ((month % 12) + 12) % 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i <= 12; i += 1) {
|
||||||
|
mockScope.changeMonth(1);
|
||||||
|
expect(mockScope.table[2][0].month)
|
||||||
|
.toEqual(mod12(originalMonth + i));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 11; i >= -12; i -= 1) {
|
||||||
|
mockScope.changeMonth(-1);
|
||||||
|
expect(mockScope.table[2][0].month)
|
||||||
|
.toEqual(mod12(originalMonth + i));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("allows checking if a cell is in the current month", function () {
|
||||||
|
expect(mockScope.isInCurrentMonth(mockScope.table[2][0]))
|
||||||
|
.toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("allows cells to be selected", function () {
|
||||||
|
mockScope.select(mockScope.table[2][0]);
|
||||||
|
expect(mockScope.isSelected(mockScope.table[2][0]))
|
||||||
|
.toBe(true);
|
||||||
|
mockScope.select(mockScope.table[2][1]);
|
||||||
|
expect(mockScope.isSelected(mockScope.table[2][0]))
|
||||||
|
.toBe(false);
|
||||||
|
expect(mockScope.isSelected(mockScope.table[2][1]))
|
||||||
|
.toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("allows cells to be compared", function () {
|
||||||
|
var table = mockScope.table;
|
||||||
|
expect(mockScope.dateEquals(table[2][0], table[2][1]))
|
||||||
|
.toBe(false);
|
||||||
|
expect(mockScope.dateEquals(table[2][1], table[2][1]))
|
||||||
|
.toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -34,14 +34,14 @@ define(
|
|||||||
mockElement,
|
mockElement,
|
||||||
testAttrs,
|
testAttrs,
|
||||||
mockBody,
|
mockBody,
|
||||||
mockParentEl,
|
mockPlainEl,
|
||||||
testRect,
|
testRect,
|
||||||
mctClickElsewhere;
|
mctClickElsewhere;
|
||||||
|
|
||||||
function testEvent(x, y) {
|
function testEvent(x, y) {
|
||||||
return {
|
return {
|
||||||
pageX: x,
|
clientX: x,
|
||||||
pageY: y,
|
clientY: y,
|
||||||
preventDefault: jasmine.createSpy("preventDefault")
|
preventDefault: jasmine.createSpy("preventDefault")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -55,8 +55,8 @@ define(
|
|||||||
jasmine.createSpyObj("element", JQLITE_METHODS);
|
jasmine.createSpyObj("element", JQLITE_METHODS);
|
||||||
mockBody =
|
mockBody =
|
||||||
jasmine.createSpyObj("body", JQLITE_METHODS);
|
jasmine.createSpyObj("body", JQLITE_METHODS);
|
||||||
mockParentEl =
|
mockPlainEl =
|
||||||
jasmine.createSpyObj("parent", ["getBoundingClientRect"]);
|
jasmine.createSpyObj("htmlElement", ["getBoundingClientRect"]);
|
||||||
|
|
||||||
testAttrs = {
|
testAttrs = {
|
||||||
mctClickElsewhere: "some Angular expression"
|
mctClickElsewhere: "some Angular expression"
|
||||||
@ -67,6 +67,8 @@ define(
|
|||||||
width: 60,
|
width: 60,
|
||||||
height: 75
|
height: 75
|
||||||
};
|
};
|
||||||
|
mockElement[0] = mockPlainEl;
|
||||||
|
mockPlainEl.getBoundingClientRect.andReturn(testRect);
|
||||||
|
|
||||||
mockDocument.find.andReturn(mockBody);
|
mockDocument.find.andReturn(mockBody);
|
||||||
|
|
||||||
@ -78,6 +80,49 @@ define(
|
|||||||
expect(mctClickElsewhere.restrict).toEqual("A");
|
expect(mctClickElsewhere.restrict).toEqual("A");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("detaches listeners when destroyed", function () {
|
||||||
|
expect(mockBody.off).not.toHaveBeenCalled();
|
||||||
|
mockScope.$on.calls.forEach(function (call) {
|
||||||
|
if (call.args[0] === '$destroy') {
|
||||||
|
call.args[1]();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
expect(mockBody.off).toHaveBeenCalled();
|
||||||
|
expect(mockBody.off.mostRecentCall.args)
|
||||||
|
.toEqual(mockBody.on.mostRecentCall.args);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("listens for mousedown on the document's body", function () {
|
||||||
|
expect(mockBody.on)
|
||||||
|
.toHaveBeenCalledWith('mousedown', jasmine.any(Function));
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when a click occurs outside the element's bounds", function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
mockBody.on.mostRecentCall.args[1](testEvent(
|
||||||
|
testRect.left + testRect.width + 10,
|
||||||
|
testRect.top + testRect.height + 10
|
||||||
|
));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("triggers an evaluation of its related Angular expression", function () {
|
||||||
|
expect(mockScope.$eval)
|
||||||
|
.toHaveBeenCalledWith(testAttrs.mctClickElsewhere);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("when a click occurs within the element's bounds", function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
mockBody.on.mostRecentCall.args[1](testEvent(
|
||||||
|
testRect.left + testRect.width / 2,
|
||||||
|
testRect.top + testRect.height / 2
|
||||||
|
));
|
||||||
|
});
|
||||||
|
|
||||||
|
it("triggers no evaluation", function () {
|
||||||
|
expect(mockScope.$eval).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -424,6 +424,58 @@ define(
|
|||||||
expect(controller.selected().style).not.toEqual(oldStyle);
|
expect(controller.selected().style).not.toEqual(oldStyle);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("on display bounds changes", function () {
|
||||||
|
var testBounds;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
testBounds = { start: 123, end: 321 };
|
||||||
|
mockScope.domainObject = mockDomainObject;
|
||||||
|
mockScope.model = testModel;
|
||||||
|
findWatch("domainObject")(mockDomainObject);
|
||||||
|
findWatch("model.modified")(testModel.modified);
|
||||||
|
findWatch("model.composition")(mockScope.model.composition);
|
||||||
|
findOn('telemetry:display:bounds')({}, testBounds);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("issues new requests", function () {
|
||||||
|
expect(mockHandle.request).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("requests only a single point", function () {
|
||||||
|
expect(mockHandle.request.mostRecentCall.args[0].size)
|
||||||
|
.toEqual(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("and after data has been received", function () {
|
||||||
|
var mockSeries,
|
||||||
|
testValue;
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
testValue = 12321;
|
||||||
|
|
||||||
|
mockSeries = jasmine.createSpyObj('series', [
|
||||||
|
'getPointCount',
|
||||||
|
'getDomainValue',
|
||||||
|
'getRangeValue'
|
||||||
|
]);
|
||||||
|
mockSeries.getPointCount.andReturn(1);
|
||||||
|
mockSeries.getRangeValue.andReturn(testValue);
|
||||||
|
|
||||||
|
// Fire the callback associated with the request
|
||||||
|
mockHandle.request.mostRecentCall.args[1](
|
||||||
|
mockHandle.getTelemetryObjects()[0],
|
||||||
|
mockSeries
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("updates displayed values", function () {
|
||||||
|
expect(controller.getElements()[0].value)
|
||||||
|
.toEqual("Formatted " + testValue);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
it("reflects limit status", function () {
|
it("reflects limit status", function () {
|
||||||
var elements;
|
var elements;
|
||||||
|
|
||||||
@ -459,6 +511,7 @@ define(
|
|||||||
expect(elements[1].cssClass).toEqual("alarm-b");
|
expect(elements[1].cssClass).toEqual("alarm-b");
|
||||||
expect(elements[2].cssClass).toEqual("alarm-c");
|
expect(elements[2].cssClass).toEqual("alarm-c");
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -286,6 +286,34 @@ define(
|
|||||||
expect(mockHandle.request.calls.length).toEqual(2);
|
expect(mockHandle.request.calls.length).toEqual(2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it("maintains externally-provided domain axis bounds after data is received", function () {
|
||||||
|
mockSeries.getPointCount.andReturn(3);
|
||||||
|
mockSeries.getRangeValue.andReturn(42);
|
||||||
|
mockSeries.getDomainValue.andCallFake(function (i) {
|
||||||
|
return 2500 + i * 2500;
|
||||||
|
});
|
||||||
|
|
||||||
|
mockScope.$watch.mostRecentCall.args[1](mockDomainObject);
|
||||||
|
fireEvent("telemetry:display:bounds", [
|
||||||
|
{},
|
||||||
|
{start: 0, end: 10000}
|
||||||
|
]);
|
||||||
|
mockHandle.request.mostRecentCall.args[1](
|
||||||
|
mockDomainObject,
|
||||||
|
mockSeries
|
||||||
|
);
|
||||||
|
|
||||||
|
// Pan-zoom state should reflect bounds set externally;
|
||||||
|
// domain axis should not have shrunk to fit data.
|
||||||
|
expect(
|
||||||
|
controller.getSubPlots()[0].panZoomStack.getOrigin()[0]
|
||||||
|
).toEqual(0);
|
||||||
|
expect(
|
||||||
|
controller.getSubPlots()[0].panZoomStack.getDimensions()[0]
|
||||||
|
).toEqual(10000);
|
||||||
|
});
|
||||||
|
|
||||||
it("provides classes for legends based on limit state", function () {
|
it("provides classes for legends based on limit state", function () {
|
||||||
var mockTelemetryObjects = mockHandle.getTelemetryObjects();
|
var mockTelemetryObjects = mockHandle.getTelemetryObjects();
|
||||||
|
|
||||||
|
@ -32,16 +32,14 @@ define(
|
|||||||
var TEST_RANGE_VALUE = "some formatted range value";
|
var TEST_RANGE_VALUE = "some formatted range value";
|
||||||
|
|
||||||
describe("A range column", function () {
|
describe("A range column", function () {
|
||||||
var mockDataSet,
|
var testDatum,
|
||||||
testMetadata,
|
testMetadata,
|
||||||
mockFormatter,
|
mockFormatter,
|
||||||
|
mockDomainObject,
|
||||||
column;
|
column;
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(function () {
|
||||||
mockDataSet = jasmine.createSpyObj(
|
testDatum = { testKey: 123, otherKey: 456 };
|
||||||
"data",
|
|
||||||
[ "getRangeValue" ]
|
|
||||||
);
|
|
||||||
mockFormatter = jasmine.createSpyObj(
|
mockFormatter = jasmine.createSpyObj(
|
||||||
"formatter",
|
"formatter",
|
||||||
[ "formatDomainValue", "formatRangeValue" ]
|
[ "formatDomainValue", "formatRangeValue" ]
|
||||||
@ -50,6 +48,10 @@ define(
|
|||||||
key: "testKey",
|
key: "testKey",
|
||||||
name: "Test Name"
|
name: "Test Name"
|
||||||
};
|
};
|
||||||
|
mockDomainObject = jasmine.createSpyObj(
|
||||||
|
"domainObject",
|
||||||
|
[ "getModel", "getCapability" ]
|
||||||
|
);
|
||||||
mockFormatter.formatRangeValue.andReturn(TEST_RANGE_VALUE);
|
mockFormatter.formatRangeValue.andReturn(TEST_RANGE_VALUE);
|
||||||
|
|
||||||
column = new RangeColumn(testMetadata, mockFormatter);
|
column = new RangeColumn(testMetadata, mockFormatter);
|
||||||
@ -59,20 +61,13 @@ define(
|
|||||||
expect(column.getTitle()).toEqual("Test Name");
|
expect(column.getTitle()).toEqual("Test Name");
|
||||||
});
|
});
|
||||||
|
|
||||||
xit("looks up data from a data set", function () {
|
it("formats range values as numbers", function () {
|
||||||
column.getValue(undefined, mockDataSet, 42);
|
expect(column.getValue(mockDomainObject, testDatum).text)
|
||||||
expect(mockDataSet.getRangeValue)
|
|
||||||
.toHaveBeenCalledWith(42, "testKey");
|
|
||||||
});
|
|
||||||
|
|
||||||
xit("formats range values as numbers", function () {
|
|
||||||
mockDataSet.getRangeValue.andReturn(123.45678);
|
|
||||||
expect(column.getValue(undefined, mockDataSet, 42).text)
|
|
||||||
.toEqual(TEST_RANGE_VALUE);
|
.toEqual(TEST_RANGE_VALUE);
|
||||||
|
|
||||||
// Make sure that service interactions were as expected
|
// Make sure that service interactions were as expected
|
||||||
expect(mockFormatter.formatRangeValue)
|
expect(mockFormatter.formatRangeValue)
|
||||||
.toHaveBeenCalledWith(123.45678);
|
.toHaveBeenCalledWith(testDatum.testKey);
|
||||||
expect(mockFormatter.formatDomainValue)
|
expect(mockFormatter.formatDomainValue)
|
||||||
.not.toHaveBeenCalled();
|
.not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
@ -47,7 +47,13 @@ define(
|
|||||||
mockQ = jasmine.createSpyObj('$q', ['when', 'all']);
|
mockQ = jasmine.createSpyObj('$q', ['when', 'all']);
|
||||||
mockSubscription = jasmine.createSpyObj(
|
mockSubscription = jasmine.createSpyObj(
|
||||||
'subscription',
|
'subscription',
|
||||||
['unsubscribe', 'getTelemetryObjects', 'promiseTelemetryObjects']
|
[
|
||||||
|
'makeDatum',
|
||||||
|
'getDatum',
|
||||||
|
'unsubscribe',
|
||||||
|
'getTelemetryObjects',
|
||||||
|
'promiseTelemetryObjects'
|
||||||
|
]
|
||||||
);
|
);
|
||||||
mockDomainObject = jasmine.createSpyObj(
|
mockDomainObject = jasmine.createSpyObj(
|
||||||
'domainObject',
|
'domainObject',
|
||||||
@ -112,6 +118,20 @@ define(
|
|||||||
expect(handle.getSeries(mockDomainObject))
|
expect(handle.getSeries(mockDomainObject))
|
||||||
.toEqual(mockSeries);
|
.toEqual(mockSeries);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("provides access to the datum objects by index", function () {
|
||||||
|
var testDatum = { a: 1, b: 2 }, testIndex = 42;
|
||||||
|
mockSubscription.makeDatum.andReturn(testDatum);
|
||||||
|
handle.request({});
|
||||||
|
expect(handle.getDatum(mockDomainObject, testIndex))
|
||||||
|
.toEqual(testDatum);
|
||||||
|
expect(mockSubscription.makeDatum)
|
||||||
|
.toHaveBeenCalledWith(
|
||||||
|
mockDomainObject,
|
||||||
|
mockSeries,
|
||||||
|
testIndex
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user