utils.spec.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { Position } from '../src/ast'
  2. import {
  3. getInnerRange,
  4. advancePositionWithClone,
  5. isMemberExpression
  6. } from '../src/utils'
  7. function p(line: number, column: number, offset: number): Position {
  8. return { column, line, offset }
  9. }
  10. describe('advancePositionWithClone', () => {
  11. test('same line', () => {
  12. const pos = p(1, 1, 0)
  13. const newPos = advancePositionWithClone(pos, 'foo\nbar', 2)
  14. expect(newPos.column).toBe(3)
  15. expect(newPos.line).toBe(1)
  16. expect(newPos.offset).toBe(2)
  17. })
  18. test('same line', () => {
  19. const pos = p(1, 1, 0)
  20. const newPos = advancePositionWithClone(pos, 'foo\nbar', 4)
  21. expect(newPos.column).toBe(1)
  22. expect(newPos.line).toBe(2)
  23. expect(newPos.offset).toBe(4)
  24. })
  25. test('multiple lines', () => {
  26. const pos = p(1, 1, 0)
  27. const newPos = advancePositionWithClone(pos, 'foo\nbar\nbaz', 10)
  28. expect(newPos.column).toBe(3)
  29. expect(newPos.line).toBe(3)
  30. expect(newPos.offset).toBe(10)
  31. })
  32. })
  33. describe('getInnerRange', () => {
  34. const loc1 = {
  35. source: 'foo\nbar\nbaz',
  36. start: p(1, 1, 0),
  37. end: p(3, 3, 11)
  38. }
  39. test('at start', () => {
  40. const loc2 = getInnerRange(loc1, 0, 4)
  41. expect(loc2.start).toEqual(loc1.start)
  42. expect(loc2.end.column).toBe(1)
  43. expect(loc2.end.line).toBe(2)
  44. expect(loc2.end.offset).toBe(4)
  45. })
  46. test('at end', () => {
  47. const loc2 = getInnerRange(loc1, 4)
  48. expect(loc2.start.column).toBe(1)
  49. expect(loc2.start.line).toBe(2)
  50. expect(loc2.start.offset).toBe(4)
  51. expect(loc2.end).toEqual(loc1.end)
  52. })
  53. test('in between', () => {
  54. const loc2 = getInnerRange(loc1, 4, 3)
  55. expect(loc2.start.column).toBe(1)
  56. expect(loc2.start.line).toBe(2)
  57. expect(loc2.start.offset).toBe(4)
  58. expect(loc2.end.column).toBe(4)
  59. expect(loc2.end.line).toBe(2)
  60. expect(loc2.end.offset).toBe(7)
  61. })
  62. })
  63. test('isMemberExpression', () => {
  64. // should work
  65. expect(isMemberExpression('obj.foo')).toBe(true)
  66. expect(isMemberExpression('obj[foo]')).toBe(true)
  67. expect(isMemberExpression('obj[arr[0]]')).toBe(true)
  68. expect(isMemberExpression('obj[arr[ret.bar]]')).toBe(true)
  69. expect(isMemberExpression('obj[arr[ret[bar]]]')).toBe(true)
  70. expect(isMemberExpression('obj[arr[ret[bar]]].baz')).toBe(true)
  71. expect(isMemberExpression('obj[1 + 1]')).toBe(true)
  72. // should warning
  73. expect(isMemberExpression('obj[foo')).toBe(false)
  74. expect(isMemberExpression('objfoo]')).toBe(false)
  75. expect(isMemberExpression('obj[arr[0]')).toBe(false)
  76. expect(isMemberExpression('obj[arr0]]')).toBe(false)
  77. })