overleaf/libraries/overleaf-editor-core/test/comment.test.js
Domagoj Kriskovic b87dad77d9 Added applyInsert/applyDelete methods to comments (#16572)
* Add CommentList to StringFileData

* added more types

* use toRaw

* using Map rather than array for comments

* using Range class

* Comment with ranges:Range[]

* Revert "Comment with ranges:Range[]"

This reverts commit 0783b1837562600637db03cc70c620129061c797.

* Comment with ranges:Range[]

* remove isDeleted

* commentList.toRaw()

* using toRaw

* commentId to id

* Revert "using toRaw"

This reverts commit 0c04ca5836f3befd5ec027bad5bf722e8b27f36c.

* fix merge

* make comment map internal to CommentList

* remove unused type

* fix parameter name in StringFileData

* import types more consistently

* more consistent type def

* Added moveOnInsert/moveOnDelete methods to comments

* use range helper methods

* mergeRanges function

* rename isAfter to startsAfter

* added @ts-checks

* using comment.isEmpty

* rename overlaps to covers

* remove ops in applyDelete

* mege, substract, isInRange

* ranges fixes, added tests

* rename to includes

* using pos,length in applyInsert

* simplify

* extendComment option

* check comment edges

* added inclusive option

* more specific touches()

* refactor mergeRanges()

* comment.addRange()

* remove inclusive option

* refactor using more helper methods

* fix typo

* inserting a comment between ranges tests

* test description fixes

* support only range

* more edge case testing

* added more range tests

* renamed to containsExcludingEdges

* endsAt check edge

* using firstIndex, lastIndex

* contains, containsIndex

* raturn -1 for lastIndex for empty ranges

* rename ranges in tests

* indexStartsAfter

* sort comment ranges

* rename to indexIsAfter, fix Range type

* add range if expandComment is true

* split the range when expandComment is false

* added moveBy and extendBy

* added more tests

* added comments

* prettier

* small fixes/typos

* rename indexIsAfter

* merge when deleting with overlaps

* added overlap test

* same range touches test

* test with overlapping comments

* delete duplicate test

* throw on empty range

GitOrigin-RevId: 1252e3d01f2f5dc1d00ce681c579506038e4d121
2024-02-02 09:03:28 +00:00

123 lines
4.3 KiB
JavaScript

// @ts-check
'use strict'
const { expect } = require('chai')
const Comment = require('../lib/file_data/comment')
const Range = require('../lib/file_data/range')
describe('Comment', function () {
it('should move ranges to the right of insert', function () {
const comment = new Comment([new Range(5, 10)])
comment.applyInsert(3, 5, false)
expect(comment.ranges).to.eql([new Range(10, 10)])
})
it('should expand the range after insert inside it', function () {
const comment = new Comment([new Range(5, 10)])
comment.applyInsert(4, 1) // inserting 1 char before the range
expect(comment.ranges).to.eql([new Range(6, 10)])
comment.applyInsert(6, 1) // inserting 1 char at the edge (without expandCommand = false)
expect(comment.ranges).to.eql([new Range(7, 10)])
comment.applyInsert(7, 1, true) // inserting 1 char at the edge (with expandCommand = true)
expect(comment.ranges).to.eql([new Range(7, 11)])
comment.applyInsert(8, 1, true) // inserting 1 char inside the range
expect(comment.ranges).to.eql([new Range(7, 12)])
})
it('should split the range if inside another and expandComment is false', function () {
const comment1 = new Comment([new Range(5, 10)])
comment1.applyInsert(6, 10, false)
expect(comment1.ranges).to.eql([new Range(5, 1), new Range(16, 9)])
// insert at the end of the range
const comment2 = new Comment([new Range(5, 10)])
comment2.applyInsert(14, 10, false)
expect(comment2.ranges).to.eql([new Range(5, 9), new Range(24, 1)])
})
it('should move the range if insert is at range start and expandComment is false', function () {
const comment = new Comment([new Range(5, 10)])
comment.applyInsert(5, 10, false)
expect(comment.ranges).to.eql([new Range(15, 10)])
})
it('should ignore the range if insert is at range end and expandComment is false', function () {
const comment = new Comment([new Range(5, 10)])
comment.applyInsert(15, 10, false)
expect(comment.ranges).to.eql([new Range(5, 10)])
})
it('should expand the range after inserting on the edge of it if expandComment is true', function () {
const comment = new Comment([new Range(5, 10)])
comment.applyInsert(15, 10, true)
expect(comment.ranges).to.eql([new Range(5, 20)])
})
it('should add a new range if expandComment is true and not inside any range', function () {
const commentNoRanges = new Comment([])
commentNoRanges.applyInsert(5, 10, true)
expect(commentNoRanges.ranges).to.eql([new Range(5, 10)])
const commentWithRanges = new Comment([new Range(5, 10)])
commentWithRanges.applyInsert(50, 10, true)
expect(commentWithRanges.ranges).to.eql([
new Range(5, 10),
new Range(50, 10),
])
})
it('should move ranges if delete is before it', function () {
const from5to14 = new Comment([new Range(5, 10)])
const from3to7 = new Range(3, 5)
from5to14.applyDelete(from3to7)
const from3to9 = new Range(3, 7)
expect(from5to14.ranges).to.eql([from3to9])
})
it('should merge ranges after delete', function () {
const comment = new Comment([new Range(5, 10), new Range(20, 10)])
comment.applyDelete(new Range(7, 18))
expect(comment.ranges).to.eql([new Range(5, 7)])
})
it('should merge overlapping ranges', function () {
const comment = new Comment([
new Range(5, 10),
new Range(15, 20),
new Range(50, 10),
])
comment.mergeRanges()
expect(comment.ranges).to.eql([new Range(5, 30), new Range(50, 10)])
})
it('should merge unsorted ranges', function () {
const comment = new Comment([
new Range(15, 20),
new Range(50, 10),
new Range(5, 10),
])
comment.mergeRanges()
expect(comment.ranges).to.eql([new Range(5, 30), new Range(50, 10)])
})
it('should ignore overlapped range', function () {
const comment = new Comment([
new Range(5, 10),
new Range(10, 5),
new Range(50, 10),
])
comment.mergeRanges()
expect(comment.ranges).to.eql([new Range(5, 10), new Range(50, 10)])
})
it('should join touching ranges', function () {
const comment = new Comment([
new Range(5, 10),
new Range(15, 5),
new Range(50, 10),
])
comment.mergeRanges()
expect(comment.ranges).to.eql([new Range(5, 15), new Range(50, 10)])
})
})