mirror of
https://github.com/nasa/openmct.git
synced 2025-06-16 06:08:11 +00:00
[Plot] #638 Added a new plot options example bundle and rebased
Fixed jsdoc Fixed incorrect memberof declaration Corrected memberof statement
This commit is contained in:
@ -25,11 +25,13 @@ define([
|
||||
"./src/MCTChart",
|
||||
"./src/PlotController",
|
||||
"./src/policies/PlotViewPolicy",
|
||||
"./src/PlotOptionsController",
|
||||
'legacyRegistry'
|
||||
], function (
|
||||
MCTChart,
|
||||
PlotController,
|
||||
PlotViewPolicy,
|
||||
PlotOptionsController,
|
||||
legacyRegistry
|
||||
) {
|
||||
"use strict";
|
||||
@ -71,6 +73,14 @@ define([
|
||||
"throttle",
|
||||
"PLOT_FIXED_DURATION"
|
||||
]
|
||||
},
|
||||
{
|
||||
"key": "PlotOptionsController",
|
||||
"implementation": PlotOptionsController,
|
||||
"depends": [
|
||||
"$scope",
|
||||
"topic"
|
||||
]
|
||||
}
|
||||
],
|
||||
"constants": [
|
||||
@ -86,6 +96,12 @@ define([
|
||||
"category": "view",
|
||||
"implementation": PlotViewPolicy
|
||||
}
|
||||
],
|
||||
"representations": [
|
||||
{
|
||||
"key": "plot-options-browse",
|
||||
"templateUrl": "templates/plot-options-browse.html"
|
||||
}
|
||||
]
|
||||
}
|
||||
});
|
||||
|
@ -0,0 +1,76 @@
|
||||
<!--
|
||||
Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
as represented by the Administrator of the National Aeronautics and Space
|
||||
Administration. All rights reserved.
|
||||
|
||||
Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
http://www.apache.org/licenses/LICENSE-2.0.
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
License for the specific language governing permissions and limitations
|
||||
under the License.
|
||||
|
||||
Open MCT Web includes source code licensed under additional open source
|
||||
licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||
this source code distribution or the Licensing information page available
|
||||
at runtime from the About dialog for additional information.
|
||||
-->
|
||||
<style>
|
||||
.l-inspect .l-inspector-part .no-margin .form {
|
||||
margin-left: 0;
|
||||
}
|
||||
.reduced-min-width .form .form-row > .label {
|
||||
min-width: 80px;
|
||||
}
|
||||
</style>
|
||||
<div ng-controller="PlotOptionsController" class="flex-elem grows l-inspector-part">
|
||||
<em class="t-inspector-part-header" title="Display properties for this object">Display</em>
|
||||
<mct-form
|
||||
ng-model="configuration.plot.xAxis"
|
||||
structure="xAxisForm"
|
||||
name="xAxisFormState"
|
||||
class="flex-elem l-flex-row no-validate no-margin reduced-min-width">
|
||||
</mct-form>
|
||||
<mct-form
|
||||
ng-model="configuration.plot.yAxis"
|
||||
structure="yAxisForm"
|
||||
name="yAxisFormState"
|
||||
class="flex-elem l-flex-row no-validate no-margin reduced-min-width">
|
||||
</mct-form>
|
||||
<div class="section-header ng-binding ng-scope">
|
||||
Plot Series
|
||||
</div>
|
||||
<ul class="first flex-elem grows vscroll">
|
||||
<ul class="tree">
|
||||
<li ng-repeat="child in children">
|
||||
<span ng-controller="ToggleController as toggle">
|
||||
<span ng-controller="TreeNodeController as treeNode">
|
||||
<span class="tree-item menus-to-left">
|
||||
<span
|
||||
class='ui-symbol view-control flex-elem has-children'
|
||||
ng-class="{ expanded: toggle.isActive() }"
|
||||
ng-click="toggle.toggle(); treeNode.trackExpansion()">
|
||||
</span>
|
||||
<mct-representation
|
||||
class="rep-object-label"
|
||||
key="'label'"
|
||||
mct-object="child">
|
||||
</mct-representation>
|
||||
</span>
|
||||
</span>
|
||||
<mct-form
|
||||
ng-class="{hidden: !toggle.isActive()}"
|
||||
ng-model="configuration.plot.series[child.getId()]"
|
||||
structure="plotSeriesForm"
|
||||
name="plotOptionsState"
|
||||
class="flex-elem l-flex-row l-controls-first no-validate">
|
||||
</mct-form>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
</ul>
|
||||
</div>
|
145
platform/features/plot/src/PlotOptionsController.js
Normal file
145
platform/features/plot/src/PlotOptionsController.js
Normal file
@ -0,0 +1,145 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* Open MCT Web includes source code licensed under additional open source
|
||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||
* this source code distribution or the Licensing information page available
|
||||
* at runtime from the About dialog for additional information.
|
||||
*****************************************************************************/
|
||||
/*global define*/
|
||||
|
||||
define(
|
||||
['./PlotOptionsForm'],
|
||||
function (PlotOptionsForm) {
|
||||
"use strict";
|
||||
|
||||
/**
|
||||
* Notes on implementation of plot options
|
||||
*
|
||||
* Multiple y-axes will have to be handled with multiple forms as
|
||||
* they will need to be stored on distinct model object
|
||||
*
|
||||
* Likewise plot series options per-child will need to be separate
|
||||
* forms.
|
||||
*/
|
||||
|
||||
/**
|
||||
* The LayoutController is responsible for supporting the
|
||||
* Layout view. It arranges frames according to saved configuration
|
||||
* and provides methods for updating these based on mouse
|
||||
* movement.
|
||||
* @memberof platform/features/plot
|
||||
* @constructor
|
||||
* @param {Scope} $scope the controller's Angular scope
|
||||
*/
|
||||
function PlotOptionsController($scope, topic) {
|
||||
|
||||
var self = this,
|
||||
domainObject = $scope.domainObject,
|
||||
composition,
|
||||
mutationListener,
|
||||
formListener,
|
||||
configuration = domainObject.getModel().configuration || {};
|
||||
|
||||
this.plotOptionsForm = new PlotOptionsForm(topic);
|
||||
|
||||
/*
|
||||
* Determine whether the changes to the model that triggered a
|
||||
* mutation event were purely compositional.
|
||||
*/
|
||||
function hasCompositionChanged(oldComposition, newComposition){
|
||||
// Framed slightly strangely, but the boolean logic is
|
||||
// easier to follow for the unchanged case.
|
||||
var isUnchanged = oldComposition === newComposition ||
|
||||
(
|
||||
oldComposition.length === newComposition.length &&
|
||||
oldComposition.every( function (currentValue, index) {
|
||||
return newComposition[index] && currentValue === newComposition[index];
|
||||
})
|
||||
);
|
||||
return !isUnchanged;
|
||||
}
|
||||
|
||||
/*
|
||||
Default the plot options model
|
||||
*/
|
||||
function defaultConfiguration() {
|
||||
configuration.plot = configuration.plot || {};
|
||||
configuration.plot.xAxis = configuration.plot.xAxis || {};
|
||||
configuration.plot.yAxis = configuration.plot.yAxis || {}; // y-axes will be associative array keyed on axis key
|
||||
configuration.plot.series = configuration.plot.series || {}; // series will be associative array keyed on sub-object id
|
||||
$scope.configuration = configuration;
|
||||
}
|
||||
|
||||
/*
|
||||
When a child is added to, or removed from a plot, update the
|
||||
plot options model
|
||||
*/
|
||||
function updateChildren() {
|
||||
domainObject.useCapability('composition').then(function(children){
|
||||
$scope.children = children;
|
||||
composition = domainObject.getModel().composition;
|
||||
children.forEach(function(child){
|
||||
configuration.plot.series[child.getId()] = configuration.plot.series[child.getId()] || {};
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
On changes to the form, update the configuration on the domain
|
||||
object
|
||||
*/
|
||||
function updateConfiguration() {
|
||||
domainObject.useCapability('mutation', function(model){
|
||||
model.configuration = model.configuration || {};
|
||||
model.configuration.plot = configuration.plot;
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
Set form structures on scope
|
||||
*/
|
||||
$scope.plotSeriesForm = this.plotOptionsForm.plotSeriesForm;
|
||||
$scope.xAxisForm = this.plotOptionsForm.xAxisForm;
|
||||
$scope.yAxisForm = this.plotOptionsForm.yAxisForm;
|
||||
|
||||
/*
|
||||
Listen for changes to the domain object and update the object's
|
||||
children.
|
||||
*/
|
||||
mutationListener = domainObject.getCapability('mutation').listen(function(model) {
|
||||
if (hasCompositionChanged(composition, model.composition)) {
|
||||
updateChildren();
|
||||
}
|
||||
});
|
||||
|
||||
formListener = this.plotOptionsForm.listen(updateConfiguration);
|
||||
|
||||
defaultConfiguration();
|
||||
updateChildren();
|
||||
|
||||
$scope.$on("$destroy", function() {
|
||||
//Clean up any listeners on destruction of controller
|
||||
mutationListener();
|
||||
formListener();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
return PlotOptionsController;
|
||||
}
|
||||
);
|
||||
|
166
platform/features/plot/src/PlotOptionsForm.js
Normal file
166
platform/features/plot/src/PlotOptionsForm.js
Normal file
@ -0,0 +1,166 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* Open MCT Web includes source code licensed under additional open source
|
||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||
* this source code distribution or the Licensing information page available
|
||||
* at runtime from the About dialog for additional information.
|
||||
*****************************************************************************/
|
||||
/*global define*/
|
||||
|
||||
define(
|
||||
[],
|
||||
function () {
|
||||
"use strict";
|
||||
|
||||
/**
|
||||
* A class for encapsulating structure and behaviour of the plot
|
||||
* options form
|
||||
* @memberOf platform/features/plot
|
||||
* @param topic
|
||||
* @constructor
|
||||
*/
|
||||
function PlotOptionsForm(topic) {
|
||||
var self = this;
|
||||
this.onchangeTopic = topic();
|
||||
|
||||
function onchange(value){
|
||||
self.onchangeTopic.notify(value);
|
||||
}
|
||||
|
||||
/*
|
||||
Defined below are the form structures for the plot options.
|
||||
*/
|
||||
this.xAxisForm = {
|
||||
'name':'x-axis',
|
||||
'sections': [{
|
||||
'name': 'x-axis',
|
||||
'rows': [
|
||||
{
|
||||
'name': 'Domain',
|
||||
'control': 'select',
|
||||
'key': 'key',
|
||||
'onchange': onchange,
|
||||
'options': [
|
||||
{'name':'scet', 'value': 'scet'},
|
||||
{'name':'sclk', 'value': 'sclk'},
|
||||
{'name':'lst', 'value': 'lst'}
|
||||
]
|
||||
}
|
||||
]
|
||||
}]};
|
||||
|
||||
this.yAxisForm = {
|
||||
'name':'y-axis',
|
||||
'sections': [{
|
||||
// Will need to be repeated for each y-axis, with a
|
||||
// distinct name for each. Ideally the name of the axis
|
||||
// itself.
|
||||
'name': 'y-axis',
|
||||
'rows': [
|
||||
{
|
||||
'name': 'Autoscale',
|
||||
'control': 'checkbox',
|
||||
'key': 'autoscale',
|
||||
'onchange': onchange
|
||||
},
|
||||
{
|
||||
'name': 'Min',
|
||||
'control': 'textfield',
|
||||
'key': 'min',
|
||||
'pattern': '[0-9]',
|
||||
'onchange': onchange
|
||||
},
|
||||
{
|
||||
'name': 'Max',
|
||||
'control': 'textfield',
|
||||
'key': 'max',
|
||||
'pattern': '[0-9]',
|
||||
'onchange': onchange
|
||||
},
|
||||
{
|
||||
'name': 'Range',
|
||||
'control': 'select',
|
||||
'key': 'key',
|
||||
'onchange': onchange,
|
||||
'options': [
|
||||
{'name':'eu', 'value': 'eu'},
|
||||
{'name':'dn', 'value': 'dn'},
|
||||
{'name':'status', 'value': 'status'}
|
||||
]
|
||||
}
|
||||
]
|
||||
}]
|
||||
};
|
||||
this.plotSeriesForm = {
|
||||
'name':'Series Options',
|
||||
'sections': [
|
||||
{
|
||||
rows: [
|
||||
{
|
||||
'name': 'Color',
|
||||
'control': 'color',
|
||||
'key': 'color',
|
||||
'onchange': onchange
|
||||
}]
|
||||
},
|
||||
{
|
||||
'rows':[
|
||||
{
|
||||
'name': 'Markers',
|
||||
'control': 'checkbox',
|
||||
'key': 'markers',
|
||||
'onchange': onchange
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
'rows':[
|
||||
{
|
||||
'name': 'No Line',
|
||||
'control': 'radio',
|
||||
'key': 'lineType',
|
||||
'value': 'noLine',
|
||||
'onchange': onchange
|
||||
},
|
||||
{
|
||||
'name': 'Step Line',
|
||||
'control': 'radio',
|
||||
'key': 'lineType',
|
||||
'value': 'stepLine',
|
||||
'onchange': onchange
|
||||
},
|
||||
{
|
||||
'name': 'Linear Line',
|
||||
'control': 'radio',
|
||||
'key': 'lineType',
|
||||
'value': 'linearLine',
|
||||
'onchange': onchange
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
PlotOptionsForm.prototype.listen = function (callback){
|
||||
return this.onchangeTopic.listen(callback);
|
||||
};
|
||||
|
||||
return PlotOptionsForm;
|
||||
}
|
||||
);
|
||||
|
161
platform/features/plot/test/PlotOptionsControllerSpec.js
Normal file
161
platform/features/plot/test/PlotOptionsControllerSpec.js
Normal file
@ -0,0 +1,161 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* Open MCT Web includes source code licensed under additional open source
|
||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||
* this source code distribution or the Licensing information page available
|
||||
* at runtime from the About dialog for additional information.
|
||||
*****************************************************************************/
|
||||
/*global define,describe,it,expect,beforeEach,jasmine,xit*/
|
||||
|
||||
define(
|
||||
['../src/PlotOptionsController'],
|
||||
function (PlotOptionsController) {
|
||||
"use strict";
|
||||
|
||||
describe("The Plot Options controller", function () {
|
||||
var plotOptionsController,
|
||||
mockTopicFunction,
|
||||
mockTopicObject,
|
||||
mockDomainObject,
|
||||
mockMutationCapability,
|
||||
mockUseCapabilities,
|
||||
mockCompositionCapability,
|
||||
mockComposition,
|
||||
mockUnlisten,
|
||||
mockFormUnlisten,
|
||||
mockChildOne,
|
||||
mockChildTwo,
|
||||
model,
|
||||
mockScope;
|
||||
|
||||
beforeEach(function () {
|
||||
model = {
|
||||
composition: ['childOne']
|
||||
};
|
||||
|
||||
mockChildOne = jasmine.createSpyObj('domainObject', [
|
||||
'getId'
|
||||
]);
|
||||
mockChildOne.getId.andReturn('childOne');
|
||||
|
||||
mockChildTwo = jasmine.createSpyObj('childTwo', [
|
||||
'getId'
|
||||
]);
|
||||
mockChildOne.getId.andReturn('childTwo');
|
||||
|
||||
mockCompositionCapability = jasmine.createSpyObj('compositionCapability', [
|
||||
'then'
|
||||
]);
|
||||
mockComposition = [
|
||||
mockChildOne
|
||||
];
|
||||
mockCompositionCapability.then.andCallFake(function (callback){
|
||||
callback(mockComposition);
|
||||
});
|
||||
|
||||
mockUseCapabilities = jasmine.createSpyObj('useCapabilities', [
|
||||
'composition',
|
||||
'mutation'
|
||||
]);
|
||||
mockUseCapabilities.composition.andReturn(mockCompositionCapability);
|
||||
|
||||
mockMutationCapability = jasmine.createSpyObj('mutationCapability', [
|
||||
'listen'
|
||||
]);
|
||||
mockUnlisten = jasmine.createSpy('unlisten');
|
||||
mockMutationCapability.listen.andReturn(mockUnlisten);
|
||||
|
||||
|
||||
mockTopicObject = jasmine.createSpyObj('Topic', [
|
||||
'listen',
|
||||
'notify'
|
||||
]);
|
||||
mockFormUnlisten = jasmine.createSpy('formUnlisten');
|
||||
mockTopicObject.listen.andReturn(mockFormUnlisten);
|
||||
|
||||
mockTopicFunction = function() {
|
||||
return mockTopicObject;
|
||||
};
|
||||
|
||||
mockDomainObject = jasmine.createSpyObj('domainObject', [
|
||||
'getModel',
|
||||
'useCapability',
|
||||
'getCapability'
|
||||
]);
|
||||
mockDomainObject.useCapability.andCallFake(function(capability){
|
||||
return mockUseCapabilities[capability]();
|
||||
});
|
||||
mockDomainObject.getCapability.andReturn(mockMutationCapability);
|
||||
mockDomainObject.getModel.andReturn(model);
|
||||
|
||||
mockScope = jasmine.createSpyObj('scope', [
|
||||
'$on'
|
||||
]);
|
||||
mockScope.domainObject = mockDomainObject;
|
||||
|
||||
plotOptionsController = new PlotOptionsController(mockScope, mockTopicFunction);
|
||||
});
|
||||
|
||||
it("sets form definitions on scope", function () {
|
||||
expect(mockScope.xAxisForm).toBeDefined();
|
||||
expect(mockScope.yAxisForm).toBeDefined();
|
||||
expect(mockScope.plotSeriesForm).toBeDefined();
|
||||
});
|
||||
|
||||
it("sets object children on scope", function () {
|
||||
expect(mockScope.children).toBe(mockComposition);
|
||||
});
|
||||
|
||||
it("on changes in object composition, updates the form", function () {
|
||||
expect(mockMutationCapability.listen).toHaveBeenCalled();
|
||||
expect(mockScope.children).toBe(mockComposition);
|
||||
expect(mockScope.children.length).toBe(1);
|
||||
mockComposition.push(mockChildTwo);
|
||||
model.composition.push('childTwo');
|
||||
mockMutationCapability.listen.mostRecentCall.args[0](model);
|
||||
expect(mockScope.children).toBe(mockComposition);
|
||||
expect(mockScope.children.length).toBe(2);
|
||||
});
|
||||
|
||||
it("on changes in form values, updates the object model", function () {
|
||||
var scopeConfiguration = mockScope.configuration,
|
||||
model = mockDomainObject.getModel();
|
||||
|
||||
scopeConfiguration.plot.xAxis.key = 'lst';
|
||||
scopeConfiguration.plot.yAxis.autoScale = true;
|
||||
scopeConfiguration.plot.yAxis.key = 'eu';
|
||||
|
||||
expect(mockTopicObject.listen).toHaveBeenCalled();
|
||||
mockTopicObject.listen.mostRecentCall.args[0]();
|
||||
expect(mockDomainObject.useCapability).toHaveBeenCalledWith('mutation', jasmine.any(Function));
|
||||
|
||||
mockDomainObject.useCapability.mostRecentCall.args[1](model);
|
||||
expect(model.configuration.plot.xAxis.key).toBe('lst');
|
||||
expect(model.configuration.plot.yAxis.autoScale).toBe(true);
|
||||
expect(model.configuration.plot.yAxis.key).toBe('eu');
|
||||
|
||||
});
|
||||
|
||||
it("cleans up listeners on destruction of the controller", function () {
|
||||
mockScope.$on.mostRecentCall.args[1]();
|
||||
expect(mockUnlisten).toHaveBeenCalled();
|
||||
expect(mockFormUnlisten).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
);
|
73
platform/features/plot/test/PlotOptionsFormSpec.js
Normal file
73
platform/features/plot/test/PlotOptionsFormSpec.js
Normal file
@ -0,0 +1,73 @@
|
||||
/*****************************************************************************
|
||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
||||
* as represented by the Administrator of the National Aeronautics and Space
|
||||
* Administration. All rights reserved.
|
||||
*
|
||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
* Open MCT Web includes source code licensed under additional open source
|
||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||
* this source code distribution or the Licensing information page available
|
||||
* at runtime from the About dialog for additional information.
|
||||
*****************************************************************************/
|
||||
/*global define,describe,it,expect,beforeEach,jasmine,xit*/
|
||||
|
||||
define(
|
||||
['../src/PlotOptionsForm'],
|
||||
function (PlotOptionsForm) {
|
||||
"use strict";
|
||||
|
||||
describe("The Plot Options form", function () {
|
||||
var plotOptionsForm,
|
||||
mockTopicFunction,
|
||||
mockTopicObject,
|
||||
listener;
|
||||
|
||||
beforeEach(function () {
|
||||
|
||||
mockTopicObject = jasmine.createSpyObj('Topic', [
|
||||
'listen',
|
||||
'notify'
|
||||
]);
|
||||
mockTopicFunction = function() {
|
||||
return mockTopicObject;
|
||||
};
|
||||
|
||||
plotOptionsForm = new PlotOptionsForm(mockTopicFunction);
|
||||
});
|
||||
|
||||
it("defines form specs for x-axis, y-axis, and series data", function () {
|
||||
expect(plotOptionsForm.xAxisForm).toBeDefined();
|
||||
expect(plotOptionsForm.xAxisForm.sections).toBeDefined();
|
||||
expect(plotOptionsForm.xAxisForm.sections[0].rows).toBeDefined();
|
||||
expect(plotOptionsForm.xAxisForm.sections[0].rows.length).toBeGreaterThan(0);
|
||||
|
||||
expect(plotOptionsForm.yAxisForm).toBeDefined();
|
||||
expect(plotOptionsForm.plotSeriesForm).toBeDefined();
|
||||
});
|
||||
|
||||
it("uses a topic to register listeners and inform them when a" +
|
||||
" form value changes", function () {
|
||||
var changedValue = 'changedValue';
|
||||
|
||||
expect(plotOptionsForm.xAxisForm.sections[0].rows[0].onchange).toBeDefined();
|
||||
|
||||
plotOptionsForm.listen(listener);
|
||||
expect(mockTopicObject.listen).toHaveBeenCalledWith(listener);
|
||||
|
||||
plotOptionsForm.xAxisForm.sections[0].rows[0].onchange(changedValue);
|
||||
expect(mockTopicObject.notify).toHaveBeenCalledWith(changedValue);
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
);
|
Reference in New Issue
Block a user