mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-21 03:51:45 +08:00
181 lines
4.7 KiB
TypeScript
181 lines
4.7 KiB
TypeScript
import {
|
|
Bound,
|
|
getCommonBound,
|
|
inflateBound,
|
|
transformPointsToNewBound,
|
|
} from '@blocksuite/global/utils';
|
|
import { describe, expect, it } from 'vitest';
|
|
|
|
describe('bound utils', () => {
|
|
it('Bound basic', () => {
|
|
const bound = new Bound(1, 1, 2, 2);
|
|
const serialized = bound.serialize();
|
|
expect(serialized).toBe('[1,1,2,2]');
|
|
expect(Bound.deserialize(serialized)).toMatchObject(bound);
|
|
expect(bound.center).toMatchObject([2, 2]);
|
|
expect(bound.minX).toBe(1);
|
|
expect(bound.minY).toBe(1);
|
|
expect(bound.maxX).toBe(3);
|
|
expect(bound.maxY).toBe(3);
|
|
expect(bound.tl).toMatchObject([1, 1]);
|
|
expect(bound.tr).toMatchObject([3, 1]);
|
|
expect(bound.bl).toMatchObject([1, 3]);
|
|
expect(bound.br).toMatchObject([3, 3]);
|
|
});
|
|
|
|
it('from', () => {
|
|
const b1 = new Bound(1, 1, 2, 2);
|
|
const b2 = Bound.from(b1);
|
|
expect(b1).toMatchObject(b2);
|
|
});
|
|
|
|
it('getCommonBound basic', () => {
|
|
const bounds = Array.from({ length: 10 })
|
|
.fill(0)
|
|
.map((_, index) => {
|
|
return {
|
|
x: index,
|
|
y: index,
|
|
w: 1,
|
|
h: 1,
|
|
};
|
|
});
|
|
expect(getCommonBound(bounds)).toMatchObject({
|
|
x: 0,
|
|
y: 0,
|
|
w: 10,
|
|
h: 10,
|
|
});
|
|
});
|
|
|
|
it('getCommonBound parameters length equal to 0', () => {
|
|
expect(getCommonBound([])).toBeNull();
|
|
});
|
|
|
|
it('getCommonBound parameters length less than 2', () => {
|
|
const b1 = {
|
|
x: 0,
|
|
y: 0,
|
|
w: 1,
|
|
h: 1,
|
|
};
|
|
expect(getCommonBound([b1])).toMatchObject(b1);
|
|
});
|
|
|
|
it('inflateBound', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = inflateBound(a, 4);
|
|
expect(b.serialize()).toBe('[-2,-2,14,14]');
|
|
|
|
expect(() => inflateBound(a, -12)).toThrowError(
|
|
'Invalid delta range or bound size.'
|
|
);
|
|
});
|
|
|
|
it('transformPointsToNewBound basic', () => {
|
|
const a = new Bound(0, 0, 20, 20);
|
|
const b = new Bound(4, 4, 18, 18);
|
|
const marginA = 4;
|
|
const marginB = 6;
|
|
const points = [{ x: 6, y: 6, other: 10 }];
|
|
const transformed = transformPointsToNewBound(
|
|
points,
|
|
a,
|
|
marginA,
|
|
b,
|
|
marginB
|
|
);
|
|
|
|
expect(transformed.bound.serialize()).toBe(b.serialize());
|
|
expect(transformed.points[0]).toMatchObject({
|
|
x: 7,
|
|
y: 7,
|
|
other: 10,
|
|
});
|
|
});
|
|
|
|
it('transformPointsToNewBound, new bound too small', () => {
|
|
const a = new Bound(0, 0, 20, 20);
|
|
const b = new Bound(4, 4, 4, 4);
|
|
const marginA = 4;
|
|
const marginB = 6;
|
|
const points = [{ x: 6, y: 6, other: 10 }];
|
|
const transformed = transformPointsToNewBound(
|
|
points,
|
|
a,
|
|
marginA,
|
|
b,
|
|
marginB
|
|
);
|
|
|
|
expect(transformed.bound.serialize()).toBe('[4,4,13,13]');
|
|
expect(transformed.points[0].x).toBeCloseTo(6.1667);
|
|
expect(transformed.points[0].y).toBeCloseTo(6.1667);
|
|
expect(transformed.points[0].other).toBe(10);
|
|
});
|
|
|
|
it('intersectLine', () => {
|
|
const bound = new Bound(0, 0, 10, 10);
|
|
expect(bound.intersectLine([0, 0], [10, 10])).toBeTruthy();
|
|
});
|
|
|
|
it('intersectline no intersection', () => {
|
|
const bound = new Bound(0, 0, 10, 10);
|
|
expect(bound.intersectLine([0, -1], [10, -10])).toBeFalsy();
|
|
});
|
|
|
|
it('isIntersectWithBound', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(5, 5, 10, 10);
|
|
expect(a.isIntersectWithBound(b)).toBeTruthy();
|
|
});
|
|
|
|
it('isIntersectWithBound no intersection', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(11, 11, 10, 10);
|
|
expect(a.isIntersectWithBound(b)).toBeFalsy();
|
|
});
|
|
|
|
it('unite', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(5, 5, 10, 10);
|
|
expect(a.unite(b).serialize()).toBe('[0,0,15,15]');
|
|
});
|
|
|
|
it('isHorizontalCross', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(5, 5, 10, 10);
|
|
expect(a.isHorizontalCross(b)).toBeTruthy();
|
|
});
|
|
|
|
it('isHorizontalCross no intersection', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(11, 11, 10, 10);
|
|
expect(a.isHorizontalCross(b)).toBeFalsy();
|
|
});
|
|
|
|
it('isVerticalCross', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(5, 5, 10, 10);
|
|
expect(a.isVerticalCross(b)).toBeTruthy();
|
|
});
|
|
|
|
it('isVerticalCross no intersection', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(11, 11, 10, 10);
|
|
expect(a.isVerticalCross(b)).toBeFalsy();
|
|
});
|
|
|
|
it('horizontalDistance', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(15, 15, 10, 10);
|
|
expect(a.horizontalDistance(b)).toBe(5);
|
|
});
|
|
|
|
it('verticalDistance', () => {
|
|
const a = new Bound(0, 0, 10, 10);
|
|
const b = new Bound(15, 15, 10, 10);
|
|
expect(a.verticalDistance(b)).toBe(5);
|
|
});
|
|
});
|