@hrforte/react-pivottable 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,571 @@
1
+ 'use strict';
2
+
3
+ var _Utilities = require('../Utilities');
4
+
5
+ var utils = _interopRequireWildcard(_Utilities);
6
+
7
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
8
+
9
+ /* eslint-disable no-magic-numbers */
10
+
11
+ /*
12
+ * decaffeinate suggestions:
13
+ * DS101: Remove unnecessary use of Array.from
14
+ * DS102: Remove unnecessary code created because of implicit returns
15
+ * DS207: Consider shorter variations of null checks
16
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
17
+ */
18
+ var fixtureData = [['name', 'gender', 'colour', 'birthday', 'trials', 'successes'], ['Nick', 'male', 'blue', '1982-11-07', 103, 12], ['Jane', 'female', 'red', '1982-11-08', 95, 25], ['John', 'male', 'blue', '1982-12-08', 112, 30], ['Carol', 'female', 'yellow', '1983-12-08', 102, 14]];
19
+
20
+ var aggregationConfig = function aggregationConfig(aggregatorName) {
21
+ var vals = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
22
+ var key = arguments[2];
23
+ return {
24
+ key: key || aggregatorName + '-' + (vals.length ? vals.join('|') : 'none'),
25
+ aggregatorName: aggregatorName,
26
+ vals: vals
27
+ };
28
+ };
29
+
30
+ describe(' utils', function () {
31
+ describe('.PivotData()', function () {
32
+ describe('with no options', function () {
33
+ var aoaInput = [['a', 'b'], [1, 2], [3, 4]];
34
+ var pd = new utils.PivotData({ data: aoaInput });
35
+
36
+ it('has the correct grand total value', function () {
37
+ return expect(pd.getAggregator([], []).value()).toBe(2);
38
+ });
39
+ });
40
+
41
+ describe('with array-of-array input', function () {
42
+ var aoaInput = [['a', 'b'], [1, 2], [3, 4]];
43
+ var pd = new utils.PivotData({
44
+ data: aoaInput,
45
+ aggregations: [aggregationConfig('Sum over Sum', ['a', 'b'])]
46
+ });
47
+
48
+ it('has the correct grand total value', function () {
49
+ return expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4));
50
+ });
51
+ });
52
+
53
+ describe('with array-of-object input', function () {
54
+ var aosInput = [{ a: 1, b: 2 }, { a: 3, b: 4 }];
55
+ var pd = new utils.PivotData({
56
+ data: aosInput,
57
+ aggregations: [aggregationConfig('Sum over Sum', ['a', 'b'])]
58
+ });
59
+
60
+ it('has the correct grand total value', function () {
61
+ return expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4));
62
+ });
63
+ });
64
+
65
+ describe('with ragged array-of-object input', function () {
66
+ var raggedAosInput = [{ a: 1 }, { b: 4 }, { a: 3, b: 2 }];
67
+ var pd = new utils.PivotData({
68
+ data: raggedAosInput,
69
+ aggregations: [aggregationConfig('Sum over Sum', ['a', 'b'])]
70
+ });
71
+
72
+ it('has the correct grand total value', function () {
73
+ return expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4));
74
+ });
75
+ });
76
+
77
+ describe('with function input', function () {
78
+ var functionInput = function functionInput(record) {
79
+ record({ a: 1, b: 2 });
80
+ record({ a: 3, b: 4 });
81
+ };
82
+ var pd = new utils.PivotData({
83
+ data: functionInput,
84
+ aggregations: [aggregationConfig('Sum over Sum', ['a', 'b'])]
85
+ });
86
+
87
+ it('has the correct grand total value', function () {
88
+ return expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4));
89
+ });
90
+ });
91
+
92
+ describe('with rows/cols', function () {
93
+ var pd = new utils.PivotData({
94
+ data: fixtureData,
95
+ rows: ['name', 'colour'],
96
+ cols: ['trials', 'successes']
97
+ });
98
+
99
+ it('has correctly-ordered row keys', function () {
100
+ return expect(pd.getRowKeys()).toEqual([['Carol', 'yellow'], ['Jane', 'red'], ['John', 'blue'], ['Nick', 'blue']]);
101
+ });
102
+
103
+ it('has correctly-ordered col keys', function () {
104
+ return expect(pd.getColKeys()).toEqual([[95, 25], [102, 14], [103, 12], [112, 30]]);
105
+ });
106
+
107
+ it('can be iterated over', function () {
108
+ var numNotNull = 0;
109
+ var numNull = 0;
110
+ var _iteratorNormalCompletion = true;
111
+ var _didIteratorError = false;
112
+ var _iteratorError = undefined;
113
+
114
+ try {
115
+ for (var _iterator = Array.from(pd.getRowKeys())[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
116
+ var r = _step.value;
117
+ var _iteratorNormalCompletion2 = true;
118
+ var _didIteratorError2 = false;
119
+ var _iteratorError2 = undefined;
120
+
121
+ try {
122
+ for (var _iterator2 = Array.from(pd.getColKeys())[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
123
+ var c = _step2.value;
124
+
125
+ if (pd.getAggregator(r, c).value() !== null) {
126
+ numNotNull++;
127
+ } else {
128
+ numNull++;
129
+ }
130
+ }
131
+ } catch (err) {
132
+ _didIteratorError2 = true;
133
+ _iteratorError2 = err;
134
+ } finally {
135
+ try {
136
+ if (!_iteratorNormalCompletion2 && _iterator2.return) {
137
+ _iterator2.return();
138
+ }
139
+ } finally {
140
+ if (_didIteratorError2) {
141
+ throw _iteratorError2;
142
+ }
143
+ }
144
+ }
145
+ }
146
+ } catch (err) {
147
+ _didIteratorError = true;
148
+ _iteratorError = err;
149
+ } finally {
150
+ try {
151
+ if (!_iteratorNormalCompletion && _iterator.return) {
152
+ _iterator.return();
153
+ }
154
+ } finally {
155
+ if (_didIteratorError) {
156
+ throw _iteratorError;
157
+ }
158
+ }
159
+ }
160
+
161
+ expect(numNotNull).toBe(4);
162
+ expect(numNull).toBe(12);
163
+ });
164
+
165
+ it('returns matching records', function () {
166
+ var records = [];
167
+ pd.forEachMatchingRecord({ gender: 'male' }, function (x) {
168
+ return records.push(x.name);
169
+ });
170
+ expect(records).toEqual(['Nick', 'John']);
171
+ });
172
+
173
+ it('has a correct spot-checked aggregator', function () {
174
+ var agg = pd.getAggregator(['Carol', 'yellow'], [102, 14]);
175
+ var val = agg.value();
176
+ expect(val).toBe(1);
177
+ expect(agg.format(val)).toBe('1');
178
+ });
179
+
180
+ it('has a correct grand total aggregator', function () {
181
+ var agg = pd.getAggregator([], []);
182
+ var val = agg.value();
183
+ expect(val).toBe(4);
184
+ expect(agg.format(val)).toBe('4');
185
+ });
186
+ });
187
+
188
+ describe('with multiple aggregators selected', function () {
189
+ var pd = new utils.PivotData({
190
+ data: fixtureData,
191
+ rows: ['gender'],
192
+ aggregators: utils.aggregators,
193
+ aggregations: [{ key: 'count-gender', aggregatorName: 'Count' }, { key: 'sum-trials', aggregatorName: 'Sum', vals: ['trials'] }]
194
+ });
195
+
196
+ it('lists all active aggregators', function () {
197
+ expect(pd.getAggregatorNames()).toEqual(['Count', 'Sum']);
198
+ });
199
+
200
+ it('defaults to the primary aggregator when none specified', function () {
201
+ expect(pd.getAggregator(['female'], []).value()).toBe(2);
202
+ });
203
+
204
+ it('can retrieve a specific aggregator by key', function () {
205
+ expect(pd.getAggregator(['female'], [], 'sum-trials').value()).toBe(197);
206
+ });
207
+
208
+ it('falls back to aggregator names for backwards compatibility', function () {
209
+ expect(pd.getAggregator(['female'], [], 'Sum').value()).toBe(197);
210
+ });
211
+
212
+ it('adds a default aggregation when none are supplied', function () {
213
+ var alt = new utils.PivotData({
214
+ data: fixtureData,
215
+ rows: ['gender'],
216
+ aggregators: utils.aggregators
217
+ });
218
+ expect(alt.getAggregations().length).toBe(1);
219
+ var expectedPrimary = Object.keys(utils.aggregators)[0];
220
+ expect(alt.getAggregatorNames()).toEqual([expectedPrimary]);
221
+ expect(alt.getPrimaryAggregation().aggregatorName).toBe(expectedPrimary);
222
+ });
223
+
224
+ it('respects legacy aggregatorName/vals when aggregations are omitted', function () {
225
+ var alt = new utils.PivotData({
226
+ data: fixtureData,
227
+ rows: ['gender'],
228
+ aggregators: utils.aggregators,
229
+ aggregatorName: 'Sum',
230
+ vals: ['trials']
231
+ });
232
+ expect(alt.getAggregations()[0]).toEqual(expect.objectContaining({
233
+ aggregatorName: 'Sum',
234
+ vals: ['trials']
235
+ }));
236
+ });
237
+
238
+ it('ignores legacy aggregatorName/vals when aggregations are supplied', function () {
239
+ var alt = new utils.PivotData({
240
+ data: fixtureData,
241
+ rows: ['gender'],
242
+ aggregators: utils.aggregators,
243
+ aggregatorName: 'Sum',
244
+ vals: ['trials'],
245
+ aggregations: [{ key: 'count-only', aggregatorName: 'Count' }]
246
+ });
247
+ expect(alt.getPrimaryAggregation().aggregatorName).toBe('Count');
248
+ expect(alt.getPrimaryAggregation().vals).toEqual([]);
249
+ });
250
+ });
251
+ });
252
+
253
+ describe('.aggregatorTemplates', function () {
254
+ var getVal = function getVal(agg, vals) {
255
+ return new utils.PivotData({
256
+ data: fixtureData,
257
+ aggregators: { agg: agg },
258
+ aggregations: [aggregationConfig('agg', vals)]
259
+ }).getAggregator([], []).value();
260
+ };
261
+ var tpl = utils.aggregatorTemplates;
262
+
263
+ describe('.count', function () {
264
+ return it('works', function () {
265
+ return expect(getVal(tpl.count(), [])).toBe(4);
266
+ });
267
+ });
268
+
269
+ describe('.countUnique', function () {
270
+ return it('works', function () {
271
+ return expect(getVal(tpl.countUnique(), ['gender'])).toBe(2);
272
+ });
273
+ });
274
+
275
+ describe('.listUnique', function () {
276
+ return it('works', function () {
277
+ return expect(getVal(tpl.listUnique(), ['gender'])).toBe('male,female');
278
+ });
279
+ });
280
+
281
+ describe('.average', function () {
282
+ return it('works', function () {
283
+ return expect(getVal(tpl.average(), ['trials'])).toBe(103);
284
+ });
285
+ });
286
+
287
+ describe('.sum', function () {
288
+ return it('works', function () {
289
+ return expect(getVal(tpl.sum(), ['trials'])).toBe(412);
290
+ });
291
+ });
292
+
293
+ describe('.min', function () {
294
+ return it('works', function () {
295
+ return expect(getVal(tpl.min(), ['trials'])).toBe(95);
296
+ });
297
+ });
298
+
299
+ describe('.max', function () {
300
+ return it('works', function () {
301
+ return expect(getVal(tpl.max(), ['trials'])).toBe(112);
302
+ });
303
+ });
304
+
305
+ describe('.first', function () {
306
+ return it('works', function () {
307
+ return expect(getVal(tpl.first(), ['name'])).toBe('Carol');
308
+ });
309
+ });
310
+
311
+ describe('.last', function () {
312
+ return it('works', function () {
313
+ return expect(getVal(tpl.last(), ['name'])).toBe('Nick');
314
+ });
315
+ });
316
+
317
+ describe('.average', function () {
318
+ return it('works', function () {
319
+ return expect(getVal(tpl.average(), ['trials'])).toBe(103);
320
+ });
321
+ });
322
+
323
+ describe('.median', function () {
324
+ return it('works', function () {
325
+ return expect(getVal(tpl.median(), ['trials'])).toBe(102.5);
326
+ });
327
+ });
328
+
329
+ describe('.quantile', function () {
330
+ return it('works', function () {
331
+ expect(getVal(tpl.quantile(0), ['trials'])).toBe(95);
332
+ expect(getVal(tpl.quantile(0.1), ['trials'])).toBe(98.5);
333
+ expect(getVal(tpl.quantile(0.25), ['trials'])).toBe(98.5);
334
+ expect(getVal(tpl.quantile(1 / 3), ['trials'])).toBe(102);
335
+ expect(getVal(tpl.quantile(1), ['trials'])).toBe(112);
336
+ });
337
+ });
338
+
339
+ describe('.var', function () {
340
+ return it('works', function () {
341
+ return expect(getVal(tpl.var(), ['trials'])).toBe(48.666666666666686);
342
+ });
343
+ });
344
+
345
+ describe('.stdev', function () {
346
+ return it('works', function () {
347
+ return expect(getVal(tpl.stdev(), ['trials'])).toBe(6.976149845485451);
348
+ });
349
+ });
350
+
351
+ describe('.sumOverSum', function () {
352
+ return it('works', function () {
353
+ return expect(getVal(tpl.sumOverSum(), ['successes', 'trials'])).toBe((12 + 25 + 30 + 14) / (95 + 102 + 103 + 112));
354
+ });
355
+ });
356
+
357
+ describe('.fractionOf', function () {
358
+ return it('works', function () {
359
+ return expect(getVal(tpl.fractionOf(tpl.sum()), ['trials'])).toBe(1);
360
+ });
361
+ });
362
+ });
363
+
364
+ describe('.naturalSort()', function () {
365
+ var naturalSort = utils.naturalSort;
366
+
367
+
368
+ var sortedArr = [null, NaN, -Infinity, '-Infinity', -3, '-3', -2, '-2', -1, '-1', 0, '2e-1', 1, '01', '1', 2, '002', '002e0', '02', '2', '2e-0', 3, 10, '10', '11', '12', '1e2', '112', Infinity, 'Infinity', '1a', '2a', '12a', '20a', 'A', 'A', 'NaN', 'a', 'a', 'a01', 'a012', 'a02', 'a1', 'a2', 'a12', 'a12', 'a21', 'a21', 'b', 'c', 'd', 'null'];
369
+
370
+ it('sorts naturally (null, NaN, numbers & numbery strings, Alphanum for text strings)', function () {
371
+ return expect(sortedArr.slice().sort(naturalSort)).toEqual(sortedArr);
372
+ });
373
+ });
374
+
375
+ describe('.sortAs()', function () {
376
+ var sortAs = utils.sortAs;
377
+
378
+
379
+ it('sorts with unknown values sorted at the end', function () {
380
+ return expect([5, 2, 3, 4, 1].sort(sortAs([4, 3, 2]))).toEqual([4, 3, 2, 1, 5]);
381
+ });
382
+
383
+ it('sorts lowercase after uppercase', function () {
384
+ return expect(['Ab', 'aA', 'aa', 'ab'].sort(sortAs(['Ab', 'Aa']))).toEqual(['Ab', 'ab', 'aa', 'aA']);
385
+ });
386
+ });
387
+
388
+ describe('.numberFormat()', function () {
389
+ var numberFormat = utils.numberFormat;
390
+
391
+
392
+ it('formats numbers', function () {
393
+ var nf = numberFormat();
394
+ expect(nf(1234567.89123456)).toEqual('1,234,567.89');
395
+ });
396
+
397
+ it('formats booleans', function () {
398
+ var nf = numberFormat();
399
+ expect(nf(true)).toEqual('1.00');
400
+ });
401
+
402
+ it('formats numbers in strings', function () {
403
+ var nf = numberFormat();
404
+ expect(nf('1234567.89123456')).toEqual('1,234,567.89');
405
+ });
406
+
407
+ it("doesn't formats strings", function () {
408
+ var nf = numberFormat();
409
+ expect(nf('hi there')).toEqual('');
410
+ });
411
+
412
+ it("doesn't formats objects", function () {
413
+ var nf = numberFormat();
414
+ expect(nf({ a: 1 })).toEqual('');
415
+ });
416
+
417
+ it('formats percentages', function () {
418
+ var nf = numberFormat({ scaler: 100, suffix: '%' });
419
+ expect(nf(0.12345)).toEqual('12.35%');
420
+ });
421
+
422
+ it('adds separators', function () {
423
+ var nf = numberFormat({ thousandsSep: 'a', decimalSep: 'b' });
424
+ expect(nf(1234567.89123456)).toEqual('1a234a567b89');
425
+ });
426
+
427
+ it('adds prefixes and suffixes', function () {
428
+ var nf = numberFormat({ prefix: 'a', suffix: 'b' });
429
+ expect(nf(1234567.89123456)).toEqual('a1,234,567.89b');
430
+ });
431
+
432
+ it('scales and rounds', function () {
433
+ var nf = numberFormat({ digitsAfterDecimal: 3, scaler: 1000 });
434
+ expect(nf(1234567.89123456)).toEqual('1,234,567,891.235');
435
+ });
436
+ });
437
+
438
+ describe('.derivers', function () {
439
+ describe('.dateFormat()', function () {
440
+ var df = utils.derivers.dateFormat('x', 'abc % %% %%% %a %y %m %n %d %w %x %H %M %S', true);
441
+
442
+ it('formats date objects', function () {
443
+ return expect(df({ x: new Date('2015-01-02T23:43:11Z') })).toBe('abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11');
444
+ });
445
+
446
+ it('formats input parsed by Date.parse()', function () {
447
+ expect(df({ x: '2015-01-02T23:43:11Z' })).toBe('abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11');
448
+
449
+ expect(df({ x: 'bla' })).toBe('');
450
+ });
451
+ });
452
+
453
+ describe('.bin()', function () {
454
+ var binner = utils.derivers.bin('x', 10);
455
+
456
+ it('bins numbers', function () {
457
+ expect(binner({ x: 11 })).toBe(10);
458
+
459
+ expect(binner({ x: 9 })).toBe(0);
460
+
461
+ expect(binner({ x: 111 })).toBe(110);
462
+ });
463
+
464
+ it('bins booleans', function () {
465
+ return expect(binner({ x: true })).toBe(0);
466
+ });
467
+
468
+ it('bins negative numbers', function () {
469
+ return expect(binner({ x: -12 })).toBe(-10);
470
+ });
471
+
472
+ it("doesn't bin strings", function () {
473
+ return expect(binner({ x: 'a' })).toBeNaN();
474
+ });
475
+
476
+ it("doesn't bin objects", function () {
477
+ return expect(binner({ x: { a: 1 } })).toBeNaN();
478
+ });
479
+ });
480
+ });
481
+
482
+ describe('aggregation grouping', function () {
483
+ describe('.groupAggregationsByType()', function () {
484
+ it('returns object with default Count aggregation when no aggregations provided', function () {
485
+ // Note: PivotData normalizes empty aggregations to a default Count
486
+ var pd = new utils.PivotData({
487
+ data: fixtureData,
488
+ aggregations: []
489
+ });
490
+ var grouped = pd.groupAggregationsByType();
491
+
492
+ expect(Object.keys(grouped)).toEqual(['Count']);
493
+ expect(grouped['Count']).toHaveLength(1);
494
+ });
495
+
496
+ it('groups aggregations by aggregatorName', function () {
497
+ var aggregations = [aggregationConfig('Count', ['name'], 'count-name'), aggregationConfig('Count', ['gender'], 'count-gender'), aggregationConfig('Sum', ['trials'], 'sum-trials')];
498
+ var pd = new utils.PivotData({
499
+ data: fixtureData,
500
+ aggregations: aggregations
501
+ });
502
+ var grouped = pd.groupAggregationsByType();
503
+
504
+ expect(Object.keys(grouped)).toEqual(['Count', 'Sum']);
505
+ expect(grouped['Count']).toHaveLength(2);
506
+ expect(grouped['Sum']).toHaveLength(1);
507
+ expect(grouped['Count'][0].key).toBe('count-name');
508
+ expect(grouped['Count'][1].key).toBe('count-gender');
509
+ expect(grouped['Sum'][0].key).toBe('sum-trials');
510
+ });
511
+
512
+ it('handles single aggregation', function () {
513
+ var aggregations = [aggregationConfig('Count', ['name'], 'count-name')];
514
+ var pd = new utils.PivotData({
515
+ data: fixtureData,
516
+ aggregations: aggregations
517
+ });
518
+ var grouped = pd.groupAggregationsByType();
519
+
520
+ expect(Object.keys(grouped)).toEqual(['Count']);
521
+ expect(grouped['Count']).toHaveLength(1);
522
+ expect(grouped['Count'][0].key).toBe('count-name');
523
+ });
524
+
525
+ it('handles multiple different aggregator types', function () {
526
+ var aggregations = [aggregationConfig('Count', ['name'], 'count-name'), aggregationConfig('Sum', ['trials'], 'sum-trials'), aggregationConfig('Average', ['successes'], 'avg-successes')];
527
+ var pd = new utils.PivotData({
528
+ data: fixtureData,
529
+ aggregations: aggregations
530
+ });
531
+ var grouped = pd.groupAggregationsByType();
532
+
533
+ expect(Object.keys(grouped)).toEqual(['Count', 'Sum', 'Average']);
534
+ expect(grouped['Count']).toHaveLength(1);
535
+ expect(grouped['Sum']).toHaveLength(1);
536
+ expect(grouped['Average']).toHaveLength(1);
537
+ });
538
+ });
539
+
540
+ describe('.getAggregationsByType()', function () {
541
+ it('returns aggregations for specific aggregator type', function () {
542
+ var aggregations = [aggregationConfig('Count', ['name'], 'count-name'), aggregationConfig('Count', ['gender'], 'count-gender'), aggregationConfig('Sum', ['trials'], 'sum-trials')];
543
+ var pd = new utils.PivotData({
544
+ data: fixtureData,
545
+ aggregations: aggregations
546
+ });
547
+ var countAggs = pd.getAggregationsByType('Count');
548
+ var sumAggs = pd.getAggregationsByType('Sum');
549
+
550
+ expect(countAggs).toHaveLength(2);
551
+ expect(countAggs.every(function (agg) {
552
+ return agg.aggregatorName === 'Count';
553
+ })).toBe(true);
554
+ expect(sumAggs).toHaveLength(1);
555
+ expect(sumAggs[0].aggregatorName).toBe('Sum');
556
+ });
557
+
558
+ it('returns empty array for non-existent aggregator type', function () {
559
+ var aggregations = [aggregationConfig('Count', ['name'], 'count-name')];
560
+ var pd = new utils.PivotData({
561
+ data: fixtureData,
562
+ aggregations: aggregations
563
+ });
564
+ var sumAggs = pd.getAggregationsByType('Sum');
565
+
566
+ expect(sumAggs).toEqual([]);
567
+ });
568
+ });
569
+ });
570
+ });
571
+ //# sourceMappingURL=Utilities-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/__tests__/Utilities-test.js"],"names":["utils","fixtureData","aggregationConfig","aggregatorName","vals","key","length","join","describe","aoaInput","pd","PivotData","data","it","expect","getAggregator","value","toBe","aggregations","aosInput","a","b","raggedAosInput","functionInput","record","rows","cols","getRowKeys","toEqual","getColKeys","numNotNull","numNull","Array","from","r","c","records","forEachMatchingRecord","gender","push","x","name","agg","val","format","aggregators","getAggregatorNames","alt","getAggregations","expectedPrimary","Object","keys","getPrimaryAggregation","objectContaining","getVal","tpl","aggregatorTemplates","count","countUnique","listUnique","average","sum","min","max","first","last","median","quantile","var","stdev","sumOverSum","fractionOf","naturalSort","sortedArr","NaN","Infinity","slice","sort","sortAs","numberFormat","nf","scaler","suffix","thousandsSep","decimalSep","prefix","digitsAfterDecimal","df","derivers","dateFormat","Date","binner","bin","toBeNaN","grouped","groupAggregationsByType","toHaveLength","countAggs","getAggregationsByType","sumAggs","every"],"mappings":"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","file":"Utilities-test.js","sourcesContent":["import * as utils from '../Utilities';\n/* eslint-disable no-magic-numbers */\n\n/*\n * decaffeinate suggestions:\n * DS101: Remove unnecessary use of Array.from\n * DS102: Remove unnecessary code created because of implicit returns\n * DS207: Consider shorter variations of null checks\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nconst fixtureData = [\n ['name', 'gender', 'colour', 'birthday', 'trials', 'successes'],\n ['Nick', 'male', 'blue', '1982-11-07', 103, 12],\n ['Jane', 'female', 'red', '1982-11-08', 95, 25],\n ['John', 'male', 'blue', '1982-12-08', 112, 30],\n ['Carol', 'female', 'yellow', '1983-12-08', 102, 14],\n];\n\nconst aggregationConfig = (aggregatorName, vals = [], key) => ({\n key: key || `${aggregatorName}-${vals.length ? vals.join('|') : 'none'}`,\n aggregatorName,\n vals,\n});\n\ndescribe(' utils', function () {\n describe('.PivotData()', function () {\n describe('with no options', function () {\n const aoaInput = [['a', 'b'], [1, 2], [3, 4]];\n const pd = new utils.PivotData({ data: aoaInput });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe(2));\n });\n\n describe('with array-of-array input', function () {\n const aoaInput = [['a', 'b'], [1, 2], [3, 4]];\n const pd = new utils.PivotData({\n data: aoaInput,\n aggregations: [aggregationConfig('Sum over Sum', ['a', 'b'])],\n });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4)));\n });\n\n describe('with array-of-object input', function () {\n const aosInput = [{ a: 1, b: 2 }, { a: 3, b: 4 }];\n const pd = new utils.PivotData({\n data: aosInput,\n aggregations: [aggregationConfig('Sum over Sum', ['a', 'b'])],\n });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4)));\n });\n\n describe('with ragged array-of-object input', function () {\n const raggedAosInput = [{ a: 1 }, { b: 4 }, { a: 3, b: 2 }];\n const pd = new utils.PivotData({\n data: raggedAosInput,\n aggregations: [aggregationConfig('Sum over Sum', ['a', 'b'])],\n });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4)));\n });\n\n describe('with function input', function () {\n const functionInput = function (record) {\n record({ a: 1, b: 2 });\n record({ a: 3, b: 4 });\n };\n const pd = new utils.PivotData({\n data: functionInput,\n aggregations: [aggregationConfig('Sum over Sum', ['a', 'b'])],\n });\n\n it('has the correct grand total value', () =>\n expect(pd.getAggregator([], []).value()).toBe((1 + 3) / (2 + 4)));\n });\n\n describe('with rows/cols', function () {\n const pd = new utils.PivotData({\n data: fixtureData,\n rows: ['name', 'colour'],\n cols: ['trials', 'successes'],\n });\n\n it('has correctly-ordered row keys', () =>\n expect(pd.getRowKeys()).toEqual([\n ['Carol', 'yellow'],\n ['Jane', 'red'],\n ['John', 'blue'],\n ['Nick', 'blue'],\n ]));\n\n it('has correctly-ordered col keys', () =>\n expect(pd.getColKeys()).toEqual([\n [95, 25],\n [102, 14],\n [103, 12],\n [112, 30],\n ]));\n\n it('can be iterated over', function () {\n let numNotNull = 0;\n let numNull = 0;\n for (const r of Array.from(pd.getRowKeys())) {\n for (const c of Array.from(pd.getColKeys())) {\n if (pd.getAggregator(r, c).value() !== null) {\n numNotNull++;\n } else {\n numNull++;\n }\n }\n }\n expect(numNotNull).toBe(4);\n expect(numNull).toBe(12);\n });\n\n it('returns matching records', function () {\n const records = [];\n pd.forEachMatchingRecord({ gender: 'male' }, x => records.push(x.name));\n expect(records).toEqual(['Nick', 'John']);\n });\n\n it('has a correct spot-checked aggregator', function () {\n const agg = pd.getAggregator(['Carol', 'yellow'], [102, 14]);\n const val = agg.value();\n expect(val).toBe(1);\n expect(agg.format(val)).toBe('1');\n });\n\n it('has a correct grand total aggregator', function () {\n const agg = pd.getAggregator([], []);\n const val = agg.value();\n expect(val).toBe(4);\n expect(agg.format(val)).toBe('4');\n });\n });\n\n describe('with multiple aggregators selected', function () {\n const pd = new utils.PivotData({\n data: fixtureData,\n rows: ['gender'],\n aggregators: utils.aggregators,\n aggregations: [\n { key: 'count-gender', aggregatorName: 'Count' },\n { key: 'sum-trials', aggregatorName: 'Sum', vals: ['trials'] },\n ],\n });\n\n it('lists all active aggregators', function () {\n expect(pd.getAggregatorNames()).toEqual(['Count', 'Sum']);\n });\n\n it('defaults to the primary aggregator when none specified', function () {\n expect(pd.getAggregator(['female'], []).value()).toBe(2);\n });\n\n it('can retrieve a specific aggregator by key', function () {\n expect(pd.getAggregator(['female'], [], 'sum-trials').value()).toBe(197);\n });\n\n it('falls back to aggregator names for backwards compatibility', function () {\n expect(pd.getAggregator(['female'], [], 'Sum').value()).toBe(197);\n });\n\n it('adds a default aggregation when none are supplied', function () {\n const alt = new utils.PivotData({\n data: fixtureData,\n rows: ['gender'],\n aggregators: utils.aggregators,\n });\n expect(alt.getAggregations().length).toBe(1);\n const expectedPrimary = Object.keys(utils.aggregators)[0];\n expect(alt.getAggregatorNames()).toEqual([expectedPrimary]);\n expect(alt.getPrimaryAggregation().aggregatorName).toBe(expectedPrimary);\n });\n\n it('respects legacy aggregatorName/vals when aggregations are omitted', function () {\n const alt = new utils.PivotData({\n data: fixtureData,\n rows: ['gender'],\n aggregators: utils.aggregators,\n aggregatorName: 'Sum',\n vals: ['trials'],\n });\n expect(alt.getAggregations()[0]).toEqual(\n expect.objectContaining({\n aggregatorName: 'Sum',\n vals: ['trials'],\n })\n );\n });\n\n it('ignores legacy aggregatorName/vals when aggregations are supplied', function () {\n const alt = new utils.PivotData({\n data: fixtureData,\n rows: ['gender'],\n aggregators: utils.aggregators,\n aggregatorName: 'Sum',\n vals: ['trials'],\n aggregations: [{ key: 'count-only', aggregatorName: 'Count' }],\n });\n expect(alt.getPrimaryAggregation().aggregatorName).toBe('Count');\n expect(alt.getPrimaryAggregation().vals).toEqual([]);\n });\n });\n });\n\n describe('.aggregatorTemplates', function () {\n const getVal = (agg, vals) => {\n return new utils.PivotData({\n data: fixtureData,\n aggregators: { agg },\n aggregations: [aggregationConfig('agg', vals)],\n })\n .getAggregator([], [])\n .value();\n };\n const tpl = utils.aggregatorTemplates;\n\n describe('.count', () =>\n it('works', () => expect(getVal(tpl.count(), [])).toBe(4)));\n\n describe('.countUnique', () =>\n it('works', () => expect(getVal(tpl.countUnique(), ['gender'])).toBe(2)));\n\n describe('.listUnique', () =>\n it('works', () =>\n expect(getVal(tpl.listUnique(), ['gender'])).toBe('male,female')));\n\n describe('.average', () =>\n it('works', () => expect(getVal(tpl.average(), ['trials'])).toBe(103)));\n\n describe('.sum', () =>\n it('works', () => expect(getVal(tpl.sum(), ['trials'])).toBe(412)));\n\n describe('.min', () =>\n it('works', () => expect(getVal(tpl.min(), ['trials'])).toBe(95)));\n\n describe('.max', () =>\n it('works', () => expect(getVal(tpl.max(), ['trials'])).toBe(112)));\n\n describe('.first', () =>\n it('works', () => expect(getVal(tpl.first(), ['name'])).toBe('Carol')));\n\n describe('.last', () =>\n it('works', () => expect(getVal(tpl.last(), ['name'])).toBe('Nick')));\n\n describe('.average', () =>\n it('works', () => expect(getVal(tpl.average(), ['trials'])).toBe(103)));\n\n describe('.median', () =>\n it('works', () => expect(getVal(tpl.median(), ['trials'])).toBe(102.5)));\n\n describe('.quantile', () =>\n it('works', function () {\n expect(getVal(tpl.quantile(0), ['trials'])).toBe(95);\n expect(getVal(tpl.quantile(0.1), ['trials'])).toBe(98.5);\n expect(getVal(tpl.quantile(0.25), ['trials'])).toBe(98.5);\n expect(getVal(tpl.quantile(1 / 3), ['trials'])).toBe(102);\n expect(getVal(tpl.quantile(1), ['trials'])).toBe(112);\n }));\n\n describe('.var', () =>\n it('works', () =>\n expect(getVal(tpl.var(), ['trials'])).toBe(48.666666666666686)));\n\n describe('.stdev', () =>\n it('works', () =>\n expect(getVal(tpl.stdev(), ['trials'])).toBe(6.976149845485451)));\n\n describe('.sumOverSum', () =>\n it('works', () =>\n expect(getVal(tpl.sumOverSum(), ['successes', 'trials'])).toBe(\n (12 + 25 + 30 + 14) / (95 + 102 + 103 + 112)\n )));\n\n describe('.fractionOf', () =>\n it('works', () =>\n expect(getVal(tpl.fractionOf(tpl.sum()), ['trials'])).toBe(1)));\n });\n\n describe('.naturalSort()', function () {\n const { naturalSort } = utils;\n\n const sortedArr = [\n null,\n NaN,\n -Infinity,\n '-Infinity',\n -3,\n '-3',\n -2,\n '-2',\n -1,\n '-1',\n 0,\n '2e-1',\n 1,\n '01',\n '1',\n 2,\n '002',\n '002e0',\n '02',\n '2',\n '2e-0',\n 3,\n 10,\n '10',\n '11',\n '12',\n '1e2',\n '112',\n Infinity,\n 'Infinity',\n '1a',\n '2a',\n '12a',\n '20a',\n 'A',\n 'A',\n 'NaN',\n 'a',\n 'a',\n 'a01',\n 'a012',\n 'a02',\n 'a1',\n 'a2',\n 'a12',\n 'a12',\n 'a21',\n 'a21',\n 'b',\n 'c',\n 'd',\n 'null',\n ];\n\n it('sorts naturally (null, NaN, numbers & numbery strings, Alphanum for text strings)', () =>\n expect(sortedArr.slice().sort(naturalSort)).toEqual(sortedArr));\n });\n\n describe('.sortAs()', function () {\n const { sortAs } = utils;\n\n it('sorts with unknown values sorted at the end', () =>\n expect([5, 2, 3, 4, 1].sort(sortAs([4, 3, 2]))).toEqual([4, 3, 2, 1, 5]));\n\n it('sorts lowercase after uppercase', () =>\n expect(['Ab', 'aA', 'aa', 'ab'].sort(sortAs(['Ab', 'Aa']))).toEqual([\n 'Ab',\n 'ab',\n 'aa',\n 'aA',\n ]));\n });\n\n describe('.numberFormat()', function () {\n const { numberFormat } = utils;\n\n it('formats numbers', function () {\n const nf = numberFormat();\n expect(nf(1234567.89123456)).toEqual('1,234,567.89');\n });\n\n it('formats booleans', function () {\n const nf = numberFormat();\n expect(nf(true)).toEqual('1.00');\n });\n\n it('formats numbers in strings', function () {\n const nf = numberFormat();\n expect(nf('1234567.89123456')).toEqual('1,234,567.89');\n });\n\n it(\"doesn't formats strings\", function () {\n const nf = numberFormat();\n expect(nf('hi there')).toEqual('');\n });\n\n it(\"doesn't formats objects\", function () {\n const nf = numberFormat();\n expect(nf({ a: 1 })).toEqual('');\n });\n\n it('formats percentages', function () {\n const nf = numberFormat({ scaler: 100, suffix: '%' });\n expect(nf(0.12345)).toEqual('12.35%');\n });\n\n it('adds separators', function () {\n const nf = numberFormat({ thousandsSep: 'a', decimalSep: 'b' });\n expect(nf(1234567.89123456)).toEqual('1a234a567b89');\n });\n\n it('adds prefixes and suffixes', function () {\n const nf = numberFormat({ prefix: 'a', suffix: 'b' });\n expect(nf(1234567.89123456)).toEqual('a1,234,567.89b');\n });\n\n it('scales and rounds', function () {\n const nf = numberFormat({ digitsAfterDecimal: 3, scaler: 1000 });\n expect(nf(1234567.89123456)).toEqual('1,234,567,891.235');\n });\n });\n\n describe('.derivers', function () {\n describe('.dateFormat()', function () {\n const df = utils.derivers.dateFormat(\n 'x',\n 'abc % %% %%% %a %y %m %n %d %w %x %H %M %S',\n true\n );\n\n it('formats date objects', () =>\n expect(df({ x: new Date('2015-01-02T23:43:11Z') })).toBe(\n 'abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11'\n ));\n\n it('formats input parsed by Date.parse()', function () {\n expect(df({ x: '2015-01-02T23:43:11Z' })).toBe(\n 'abc % %% %%% %a 2015 01 Jan 02 Fri 5 23 43 11'\n );\n\n expect(df({ x: 'bla' })).toBe('');\n });\n });\n\n describe('.bin()', function () {\n const binner = utils.derivers.bin('x', 10);\n\n it('bins numbers', function () {\n expect(binner({ x: 11 })).toBe(10);\n\n expect(binner({ x: 9 })).toBe(0);\n\n expect(binner({ x: 111 })).toBe(110);\n });\n\n it('bins booleans', () => expect(binner({ x: true })).toBe(0));\n\n it('bins negative numbers', () => expect(binner({ x: -12 })).toBe(-10));\n\n it(\"doesn't bin strings\", () => expect(binner({ x: 'a' })).toBeNaN());\n\n it(\"doesn't bin objects\", () => expect(binner({ x: { a: 1 } })).toBeNaN());\n });\n });\n\n describe('aggregation grouping', function () {\n describe('.groupAggregationsByType()', function () {\n it('returns object with default Count aggregation when no aggregations provided', function () {\n // Note: PivotData normalizes empty aggregations to a default Count\n const pd = new utils.PivotData({\n data: fixtureData,\n aggregations: [],\n });\n const grouped = pd.groupAggregationsByType();\n\n expect(Object.keys(grouped)).toEqual(['Count']);\n expect(grouped['Count']).toHaveLength(1);\n });\n\n it('groups aggregations by aggregatorName', function () {\n const aggregations = [\n aggregationConfig('Count', ['name'], 'count-name'),\n aggregationConfig('Count', ['gender'], 'count-gender'),\n aggregationConfig('Sum', ['trials'], 'sum-trials'),\n ];\n const pd = new utils.PivotData({\n data: fixtureData,\n aggregations,\n });\n const grouped = pd.groupAggregationsByType();\n\n expect(Object.keys(grouped)).toEqual(['Count', 'Sum']);\n expect(grouped['Count']).toHaveLength(2);\n expect(grouped['Sum']).toHaveLength(1);\n expect(grouped['Count'][0].key).toBe('count-name');\n expect(grouped['Count'][1].key).toBe('count-gender');\n expect(grouped['Sum'][0].key).toBe('sum-trials');\n });\n\n it('handles single aggregation', function () {\n const aggregations = [\n aggregationConfig('Count', ['name'], 'count-name'),\n ];\n const pd = new utils.PivotData({\n data: fixtureData,\n aggregations,\n });\n const grouped = pd.groupAggregationsByType();\n\n expect(Object.keys(grouped)).toEqual(['Count']);\n expect(grouped['Count']).toHaveLength(1);\n expect(grouped['Count'][0].key).toBe('count-name');\n });\n\n it('handles multiple different aggregator types', function () {\n const aggregations = [\n aggregationConfig('Count', ['name'], 'count-name'),\n aggregationConfig('Sum', ['trials'], 'sum-trials'),\n aggregationConfig('Average', ['successes'], 'avg-successes'),\n ];\n const pd = new utils.PivotData({\n data: fixtureData,\n aggregations,\n });\n const grouped = pd.groupAggregationsByType();\n\n expect(Object.keys(grouped)).toEqual(['Count', 'Sum', 'Average']);\n expect(grouped['Count']).toHaveLength(1);\n expect(grouped['Sum']).toHaveLength(1);\n expect(grouped['Average']).toHaveLength(1);\n });\n });\n\n describe('.getAggregationsByType()', function () {\n it('returns aggregations for specific aggregator type', function () {\n const aggregations = [\n aggregationConfig('Count', ['name'], 'count-name'),\n aggregationConfig('Count', ['gender'], 'count-gender'),\n aggregationConfig('Sum', ['trials'], 'sum-trials'),\n ];\n const pd = new utils.PivotData({\n data: fixtureData,\n aggregations,\n });\n const countAggs = pd.getAggregationsByType('Count');\n const sumAggs = pd.getAggregationsByType('Sum');\n\n expect(countAggs).toHaveLength(2);\n expect(countAggs.every(agg => agg.aggregatorName === 'Count')).toBe(true);\n expect(sumAggs).toHaveLength(1);\n expect(sumAggs[0].aggregatorName).toBe('Sum');\n });\n\n it('returns empty array for non-existent aggregator type', function () {\n const aggregations = [\n aggregationConfig('Count', ['name'], 'count-name'),\n ];\n const pd = new utils.PivotData({\n data: fixtureData,\n aggregations,\n });\n const sumAggs = pd.getAggregationsByType('Sum');\n\n expect(sumAggs).toEqual([]);\n });\n });\n });\n});\n"]}