Files
ohif-viewer/extensions/cornerstone/src/utils/segmentUtils.test.ts
T

516 lines
13 KiB
TypeScript

import { handleSegmentChange } from './segmentUtils';
describe('handleSegmentChange', () => {
const mockSegmentationService = {
getSegmentation: jest.fn(),
getActiveSegment: jest.fn(),
setActiveSegment: jest.fn(),
jumpToSegmentNext: jest.fn(),
};
const mockSegmentation = {
segments: {
'1': {
segmentIndex: 1,
label: 'Segment 1',
},
'2': {
segmentIndex: 2,
label: 'Segment 2',
},
'3': {
segmentIndex: 3,
label: 'Segment 3',
},
},
};
const defaultParameters = {
direction: 1,
segmentationId: 'test-segmentation-id',
viewportId: 'test-viewport-id',
selectedSegmentObjectIndex: 0,
// @ts-expect-error - only part of the SegmentationService is needed
segmentationService: mockSegmentationService as AppTypes.SegmentationService,
};
beforeEach(() => {
jest.clearAllMocks();
mockSegmentationService.getSegmentation.mockReturnValue(mockSegmentation);
});
it('should move to next segment when direction is positive and activeSegment is null', () => {
const direction = 1;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.getSegmentation).toHaveBeenCalledWith(
defaultParameters.segmentationId
);
expect(mockSegmentationService.getActiveSegment).toHaveBeenCalledWith(
defaultParameters.viewportId
);
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
2
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
2,
undefined,
direction
);
});
it('should move to previous segment when direction is negative and activeSegment is null', () => {
const direction = -1;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 1,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1,
undefined,
direction
);
});
it('should update selectedSegmentObjectIndex when activeSegment is found', () => {
const direction = 1;
const mockActiveSegment = {
segmentIndex: 2,
};
mockSegmentationService.getActiveSegment.mockReturnValue(mockActiveSegment);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3,
undefined,
direction
);
});
it('should loop to first segment when going beyond last segment', () => {
const direction = 1;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 2,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1,
undefined,
direction
);
});
it('should loop to last segment when going before first segment', () => {
const direction = -1;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3,
undefined,
direction
);
});
it('should handle direction with value greater than 1', () => {
const direction = 2;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3,
undefined,
direction
);
});
it('should handle direction with value less than -1', () => {
const direction = -2;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 1,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3,
undefined,
direction
);
});
it('should handle single segment scenario with positive direction', () => {
const direction = 1;
const singleSegmentSegmentation = {
segments: {
'1': {
segmentIndex: 1,
label: 'Only Segment',
},
},
};
mockSegmentationService.getSegmentation.mockReturnValue(singleSegmentSegmentation);
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1,
undefined,
direction
);
});
it('should handle single segment scenario with negative direction', () => {
const direction = -1;
const singleSegmentSegmentation = {
segments: {
'1': {
segmentIndex: 1,
label: 'Only Segment',
},
},
};
mockSegmentationService.getSegmentation.mockReturnValue(singleSegmentSegmentation);
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1,
undefined,
direction
);
});
it('should handle activeSegment not found in segments', () => {
const direction = 1;
const mockActiveSegment = {
segmentIndex: 99,
};
mockSegmentationService.getActiveSegment.mockReturnValue(mockActiveSegment);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1,
undefined,
direction
);
});
it('should handle zero direction', () => {
const direction = 0;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 1,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
2
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
2,
undefined,
direction
);
});
it('should handle segments with non-sequential indices', () => {
const direction = 1;
const nonSequentialSegmentation = {
segments: {
'5': {
segmentIndex: 5,
label: 'Segment 5',
},
'10': {
segmentIndex: 10,
label: 'Segment 10',
},
'15': {
segmentIndex: 15,
label: 'Segment 15',
},
},
};
mockSegmentationService.getSegmentation.mockReturnValue(nonSequentialSegmentation);
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
10
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
10,
undefined,
direction
);
});
it('should handle wrap around with non-sequential indices', () => {
const direction = 1;
const nonSequentialSegmentation = {
segments: {
'5': {
segmentIndex: 5,
label: 'Segment 5',
},
'10': {
segmentIndex: 10,
label: 'Segment 10',
},
},
};
mockSegmentationService.getSegmentation.mockReturnValue(nonSequentialSegmentation);
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 1,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
5
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
5,
undefined,
direction
);
});
it('should handle empty segments object', () => {
const direction = 1;
const emptySegmentation = {
segments: {},
};
mockSegmentationService.getSegmentation.mockReturnValue(emptySegmentation);
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
undefined
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
undefined,
undefined,
direction
);
});
it('should handle large positive direction that wraps multiple times', () => {
const direction = 5;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 1,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1,
undefined,
direction
);
});
it('should handle large negative direction that wraps multiple times', () => {
const direction = -5;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 1,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
3,
undefined,
direction
);
});
it('should handle activeSegment with segmentIndex 0', () => {
const direction = 1;
const mockActiveSegment = {
segmentIndex: 0,
};
mockSegmentationService.getActiveSegment.mockReturnValue(mockActiveSegment);
handleSegmentChange({
...defaultParameters,
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
defaultParameters.segmentationId,
1,
undefined,
direction
);
});
it('should use different viewport and segmentation IDs', () => {
const direction = 1;
mockSegmentationService.getActiveSegment.mockReturnValue(null);
handleSegmentChange({
...defaultParameters,
segmentationId: 'different-segmentation-id',
viewportId: 'different-viewport-id',
direction,
selectedSegmentObjectIndex: 0,
});
expect(mockSegmentationService.getSegmentation).toHaveBeenCalledWith(
'different-segmentation-id'
);
expect(mockSegmentationService.getActiveSegment).toHaveBeenCalledWith('different-viewport-id');
expect(mockSegmentationService.setActiveSegment).toHaveBeenCalledWith(
'different-segmentation-id',
2
);
expect(mockSegmentationService.jumpToSegmentNext).toHaveBeenCalledWith(
'different-segmentation-id',
2,
undefined,
direction
);
});
});