mirror of
https://github.com/enso-org/enso.git
synced 2024-12-22 23:31:42 +03:00
19d0707334
Further AST integration and API refinement before introducing the new synchronization mechanism. closes #8609 # Important Notes API changes: - Renamed `Ast.parseExpression` / `Ast.parse` to better reflect their usage: - `Ast.parse` returns a block or a single expression, depending on its input; this is convenient for expressions expected to be single-line. - `Ast.parseBlock` always treats its input as a block; this is suitable for parsing a file. - `astExtended` is no longer needed to access span information. `Ast.span` provides access to the value when appropriate (the project's committed modules have spans; uncommitted changes or other parsed expressions don't). - `SourceRange` is now used everywhere in place of `ContentRange`--the two types had the same definition. Features: - Fix CodeEditor viewing. Implementation improvements: - Updated widget update handlers (#8545) implementation to Ast API. - Integrated `imports` more thoroughly with new AST APIs. - More tests.
55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import { rangeEncloses, rangeIntersects, type SourceRange } from 'shared/yjsModel'
|
|
import { expect, test } from 'vitest'
|
|
|
|
type RangeTest = { a: SourceRange; b: SourceRange }
|
|
|
|
const equalRanges: RangeTest[] = [
|
|
{ a: [0, 0], b: [0, 0] },
|
|
{ a: [0, 1], b: [0, 1] },
|
|
{ a: [-5, 5], b: [-5, 5] },
|
|
]
|
|
|
|
const totalOverlap: RangeTest[] = [
|
|
{ a: [0, 1], b: [0, 0] },
|
|
{ a: [0, 2], b: [2, 2] },
|
|
{ a: [-1, 1], b: [1, 1] },
|
|
{ a: [0, 2], b: [0, 1] },
|
|
{ a: [-10, 10], b: [-3, 7] },
|
|
{ a: [0, 5], b: [1, 2] },
|
|
{ a: [3, 5], b: [3, 4] },
|
|
]
|
|
|
|
const reverseTotalOverlap: RangeTest[] = totalOverlap.map(({ a, b }) => ({ a: b, b: a }))
|
|
|
|
const noOverlap: RangeTest[] = [
|
|
{ a: [0, 1], b: [2, 3] },
|
|
{ a: [0, 1], b: [-1, -1] },
|
|
{ a: [5, 6], b: [2, 3] },
|
|
{ a: [0, 2], b: [-2, -1] },
|
|
{ a: [-5, -3], b: [9, 10] },
|
|
{ a: [-3, 2], b: [3, 4] },
|
|
]
|
|
|
|
const partialOverlap: RangeTest[] = [
|
|
{ a: [0, 3], b: [-1, 1] },
|
|
{ a: [0, 1], b: [-1, 0] },
|
|
{ a: [0, 0], b: [-1, 0] },
|
|
{ a: [0, 2], b: [1, 4] },
|
|
{ a: [-8, 0], b: [0, 10] },
|
|
]
|
|
|
|
test.each([...equalRanges, ...totalOverlap])('Range $a should enclose $b', ({ a, b }) =>
|
|
expect(rangeEncloses(a, b)).toBe(true),
|
|
)
|
|
test.each([...noOverlap, ...partialOverlap, ...reverseTotalOverlap])(
|
|
'Range $a should not enclose $b',
|
|
({ a, b }) => expect(rangeEncloses(a, b)).toBe(false),
|
|
)
|
|
test.each([...equalRanges, ...totalOverlap, ...reverseTotalOverlap, ...partialOverlap])(
|
|
'Range $a should intersect $b',
|
|
({ a, b }) => expect(rangeIntersects(a, b)).toBe(true),
|
|
)
|
|
test.each([...noOverlap])('Range $a should not intersect $b', ({ a, b }) =>
|
|
expect(rangeIntersects(a, b)).toBe(false),
|
|
)
|