utils.spec.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { Position } from '../src/ast'
  2. import { getInnerRange, advancePositionWithClone } from '../src/utils'
  3. function p(line: number, column: number, offset: number): Position {
  4. return { column, line, offset }
  5. }
  6. describe('advancePositionWithClone', () => {
  7. test('same line', () => {
  8. const pos = p(1, 1, 0)
  9. const newPos = advancePositionWithClone(pos, 'foo\nbar', 2)
  10. expect(newPos.column).toBe(3)
  11. expect(newPos.line).toBe(1)
  12. expect(newPos.offset).toBe(2)
  13. })
  14. test('same line', () => {
  15. const pos = p(1, 1, 0)
  16. const newPos = advancePositionWithClone(pos, 'foo\nbar', 4)
  17. expect(newPos.column).toBe(1)
  18. expect(newPos.line).toBe(2)
  19. expect(newPos.offset).toBe(4)
  20. })
  21. test('multiple lines', () => {
  22. const pos = p(1, 1, 0)
  23. const newPos = advancePositionWithClone(pos, 'foo\nbar\nbaz', 10)
  24. expect(newPos.column).toBe(2)
  25. expect(newPos.line).toBe(3)
  26. expect(newPos.offset).toBe(10)
  27. })
  28. })
  29. describe('getInnerRange', () => {
  30. const loc1 = {
  31. source: 'foo\nbar\nbaz',
  32. start: p(1, 1, 0),
  33. end: p(3, 3, 11)
  34. }
  35. test('at start', () => {
  36. const loc2 = getInnerRange(loc1, 0, 4)
  37. expect(loc2.start).toEqual(loc1.start)
  38. expect(loc2.end.column).toBe(1)
  39. expect(loc2.end.line).toBe(2)
  40. expect(loc2.end.offset).toBe(4)
  41. })
  42. test('at end', () => {
  43. const loc2 = getInnerRange(loc1, 4)
  44. expect(loc2.start.column).toBe(1)
  45. expect(loc2.start.line).toBe(2)
  46. expect(loc2.start.offset).toBe(4)
  47. expect(loc2.end).toEqual(loc1.end)
  48. })
  49. test('in between', () => {
  50. const loc2 = getInnerRange(loc1, 4, 3)
  51. expect(loc2.start.column).toBe(1)
  52. expect(loc2.start.line).toBe(2)
  53. expect(loc2.start.offset).toBe(4)
  54. expect(loc2.end.column).toBe(3)
  55. expect(loc2.end.line).toBe(2)
  56. expect(loc2.end.offset).toBe(7)
  57. })
  58. })