Repository navigation
Expand file tree
/
Copy pathtest-analytics-sorting-236.js
More file actions
35 lines (35 loc) · 2.5 KB
/
Copy pathtest-analytics-sorting-236.js
File metadata and controls
35 lines (35 loc) · 2.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
'use strict';
const assert = require('assert');
const fs = require('fs');
const vm = require('vm');
let collators = 0;
const ctx = { window: {}, registerPage() {}, navigator: { languages: ['da'] }, Intl: { Collator: function(...args) { collators++; return new Intl.Collator(...args); } }, console, URLSearchParams, setInterval, clearInterval, setTimeout, clearTimeout };
vm.createContext(ctx);
vm.runInContext(fs.readFileSync('public/analytics.js', 'utf8'), ctx);
const sort = ctx.window._analyticsSortRows;
assert.strictEqual(typeof sort, 'function');
const rows = [{v:'Å'}, {v:'Ø'}, {v:'Æ'}, {v:'Z'}, {v:null}, {v:''}];
const values = result => Array.from(result, r => r.v);
assert.deepStrictEqual(values(sort(rows, r=>r.v, 'text', 'asc')), ['Z','Æ','Ø','Å',null,'']);
assert.deepStrictEqual(values(sort(rows, r=>r.v, 'text', 'desc')), ['Å','Ø','Æ','Z',null,'']);
const nums = [{v:null},{v:'2'},{v:0},{v:NaN},{v:'10'},{v:''},{v:Infinity}];
assert.deepStrictEqual(values(sort(nums,r=>r.v,'number','desc')), ['10','2',0,null,NaN,'',Infinity]);
assert.deepStrictEqual(values(sort(nums,r=>r.v,'number','asc')), [0,'2','10',null,NaN,'',Infinity]);
const ties = [{v:'A',i:1},{v:'a',i:2}];
assert.deepStrictEqual(Array.from(sort(ties,r=>r.v,'text','desc'),r=>r.i),[1,2]);
assert.deepStrictEqual(values(rows), ['Å','Ø','Æ','Z',null,'']);
const next = ctx.window._analyticsNextSort;
assert.strictEqual(next({col:'name',dir:'asc'},'packets','number').dir,'desc');
assert.strictEqual(next({col:'name',dir:'asc'},'role','text').dir,'asc');
assert.strictEqual(next({col:'packets',dir:'desc'},'packets','number').dir,'asc');
let calls = 0;
sort(Array.from({length: 2000}, (_,i)=>({v:2000-i})), r=>{ calls++; return r.v; }, 'number', 'desc');
assert.strictEqual(calls,2000,'sort keys are extracted exactly once per row');
const hashes = h => Array.from(ctx.window._analyticsSortChannels(h.map(hash=>({hash})), 'hash', 'asc'), r=>r.hash);
assert.deepStrictEqual(hashes([12,2]),[2,12]);
assert.deepStrictEqual(hashes(['bravo','alpha']),['alpha','bravo']);
assert.deepStrictEqual(hashes(['bravo',2,'alpha']),[2,'alpha','bravo']);
const dates = [{v:null},{v:'invalid'},{v:'2026-01-02T00:00:00Z'},{v:'2026-01-01T00:00:00Z'}];
assert.deepStrictEqual(values(sort(dates,r=>r.v,'date','desc')), ['2026-01-02T00:00:00Z','2026-01-01T00:00:00Z',null,'invalid']);
assert.strictEqual(collators,1,'collator is constructed once, not per comparison or sort');
console.log('Analytics shared sorting: locale, missing values, stable ties, numeric coercion and direction passed');