2019-10-10 22:33:58 +08:00
|
|
|
import { Position, NodeTypes } from '../src/ast'
|
|
|
|
import {
|
|
|
|
getInnerRange,
|
|
|
|
advancePositionWithClone,
|
|
|
|
isEmptyExpression
|
|
|
|
} from '../src/utils'
|
2019-09-20 01:23:49 +08:00
|
|
|
|
|
|
|
function p(line: number, column: number, offset: number): Position {
|
|
|
|
return { column, line, offset }
|
|
|
|
}
|
|
|
|
|
2019-09-20 11:05:51 +08:00
|
|
|
describe('advancePositionWithClone', () => {
|
2019-09-20 01:23:49 +08:00
|
|
|
test('same line', () => {
|
|
|
|
const pos = p(1, 1, 0)
|
2019-09-20 11:05:51 +08:00
|
|
|
const newPos = advancePositionWithClone(pos, 'foo\nbar', 2)
|
2019-09-20 01:23:49 +08:00
|
|
|
|
|
|
|
expect(newPos.column).toBe(3)
|
|
|
|
expect(newPos.line).toBe(1)
|
|
|
|
expect(newPos.offset).toBe(2)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('same line', () => {
|
|
|
|
const pos = p(1, 1, 0)
|
2019-09-20 11:05:51 +08:00
|
|
|
const newPos = advancePositionWithClone(pos, 'foo\nbar', 4)
|
2019-09-20 01:23:49 +08:00
|
|
|
|
|
|
|
expect(newPos.column).toBe(1)
|
|
|
|
expect(newPos.line).toBe(2)
|
|
|
|
expect(newPos.offset).toBe(4)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('multiple lines', () => {
|
|
|
|
const pos = p(1, 1, 0)
|
2019-09-20 11:05:51 +08:00
|
|
|
const newPos = advancePositionWithClone(pos, 'foo\nbar\nbaz', 10)
|
2019-09-20 01:23:49 +08:00
|
|
|
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(newPos.column).toBe(3)
|
2019-09-20 01:23:49 +08:00
|
|
|
expect(newPos.line).toBe(3)
|
|
|
|
expect(newPos.offset).toBe(10)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
describe('getInnerRange', () => {
|
|
|
|
const loc1 = {
|
|
|
|
source: 'foo\nbar\nbaz',
|
|
|
|
start: p(1, 1, 0),
|
|
|
|
end: p(3, 3, 11)
|
|
|
|
}
|
|
|
|
|
|
|
|
test('at start', () => {
|
|
|
|
const loc2 = getInnerRange(loc1, 0, 4)
|
|
|
|
expect(loc2.start).toEqual(loc1.start)
|
|
|
|
expect(loc2.end.column).toBe(1)
|
|
|
|
expect(loc2.end.line).toBe(2)
|
|
|
|
expect(loc2.end.offset).toBe(4)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('at end', () => {
|
|
|
|
const loc2 = getInnerRange(loc1, 4)
|
|
|
|
expect(loc2.start.column).toBe(1)
|
|
|
|
expect(loc2.start.line).toBe(2)
|
|
|
|
expect(loc2.start.offset).toBe(4)
|
|
|
|
expect(loc2.end).toEqual(loc1.end)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('in between', () => {
|
|
|
|
const loc2 = getInnerRange(loc1, 4, 3)
|
|
|
|
expect(loc2.start.column).toBe(1)
|
|
|
|
expect(loc2.start.line).toBe(2)
|
|
|
|
expect(loc2.start.offset).toBe(4)
|
2019-09-26 07:17:45 +08:00
|
|
|
expect(loc2.end.column).toBe(4)
|
2019-09-20 01:23:49 +08:00
|
|
|
expect(loc2.end.line).toBe(2)
|
|
|
|
expect(loc2.end.offset).toBe(7)
|
|
|
|
})
|
|
|
|
})
|
2019-10-10 22:33:58 +08:00
|
|
|
|
|
|
|
describe('isEmptyExpression', () => {
|
|
|
|
test('empty', () => {
|
|
|
|
expect(
|
|
|
|
isEmptyExpression({
|
|
|
|
content: '',
|
|
|
|
type: NodeTypes.SIMPLE_EXPRESSION,
|
|
|
|
isStatic: true,
|
2019-10-15 23:41:24 +08:00
|
|
|
isConstant: true,
|
2019-10-10 22:33:58 +08:00
|
|
|
loc: null as any
|
|
|
|
})
|
|
|
|
).toBe(true)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('spaces', () => {
|
|
|
|
expect(
|
|
|
|
isEmptyExpression({
|
|
|
|
content: ' \t ',
|
|
|
|
type: NodeTypes.SIMPLE_EXPRESSION,
|
|
|
|
isStatic: true,
|
2019-10-15 23:41:24 +08:00
|
|
|
isConstant: true,
|
2019-10-10 22:33:58 +08:00
|
|
|
loc: null as any
|
|
|
|
})
|
|
|
|
).toBe(true)
|
|
|
|
})
|
|
|
|
|
|
|
|
test('identifier', () => {
|
|
|
|
expect(
|
|
|
|
isEmptyExpression({
|
|
|
|
content: 'foo',
|
|
|
|
type: NodeTypes.SIMPLE_EXPRESSION,
|
|
|
|
isStatic: true,
|
2019-10-15 23:41:24 +08:00
|
|
|
isConstant: true,
|
2019-10-10 22:33:58 +08:00
|
|
|
loc: null as any
|
|
|
|
})
|
|
|
|
).toBe(false)
|
|
|
|
})
|
|
|
|
})
|