Skip to content

Commit d98dcc0

Browse files
committed
improve makeCalcdata typed array handling + some tests + some linting
1 parent 2372629 commit d98dcc0

File tree

2 files changed

+100
-13
lines changed

2 files changed

+100
-13
lines changed

src/plots/cartesian/set_convert.js

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -406,29 +406,33 @@ module.exports = function setConvert(ax, fullLayout) {
406406
arrayIn = trace[axLetter];
407407
len = trace._length || arrayIn.length;
408408

409-
if(ax.type === 'linear' && Lib.isTypedArray(arrayIn) && arrayIn.subarray) {
410-
arrayOut = arrayIn.subarray(0, len);
411-
} else {
412-
arrayOut = new Array(len);
413-
414-
for(i = 0; i < len; i++) {
415-
arrayOut[i] = ax.d2c(arrayIn[i], 0, cal);
409+
if(Lib.isTypedArray(arrayIn)) {
410+
if(len === arrayIn.length) {
411+
return arrayIn;
412+
} else if(arrayIn.subarray) {
413+
return arrayIn.subarray(0, len);
416414
}
417415
}
416+
417+
arrayOut = new Array(len);
418+
for(i = 0; i < len; i++) {
419+
arrayOut[i] = ax.d2c(arrayIn[i], 0, cal);
420+
}
418421
}
419422
else {
420-
var v0 = ((axLetter + '0') in trace) ?
421-
ax.d2c(trace[axLetter + '0'], 0, cal) : 0,
422-
dv = (trace['d' + axLetter]) ?
423-
Number(trace['d' + axLetter]) : 1;
423+
var v0 = ((axLetter + '0') in trace) ? ax.d2c(trace[axLetter + '0'], 0, cal) : 0;
424+
var dv = (trace['d' + axLetter]) ? Number(trace['d' + axLetter]) : 1;
424425

425426
// the opposing data, for size if we have x and dx etc
426427
arrayIn = trace[{x: 'y', y: 'x'}[axLetter]];
427428
len = trace._length || arrayIn.length;
428429
arrayOut = new Array(len);
429430

430-
for(i = 0; i < len; i++) arrayOut[i] = v0 + i * dv;
431+
for(i = 0; i < len; i++) {
432+
arrayOut[i] = v0 + i * dv;
433+
}
431434
}
435+
432436
return arrayOut;
433437
};
434438

test/jasmine/tests/axes_test.js

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ var Cartesian = require('@src/plots/cartesian');
1212
var Axes = require('@src/plots/cartesian/axes');
1313
var Fx = require('@src/components/fx');
1414
var supplyLayoutDefaults = require('@src/plots/cartesian/layout_defaults');
15+
var BADNUM = require('@src/constants/numerical').BADNUM;
1516

1617
var createGraphDiv = require('../assets/create_graph_div');
1718
var destroyGraphDiv = require('../assets/destroy_graph_div');
1819
var failTest = require('../assets/fail_test');
1920
var selectButton = require('../assets/modebar_button');
2021
var supplyDefaults = require('../assets/supply_defaults');
2122

22-
2323
describe('Test axes', function() {
2424
'use strict';
2525

@@ -2447,6 +2447,89 @@ describe('Test axes', function() {
24472447
});
24482448
});
24492449
});
2450+
2451+
describe('makeCalcdata', function() {
2452+
function _makeCalcdata(trace, axLetter, axType) {
2453+
var ax = {type: axType};
2454+
Axes.setConvert(ax);
2455+
ax._categories = [];
2456+
return ax.makeCalcdata(trace, axLetter);
2457+
}
2458+
2459+
describe('should convert items', function() {
2460+
it('- linear case', function() {
2461+
var out = _makeCalcdata({
2462+
x: ['1', NaN, null, 2],
2463+
}, 'x', 'linear');
2464+
expect(out).toEqual([1, BADNUM, BADNUM, 2]);
2465+
});
2466+
2467+
it('- date case', function() {
2468+
var out = _makeCalcdata({
2469+
x: ['2000-01-01', NaN, null, new Date(2000, 0, 1).getTime()],
2470+
}, 'x', 'date');
2471+
expect(out).toEqual([946684800000, BADNUM, BADNUM, 946684800000]);
2472+
});
2473+
2474+
it('- category case', function() {
2475+
var out = _makeCalcdata({
2476+
x: ['a', 'b', null, 4],
2477+
}, 'x', 'category');
2478+
2479+
expect(out).toEqual([0, 1, BADNUM, 2]);
2480+
});
2481+
});
2482+
2483+
describe('should fill item to other coordinate length if not present', function() {
2484+
it('- base case', function() {
2485+
var out = _makeCalcdata({
2486+
y: [1, 2, 1],
2487+
}, 'x', 'linear');
2488+
expect(out).toEqual([0, 1, 2]);
2489+
});
2490+
2491+
it('- x0/dx case', function() {
2492+
var out = _makeCalcdata({
2493+
y: [1, 2, 1],
2494+
x0: 2,
2495+
dx: 10,
2496+
_length: 3
2497+
}, 'x', 'linear');
2498+
expect(out).toEqual([2, 12, 22]);
2499+
});
2500+
2501+
it('- other length case', function() {
2502+
var out = _makeCalcdata({
2503+
_length: 5,
2504+
y: [1, 2, 1],
2505+
}, 'x', 'linear');
2506+
expect(out).toEqual([0, 1, 2, 3, 4]);
2507+
});
2508+
});
2509+
2510+
describe('should subarray typed arrays', function() {
2511+
it('- same length case', function() {
2512+
var x = new Float32Array([1, 2, 3]);
2513+
var out = _makeCalcdata({
2514+
_length: 3,
2515+
x: x
2516+
}, 'x', 'linear');
2517+
expect(out).toBe(x);
2518+
});
2519+
2520+
it('- subarray case', function() {
2521+
var x = new Float32Array([1, 2, 3]);
2522+
var out = _makeCalcdata({
2523+
_length: 2,
2524+
x: x
2525+
}, 'x', 'linear');
2526+
expect(out).toEqual(new Float32Array([1, 2]));
2527+
// check that in and out are linked to same buffer
2528+
expect(out.buffer).toBeDefined();
2529+
expect(out.buffer).toEqual(x.buffer);
2530+
});
2531+
});
2532+
});
24502533
});
24512534

24522535
function getZoomInButton(gd) {

0 commit comments

Comments
 (0)