comment.test.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // @ts-check
  2. 'use strict'
  3. const { expect } = require('chai')
  4. const Comment = require('../lib/comment')
  5. const Range = require('../lib/range')
  6. describe('Comment', function () {
  7. it('should move ranges to the right of insert', function () {
  8. const comment = new Comment([new Range(5, 10)])
  9. comment.applyInsert(3, 5, false)
  10. expect(comment.ranges).to.eql([new Range(10, 10)])
  11. })
  12. it('should expand the range after insert inside it', function () {
  13. const comment = new Comment([new Range(5, 10)])
  14. comment.applyInsert(4, 1) // inserting 1 char before the range
  15. expect(comment.ranges).to.eql([new Range(6, 10)])
  16. comment.applyInsert(6, 1) // inserting 1 char at the edge (without expandCommand = false)
  17. expect(comment.ranges).to.eql([new Range(7, 10)])
  18. comment.applyInsert(7, 1, true) // inserting 1 char at the edge (with expandCommand = true)
  19. expect(comment.ranges).to.eql([new Range(7, 11)])
  20. comment.applyInsert(8, 1, true) // inserting 1 char inside the range
  21. expect(comment.ranges).to.eql([new Range(7, 12)])
  22. })
  23. it('should split the range if inside another and expandComment is false', function () {
  24. const comment1 = new Comment([new Range(5, 10)])
  25. comment1.applyInsert(6, 10, false)
  26. expect(comment1.ranges).to.eql([new Range(5, 1), new Range(16, 9)])
  27. // insert at the end of the range
  28. const comment2 = new Comment([new Range(5, 10)])
  29. comment2.applyInsert(14, 10, false)
  30. expect(comment2.ranges).to.eql([new Range(5, 9), new Range(24, 1)])
  31. })
  32. it('should move the range if insert is at range start and expandComment is false', function () {
  33. const comment = new Comment([new Range(5, 10)])
  34. comment.applyInsert(5, 10, false)
  35. expect(comment.ranges).to.eql([new Range(15, 10)])
  36. })
  37. it('should ignore the range if insert is at range end and expandComment is false', function () {
  38. const comment = new Comment([new Range(5, 10)])
  39. comment.applyInsert(15, 10, false)
  40. expect(comment.ranges).to.eql([new Range(5, 10)])
  41. })
  42. it('should expand the range after inserting on the edge of it if expandComment is true', function () {
  43. const comment = new Comment([new Range(5, 10)])
  44. comment.applyInsert(15, 10, true)
  45. expect(comment.ranges).to.eql([new Range(5, 20)])
  46. })
  47. it('should add a new range if expandComment is true and not inside any range', function () {
  48. const commentNoRanges = new Comment([])
  49. commentNoRanges.applyInsert(5, 10, true)
  50. expect(commentNoRanges.ranges).to.eql([new Range(5, 10)])
  51. const commentWithRanges = new Comment([new Range(5, 10)])
  52. commentWithRanges.applyInsert(50, 10, true)
  53. expect(commentWithRanges.ranges).to.eql([
  54. new Range(5, 10),
  55. new Range(50, 10),
  56. ])
  57. })
  58. it('should move ranges if delete is before it', function () {
  59. const from5to14 = new Comment([new Range(5, 10)])
  60. const from3to7 = new Range(3, 5)
  61. from5to14.applyDelete(from3to7)
  62. const from3to9 = new Range(3, 7)
  63. expect(from5to14.ranges).to.eql([from3to9])
  64. })
  65. it('should merge ranges after delete', function () {
  66. const comment = new Comment([new Range(5, 10), new Range(20, 10)])
  67. comment.applyDelete(new Range(7, 18))
  68. expect(comment.ranges).to.eql([new Range(5, 7)])
  69. })
  70. it('should merge overlapping ranges', function () {
  71. const comment = new Comment([
  72. new Range(5, 10),
  73. new Range(15, 20),
  74. new Range(50, 10),
  75. ])
  76. comment.mergeRanges()
  77. expect(comment.ranges).to.eql([new Range(5, 30), new Range(50, 10)])
  78. })
  79. it('should merge unsorted ranges', function () {
  80. const comment = new Comment([
  81. new Range(15, 20),
  82. new Range(50, 10),
  83. new Range(5, 10),
  84. ])
  85. comment.mergeRanges()
  86. expect(comment.ranges).to.eql([new Range(5, 30), new Range(50, 10)])
  87. })
  88. it('should ignore overlapped range', function () {
  89. const comment = new Comment([
  90. new Range(5, 10),
  91. new Range(10, 5),
  92. new Range(50, 10),
  93. ])
  94. comment.mergeRanges()
  95. expect(comment.ranges).to.eql([new Range(5, 10), new Range(50, 10)])
  96. })
  97. it('should join touching ranges', function () {
  98. const comment = new Comment([
  99. new Range(5, 10),
  100. new Range(15, 5),
  101. new Range(50, 10),
  102. ])
  103. comment.mergeRanges()
  104. expect(comment.ranges).to.eql([new Range(5, 15), new Range(50, 10)])
  105. })
  106. })