import test from 'node:test';import assert from 'node:assert/strict'; import {timelineWindow,visibleTimelineSegment,timelineGrabOffset,timelineDropSlot,timelineHourTicks} from '../src/dispositionTimelineRange.mjs'; const range={startHour:8,endHourExclusive:19,configured:true,warning:''},display=timelineWindow(range); test('configured hours and full-day switch share the unchanged24hour domain',()=>{assert.deepEqual(display,{start:8,end:19,hours:11});assert.deepEqual(timelineWindow(range,true),{start:0,end:24,hours:24});assert.deepEqual(timelineWindow({startHour:20,endHourExclusive:8}),timelineWindow());}); test('segments crossing the visible boundaries are clipped without changing their original bounds',()=>{const job={start:6*6,end:10*6};const clip=visibleTimelineSegment(job,display,6);assert.equal(clip.start,48);assert.equal(clip.end,60);assert.equal(clip.left,0);assert.equal(clip.width,100*2/11);assert.deepEqual(job,{start:36,end:60});assert.equal(visibleTimelineSegment({start:0,end:48},display,6),null);assert.equal(visibleTimelineSegment({start:114,end:120},display,6),null);}); test('grab offset includes the hidden beginning of a clipped job',()=>{const job={start:36,end:60};assert.equal(timelineGrabOffset(job,display,6,0),12);assert.equal(timelineGrabOffset(job,display,6,.5),18);assert.equal(timelineDropSlot(display,6,3/11,18),48);}); test('drop time follows displayed hours and remains bounded by actual day',()=>{assert.equal(timelineDropSlot(display,6,1/11,0),54);assert.equal(timelineDropSlot(display,6,1,0),114);assert.equal(timelineDropSlot(display,6,0,100),0);assert.equal(timelineDropSlot(timelineWindow(),6,1,0),143);}); test('hour labels include both display boundaries without a distorted last interval',()=>{assert.deepEqual(timelineHourTicks(display),[8,10,12,14,16,18,19]);assert.deepEqual(timelineHourTicks({start:23,end:24,hours:1}),[23,24]);});