/**
* Copyright 2009 Google Inc.
*
* 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 org.waveprotocol.wave.model.document.util;
import junit.framework.TestCase;
import org.waveprotocol.wave.model.document.MutableDocument;
import org.waveprotocol.wave.model.document.operation.automaton.DocumentSchema;
import org.waveprotocol.wave.model.document.raw.impl.Element;
import org.waveprotocol.wave.model.document.raw.impl.Node;
import org.waveprotocol.wave.model.document.raw.impl.Text;
import org.waveprotocol.wave.model.document.util.ContextProviders.TestDocumentContext;
/**
* Tests RangeTracker
*
*
*/
public class RangeTrackerTest extends TestCase {
/**
* Basic sanity test.
*/
public void testTrackRange() {
String initialContent = "abc";
TestDocumentContext<Node, Element, Text> test =
ContextProviders.createTestPojoContext(
DocProviders.POJO.parse(initialContent).asOperation(), null, null, null,
DocumentSchema.NO_SCHEMA_CONSTRAINTS);
MutableDocument<Node, Element, Text> doc = test.document();
RangeTracker rangeTracker = new RangeTracker(test.localAnnotations());
assertNull(rangeTracker.getRange());
rangeTracker.trackRange(new Range(1, 2));
assertEquals(new Range(1, 2), rangeTracker.getRange());
doc.insertText(doc.locate(0), "012");
assertEquals(new Range(4, 5), rangeTracker.getRange());
doc.insertText(doc.locate(4), "a");
assertEquals(new Range(5, 6), rangeTracker.getRange());
doc.insertText(doc.locate(6), "a");
assertEquals(new Range(5, 7), rangeTracker.getRange());
rangeTracker.clearRange();
assertNull(rangeTracker.getRange());
}
public void testRangesWithSameDebugIdDontCollide() {
String initialContent = "hello world";
TestDocumentContext<Node, Element, Text> test =
ContextProviders.createTestPojoContext(
DocProviders.POJO.parse(initialContent).asOperation(), null, null, null,
DocumentSchema.NO_SCHEMA_CONSTRAINTS);
MutableDocument<Node, Element, Text> doc = test.document();
RangeTracker trackerA = new RangeTracker(test.localAnnotations(), "debugId");
RangeTracker trackerB = new RangeTracker(test.localAnnotations(), "debugId");
trackerA.trackRange(new Range(1, 2));
trackerB.trackRange(new Range(0, 4));
assertEquals(new Range(1, 2), trackerA.getRange());
assertEquals(new Range(0, 4), trackerB.getRange());
doc.insertText(doc.locate(3), "a");
assertEquals(new Range(1, 2), trackerA.getRange());
assertEquals(new Range(0, 5), trackerB.getRange());
trackerA.clearRange();
assertEquals(null, trackerA.getRange());
assertEquals(new Range(0, 5), trackerB.getRange());
}
/** Check that a collapsed range in the middle behaves correctly. */
public void testCollapsedRange() {
String initialContent = "abc";
TestDocumentContext<Node, Element, Text> test =
ContextProviders.createTestPojoContext(
DocProviders.POJO.parse(initialContent).asOperation(), null, null, null,
DocumentSchema.NO_SCHEMA_CONSTRAINTS);
MutableDocument<Node, Element, Text> doc = test.document();
RangeTracker tracker = new RangeTracker(test.localAnnotations());
// collapsed at the start, through mutation:
tracker.trackRange(new Range(2, 2));
assertEquals(new Range(2, 2), tracker.getRange());
doc.insertText(doc.locate(0), "a");
assertEquals(new Range(3, 3), tracker.getRange());
doc.insertText(doc.locate(4), "b");
assertEquals(new Range(3, 3), tracker.getRange());
doc.insertText(doc.locate(3), "c");
assertEquals(new Range(4, 4), tracker.getRange());
}
/** Check that a collapsed range at 0 behaves correctly. */
public void testCollapsedStartRange() {
String initialContent = "abc";
TestDocumentContext<Node, Element, Text> test =
ContextProviders.createTestPojoContext(
DocProviders.POJO.parse(initialContent).asOperation(), null, null, null,
DocumentSchema.NO_SCHEMA_CONSTRAINTS);
MutableDocument<Node, Element, Text> doc = test.document();
RangeTracker tracker = new RangeTracker(test.localAnnotations());
// collapsed at the start, through mutation:
tracker.trackRange(new Range(0, 0));
assertEquals(new Range(0, 0), tracker.getRange());
doc.insertText(doc.locate(3), "a");
assertEquals(new Range(0, 0), tracker.getRange());
doc.insertText(doc.locate(0), "x");
assertEquals(new Range(1, 1), tracker.getRange());
}
/** Check that a collapsed range at doc.size() behaves correctly. */
public void testCollapsedEndRange() {
String initialContent = "abc";
TestDocumentContext<Node, Element, Text> test =
ContextProviders.createTestPojoContext(
DocProviders.POJO.parse(initialContent).asOperation(), null, null, null,
DocumentSchema.NO_SCHEMA_CONSTRAINTS);
MutableDocument<Node, Element, Text> doc = test.document();
RangeTracker tracker = new RangeTracker(test.localAnnotations());
int end = doc.size();
// collapsed at the start, through mutation:
tracker.trackRange(new Range(end, end));
assertEquals(new Range(end, end), tracker.getRange());
doc.insertText(doc.locate(3), "a");
assertEquals(new Range(end + 1, end + 1), tracker.getRange());
doc.insertText(doc.locate(doc.size()), "x");
assertEquals(new Range(end + 2, end + 2), tracker.getRange());
}
/** Check that a collapsed range over the document behaves correctly. */
public void testEntireCoverRanges() {
String initialContent = "abc";
TestDocumentContext<Node, Element, Text> test =
ContextProviders.createTestPojoContext(
DocProviders.POJO.parse(initialContent).asOperation(), null, null, null,
DocumentSchema.NO_SCHEMA_CONSTRAINTS);
MutableDocument<Node, Element, Text> doc = test.document();
RangeTracker tracker = new RangeTracker(test.localAnnotations());
// entire range through mutation at middle, end, start
tracker.trackRange(new Range(0, doc.size()));
assertEquals(new Range(0, doc.size()), tracker.getRange());
doc.insertText(doc.locate(1), "a");
assertEquals(new Range(0, doc.size()), tracker.getRange());
doc.insertText(doc.locate(doc.size()), "b");
assertEquals(new Range(0, doc.size()), tracker.getRange());
doc.insertText(doc.locate(0), "c");
assertEquals(new Range(1, doc.size()), tracker.getRange());
}
public void testOrdering() {
String initialContent = "abc";
TestDocumentContext<Node, Element, Text> test =
ContextProviders.createTestPojoContext(
DocProviders.POJO.parse(initialContent).asOperation(), null, null, null,
DocumentSchema.NO_SCHEMA_CONSTRAINTS);
RangeTracker tracker = new RangeTracker(test.localAnnotations());
tracker.trackRange(new FocusedRange(2, 1));
assertEquals(new Range(1, 2), tracker.getRange());
assertEquals(new FocusedRange(2, 1), tracker.getFocusedRange());
}
}