import test from 'node:test';import assert from 'node:assert/strict'; import {statisticsMetric,statisticsChartData,statisticsChartProblem,normalizedChartData} from '../src/statisticsChartData.mjs'; const result={splits:['CUSTOMER'],periods:[{interval:{from:'2028-01-01',to:'2028-12-31'},rows:[{period:'2028-01',split0:'A',orders:2,revenue:100,courierRevenue:50},{period:'2028-02',split0:'A',orders:1,revenue:300,courierRevenue:240},{period:'2028-02',split0:'B',orders:1,revenue:-20,courierRevenue:null}]},{interval:{from:'2027-01-01',to:'2027-12-31'},rows:[{period:'2027-01',split0:'B',orders:3,revenue:60,courierRevenue:30}]}]}; test('comparison aligns exact groups across independent intervals and includes absent groups as zero',()=>{const data=statisticsChartData(result,'revenue','comparison',{CUSTOMER:'Kunde'});assert.deepEqual(data.series,[{name:'Kunde: A',values:[400,0]},{name:'Kunde: B',values:[-20,60]}]);assert.equal(data.categories.length,2);}); test('percentage is recalculated from totals, never summed; unknown remuneration stays unknown',()=>{const data=statisticsChartData(result,'ratio','comparison',{});assert.ok(Math.abs(data.series[0].values[0]-27.5)<1e-9);assert.equal(data.series[1].values[0],null);assert.equal(statisticsMetric({revenue:0,courierRevenue:0},'ratio'),null);}); test('single-period rows retain dates, groups and negative values',()=>{const data=statisticsChartData(result,'revenue','0',{CUSTOMER:'Kunde'});assert.deepEqual(data.series[0].values,[100,300,-20]);assert.equal(data.categories[0],'2028-01 · Kunde: A');assert.match(statisticsChartProblem(data,'PIE'),/nichtnegative/);assert.equal(statisticsChartProblem(data,'BAR'),'');}); test('normalized values retain zero totals; missing and excessive datasets are explicit',()=>{const data={categories:['A','B'],series:[{name:'X',values:[3,0]},{name:'Y',values:[1,0]}]};assert.deepEqual(normalizedChartData(data).series.map(s=>s.values),[[75,0],[25,0]]);assert.match(statisticsChartProblem({...data,series:[{name:'X',values:[null,1]}]},'NORMALIZED'),/vollständige/);assert.match(statisticsChartProblem({...data,categories:Array(121).fill('A')},'BAR'),/eingrenzen/);}); test('surcharge margin uses surcharge values and propagates unknown remuneration across periods',()=>{const data={splits:['CUSTOMER'],periods:[{interval:{from:'2028-01-01',to:'2028-12-31'},rows:[{period:'01',split0:'A',fuelMarkup:20,courierFuelMarkup:15,revenue:999},{period:'02',split0:'A',fuelMarkup:30,courierFuelMarkup:40}]},{interval:{from:'2027-01-01',to:'2027-12-31'},rows:[{period:'01',split0:'A',fuelMarkup:10,courierFuelMarkup:null}]}]};assert.deepEqual(statisticsChartData(data,'fuelMargin','comparison').series[0].values,[-5,null]);assert.equal(statisticsMetric({fuelMarkup:0,courierFuelMarkup:0},'fuelMargin'),0);});