// Copyright 2012 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.collide.shared.ot; import static com.google.collide.shared.ot.DocOpApplierTests.Operation.DELETE; import static com.google.collide.shared.ot.DocOpApplierTests.Operation.INSERT; import com.google.collide.dto.server.ServerDocOpFactory; import com.google.collide.shared.document.Document; import com.google.collide.shared.document.DocumentMutator; import com.google.collide.shared.document.Line; import com.google.collide.shared.document.Position; import com.google.collide.shared.document.TextChange; import com.google.common.collect.Lists; import junit.framework.TestCase; import java.util.List; /** * Tests for {@link DocOpApplier}. * */ public class DocOpApplierTests extends TestCase { public enum Operation { DELETE, INSERT } private class MockDocumentMutator implements DocumentMutator { private int index; private List<Operation> operations = Lists.newArrayList(); private List<Position> positions = Lists.newArrayList(); private List<String> texts = Lists.newArrayList(); public MockDocumentMutator(Object... alternatingPositionOperationAndText) { for (int i = 0; i < alternatingPositionOperationAndText.length;) { int lineNumber = (Integer) alternatingPositionOperationAndText[i++]; int column = (Integer) alternatingPositionOperationAndText[i++]; positions.add(createPosition(lineNumber, column)); operations.add((Operation) alternatingPositionOperationAndText[i++]); texts.add((String) alternatingPositionOperationAndText[i++]); } } private Position createPosition(int lineNumber, int column) { return new Position(doc.getLineFinder().findLine(lineNumber), column); } @Override public TextChange deleteText(Line line, int column, int deleteCount) { throw new IllegalStateException( "DocOpApplier knows its line number and should not call the inefficient deleteText"); } @Override public TextChange deleteText(Line line, int lineNumber, int column, int deleteCount) { assertPosition(line, lineNumber, column); assertEquals(operations.get(index), DELETE); assertEquals(texts.get(index).length(), deleteCount); index++; return doc.deleteText(line, lineNumber, column, deleteCount); } @Override public TextChange insertText(Line line, int column, String text) { throw new IllegalStateException( "DocOpApplier knows its line number and should not call the inefficient insertText"); } @Override public TextChange insertText(Line line, int lineNumber, int column, String text) { assertPosition(line, lineNumber, column); assertEquals(operations.get(index), INSERT); assertEquals(texts.get(index), text); index++; return doc.insertText(line, lineNumber, column, text); } @Override public TextChange insertText(Line line, int lineNumber, int column, String text, boolean canReplaceSelection) { // This mutator impl does not care to replace the selection return insertText(line, lineNumber, column, text); } private void assertPosition(Line line, int lineNumber, int column) { assertEquals(positions.get(index).getLine(), line); assertEquals(positions.get(index).getLineNumber(), lineNumber); assertEquals(positions.get(index).getColumn(), column); } } private Document doc = Document.createFromString(""); private TerseDocOpBuilder b = new TerseDocOpBuilder(ServerDocOpFactory.INSTANCE, false); public void testVerySimpleInsertion() { DocOpApplier.apply(b.i("a").b(), doc, new MockDocumentMutator(0, 0, INSERT, "a")); } public void testMultilineSimpleInsertion() { DocOpApplier.apply(b.i("a\n").i("b\n").b(), doc, new MockDocumentMutator(0, 0, INSERT, "a\nb\n")); } public void testMultilineSimpleMutations() { DocOpApplier.apply(b.i("a\n").i("b\n").b(), doc, new MockDocumentMutator(0, 0, INSERT, "a\nb\n")); DocOpApplier.apply(b.d("a\n").d("b\n").i("c\n").i("d").b(), doc, new MockDocumentMutator(0, 0, DELETE, "a\nb\n", 0, 0, INSERT, "c\nd")); } }