blob: f0c138883e3bd9a84a1286c120a3e02cdbc5048d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.draw2d.test;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.text.FlowPage;
import org.eclipse.draw2d.text.InlineFlow;
import org.eclipse.draw2d.text.ParagraphTextLayout;
import org.eclipse.draw2d.text.TextFlow;
import org.eclipse.draw2d.text.TextFragmentBox;
public class TextFlowWrapTest extends BaseTestCase {
// @TODO:Pratik create similar test cases for bidi...where the fragments are
// examined
// used to ensure that there are no extra fragments
static final String TERMINATE = "#@terminate@#!";
// used to ensure that two consecutive fragments are on the same line
static final String SAMELINE = "#@sameline@#";
// used to ensure that two consecutive fragments are on different lines
static final String NEWLINE = "#@newline@#";
// used to ensure that a fragment is truncated (this mark is placed after
// the fragment
// that is supposed to be truncated)
static final String TRUNCATED = "#@truncated@#";
// used to ensure that a fragment is not truncated (this mark is placed
// after the fragment
// that is not supposed to be truncated)
static final String NON_TRUNCATED = "#@non-truncated@#";
FlowPage figure;
TextFlow textFlow, textFlow2;
protected void doTest(String stringToTest, String widthString,
String[] answers) {
doTest2(stringToTest, "", widthString, answers);
}
protected void doTest2(String string1, String string2, String widthString,
String[] answers) {
int width = -1;
if (widthString != null)
width = FigureUtilities.getStringExtents(widthString, TAHOMA).width;
figure.setSize(width, 1000);
textFlow.setText(string1);
textFlow2.setText(string2);
figure.validate();
ArrayList list = new ArrayList(textFlow.getFragments());
if (string2.length() != 0)
list.addAll(textFlow2.getFragments());
Iterator frags = list.iterator();
int index = 0;
TextFragmentBox previousFrag = null;
for (; index < answers.length; index++) {
String answer = answers[index];
if (answer == TERMINATE) {
// if (frags.hasNext()) {
// TextFragmentBox box = (TextFragmentBox)frags.next();
// assertTrue("Failed on: " + string1 + string2 +
// " Found extra fragment: -"
// + string1.substring(box.offset, box.offset + box.length) +
// "-\n",
// false);
// }
return;
} else if (answer == TRUNCATED) {
assertTrue("Failed on: " + string1 + string2
+ "Fragment is not truncated\n",
previousFrag.isTruncated());
continue;
} else if (answer == NON_TRUNCATED) {
assertFalse("Failed on: " + string1 + string2
+ "Fragment is truncated\n", previousFrag.isTruncated());
continue;
}
if (!frags.hasNext())
break;
TextFragmentBox frag = (TextFragmentBox) frags.next();
if (answer == SAMELINE) {
assertTrue("Failed on: " + string1 + string2
+ " Fragments are not on the same line\n",
previousFrag.getBaseline() == frag.getBaseline());
index++;
if (index >= answers.length)
return;
answer = answers[index];
} else if (answer == NEWLINE) {
assertTrue("Failed on: " + string1 + string2
+ " Fragments are on the same line\n",
previousFrag.getBaseline() != frag.getBaseline());
index++;
if (index >= answers.length)
return;
answer = answers[index];
}
previousFrag = frag;
if (textFlow.getFragments().contains(frag)) {
assertEquals(
"Failed on: \""
+ string1
+ "\" + \""
+ string2
+ "\" Fragment expected: \""
+ answer
+ "\" Got: \""
+ string1.substring(frag.offset, frag.offset
+ frag.length) + "\"\n",
answer,
string1.substring(frag.offset, frag.offset
+ frag.length));
} else {
assertEquals(
"Failed on: \""
+ string1
+ "\" + \""
+ string2
+ "\" Fragment expected: \""
+ answer
+ "\" Got: \""
+ string2.substring(frag.offset, frag.offset
+ frag.length) + "\"\n",
answer,
string2.substring(frag.offset, frag.offset
+ frag.length));
}
}
if (index < answers.length) {
// We put this in the if statement because the error message
// accesses answers[index]
// which would cause an index out of bounds exception if there were
// no leftover
// fragments
assertFalse("Failed on: \"" + string1 + "\" + \"" + string2
+ "\" Fragment expected: -" + answers[index]
+ "- No corresponding fragment\n", true);
}
}
protected void runGenericTests() {
doTest("tester abc", "tester", new String[] { "tester", "abc",
TERMINATE });
doTest("tester abc", "tester a", new String[] { "tester", "abc",
TERMINATE });
doTest("tester abc", "tester ab", new String[] { "tester", "abc",
TERMINATE });
doTest("tester ab", "tester", new String[] { "tester", "ab" });
doTest("tester ab c", "tester", new String[] { "tester", "ab c" });
doTest("test\r ab c", "test ab c", new String[] { "test", " ab c" });
doTest("test\n ab c", "test ab c", new String[] { "test", " ab c" });
doTest("test\r\n abc def", "test abc def", new String[] { "test",
" abc def", TERMINATE });
doTest("\rtester abc def", "tester", new String[] { "", "tester" });
doTest("\r\ntester abc def", "tester", new String[] { "", "tester" });
doTest("\ntester abc def", "tester", new String[] { "", "tester" });
doTest("tester abc\n def", "tester", new String[] { "tester", "abc",
" def", TERMINATE });
doTest("tester abc\r\n def", "tester", new String[] { "tester", "abc",
" def", TERMINATE });
doTest("tester abc\r def", "tester", new String[] { "tester", "abc",
" def", TERMINATE });
doTest("tester abc def\r\n", "tester", new String[] { "tester", "abc",
"def", TERMINATE });
doTest("tester abc def\r", "tester", new String[] { "tester", "abc",
"def", TERMINATE });
doTest("tester abc def\n", "tester", new String[] { "tester", "abc",
"def", TERMINATE });
doTest("blah blah blah", "blah blah", new String[] { "blah blah",
"blah", TERMINATE });
doTest("blah blah blah", "blah", new String[] { "blah", "blah" });
doTest("h hh h", "h hh", new String[] { "h hh", "h", TERMINATE });
doTest("h hh h", "h hh ", new String[] { "h hh", "h" });
doTest("x x x x ", "x x x ",
new String[] { "x x x ", "x ", TERMINATE });
doTest("x x x x", "x x x", new String[] { "x x x", " x", TERMINATE });
doTest("\n\nbreak", "break", new String[] { "", "" });
doTest("\r\rbreak", "break", new String[] { "", "" });
doTest("\r\n\r\nbreak", "break", new String[] { "", "", "break",
TERMINATE });
doTest("crow ", "crow", new String[] { "crow", NEWLINE, "", TERMINATE });
doTest("abc - -moreango", "abc", new String[] { "abc", NEWLINE, "- -",
NEWLINE });
doTest("abc def ghi", "abc def g", new String[] { "abc def", "ghi",
TERMINATE });
doTest("blah blah ", "blah blah",
new String[] { "blah blah", TERMINATE });
doTest("testers testers testers ab c", "testers testers test",
new String[] { "testers testers", "testers ab c", TERMINATE });
doTest("testers\r ab c", "testers", new String[] { "testers", " ab c",
TERMINATE });
doTest("trailingSpace \n ", "trailingSpace", new String[] {
"trailingSpace", " ", " ", TERMINATE });
doTest("test \r b", "test",
new String[] { "test", "", " b", TERMINATE });
doTest(" \n \n \n ", "wwwwww", new String[] { " ", " ",
" ", " ", TERMINATE });
doTest(" \n \n ", " ", new String[] { " ", " ", " ", "", " ", " ",
TERMINATE });
doTest("\r\r\n", "wwwwwww", new String[] { "", "", TERMINATE });
doTest("", "www", new String[] { "", TERMINATE });
// empty string means availableWidth == 1
doTest("", "", new String[] { "", TERMINATE });
doTest("a cow\naha", "a cow",
new String[] { "a cow", "aha", TERMINATE });
// tests with two spaces after a period
doTest("a one. two", "a one", new String[] { "a", NEWLINE, "one.",
NEWLINE, "two" });
doTest("a one-two", "a one", new String[] { "a", NEWLINE, "one-",
NEWLINE, "two" });
// chinese characters
doTest("\u7325\u7334\u7329", "\u7325\u7334", new String[] {
"\u7325\u7334", "\u7329", TERMINATE });
doTest("\u7325\u7334\u7329", "\u7325", new String[] { "\u7325",
"\u7334", "\u7329", TERMINATE });
// BiDi
doTest2("\u0634", "foo-bar", "\u0634foo-", new String[] { "\u0634",
SAMELINE, "foo-", NEWLINE, "bar" });
// testing with multiple TextFlows will bring lookAhead into action
doTest2("foo1", " bar1", null, new String[] { "foo1", SAMELINE,
" bar1", TERMINATE });
doTest2("foo2", " bar2", "foo2 ", new String[] { "foo2", "", "bar2",
TERMINATE });
doTest2("foo3", " ba3", "foo3", new String[] { "foo3", "", NEWLINE,
"ba3", TERMINATE });
doTest2("foo4 ", " bar4", "foo4 ", new String[] { "foo4 ", "", "bar4",
TERMINATE });
doTest2("wwww ", " bar", "wwww", new String[] { "wwww", "", " bar",
TERMINATE });
doTest2("foo5 ", "bar5", "foo5 ", new String[] { "foo5", NEWLINE, "",
"bar5", TERMINATE });
doTest2("foot bar", "xyz", "barxyz", new String[] { "foot", "bar",
SAMELINE, "xyz", TERMINATE });
doTest2("foo\n", " bar6", null, new String[] { "foo", NEWLINE, "",
SAMELINE, " bar6", TERMINATE });
// doTest2("foo7-bar7", "mo", "foo7-ba", new String[] {"foo7-", NEWLINE,
// "bar7", SAMELINE, "mo", TERMINATE});
doTest2("foo-bar", "abc", "foo-barab", new String[] { "foo-", NEWLINE,
"bar", SAMELINE, "abc", TERMINATE });
// doTest2(" foobar", "abc", " foobarab", new String[] {"", NEWLINE,
// "foobar"});
doTest2("foo bar", "abc", "foo barab", new String[] { "foo ",
NEWLINE, "bar", SAMELINE, "abc", TERMINATE });
// doTest2("abd", "\u7325", "abd", new String[] {"abd", NEWLINE,
// "\u7325"});
doTest2("a abc", "-def", "a abc", new String[] { "a", NEWLINE, "abc",
SAMELINE, "-", NEWLINE, "def", TERMINATE });
doTest2("alpha\n", "bravo", null, new String[] { "alpha", NEWLINE, "",
SAMELINE, "bravo", TERMINATE });
}
protected void runHardWrappingTests() {
doTest("ahahahah", "aha", new String[] { "ahahahah", TERMINATE });
doTest("Flow Container ", " ", new String[] { "Flow", " ", "",
"Container", " ", TERMINATE });
doTest("aha \nb \r c ", "", new String[] { "aha", "", "b", "", "", "c",
TERMINATE });
doTest2("one", "two", "onet", new String[] { "one", SAMELINE, "two",
TERMINATE });
doTest2("one", "t ", "one", new String[] { "one", SAMELINE, "t",
TERMINATE });
doTest("Flowing", "flow", new String[] { "Flowing", TERMINATE });
doTest2("foobar", "foobar", "foo", new String[] { "foobar", SAMELINE,
"foobar" });
doTest2("home ", "alone", "home al", new String[] { "home", NEWLINE,
"", SAMELINE, "alone", TERMINATE });
doTest2("more willing in t", "hemorning", "more willing in themorni",
new String[] { "more willing in", NEWLINE, "t", SAMELINE,
"hemorning", TERMINATE });
}
protected void runSoftWrappingTests() {
doTest("tester ab", "teste", new String[] { "teste", NEWLINE, "r ab",
TERMINATE });
doTest("aha \nb \r c ", "", new String[] { "a", "h", "a", "", "b", "",
"", "c", TERMINATE });
doTest("\u0634abcd", "\u0634abc", new String[] { "\u0634", SAMELINE,
"abc", NEWLINE, "d", TERMINATE });
// doTest2("foofoo", "foo", "foo", new String[] {"foo", NEWLINE, "foo",
// NEWLINE, "foo", TERMINATE});
// doTest2("foofo", "ofoo", "foo", new String[] {"foo", NEWLINE, "fo",
// SAMELINE, "o", NEWLINE, "foo", TERMINATE});
}
protected void runTruncatedWrappingTests() {
doTest("Flowing Container", "Flo...", new String[] { "Flo", NEWLINE,
"Co", TERMINATE });
doTest("Flowing C", "Flo...", new String[] { "Flo", "C", TERMINATE });
doTest("Fooooooo", "...", new String[] { "", TRUNCATED, TERMINATE });
doTest("WWW", "|...", new String[] { "", TRUNCATED, TERMINATE });
doTest(" Foo", "Foo", new String[] { "", "Foo", TERMINATE });
// doTest("aha \nb \r c ", "", new String[] {"", TRUNCATED, NEWLINE,
// "b", NON_TRUNCATED, NEWLINE, "", NON_TRUNCATED, NEWLINE, "c",
// NON_TRUNCATED});
// doTest("aha \nb \r c", "", new String[] {"", TRUNCATED, "",
// NON_TRUNCATED, "b", "", NON_TRUNCATED, "", "c", TERMINATE});
// doTest("aha \nb \r w ", "..", new String[] {"", TRUNCATED, "",
// NON_TRUNCATED, "b", "", NON_TRUNCATED, "", "w", TERMINATE});
// truncation is not supported with BiDi and across figures (with
// look-ahead), so we're
// not testing it here
// doTest2("foobar", "foobar", "foobar...", new String[] {"foobar",
// SAMELINE, "", TERMINATE});
// doTest2("foobar", "foobar", "fooba...", new String[] {"fooba",
// TERMINATE});
// doTest2("foobar", "foobar", "f...", new String[] {"f", TERMINATE});
}
public void testHardWrapping() {
figure = new FlowPage();
textFlow = new TextFlow();
textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
ParagraphTextLayout.WORD_WRAP_HARD));
textFlow.setFont(TAHOMA);
figure.add(textFlow);
textFlow2 = new TextFlow();
textFlow2.setLayoutManager(new ParagraphTextLayout(textFlow2,
ParagraphTextLayout.WORD_WRAP_HARD));
textFlow2.setFont(TAHOMA);
figure.add(textFlow2);
runGenericTests();
runHardWrappingTests();
}
public void testSoftWrapping() {
figure = new FlowPage();
textFlow = new TextFlow();
textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
ParagraphTextLayout.WORD_WRAP_SOFT));
textFlow.setFont(TAHOMA);
figure.add(textFlow);
textFlow2 = new TextFlow();
textFlow2.setLayoutManager(new ParagraphTextLayout(textFlow2,
ParagraphTextLayout.WORD_WRAP_SOFT));
textFlow2.setFont(TAHOMA);
figure.add(textFlow2);
runGenericTests();
runSoftWrappingTests();
}
public void testTruncatedWrapping() {
figure = new FlowPage();
textFlow = new TextFlow();
textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
ParagraphTextLayout.WORD_WRAP_TRUNCATE));
textFlow.setFont(TAHOMA);
figure.add(textFlow);
textFlow2 = new TextFlow();
textFlow2.setLayoutManager(new ParagraphTextLayout(textFlow2,
ParagraphTextLayout.WORD_WRAP_TRUNCATE));
textFlow2.setFont(TAHOMA);
figure.add(textFlow2);
runGenericTests();
runTruncatedWrappingTests();
}
public void testInlineFlow() {
figure = new FlowPage();
InlineFlow inline = new InlineFlow();
textFlow = new TextFlow();
textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
ParagraphTextLayout.WORD_WRAP_SOFT));
textFlow.setFont(TAHOMA);
inline.add(textFlow);
figure.add(inline);
textFlow2 = new TextFlow();
textFlow2.setLayoutManager(new ParagraphTextLayout(textFlow2,
ParagraphTextLayout.WORD_WRAP_SOFT));
textFlow2.setFont(TAHOMA);
figure.add(textFlow2);
runGenericTests();
runSoftWrappingTests();
figure = new FlowPage();
inline = new InlineFlow();
textFlow = new TextFlow();
textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
ParagraphTextLayout.WORD_WRAP_HARD));
textFlow.setFont(TAHOMA);
inline.add(textFlow);
figure.add(inline);
textFlow2 = new TextFlow();
textFlow2.setLayoutManager(new ParagraphTextLayout(textFlow2,
ParagraphTextLayout.WORD_WRAP_HARD));
textFlow2.setFont(TAHOMA);
figure.add(textFlow2);
runGenericTests();
runHardWrappingTests();
doTest2("def", "def", "defde", new String[] { "def", SAMELINE, "def",
TERMINATE });
}
public void testNestedInlineFlows() {
figure = new FlowPage();
textFlow = new TextFlow();
textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
ParagraphTextLayout.WORD_WRAP_SOFT));
textFlow.setFont(TAHOMA);
figure.add(textFlow);
InlineFlow inline = new InlineFlow();
figure.add(inline);
InlineFlow inline2 = new InlineFlow();
inline.add(inline2);
textFlow2 = new TextFlow();
textFlow2.setLayoutManager(new ParagraphTextLayout(textFlow2,
ParagraphTextLayout.WORD_WRAP_SOFT));
textFlow2.setFont(TAHOMA);
inline2.add(textFlow2);
runGenericTests();
runSoftWrappingTests();
figure = new FlowPage();
textFlow = new TextFlow();
textFlow.setLayoutManager(new ParagraphTextLayout(textFlow,
ParagraphTextLayout.WORD_WRAP_HARD));
textFlow.setFont(TAHOMA);
figure.add(textFlow);
inline = new InlineFlow();
figure.add(inline);
inline2 = new InlineFlow();
inline.add(inline2);
textFlow2 = new TextFlow();
textFlow2.setLayoutManager(new ParagraphTextLayout(textFlow2,
ParagraphTextLayout.WORD_WRAP_HARD));
textFlow2.setFont(TAHOMA);
inline2.add(textFlow2);
runGenericTests();
runHardWrappingTests();
doTest2("def", "def", "defde", new String[] { "def", SAMELINE, "def",
TERMINATE });
}
}