Skip to content

Commit e481a13

Browse files
committed
validate numberic bounds when using patterns
1 parent 550a375 commit e481a13

File tree

2 files changed

+88
-2
lines changed

2 files changed

+88
-2
lines changed

src/plots/cartesian/axis_defaults.js

+36-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
'use strict';
1010

11+
var isNumeric = require('fast-isnumeric');
12+
1113
var Registry = require('../../registry');
1214
var Lib = require('../../lib');
1315

@@ -22,6 +24,7 @@ var handleLineGridDefaults = require('./line_grid_defaults');
2224
var setConvert = require('./set_convert');
2325

2426
var DAY_OF_WEEK = require('./constants').WEEKDAY_PATTERN;
27+
var HOUR = require('./constants').HOUR_PATTERN;
2528

2629
/**
2730
* options: object containing:
@@ -175,8 +178,11 @@ function rangebreaksDefaults(itemIn, itemOut, containerOut) {
175178
}
176179
}
177180
var pattern = coerce('pattern', dfltPattern);
178-
179-
if(bnds.length === 2 && pattern === DAY_OF_WEEK) {
181+
if(pattern && bnds.length !== 2) {
182+
itemOut.enabled = false;
183+
return;
184+
}
185+
if(pattern === DAY_OF_WEEK) {
180186
for(i = 0; i < 2; i++) {
181187
q = indexOfDay(bnds[i]);
182188
if(q) {
@@ -185,6 +191,34 @@ function rangebreaksDefaults(itemIn, itemOut, containerOut) {
185191
}
186192
}
187193
}
194+
if(pattern) {
195+
// ensure types and ranges
196+
for(i = 0; i < 2; i++) {
197+
q = bnds[i];
198+
switch(pattern) {
199+
case DAY_OF_WEEK :
200+
if(isNumeric(q)) q = Math.floor(q);
201+
202+
q = Math.floor(+q);
203+
if(!(q >= 0 && q < 7)) {
204+
itemOut.enabled = false;
205+
return;
206+
}
207+
// use int [0, 7)
208+
itemOut.bounds[i] = bnds[i] = q;
209+
break;
210+
211+
case HOUR :
212+
if(!(q >= 0 && q <= 24)) { // accept 24
213+
itemOut.enabled = false;
214+
return;
215+
}
216+
// use float [0, 24]
217+
itemOut.bounds[i] = bnds[i] = q;
218+
break;
219+
}
220+
}
221+
}
188222

189223
if(containerOut.autorange === false) {
190224
var rng = containerOut.range;

test/jasmine/tests/axes_test.js

+52
Original file line numberDiff line numberDiff line change
@@ -1162,6 +1162,58 @@ describe('Test axes', function() {
11621162
expect(layoutOut.xaxis2.rangebreaks[2].bounds[1]).toBe(6, 'convert sat');
11631163
expect(layoutOut.xaxis2.rangebreaks[3].bounds[1]).toBe('-1', 'string');
11641164
});
1165+
1166+
it('should validate inputs in respect to *day of week* pattern', function() {
1167+
layoutIn = {
1168+
xaxis: {type: 'date', rangebreaks: [{pattern: 'day of week', bounds: ['6.999', '0'] }]},
1169+
xaxis2: {type: 'date', rangebreaks: [{bounds: ['Sunday'] }]},
1170+
xaxis3: {type: 'date', rangebreaks: [{bounds: ['sun', 'mon', 'tue'] }]},
1171+
xaxis4: {type: 'date', rangebreaks: [{pattern: 'day of week', bounds: [1, '-1'] }]},
1172+
xaxis5: {type: 'date', rangebreaks: [{pattern: 'day of week', bounds: [1, '-.001'] }]},
1173+
xaxis6: {type: 'date', rangebreaks: [{pattern: 'day of week', bounds: [1, '7'] }]},
1174+
xaxis7: {type: 'date', rangebreaks: [{pattern: 'day of week', bounds: [1, '6.999'] }]}
1175+
};
1176+
layoutOut._subplots.xaxis.push('x2', 'x3', 'x4', 'x5', 'x6', 'x7');
1177+
supplyLayoutDefaults(layoutIn, layoutOut, fullData);
1178+
1179+
expect(layoutOut.xaxis.rangebreaks[0].enabled).toBe(true, 'valid');
1180+
expect(layoutOut.xaxis.rangebreaks[0].bounds[0]).toBe(6, 'cast float to int');
1181+
expect(layoutOut.xaxis.rangebreaks[0].bounds[1]).toBe(0, 'cast string to int');
1182+
expect(layoutOut.xaxis2.rangebreaks[0].enabled).toBe(false, 'reject bounds.length < 2');
1183+
expect(layoutOut.xaxis3.rangebreaks[0].enabled).toBe(true, 'do not reject bounds.length > 2');
1184+
expect(layoutOut.xaxis3.rangebreaks[0].bounds.length).toBe(2, 'pick first two');
1185+
expect(layoutOut.xaxis4.rangebreaks[0].enabled).toBe(false, 'reject bound < 0');
1186+
expect(layoutOut.xaxis5.rangebreaks[0].enabled).toBe(false, 'reject bound < 0');
1187+
expect(layoutOut.xaxis6.rangebreaks[0].enabled).toBe(false, 'reject bound >= 7');
1188+
expect(layoutOut.xaxis7.rangebreaks[0].enabled).toBe(true, 'do not reject bound < 7');
1189+
});
1190+
1191+
it('should validate inputs in respect to *hour* pattern', function() {
1192+
layoutIn = {
1193+
xaxis: {type: 'date', rangebreaks: [{pattern: 'hour', bounds: ['23.999', '0'] }]},
1194+
xaxis2: {type: 'date', rangebreaks: [{pattern: 'hour', bounds: [1] }]},
1195+
xaxis3: {type: 'date', rangebreaks: [{pattern: 'hour', bounds: [1, 2, 3] }]},
1196+
xaxis4: {type: 'date', rangebreaks: [{pattern: 'hour', bounds: [1, '-1'] }]},
1197+
xaxis5: {type: 'date', rangebreaks: [{pattern: 'hour', bounds: [1, '-.001'] }]},
1198+
xaxis6: {type: 'date', rangebreaks: [{pattern: 'hour', bounds: [1, '24.001'] }]},
1199+
xaxis7: {type: 'date', rangebreaks: [{pattern: 'hour', bounds: [1, '23.999'] }]},
1200+
xaxis8: {type: 'date', rangebreaks: [{pattern: 'hour', bounds: [1, '24'] }]}
1201+
};
1202+
layoutOut._subplots.xaxis.push('x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8');
1203+
supplyLayoutDefaults(layoutIn, layoutOut, fullData);
1204+
1205+
expect(layoutOut.xaxis.rangebreaks[0].enabled).toBe(true, 'valid');
1206+
expect(layoutOut.xaxis.rangebreaks[0].bounds[0]).toBe('23.999', 'do not cast float to int');
1207+
expect(layoutOut.xaxis.rangebreaks[0].bounds[1]).toBe('0', 'do not cast string to int');
1208+
expect(layoutOut.xaxis2.rangebreaks[0].enabled).toBe(false, 'reject bounds.length < 2');
1209+
expect(layoutOut.xaxis3.rangebreaks[0].enabled).toBe(true, 'do not reject bounds.length > 2');
1210+
expect(layoutOut.xaxis3.rangebreaks[0].bounds.length).toBe(2, 'pick first two');
1211+
expect(layoutOut.xaxis4.rangebreaks[0].enabled).toBe(false, 'reject bound < 0');
1212+
expect(layoutOut.xaxis5.rangebreaks[0].enabled).toBe(false, 'reject bound < 0');
1213+
expect(layoutOut.xaxis6.rangebreaks[0].enabled).toBe(false, 'reject bound > 24');
1214+
expect(layoutOut.xaxis7.rangebreaks[0].enabled).toBe(true, 'do not reject bound <= 24');
1215+
expect(layoutOut.xaxis8.rangebreaks[0].enabled).toBe(true, 'do not reject 24');
1216+
});
11651217
});
11661218

11671219
describe('constraints relayout', function() {

0 commit comments

Comments
 (0)