/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.testing;
import org.waveprotocol.wave.model.document.operation.Attributes;
import org.waveprotocol.wave.model.document.operation.DocOp;
import org.waveprotocol.wave.model.document.operation.impl.AnnotationBoundaryMapImpl;
import org.waveprotocol.wave.model.document.operation.impl.AttributesImpl;
import org.waveprotocol.wave.model.document.operation.impl.AttributesUpdateImpl;
import org.waveprotocol.wave.model.document.operation.impl.DocOpBuffer;
public class TestOperations {
// The test case for the message-based implementation should also use this.
public static DocOp getBasicTestOp() {
DocOpBuffer b = new DocOpBuffer();
// The operation starts with characters/deleteCharacters of various lengths
// and case, mixed with some retains and nested element start/end with
// different mixes of attributes.
b.characters("hello");
b.characters("z");
b.retain(1);
b.deleteCharacters("ab");
b.characters("world");
b.retain(2);
b.deleteCharacters("cd");
b.elementStart("a", Attributes.EMPTY_MAP);
b.characters("hEllo");
b.elementStart("b", new AttributesImpl("a", "1"));
b.characters("world");
b.elementStart("B", new AttributesImpl("A", "1", "b", "abc12"));
b.elementEnd();
// A non-ASCII Unicode character.
b.characters("\u2603");
b.elementEnd();
b.elementEnd();
b.deleteElementStart("a", new AttributesImpl("a", "2", "c", ""));
b.deleteCharacters("asdf");
b.deleteElementEnd();
// Now some replaceAttributes with different size and case.
b.replaceAttributes(new AttributesImpl("a", "b"), new AttributesImpl("b", "c", "c", "d"));
b.replaceAttributes(Attributes.EMPTY_MAP, new AttributesImpl("Aa", "aA"));
b.replaceAttributes(new AttributesImpl("B", "A"), new AttributesImpl());
// Try both a fresh empty AttributesImpl() instance and the preallocated
// EMPTY_MAP.
b.replaceAttributes(new AttributesImpl(), Attributes.EMPTY_MAP);
// Now we add similar cases for annotation boundaries. Since consecutive annotation
// boundaries would make the operation ill-formed, we interleave them with further
// updateAttributes tests.
b.annotationBoundary(AnnotationBoundaryMapImpl.builder().build());
b.updateAttributes(new AttributesUpdateImpl());
b.annotationBoundary(AnnotationBoundaryMapImpl.builder()
.updateValues("b", "XZ", "yz", "f-", null, null,
"g-", "a", null, "k-", "b", "", "r", "", "2")
.build());
b.updateAttributes(new AttributesUpdateImpl("a", null, "1"));
b.annotationBoundary(AnnotationBoundaryMapImpl.builder()
.initializationEnd("b", "g-", "k-", "r")
.updateValues("e", "166", null, "f-", null, null)
.build());
b.updateAttributes(new AttributesUpdateImpl("P", null, "", ":wq", "ZZ", null));
b.annotationBoundary(AnnotationBoundaryMapImpl.builder()
.initializationEnd("e", "f-")
.build());
return b.finish();
}
}