schlechtenburg/packages/rich-text/lib/test/split.test.ts
2024-10-08 09:15:26 +02:00

231 lines
4.5 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import deepFreeze from 'deep-freeze';
import { split } from '../split';
import { getSparseArrayLength } from './helpers';
describe( 'split', () => {
const em = { type: 'em' };
it( 'should split', () => {
const record = {
start: 5,
end: 10,
formats: [ , , , , [ em ], [ em ], [ em ], , , , , , , ],
replacements: [ , , , , , , , , , , , , , ],
text: 'one two three',
};
const expected = [
{
formats: [ , , , , [ em ], [ em ] ],
replacements: [ , , , , , , ],
text: 'one tw',
},
{
start: 0,
end: 0,
formats: [ [ em ], , , , , , , ],
replacements: [ , , , , , , , ],
text: 'o three',
},
];
const result = split( deepFreeze( record ), 6, 6 );
expect( result ).toEqual( expected );
result.forEach( ( item, index ) => {
expect( item ).not.toBe( record );
expect( getSparseArrayLength( item.formats ) ).toBe(
getSparseArrayLength( expected[ index ].formats )
);
} );
} );
it( 'should split with selection', () => {
const record = {
formats: [ , , , , [ em ], [ em ], [ em ], , , , , , , ],
replacements: [ , , , , , , , , , , , , , ],
text: 'one two three',
start: 6,
end: 6,
};
const expected = [
{
formats: [ , , , , [ em ], [ em ] ],
replacements: [ , , , , , , ],
text: 'one tw',
},
{
formats: [ [ em ], , , , , , , ],
replacements: [ , , , , , , , ],
text: 'o three',
start: 0,
end: 0,
},
];
const result = split( deepFreeze( record ) );
expect( result ).toEqual( expected );
result.forEach( ( item, index ) => {
expect( item ).not.toBe( record );
expect( getSparseArrayLength( item.formats ) ).toBe(
getSparseArrayLength( expected[ index ].formats )
);
} );
} );
it( 'should split empty', () => {
const record = {
formats: [],
replacements: [],
text: '',
start: 0,
end: 0,
};
const expected = [
{
formats: [],
replacements: [],
text: '',
},
{
formats: [],
replacements: [],
text: '',
start: 0,
end: 0,
},
];
const result = split( deepFreeze( record ) );
expect( result ).toEqual( expected );
result.forEach( ( item, index ) => {
expect( item ).not.toBe( record );
expect( getSparseArrayLength( item.formats ) ).toBe(
getSparseArrayLength( expected[ index ].formats )
);
} );
} );
it( 'should split search', () => {
const record = {
start: 6,
end: 16,
formats: [
,
,
,
,
[ em ],
[ em ],
[ em ],
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
],
replacements: [ , , , , , , , , , , , , , , , , , , , , , , , ],
text: 'one two three four five',
};
const expected = [
{
formats: [ , , , ],
replacements: [ , , , ],
text: 'one',
},
{
start: 2,
end: 3,
formats: [ [ em ], [ em ], [ em ] ],
replacements: [ , , , ],
text: 'two',
},
{
start: 0,
end: 5,
formats: [ , , , , , ],
replacements: [ , , , , , ],
text: 'three',
},
{
start: 0,
end: 2,
formats: [ , , , , ],
replacements: [ , , , , ],
text: 'four',
},
{
formats: [ , , , , ],
replacements: [ , , , , ],
text: 'five',
},
];
const result = split( deepFreeze( record ), ' ' );
expect( result ).toEqual( expected );
result.forEach( ( item, index ) => {
expect( item ).not.toBe( record );
expect( getSparseArrayLength( item.formats ) ).toBe(
getSparseArrayLength( expected[ index ].formats )
);
} );
} );
it( 'should split search 2', () => {
const record = {
start: 5,
end: 6,
formats: [ , , , , [ em ], [ em ], [ em ], , , , , , , ],
replacements: [ , , , , , , , , , , , , , ],
text: 'one two three',
};
const expected = [
{
formats: [ , , , ],
replacements: [ , , , ],
text: 'one',
},
{
start: 1,
end: 2,
formats: [ [ em ], [ em ], [ em ] ],
replacements: [ , , , ],
text: 'two',
},
{
formats: [ , , , , , ],
replacements: [ , , , , , ],
text: 'three',
},
];
const result = split( deepFreeze( record ), ' ' );
expect( result ).toEqual( expected );
result.forEach( ( item, index ) => {
expect( item ).not.toBe( record );
expect( getSparseArrayLength( item.formats ) ).toBe(
getSparseArrayLength( expected[ index ].formats )
);
} );
} );
it( 'should not split without selection', () => {
const record = {
formats: [],
replacements: [],
text: '',
};
expect( split( deepFreeze( record ) ) ).toBe( undefined );
} );
} );