From 3b4ed65b940c38f19ac503df1cb976c41a86aba0 Mon Sep 17 00:00:00 2001 From: Michael MacFadden Date: Fri, 4 Feb 2022 11:59:37 -0600 Subject: [PATCH] Update the string splice transform logic Fixes convergencelabs/convergence-project#264 --- .../xform/string/StringSpliceSpliceTF.scala | 17 +++++++---- ...ng-splice-replace-splice-replace-spec.json | 28 +++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 src/test/otfspec/otf-string-splice-replace-splice-replace-spec.json diff --git a/src/main/scala/com/convergencelabs/convergence/server/backend/services/domain/model/ot/xform/string/StringSpliceSpliceTF.scala b/src/main/scala/com/convergencelabs/convergence/server/backend/services/domain/model/ot/xform/string/StringSpliceSpliceTF.scala index da3e1365..7afd9017 100644 --- a/src/main/scala/com/convergencelabs/convergence/server/backend/services/domain/model/ot/xform/string/StringSpliceSpliceTF.scala +++ b/src/main/scala/com/convergencelabs/convergence/server/backend/services/domain/model/ot/xform/string/StringSpliceSpliceTF.scala @@ -391,14 +391,21 @@ private[ot] object StringSpliceSpliceTF extends OperationTransformationFunction[ case FinishedBy => ( s.copy(deleteCount = s.deleteCount - c.deleteCount), - c.copy(deleteCount = 0, index = s.index + s.insertValue.length), + c.copy(deleteCount = 0, index = s.index + s.insertValue.length) ) case EqualTo => - ( - s.copy(deleteCount = 0), - c.copy(index = c.index + s.insertValue.length, deleteCount = 0), - ) + if (s.insertValue != c.insertValue) { + ( + s, + c.copy(noOp = true) + ) + } else { + ( + s.copy(noOp = true), + c.copy(noOp = true) + ) + } } } diff --git a/src/test/otfspec/otf-string-splice-replace-splice-replace-spec.json b/src/test/otfspec/otf-string-splice-replace-splice-replace-spec.json new file mode 100644 index 00000000..059e3dee --- /dev/null +++ b/src/test/otfspec/otf-string-splice-replace-splice-replace-spec.json @@ -0,0 +1,28 @@ +{ + "serverOpType": "StringSplice", + "clientOpType": "StringSplice", + "cases": [ + { + "id": "S-PP-1", + "input": { + "serverOp": {"type": "StringSplice", "noOp": false, "index": 4, "deleteCount": 1, "insertValue": "X"}, + "clientOp": {"type": "StringSplice", "noOp": false, "index": 4, "deleteCount": 1, "insertValue": "Y"} + }, + "output": { + "serverOp": {"type": "StringSplice", "noOp": false, "index": 4, "deleteCount": 1, "insertValue": "X"}, + "clientOp": {"type": "StringSplice", "noOp": true, "index": 4, "deleteCount": 1, "insertValue": "Y"} + } + }, + { + "id": "S-PP-2", + "input": { + "serverOp": {"type": "StringSplice", "noOp": false, "index": 4, "deleteCount": 1, "insertValue": "X"}, + "clientOp": {"type": "StringSplice", "noOp": false, "index": 4, "deleteCount": 1, "insertValue": "X"} + }, + "output": { + "serverOp": {"type": "StringSplice", "noOp": true, "index": 4, "deleteCount": 1, "insertValue": "X"}, + "clientOp": {"type": "StringSplice", "noOp": true, "index": 4, "deleteCount": 1, "insertValue": "X"} + } + } + ] +} \ No newline at end of file