Skip to content

Commit

Permalink
test: add missing test case
Browse files Browse the repository at this point in the history
  • Loading branch information
lumixraku committed Mar 1, 2025
1 parent 4202c2e commit 4267041
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 64 deletions.
53 changes: 47 additions & 6 deletions packages/sheets/src/services/ref-range/__tests__/utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@
*/

import type { IMutationInfo, IRange } from '@univerjs/core';
import { beforeEach, describe, expect, it } from 'vitest';
import type { IRemoveSheetMutationParams } from '../../../basics';

import type { IMoveRowsMutationParams } from '../../../commands/mutations/move-rows-cols.mutation';
import { beforeEach, describe, expect, it } from 'vitest';
import { MoveRowsMutation } from '../../../commands/mutations/move-rows-cols.mutation';
import { RemoveSheetMutation } from '../../../commands/mutations/remove-sheet.mutation';
import { EffectRefRangId } from '../type';
import {
adjustRangeOnMutation,
Expand All @@ -39,10 +43,6 @@ import {
handleRemoveRowCommon,
runRefRangeMutations,
} from '../util';
import { RemoveSheetMutation } from '../../../commands/mutations/remove-sheet.mutation';
import type { IRemoveSheetMutationParams } from '../../../basics';
import type { IMoveRowsMutationParams } from '../../../commands/mutations/move-rows-cols.mutation';
import { MoveRowsMutation } from '../../../commands/mutations/move-rows-cols.mutation';

const countRange = ([a, b, c, d]: readonly [number, number, number, number]) => (a * 1000 + b * 100 + c * 10 + d);

Expand Down Expand Up @@ -991,7 +991,22 @@ describe('test ref-range move', () => {
const result = runRefRangeMutations(operators!, targetRange);
expect(result).toEqual({ startRow: 0, endRow: 99, startColumn: 18, endColumn: 19 });
});

it('the targetRange is on the range start', () => {
const targetRange = { startRow: 0, endRow: 99, startColumn: 5, endColumn: 6 };

const operators = handleInsertCol(
{
id: EffectRefRangId.InsertColCommandId,
params: { range, unitId: '', subUnitId: '', direction: '' as any },
},
targetRange
);
const result = runRefRangeMutations(operators!, targetRange);
expect(result).toEqual({ startRow: 0, endRow: 99, startColumn: 11, endColumn: 12 });
});
});

