blob: 5946038158a4a6c8ed2fa0f37f78bc7ee5d1d668 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* 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.intellij.openapi.editor;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.integration.junit4.JUnit4Mockery;
import org.jmock.lib.legacy.ClassImposteriser;
import static org.junit.Assert.assertSame;
public abstract class AbstractLineWrapPositionStrategyTest {
private static final String EDGE_MARKER = "<EDGE>";
private static final String WRAP_MARKER = "<WRAP>";
private Mockery myMockery;
private Project myProject;
public void setUp() {
myMockery = new JUnit4Mockery() {{
setImposteriser(ClassImposteriser.INSTANCE);
}};
myProject = myMockery.mock(Project.class);
}
protected void doTest(@NotNull LineWrapPositionStrategy strategy, final String document) {
doTest(strategy, document, true);
}
protected void doTest(@NotNull LineWrapPositionStrategy strategy, final String document, boolean allowToBeyondMaxPreferredOffset) {
final Context context = new Context(document);
context.init();
int actual = strategy.calculateWrapPosition(
createMockDocument(context.document), myProject, 0, context.document.length(), context.edgeIndex,
allowToBeyondMaxPreferredOffset, true
);
assertSame(context.wrapIndex, actual);
}
private Document createMockDocument(@NotNull final String text) {
final Document result = myMockery.mock(Document.class);
myMockery.checking(new Expectations() {{
allowing(result).getCharsSequence(); will(returnValue(text));
}});
return result;
}
/**
* Utility class for parsing and initialising test data.
* <p/>
* <b>Note:</b> this class is line-oriented, i.e. it assumes that target document doesn't contain line feeds.
*/
private static class Context {
private final StringBuilder buffer = new StringBuilder();
private final String rawDocument;
private String document;
private int index;
private int wrapIndex = -1;
private int tmpWrapIndex;
private int edgeIndex;
private int tmpEdgeIndex;
Context(String rawDocument) {
if (rawDocument.contains("\n")) {
throw new IllegalArgumentException(
String.format("Don't expect to test multi-line documents but the one is detected: '%s'", rawDocument)
);
}
this.rawDocument = rawDocument;
}
public void init() {
tmpWrapIndex = rawDocument.indexOf(WRAP_MARKER);
tmpEdgeIndex = rawDocument.indexOf(EDGE_MARKER);
if (tmpWrapIndex >= 0 && tmpEdgeIndex >= 0) {
if (tmpWrapIndex < tmpEdgeIndex) {
processWrap();
processMaxPreferredIndex();
}
else {
processMaxPreferredIndex();
processWrap();
}
}
else {
if (tmpWrapIndex >= 0) {
processWrap();
}
if (tmpEdgeIndex >= 0) {
processMaxPreferredIndex();
}
}
buffer.append(rawDocument.substring(index));
document = buffer.toString();
if (edgeIndex <= 0) {
edgeIndex = document.length();
}
}
private void processWrap() {
buffer.append(rawDocument.substring(index, tmpWrapIndex));
index = tmpWrapIndex + WRAP_MARKER.length();
wrapIndex = buffer.length();
if (rawDocument.indexOf(WRAP_MARKER, index) >= 0) {
throw new IllegalArgumentException(String.format("More than one wrap indicator is found at the document '%s'", rawDocument));
}
}
private void processMaxPreferredIndex() {
buffer.append(rawDocument.substring(index, tmpEdgeIndex));
index = tmpEdgeIndex + EDGE_MARKER.length();
edgeIndex = buffer.length();
if (rawDocument.indexOf(EDGE_MARKER, index) >= 0) {
throw new IllegalArgumentException(String.format("More than one max preferred offset is found at the document '%s'", rawDocument));
}
}
}
}