1
/* Copyright 2002-2005 Elliotte Rusty Harold
3
This library is free software; you can redistribute it and/or modify
4
it under the terms of version 2.1 of the GNU Lesser General Public
5
License as published by the Free Software Foundation.
7
This library is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU Lesser General Public License for more details.
12
You should have received a copy of the GNU Lesser General Public
13
License along with this library; if not, write to the
14
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
15
Boston, MA 02111-1307 USA
17
You can contact Elliotte Rusty Harold by sending e-mail to
18
elharo@metalab.unc.edu. Please include the word "XOM" in the
19
subject line. The XOM home page is located at http://www.xom.nu/
24
import nu.xom.Element;
25
import nu.xom.IllegalCharacterDataException;
32
* Basic tests for the <code>Text</code> class.
35
* @author Elliotte Rusty Harold
39
public class TextTest extends XOMTestCase {
42
public TextTest(String name) {
47
public void testConstructor() {
48
Text a1 = new Text("test");
49
assertEquals("test", a1.getValue());
53
public void testSetter() {
58
" spaces on both ends ",
59
" quotes \" \" quotes",
60
" single \'\' quotes",
61
" both double and single \"\'\"\' quotes",
62
" angle brackets < > <<<",
63
" carriage returns \r\r\r",
65
" <![CDATA[ CDATA end: ]]>",
67
" ampersands & &&& &name; "
70
Text t = new Text("name");
72
// Things that shouldn't cause an exception
73
for (int i = 0; i < legal.length; i++) {
75
assertEquals(legal[i], t.getValue());
79
assertEquals("", t.getValue());
82
t.setValue("test \u0000 test ");
83
fail("Should raise an IllegalCharacterDataException");
85
catch (IllegalCharacterDataException success) {
86
assertEquals("test \u0000 test ", success.getData());
87
assertNotNull(success.getMessage());
93
public void testToXML() {
95
String[] easyCases = {
98
" spaces on both ends ",
99
" quotes \" \" quotes",
100
" single \'\' quotes",
101
" both double and single \"\'\"\' quotes"
104
Text t = new Text("name");
106
// Things that shouldn't cause an exception
107
for (int i = 0; i < easyCases.length; i++) {
108
t.setValue(easyCases[i]);
109
assertEquals(easyCases[i], t.toXML());
113
assertEquals("<>", t.toXML());
115
assertEquals("&amp;", t.toXML());
117
assertEquals("]]>", t.toXML());
119
assertEquals("
", t.toXML());
124
public void testPunctuationCharactersInToXML() {
126
String data = "=,.!@#$%^*()_-\"'[]{}+/?;:`|\\";
127
Text t = new Text(data);
128
assertEquals(data, t.toXML());
133
public void testEquals() {
135
Text c1 = new Text("test");
136
Text c2 = new Text("test");
137
Text c3 = new Text("skjlchsakdjh");
139
assertEquals(c1, c1);
140
assertEquals(c1.hashCode(), c1.hashCode());
141
assertTrue(!c1.equals(c2));
142
assertTrue(!c1.equals(c3));
147
public void testCopy() {
149
Text c1 = new Text("test");
150
Text c2 = (Text) c1.copy();
152
assertEquals(c1.getValue(), c2.getValue());
153
assertEquals(c1, c2);
154
assertTrue(!c1.equals(c2));
155
assertNull(c2.getParent());
160
public void testCopyisNotACDATASection() {
162
Text c1 = new Text("test");
164
assertEquals(Text.class, c2.getClass());
169
// Check passing in a string with broken surrogate pairs
170
// and with correct surrogate pairs
171
public void testSurrogates() {
173
String goodString = "test: \uD8F5\uDF80 ";
174
Text c = new Text(goodString);
175
assertEquals(goodString, c.getValue());
179
new Text("test: \uD8F5\uDBF0 ");
180
fail("Should raise an IllegalCharacterDataException");
182
catch (IllegalCharacterDataException success) {
183
assertNotNull(success.getMessage());
184
assertEquals("test: \uD8F5\uDBF0 ", success.getData());
189
new Text("test: \uD8F5\uD8F5 ");
190
fail("Should raise an IllegalCharacterDataException");
192
catch (IllegalCharacterDataException success) {
193
assertEquals("test: \uD8F5\uD8F5 ", success.getData());
194
assertNotNull(success.getMessage());
199
new Text("test: \uD8F5 ");
200
fail("Should raise an IllegalCharacterDataException");
202
catch (IllegalCharacterDataException success) {
203
assertNotNull(success.getMessage());
204
assertEquals("test: \uD8F5 ", success.getData());
209
new Text("test: \uDF80 ");
210
fail("Should raise an IllegalCharacterDataException");
212
catch (IllegalCharacterDataException success) {
213
assertNotNull(success.getMessage());
214
assertEquals("test: \uDF80 ", success.getData());
217
// Low half before high half
219
new Text("test: \uDCF5\uD8F5 ");
220
fail("Should raise an IllegalCharacterDataException");
222
catch (IllegalCharacterDataException success) {
223
assertEquals("test: \uDCF5\uD8F5 ", success.getData());
224
assertNotNull(success.getMessage());
230
public void testNonBMPText() {
232
StringBuffer sb = new StringBuffer(2);
233
for (char high = '\uD800'; high <= '\uDB7F'; high++) {
234
for (char low = '\uDC00'; low <= '\uDFFF'; low++) {
238
String s = sb.toString();
239
Text t = new Text(s);
240
assertEquals(s, t.getValue());
247
public void testEndOfBMP() {
251
fail("allowed FFFE");
253
catch (IllegalCharacterDataException success) {
254
assertEquals("\uFFFE", success.getData());
255
assertNotNull(success.getMessage());
260
fail("allowed FFFF");
262
catch (IllegalCharacterDataException success) {
263
assertEquals("\uFFFF", success.getData());
264
assertNotNull(success.getMessage());
270
public void testLeafNode() {
272
Text c1 = new Text("data");
273
assertEquals(0, c1.getChildCount());
276
fail("Didn't throw IndexOutofBoundsException");
278
catch (IndexOutOfBoundsException success) {
282
assertNull(c1.getParent());
284
Element element = new Element("test");
285
element.appendChild(c1);
286
assertEquals(element, c1.getParent());
287
assertEquals(c1, element.getChild(0));
289
element.removeChild(c1);
290
assertEquals(0, element.getChildCount());
295
public void testToStringWithLineFeed() {
297
Text t = new Text("content\ncontent");
298
assertEquals("[nu.xom.Text: content\\ncontent]", t.toString());
303
public void testToStringWithCarriageReturn() {
305
Text t = new Text("content\rcontent");
306
assertEquals("[nu.xom.Text: content\\rcontent]", t.toString());
311
public void testToStringWithCarriageReturnLinefeed() {
313
Text t = new Text("content\r\ncontent");
314
assertEquals("[nu.xom.Text: content\\r\\ncontent]", t.toString());
319
public void testToStringWithTab() {
321
Text t = new Text("content\tcontent");
322
assertEquals("[nu.xom.Text: content\\tcontent]", t.toString());
327
public void testToString() {
329
Text t = new Text("content");
330
assertEquals("[nu.xom.Text: content]", t.toString());
332
t.setValue("012345678901234567890123456789012345678901234567890123456789");
334
"[nu.xom.Text: 01234567890123456789012345678901234...]",
341
// Make sure carriage returns are escaped properly by toXML()
342
public void testCarriageReturnInText() {
343
Text text = new Text("data\rdata");
344
String xml = text.toXML();
345
assertEquals("data
data", xml);
349
public void testHighSurrogateWithNoLowSurrogate() {
351
String data = String.valueOf((char) 0xD800);
354
fail("Allowed single high surrogate in text node");
356
catch (IllegalCharacterDataException success) {
357
assertEquals(data, success.getData());
358
assertNotNull(success.getMessage());