describe('handleInsertRow', () => {
let range: IRange;
beforeEach(() => {
Expand Down Expand Up @@ -1033,7 +1048,7 @@ describe('test ref-range move', () => {
const result = runRefRangeMutations(operators!, targetRange);
expect(result).toEqual({ startRow: 4, endRow: 17, endColumn: 99, startColumn: 0 });
});
it('the targetRange is overlap with range', () => {
it('the targetRange is overlap with range', () => {
const targetRange = { startRow: 4, endRow: 6, endColumn: 99, startColumn: 0 };
const operators = handleInsertRow(
{
Expand All @@ -1057,6 +1072,32 @@ describe('test ref-range move', () => {
const result = runRefRangeMutations(operators!, targetRange);
expect(result).toEqual({ startRow: 18, endColumn: 99, startColumn: 0, endRow: 19 });
});

it('the targetRange is on the range start', () => {
const targetRange = { startRow: 5, endRow: 6, endColumn: 99, startColumn: 0 };
const operators = handleInsertRow(
{
id: EffectRefRangId.InsertRowCommandId,
params: { range, unitId: '', subUnitId: '', direction: '' as any },
},
targetRange
);
const result = runRefRangeMutations(operators!, targetRange);
expect(result).toEqual({ startRow: 11, endColumn: 99, startColumn: 0, endRow: 12 });
});

it('the targetRange is overlap range 2', () => {
const targetRange = { startRow: 4, endRow: 6, endColumn: 99, startColumn: 0 };
const operators = handleInsertRow(
{
id: EffectRefRangId.InsertRowCommandId,
params: { range, unitId: '', subUnitId: '', direction: '' as any },
},
targetRange
);
const result = runRefRangeMutations(operators!, targetRange);
expect(result).toEqual({ startRow: 4, endRow: 12, endColumn: 99, startColumn: 0 });
});
});
describe('handleMoveRange', () => {
describe('fromRange and toRange is no overlap', () => {
Expand Down
120 changes: 62 additions & 58 deletions packages/sheets/src/services/ref-range/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -561,71 +561,75 @@ export const handleReorderRange = (param: IReorderRangeCommand, targetRange: IRa
return [];
};

// see docs/tldr/ref-range/insert-rows-cols.tldr
/**
* see docs/tldr/ref-range/insert-rows-cols.tldr
* calculate insert steps(move step) or expand size(length) to ref range.
*
* @param _insertRange inserted range
* @param _targetRange ref range
* @returns {step: number, length: number} step means inserted count of row/col before ref range, that would cause range move few cells(steps) afterward.
* length means expand size of row/col in ref range, that would make ref range larger than before.
*/
export const handleBaseInsertRange = (_insertRange: IRange, _targetRange: IRange) => {
const insertRange = handleRangeTypeInput(_insertRange);
const targetRange = handleRangeTypeInput(_targetRange);
const getLength = (range: IRange): number => range.endColumn - range.startColumn + 1;
if (insertRange.startRow <= targetRange.startRow && insertRange.endRow >= targetRange.endRow) {
if (
// 2
// Case 2: Overlap on the left side
// Target range starts before the insert range and ends within the insert range boundaries
// targetRange: |----------|
// insertRange: |-------|
(targetRange.startColumn < insertRange.startColumn &&
targetRange.endColumn >= insertRange.startColumn &&
targetRange.endColumn <= insertRange.endColumn)
||
// 6
// Case 6: Fully overlapping on both sides
// Target range starts before the insert range and ends after the insert range
// targetRange: |----------------|
// insertRange: |-------|
(targetRange.startColumn < insertRange.startColumn && targetRange.endColumn >= insertRange.endColumn) ||

// Case 7: Exact start overlap but target ends after insert
// Target range starts at the same point as the insert range but ends after the insert range
// targetRange: |---------|
// insertRange: |-----|
(targetRange.startColumn === insertRange.startColumn && targetRange.endColumn > insertRange.endColumn)
) {
const length = getLength(insertRange);
return { step: 0, length };
}
if (!(insertRange.startRow <= targetRange.startRow && insertRange.endRow >= targetRange.endRow)) {
return { step: 0, length: 0 };
}

if (
// 3
// Case 3: Fully contained
// Target range is completely within the insert range
// targetRange: |---|
// insertRange: |-------|
(targetRange.startColumn >= insertRange.startColumn && targetRange.endColumn <= insertRange.endColumn) ||
// 4
// Case 4: Overlap on the right side
// Target range starts within the insert range and ends after the insert range
// targetRange: |---------|
// insertRange: |-------|
(targetRange.startColumn > insertRange.startColumn &&
targetRange.startColumn <= insertRange.endColumn &&
targetRange.endColumn > insertRange.endColumn) ||
//5
// Case 5: No overlap (target range starts after the insert range ends)
// targetRange: |-------|
// insertRange: |-------|
targetRange.startColumn >= insertRange.endColumn ||

// Case 8: Exact end overlap but target starts before insert
// Target range ends at the same point as the insert range but starts before the insert range
// targetRange: |-------|
// insertRange: |---|
(targetRange.endColumn === insertRange.endColumn && targetRange.startColumn < insertRange.startColumn)
// expand range, that means insert new rows/cols in target range
if (
// 2
// Case 2: Overlap on the left side
// Target range starts before the insert range and ends within the insert range boundaries
// targetRange: |----------|
// insertRange: |-------|
// insertRange:
(targetRange.startColumn < insertRange.startColumn &&
targetRange.endColumn >= insertRange.startColumn &&
targetRange.endColumn <= insertRange.endColumn)
||
// 6
// Case 6: Fully overlapping on both sides
// Target range starts before the insert range and ends after the insert range
// targetRange: |----------------|
// insertRange: |-------|
(targetRange.startColumn < insertRange.startColumn && targetRange.endColumn >= insertRange.endColumn)

// (targetRange.startColumn === insertRange.startColumn && targetRange.endColumn > insertRange.endColumn)
) {
const length = getLength(insertRange);
return { step: 0, length };
}

) {
const step = getLength(insertRange);
return { step, length: 0 };
}
// make range shifted backward, that means insert new rows/cols before target range
if (
// 3
// Case 3: Fully contained
// Target range is completely within the insert range
// targetRange: |---|
// insertRange: |-------|
(targetRange.startColumn >= insertRange.startColumn && targetRange.endColumn <= insertRange.endColumn) ||
// 4
// Case 4: Overlap on the right side
// Target range starts within the insert range and ends after the insert range
// targetRange: |---------|
// insertRange: |-------|
(targetRange.startColumn >= insertRange.startColumn &&
targetRange.startColumn <= insertRange.endColumn &&
targetRange.endColumn > insertRange.endColumn) ||
//5
// Case 5: No overlap (target range starts after the insert range ends)
// targetRange: |-------|
// insertRange: |-------|
targetRange.startColumn >= insertRange.endColumn

) {
const step = getLength(insertRange);
return { step, length: 0 };
}

return { step: 0, length: 0 };
};

Expand Down

0 comments on commit 4267041

Please sign in to comment.