*/
public final class TestProblems extends HWPFTestCase {
- /**
- * ListEntry passed no ListTable
- */
- public void testListEntryNoListTable() {
- HWPFDocument doc = HWPFTestDataSamples.openSampleFile("ListEntryNoListTable.doc");
-
- Range r = doc.getRange();
- StyleSheet styleSheet = doc.getStyleSheet();
- for (int x = 0; x < r.numSections(); x++) {
- Section s = r.getSection(x);
- for (int y = 0; y < s.numParagraphs(); y++) {
- Paragraph paragraph = s.getParagraph(y);
- // System.out.println(paragraph.getCharacterRun(0).text());
- }
- }
- }
-
- /**
- * AIOOB for TableSprmUncompressor.unCompressTAPOperation
- */
- public void testSprmAIOOB() {
- HWPFDocument doc = HWPFTestDataSamples.openSampleFile("AIOOB-Tap.doc");
-
- Range r = doc.getRange();
- StyleSheet styleSheet = doc.getStyleSheet();
- for (int x = 0; x < r.numSections(); x++) {
- Section s = r.getSection(x);
- for (int y = 0; y < s.numParagraphs(); y++) {
- Paragraph paragraph = s.getParagraph(y);
- // System.out.println(paragraph.getCharacterRun(0).text());
- }
- }
- }
-
- /**
- * Test for TableCell not skipping the last paragraph. Bugs #45062 and
- * #44292
- */
- public void testTableCellLastParagraph() {
- HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug44292.doc");
- Range r = doc.getRange();
- assertEquals(6, r.numParagraphs());
- assertEquals(0, r.getStartOffset());
- assertEquals(87, r.getEndOffset());
-
- // Paragraph with table
- Paragraph p = r.getParagraph(0);
- assertEquals(0, p.getStartOffset());
- assertEquals(20, p.getEndOffset());
-
- // Get the table
- Table t = r.getTable(p);
-
- // get the only row
- assertEquals(1, t.numRows());
- TableRow row = t.getRow(0);
-
- // get the first cell
- TableCell cell = row.getCell(0);
- // First cell should have one paragraph
- assertEquals(1, cell.numParagraphs());
- assertEquals("One paragraph is ok\7", cell.getParagraph(0).text());
-
- // get the second
- cell = row.getCell(1);
- // Second cell should be detected as having two paragraphs
- assertEquals(2, cell.numParagraphs());
- assertEquals("First para is ok\r", cell.getParagraph(0).text());
- assertEquals("Second paragraph is skipped\7", cell.getParagraph(1).text());
-
- // get the last cell
- cell = row.getCell(2);
- // Last cell should have one paragraph
- assertEquals(1, cell.numParagraphs());
- assertEquals("One paragraph is ok\7", cell.getParagraph(0).text());
- }
-
- public void testRangeDelete() {
- HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug28627.doc");
-
- Range range = doc.getRange();
- int numParagraphs = range.numParagraphs();
-
- int totalLength = 0, deletedLength = 0;
-
- for (int i = 0; i < numParagraphs; i++) {
- Paragraph para = range.getParagraph(i);
- String text = para.text();
-
- totalLength += text.length();
- if (text.indexOf("{delete me}") > -1) {
- para.delete();
- deletedLength = text.length();
- }
- }
-
- // check the text length after deletion
- int newLength = 0;
- range = doc.getRange();
- numParagraphs = range.numParagraphs();
-
- for (int i = 0; i < numParagraphs; i++) {
- Paragraph para = range.getParagraph(i);
- String text = para.text();
-
- newLength += text.length();
- }
-
- assertEquals(newLength, totalLength - deletedLength);
- }
-
- /**
- * With an encrypted file, we should give a suitable exception, and not OOM
- */
- public void testEncryptedFile() {
- try {
- HWPFTestDataSamples.openSampleFile("PasswordProtected.doc");
- fail();
- } catch (EncryptedDocumentException e) {
- // Good
- }
- }
-
- public void testWriteProperties() {
- HWPFDocument doc = HWPFTestDataSamples.openSampleFile("SampleDoc.doc");
- assertEquals("Nick Burch", doc.getSummaryInformation().getAuthor());
-
- // Write and read
- HWPFDocument doc2 = writeOutAndRead(doc);
- assertEquals("Nick Burch", doc2.getSummaryInformation().getAuthor());
- }
-
- /**
- * Test for reading paragraphs from Range after replacing some
- * text in this Range.
- * Bug #45269
- */
- public void testReadParagraphsAfterReplaceText()throws Exception{
- HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug45269.doc");
- Range range = doc.getRange();
-
- String toFind = "campo1";
- String longer = " foi porraaaaa ";
- String shorter = " foi ";
-
- //check replace with longer text
- for (int x = 0; x < range.numParagraphs(); x++) {
- Paragraph para = range.getParagraph(x);
- int offset = para.text().indexOf(toFind);
- if (offset >= 0) {
- para.replaceText(toFind, longer, offset);
- assertEquals(offset, para.text().indexOf(longer));
+ /**
+ * ListEntry passed no ListTable
+ */
+ public void testListEntryNoListTable() {
+ HWPFDocument doc = HWPFTestDataSamples.openSampleFile("ListEntryNoListTable.doc");
+
+ Range r = doc.getRange();
+ StyleSheet styleSheet = doc.getStyleSheet();
+ for (int x = 0; x < r.numSections(); x++) {
+ Section s = r.getSection(x);
+ for (int y = 0; y < s.numParagraphs(); y++) {
+ Paragraph paragraph = s.getParagraph(y);
+ // System.out.println(paragraph.getCharacterRun(0).text());
+ }
+ }
+ }
+
+ /**
+ * AIOOB for TableSprmUncompressor.unCompressTAPOperation
+ */
+ public void testSprmAIOOB() {
+ HWPFDocument doc = HWPFTestDataSamples.openSampleFile("AIOOB-Tap.doc");
+
+ Range r = doc.getRange();
+ StyleSheet styleSheet = doc.getStyleSheet();
+ for (int x = 0; x < r.numSections(); x++) {
+ Section s = r.getSection(x);
+ for (int y = 0; y < s.numParagraphs(); y++) {
+ Paragraph paragraph = s.getParagraph(y);
+ // System.out.println(paragraph.getCharacterRun(0).text());
+ }
+ }
+ }
+
+ /**
+ * Test for TableCell not skipping the last paragraph. Bugs #45062 and
+ * #44292
+ */
+ public void testTableCellLastParagraph() {
+ HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug44292.doc");
+ Range r = doc.getRange();
+ assertEquals(6, r.numParagraphs());
+ assertEquals(0, r.getStartOffset());
+ assertEquals(87, r.getEndOffset());
+
+ // Paragraph with table
+ Paragraph p = r.getParagraph(0);
+ assertEquals(0, p.getStartOffset());
+ assertEquals(20, p.getEndOffset());
+
+ // Check a few bits of the table directly
+ assertEquals("One paragraph is ok\7", r.getParagraph(0).text());
+ assertEquals("First para is ok\r", r.getParagraph(1).text());
+ assertEquals("Second paragraph is skipped\7", r.getParagraph(2).text());
+ assertEquals("One paragraph is ok\7", r.getParagraph(3).text());
+ assertEquals("\7", r.getParagraph(4).text());
+ assertEquals("\r", r.getParagraph(5).text());
+ for(int i=0; i<=5; i++) {
+ assertFalse(r.getParagraph(i).usesUnicode());
+ }
+
+
+ // Get the table
+ Table t = r.getTable(p);
+
+ // get the only row
+ assertEquals(1, t.numRows());
+ TableRow row = t.getRow(0);
+
+ // sanity check our row
+ assertEquals(5, row.numParagraphs());
+ assertEquals(0, row._parStart);
+ assertEquals(5, row._parEnd);
+ assertEquals(0, row.getStartOffset());
+ assertEquals(87, row.getEndOffset());
+
+
+ // get the first cell
+ TableCell cell = row.getCell(0);
+ // First cell should have one paragraph
+ assertEquals(1, cell.numParagraphs());
+ assertEquals("One paragraph is ok\7", cell.getParagraph(0).text());
+ assertEquals(0, cell._parStart);
+ assertEquals(1, cell._parEnd);
+ assertEquals(0, cell.getStartOffset());
+ assertEquals(20, cell.getEndOffset());
+
+
+ // get the second
+ cell = row.getCell(1);
+ // Second cell should be detected as having two paragraphs
+ assertEquals(2, cell.numParagraphs());
+ assertEquals("First para is ok\r", cell.getParagraph(0).text());
+ assertEquals("Second paragraph is skipped\7", cell.getParagraph(1).text());
+ assertEquals(1, cell._parStart);
+ assertEquals(3, cell._parEnd);
+ assertEquals(20, cell.getStartOffset());
+ assertEquals(65, cell.getEndOffset());
+
+
+ // get the last cell
+ cell = row.getCell(2);
+ // Last cell should have one paragraph
+ assertEquals(1, cell.numParagraphs());
+ assertEquals("One paragraph is ok\7", cell.getParagraph(0).text());
+ assertEquals(3, cell._parStart);
+ assertEquals(4, cell._parEnd);
+ assertEquals(65, cell.getStartOffset());
+ assertEquals(85, cell.getEndOffset());
+ }
+
+ public void testRangeDelete() {
+ HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug28627.doc");
+
+ Range range = doc.getRange();
+ int numParagraphs = range.numParagraphs();
+
+ int totalLength = 0, deletedLength = 0;
+
+ for (int i = 0; i < numParagraphs; i++) {
+ Paragraph para = range.getParagraph(i);
+ String text = para.text();
+
+ totalLength += text.length();
+ if (text.indexOf("{delete me}") > -1) {
+ para.delete();
+ deletedLength = text.length();
+ }
+ }
+
+ // check the text length after deletion
+ int newLength = 0;
+ range = doc.getRange();
+ numParagraphs = range.numParagraphs();
+
+ for (int i = 0; i < numParagraphs; i++) {
+ Paragraph para = range.getParagraph(i);
+ String text = para.text();
+
+ newLength += text.length();
+ }
+
+ assertEquals(newLength, totalLength - deletedLength);
+ }
+
+ /**
+ * With an encrypted file, we should give a suitable exception, and not OOM
+ */
+ public void testEncryptedFile() {
+ try {
+ HWPFTestDataSamples.openSampleFile("PasswordProtected.doc");
+ fail();
+ } catch (EncryptedDocumentException e) {
+ // Good
+ }
+ }
+
+ public void testWriteProperties() {
+ HWPFDocument doc = HWPFTestDataSamples.openSampleFile("SampleDoc.doc");
+ assertEquals("Nick Burch", doc.getSummaryInformation().getAuthor());
+
+ // Write and read
+ HWPFDocument doc2 = writeOutAndRead(doc);
+ assertEquals("Nick Burch", doc2.getSummaryInformation().getAuthor());
+ }
+
+ /**
+ * Test for reading paragraphs from Range after replacing some
+ * text in this Range.
+ * Bug #45269
+ */
+ public void testReadParagraphsAfterReplaceText()throws Exception{
+ HWPFDocument doc = HWPFTestDataSamples.openSampleFile("Bug45269.doc");
+ Range range = doc.getRange();
+
+ String toFind = "campo1";
+ String longer = " foi porraaaaa ";
+ String shorter = " foi ";
+
+ //check replace with longer text
+ for (int x = 0; x < range.numParagraphs(); x++) {
+ Paragraph para = range.getParagraph(x);
+ int offset = para.text().indexOf(toFind);
+ if (offset >= 0) {
+ para.replaceText(toFind, longer, offset);
+ assertEquals(offset, para.text().indexOf(longer));
+ }
+ }
+
+ doc = HWPFTestDataSamples.openSampleFile("Bug45269.doc");
+ range = doc.getRange();
+
+ //check replace with shorter text
+ for (int x = 0; x < range.numParagraphs(); x++) {
+ Paragraph para = range.getParagraph(x);
+ int offset = para.text().indexOf(toFind);
+ if (offset >= 0) {
+ para.replaceText(toFind, shorter, offset);
+ assertEquals(offset, para.text().indexOf(shorter));
+ }
}
- }
-
- doc = HWPFTestDataSamples.openSampleFile("Bug45269.doc");
- range = doc.getRange();
-
- //check replace with shorter text
- for (int x = 0; x < range.numParagraphs(); x++) {
- Paragraph para = range.getParagraph(x);
- int offset = para.text().indexOf(toFind);
- if (offset >= 0) {
- para.replaceText(toFind, shorter, offset);
- assertEquals(offset, para.text().indexOf(shorter));
+ }
+
+ /**
+ * Bug #48245 - don't include the text from the
+ * next cell in the current one
+ */
+ public void testTableIterator() throws Exception {
+ HWPFDocument doc = HWPFTestDataSamples.openSampleFile("simple-table2.doc");
+ Range r = doc.getRange();
+
+ // Check the text is as we'd expect
+ assertEquals(13, r.numParagraphs());
+ assertEquals("Row 1/Cell 1\u0007", r.getParagraph(0).text());
+ assertEquals("Row 1/Cell 2\u0007", r.getParagraph(1).text());
+ assertEquals("Row 1/Cell 3\u0007", r.getParagraph(2).text());
+ assertEquals("\u0007", r.getParagraph(3).text());
+ assertEquals("Row 2/Cell 1\u0007", r.getParagraph(4).text());
+ assertEquals("Row 2/Cell 2\u0007", r.getParagraph(5).text());
+ assertEquals("Row 2/Cell 3\u0007", r.getParagraph(6).text());
+ assertEquals("\u0007", r.getParagraph(7).text());
+ assertEquals("Row 3/Cell 1\u0007", r.getParagraph(8).text());
+ assertEquals("Row 3/Cell 2\u0007", r.getParagraph(9).text());
+ assertEquals("Row 3/Cell 3\u0007", r.getParagraph(10).text());
+ assertEquals("\u0007", r.getParagraph(11).text());
+ assertEquals("\r", r.getParagraph(12).text());
+ for(int i=0; i<=12; i++) {
+ assertFalse(r.getParagraph(i).usesUnicode());
}
- }
- }
+
+ Paragraph p;
+
+ // Take a look in detail at the first couple of
+ // paragraphs
+ p = r.getParagraph(0);
+ assertEquals(1, p.numParagraphs());
+ assertEquals(0, p.getStartOffset());
+ assertEquals(13, p.getEndOffset());
+ assertEquals(0, p._parStart);
+ assertEquals(1, p._parEnd);
+
+ p = r.getParagraph(1);
+ assertEquals(1, p.numParagraphs());
+ assertEquals(13, p.getStartOffset());
+ assertEquals(26, p.getEndOffset());
+ assertEquals(1, p._parStart);
+ assertEquals(2, p._parEnd);
+
+ p = r.getParagraph(2);
+ assertEquals(1, p.numParagraphs());
+ assertEquals(26, p.getStartOffset());
+ assertEquals(39, p.getEndOffset());
+ assertEquals(2, p._parStart);
+ assertEquals(3, p._parEnd);
+
+
+ // Now look at the table
+ Table table = r.getTable(r.getParagraph(0));
+ assertEquals(3, table.numRows());
+
+ TableRow row;
+ TableCell cell;
+
+
+ row = table.getRow(0);
+ assertEquals(0, row._parStart);
+ assertEquals(4, row._parEnd);
+
+ cell = row.getCell(0);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(0, cell._parStart);
+ assertEquals(1, cell._parEnd);
+ assertEquals(0, cell.getStartOffset());
+ assertEquals(13, cell.getEndOffset());
+ assertEquals("Row 1/Cell 1\u0007", cell.text());
+
+ cell = row.getCell(1);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(1, cell._parStart);
+ assertEquals(2, cell._parEnd);
+ assertEquals(13, cell.getStartOffset());
+ assertEquals(26, cell.getEndOffset());
+ assertEquals("Row 1/Cell 2\u0007", cell.text());
+
+ cell = row.getCell(2);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(2, cell._parStart);
+ assertEquals(3, cell._parEnd);
+ assertEquals(26, cell.getStartOffset());
+ assertEquals(39, cell.getEndOffset());
+ assertEquals("Row 1/Cell 3\u0007", cell.text());
+
+
+ // Onto row #2
+ row = table.getRow(1);
+ assertEquals(4, row._parStart);
+ assertEquals(8, row._parEnd);
+
+ cell = row.getCell(0);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(4, cell._parStart);
+ assertEquals(5, cell._parEnd);
+ assertEquals(40, cell.getStartOffset());
+ assertEquals(53, cell.getEndOffset());
+ assertEquals("Row 2/Cell 1\u0007", cell.text());
+
+ cell = row.getCell(1);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(5, cell._parStart);
+ assertEquals(6, cell._parEnd);
+ assertEquals(53, cell.getStartOffset());
+ assertEquals(66, cell.getEndOffset());
+ assertEquals("Row 2/Cell 2\u0007", cell.text());
+
+ cell = row.getCell(2);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(6, cell._parStart);
+ assertEquals(7, cell._parEnd);
+ assertEquals(66, cell.getStartOffset());
+ assertEquals(79, cell.getEndOffset());
+ assertEquals("Row 2/Cell 3\u0007", cell.text());
+
+
+ // Finally row 3
+ row = table.getRow(2);
+ assertEquals(8, row._parStart);
+ assertEquals(12, row._parEnd);
+
+ cell = row.getCell(0);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(8, cell._parStart);
+ assertEquals(9, cell._parEnd);
+ assertEquals(80, cell.getStartOffset());
+ assertEquals(93, cell.getEndOffset());
+ assertEquals("Row 3/Cell 1\u0007", cell.text());
+
+ cell = row.getCell(1);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(9, cell._parStart);
+ assertEquals(10, cell._parEnd);
+ assertEquals(93, cell.getStartOffset());
+ assertEquals(106, cell.getEndOffset());
+ assertEquals("Row 3/Cell 2\u0007", cell.text());
+
+ cell = row.getCell(2);
+ assertEquals(1, cell.numParagraphs());
+ assertEquals(10, cell._parStart);
+ assertEquals(11, cell._parEnd);
+ assertEquals(106, cell.getStartOffset());
+ assertEquals(119, cell.getEndOffset());
+ assertEquals("Row 3/Cell 3\u0007", cell.text());
+ }
}