You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TestMissingRecordAwareHSSFListener.java 36KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886
  1. /* ====================================================================
  2. Licensed to the Apache Software Foundation (ASF) under one or more
  3. contributor license agreements. See the NOTICE file distributed with
  4. this work for additional information regarding copyright ownership.
  5. The ASF licenses this file to You under the Apache License, Version 2.0
  6. (the "License"); you may not use this file except in compliance with
  7. the License. You may obtain a copy of the License at
  8. http://www.apache.org/licenses/LICENSE-2.0
  9. Unless required by applicable law or agreed to in writing, software
  10. distributed under the License is distributed on an "AS IS" BASIS,
  11. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. See the License for the specific language governing permissions and
  13. limitations under the License.
  14. ==================================================================== */
  15. package org.apache.poi.hssf.eventusermodel;
  16. import java.io.IOException;
  17. import java.io.InputStream;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import junit.framework.AssertionFailedError;
  21. import junit.framework.TestCase;
  22. import org.apache.poi.hssf.HSSFTestDataSamples;
  23. import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;
  24. import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;
  25. import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingRowDummyRecord;
  26. import org.apache.poi.hssf.record.BOFRecord;
  27. import org.apache.poi.hssf.record.BlankRecord;
  28. import org.apache.poi.hssf.record.CellValueRecordInterface;
  29. import org.apache.poi.hssf.record.DimensionsRecord;
  30. import org.apache.poi.hssf.record.FormulaRecord;
  31. import org.apache.poi.hssf.record.LabelSSTRecord;
  32. import org.apache.poi.hssf.record.MulBlankRecord;
  33. import org.apache.poi.hssf.record.NumberRecord;
  34. import org.apache.poi.hssf.record.Record;
  35. import org.apache.poi.hssf.record.RowRecord;
  36. import org.apache.poi.hssf.record.SharedFormulaRecord;
  37. import org.apache.poi.hssf.record.StringRecord;
  38. import org.apache.poi.hssf.record.WindowTwoRecord;
  39. import org.apache.poi.poifs.filesystem.POIFSFileSystem;
  40. /**
  41. * Tests for MissingRecordAwareHSSFListener
  42. */
  43. public final class TestMissingRecordAwareHSSFListener extends TestCase {
  44. private Record[] r;
  45. private void readRecords(String sampleFileName) {
  46. HSSFRequest req = new HSSFRequest();
  47. MockHSSFListener mockListen = new MockHSSFListener();
  48. MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(mockListen);
  49. req.addListenerForAllRecords(listener);
  50. HSSFEventFactory factory = new HSSFEventFactory();
  51. try {
  52. InputStream is = HSSFTestDataSamples.openSampleFileStream(sampleFileName);
  53. POIFSFileSystem fs = new POIFSFileSystem(is);
  54. factory.processWorkbookEvents(req, fs);
  55. } catch (IOException e) {
  56. throw new RuntimeException(e);
  57. }
  58. r = mockListen.getRecords();
  59. assertTrue(r.length > 100);
  60. }
  61. public void openNormal() {
  62. readRecords("MissingBits.xls");
  63. }
  64. public void testMissingRowRecords() {
  65. openNormal();
  66. // We have rows 0, 1, 2, 20 and 21
  67. int row0 = -1;
  68. for(int i=0; i<r.length; i++) {
  69. if(r[i] instanceof RowRecord) {
  70. RowRecord rr = (RowRecord)r[i];
  71. if(rr.getRowNumber() == 0) { row0 = i; }
  72. }
  73. }
  74. assertTrue(row0 > -1);
  75. // Following row 0, we should have 1, 2, then dummy, then 20+21+22
  76. assertTrue(r[row0] instanceof RowRecord);
  77. assertTrue(r[row0+1] instanceof RowRecord);
  78. assertTrue(r[row0+2] instanceof RowRecord);
  79. assertTrue(r[row0+3] instanceof MissingRowDummyRecord);
  80. assertTrue(r[row0+4] instanceof MissingRowDummyRecord);
  81. assertTrue(r[row0+5] instanceof MissingRowDummyRecord);
  82. assertTrue(r[row0+6] instanceof MissingRowDummyRecord);
  83. // ...
  84. assertTrue(r[row0+18] instanceof MissingRowDummyRecord);
  85. assertTrue(r[row0+19] instanceof MissingRowDummyRecord);
  86. assertTrue(r[row0+20] instanceof RowRecord);
  87. assertTrue(r[row0+21] instanceof RowRecord);
  88. assertTrue(r[row0+22] instanceof RowRecord);
  89. // Check things had the right row numbers
  90. RowRecord rr;
  91. rr = (RowRecord)r[row0+2];
  92. assertEquals(2, rr.getRowNumber());
  93. rr = (RowRecord)r[row0+20];
  94. assertEquals(20, rr.getRowNumber());
  95. rr = (RowRecord)r[row0+21];
  96. assertEquals(21, rr.getRowNumber());
  97. MissingRowDummyRecord mr;
  98. mr = (MissingRowDummyRecord)r[row0+3];
  99. assertEquals(3, mr.getRowNumber());
  100. mr = (MissingRowDummyRecord)r[row0+4];
  101. assertEquals(4, mr.getRowNumber());
  102. mr = (MissingRowDummyRecord)r[row0+5];
  103. assertEquals(5, mr.getRowNumber());
  104. mr = (MissingRowDummyRecord)r[row0+18];
  105. assertEquals(18, mr.getRowNumber());
  106. mr = (MissingRowDummyRecord)r[row0+19];
  107. assertEquals(19, mr.getRowNumber());
  108. }
  109. public void testEndOfRowRecords() {
  110. openNormal();
  111. // Find the cell at 0,0
  112. int cell00 = -1;
  113. for(int i=0; i<r.length; i++) {
  114. if(r[i] instanceof LabelSSTRecord) {
  115. LabelSSTRecord lr = (LabelSSTRecord)r[i];
  116. if(lr.getRow() == 0 && lr.getColumn() == 0) { cell00 = i; }
  117. }
  118. }
  119. assertTrue(cell00 > -1);
  120. // We have rows 0, 1, 2, 20 and 21
  121. // Row 0 has 1 entry
  122. // Row 1 has 4 entries
  123. // Row 2 has 6 entries
  124. // Row 20 has 5 entries
  125. // Row 21 has 7 entries
  126. // Row 22 has 12 entries
  127. // Row 0
  128. assertFalse(r[cell00+0] instanceof LastCellOfRowDummyRecord);
  129. assertTrue(r[cell00+1] instanceof LastCellOfRowDummyRecord);
  130. // Row 1
  131. assertFalse(r[cell00+2] instanceof LastCellOfRowDummyRecord);
  132. assertFalse(r[cell00+3] instanceof LastCellOfRowDummyRecord);
  133. assertFalse(r[cell00+4] instanceof LastCellOfRowDummyRecord);
  134. assertFalse(r[cell00+5] instanceof LastCellOfRowDummyRecord);
  135. assertTrue(r[cell00+6] instanceof LastCellOfRowDummyRecord);
  136. // Row 2
  137. assertFalse(r[cell00+7] instanceof LastCellOfRowDummyRecord);
  138. assertFalse(r[cell00+8] instanceof LastCellOfRowDummyRecord);
  139. assertFalse(r[cell00+9] instanceof LastCellOfRowDummyRecord);
  140. assertFalse(r[cell00+10] instanceof LastCellOfRowDummyRecord);
  141. assertFalse(r[cell00+11] instanceof LastCellOfRowDummyRecord);
  142. assertFalse(r[cell00+12] instanceof LastCellOfRowDummyRecord);
  143. assertTrue(r[cell00+13] instanceof LastCellOfRowDummyRecord);
  144. // Row 3 -> 19
  145. assertTrue(r[cell00+14] instanceof LastCellOfRowDummyRecord);
  146. assertTrue(r[cell00+15] instanceof LastCellOfRowDummyRecord);
  147. assertTrue(r[cell00+16] instanceof LastCellOfRowDummyRecord);
  148. assertTrue(r[cell00+17] instanceof LastCellOfRowDummyRecord);
  149. assertTrue(r[cell00+18] instanceof LastCellOfRowDummyRecord);
  150. assertTrue(r[cell00+19] instanceof LastCellOfRowDummyRecord);
  151. assertTrue(r[cell00+20] instanceof LastCellOfRowDummyRecord);
  152. assertTrue(r[cell00+21] instanceof LastCellOfRowDummyRecord);
  153. assertTrue(r[cell00+22] instanceof LastCellOfRowDummyRecord);
  154. assertTrue(r[cell00+23] instanceof LastCellOfRowDummyRecord);
  155. assertTrue(r[cell00+24] instanceof LastCellOfRowDummyRecord);
  156. assertTrue(r[cell00+25] instanceof LastCellOfRowDummyRecord);
  157. assertTrue(r[cell00+26] instanceof LastCellOfRowDummyRecord);
  158. assertTrue(r[cell00+27] instanceof LastCellOfRowDummyRecord);
  159. assertTrue(r[cell00+28] instanceof LastCellOfRowDummyRecord);
  160. assertTrue(r[cell00+29] instanceof LastCellOfRowDummyRecord);
  161. assertTrue(r[cell00+30] instanceof LastCellOfRowDummyRecord);
  162. // Row 20
  163. assertFalse(r[cell00+31] instanceof LastCellOfRowDummyRecord);
  164. assertFalse(r[cell00+32] instanceof LastCellOfRowDummyRecord);
  165. assertFalse(r[cell00+33] instanceof LastCellOfRowDummyRecord);
  166. assertFalse(r[cell00+34] instanceof LastCellOfRowDummyRecord);
  167. assertFalse(r[cell00+35] instanceof LastCellOfRowDummyRecord);
  168. assertTrue(r[cell00+36] instanceof LastCellOfRowDummyRecord);
  169. // Row 21
  170. assertFalse(r[cell00+37] instanceof LastCellOfRowDummyRecord);
  171. assertFalse(r[cell00+38] instanceof LastCellOfRowDummyRecord);
  172. assertFalse(r[cell00+39] instanceof LastCellOfRowDummyRecord);
  173. assertFalse(r[cell00+40] instanceof LastCellOfRowDummyRecord);
  174. assertFalse(r[cell00+41] instanceof LastCellOfRowDummyRecord);
  175. assertFalse(r[cell00+42] instanceof LastCellOfRowDummyRecord);
  176. assertFalse(r[cell00+43] instanceof LastCellOfRowDummyRecord);
  177. assertTrue(r[cell00+44] instanceof LastCellOfRowDummyRecord);
  178. // Row 22
  179. assertFalse(r[cell00+45] instanceof LastCellOfRowDummyRecord);
  180. assertFalse(r[cell00+46] instanceof LastCellOfRowDummyRecord);
  181. assertFalse(r[cell00+47] instanceof LastCellOfRowDummyRecord);
  182. assertFalse(r[cell00+48] instanceof LastCellOfRowDummyRecord);
  183. assertFalse(r[cell00+49] instanceof LastCellOfRowDummyRecord);
  184. assertFalse(r[cell00+50] instanceof LastCellOfRowDummyRecord);
  185. assertFalse(r[cell00+51] instanceof LastCellOfRowDummyRecord);
  186. assertFalse(r[cell00+52] instanceof LastCellOfRowDummyRecord);
  187. assertFalse(r[cell00+53] instanceof LastCellOfRowDummyRecord);
  188. assertFalse(r[cell00+54] instanceof LastCellOfRowDummyRecord);
  189. assertFalse(r[cell00+55] instanceof LastCellOfRowDummyRecord);
  190. assertFalse(r[cell00+56] instanceof LastCellOfRowDummyRecord);
  191. assertTrue(r[cell00+57] instanceof LastCellOfRowDummyRecord);
  192. // Check the numbers of the last seen columns
  193. LastCellOfRowDummyRecord[] lrs = new LastCellOfRowDummyRecord[24];
  194. int lrscount = 0;
  195. for(int i=0; i<r.length; i++) {
  196. if(r[i] instanceof LastCellOfRowDummyRecord) {
  197. lrs[lrscount] = (LastCellOfRowDummyRecord)r[i];
  198. lrscount++;
  199. }
  200. }
  201. assertEquals(0, lrs[0].getLastColumnNumber());
  202. assertEquals(0, lrs[0].getRow());
  203. assertEquals(3, lrs[1].getLastColumnNumber());
  204. assertEquals(1, lrs[1].getRow());
  205. assertEquals(5, lrs[2].getLastColumnNumber());
  206. assertEquals(2, lrs[2].getRow());
  207. for(int i=3; i<=19; i++) {
  208. assertEquals(-1, lrs[i].getLastColumnNumber());
  209. assertEquals(i, lrs[i].getRow());
  210. }
  211. assertEquals(4, lrs[20].getLastColumnNumber());
  212. assertEquals(20, lrs[20].getRow());
  213. assertEquals(6, lrs[21].getLastColumnNumber());
  214. assertEquals(21, lrs[21].getRow());
  215. assertEquals(11, lrs[22].getLastColumnNumber());
  216. assertEquals(22, lrs[22].getRow());
  217. }
  218. public void testMissingCellRecords() {
  219. openNormal();
  220. // Find the cell at 0,0
  221. int cell00 = -1;
  222. for(int i=0; i<r.length; i++) {
  223. if(r[i] instanceof LabelSSTRecord) {
  224. LabelSSTRecord lr = (LabelSSTRecord)r[i];
  225. if(lr.getRow() == 0 && lr.getColumn() == 0) { cell00 = i; }
  226. }
  227. }
  228. assertTrue(cell00 > -1);
  229. // We have rows 0, 1, 2, 20 and 21
  230. // Row 0 has 1 entry, 0
  231. // Row 1 has 4 entries, 0+3
  232. // Row 2 has 6 entries, 0+5
  233. // Row 20 has 5 entries, 0-5
  234. // Row 21 has 7 entries, 0+1+3+5+6
  235. // Row 22 has 12 entries, 0+3+4+11
  236. // Row 0
  237. assertFalse(r[cell00+0] instanceof MissingCellDummyRecord);
  238. assertFalse(r[cell00+1] instanceof MissingCellDummyRecord);
  239. // Row 1
  240. assertFalse(r[cell00+2] instanceof MissingCellDummyRecord);
  241. assertTrue(r[cell00+3] instanceof MissingCellDummyRecord);
  242. assertTrue(r[cell00+4] instanceof MissingCellDummyRecord);
  243. assertFalse(r[cell00+5] instanceof MissingCellDummyRecord);
  244. assertFalse(r[cell00+6] instanceof MissingCellDummyRecord);
  245. // Row 2
  246. assertFalse(r[cell00+7] instanceof MissingCellDummyRecord);
  247. assertTrue(r[cell00+8] instanceof MissingCellDummyRecord);
  248. assertTrue(r[cell00+9] instanceof MissingCellDummyRecord);
  249. assertTrue(r[cell00+10] instanceof MissingCellDummyRecord);
  250. assertTrue(r[cell00+11] instanceof MissingCellDummyRecord);
  251. assertFalse(r[cell00+12] instanceof MissingCellDummyRecord);
  252. assertFalse(r[cell00+13] instanceof MissingCellDummyRecord);
  253. // Row 3-19
  254. assertFalse(r[cell00+14] instanceof MissingCellDummyRecord);
  255. assertFalse(r[cell00+15] instanceof MissingCellDummyRecord);
  256. // Row 20
  257. assertFalse(r[cell00+31] instanceof MissingCellDummyRecord);
  258. assertFalse(r[cell00+32] instanceof MissingCellDummyRecord);
  259. assertFalse(r[cell00+33] instanceof MissingCellDummyRecord);
  260. assertFalse(r[cell00+34] instanceof MissingCellDummyRecord);
  261. assertFalse(r[cell00+35] instanceof MissingCellDummyRecord);
  262. assertFalse(r[cell00+36] instanceof MissingCellDummyRecord);
  263. // Row 21
  264. assertFalse(r[cell00+37] instanceof MissingCellDummyRecord);
  265. assertFalse(r[cell00+38] instanceof MissingCellDummyRecord);
  266. assertTrue(r[cell00+39] instanceof MissingCellDummyRecord);
  267. assertFalse(r[cell00+40] instanceof MissingCellDummyRecord);
  268. assertTrue(r[cell00+41] instanceof MissingCellDummyRecord);
  269. assertFalse(r[cell00+42] instanceof MissingCellDummyRecord);
  270. assertFalse(r[cell00+43] instanceof MissingCellDummyRecord);
  271. assertFalse(r[cell00+44] instanceof MissingCellDummyRecord);
  272. // Row 22
  273. assertFalse(r[cell00+45] instanceof MissingCellDummyRecord);
  274. assertTrue(r[cell00+46] instanceof MissingCellDummyRecord);
  275. assertTrue(r[cell00+47] instanceof MissingCellDummyRecord);
  276. assertFalse(r[cell00+48] instanceof MissingCellDummyRecord);
  277. assertFalse(r[cell00+49] instanceof MissingCellDummyRecord);
  278. assertTrue(r[cell00+50] instanceof MissingCellDummyRecord);
  279. assertTrue(r[cell00+51] instanceof MissingCellDummyRecord);
  280. assertTrue(r[cell00+52] instanceof MissingCellDummyRecord);
  281. assertTrue(r[cell00+53] instanceof MissingCellDummyRecord);
  282. assertTrue(r[cell00+54] instanceof MissingCellDummyRecord);
  283. assertTrue(r[cell00+55] instanceof MissingCellDummyRecord);
  284. assertFalse(r[cell00+56] instanceof MissingCellDummyRecord);
  285. assertFalse(r[cell00+57] instanceof MissingCellDummyRecord);
  286. // Check some numbers
  287. MissingCellDummyRecord mc;
  288. mc = (MissingCellDummyRecord)r[cell00+3];
  289. assertEquals(1, mc.getRow());
  290. assertEquals(1, mc.getColumn());
  291. mc = (MissingCellDummyRecord)r[cell00+4];
  292. assertEquals(1, mc.getRow());
  293. assertEquals(2, mc.getColumn());
  294. mc = (MissingCellDummyRecord)r[cell00+8];
  295. assertEquals(2, mc.getRow());
  296. assertEquals(1, mc.getColumn());
  297. mc = (MissingCellDummyRecord)r[cell00+9];
  298. assertEquals(2, mc.getRow());
  299. assertEquals(2, mc.getColumn());
  300. mc = (MissingCellDummyRecord)r[cell00+55];
  301. assertEquals(22, mc.getRow());
  302. assertEquals(10, mc.getColumn());
  303. }
  304. // Make sure we don't put in any extra new lines
  305. // that aren't already there
  306. public void testNoExtraNewLines() {
  307. // Load a different file
  308. // This file has has something in lines 1-33
  309. readRecords("MRExtraLines.xls");
  310. int rowCount=0;
  311. for(int i=0; i<r.length; i++) {
  312. if(r[i] instanceof LastCellOfRowDummyRecord) {
  313. LastCellOfRowDummyRecord eor = (LastCellOfRowDummyRecord) r[i];
  314. assertEquals(rowCount, eor.getRow());
  315. rowCount++;
  316. }
  317. }
  318. // Check we got the 33 rows
  319. assertEquals(33, rowCount);
  320. }
  321. private static final class MockHSSFListener implements HSSFListener {
  322. public MockHSSFListener() {}
  323. private final List<Record> _records = new ArrayList<Record>();
  324. private boolean logToStdOut = false;
  325. public void processRecord(Record record) {
  326. _records.add(record);
  327. if(record instanceof MissingRowDummyRecord) {
  328. MissingRowDummyRecord mr = (MissingRowDummyRecord)record;
  329. log("Got dummy row " + mr.getRowNumber());
  330. }
  331. if(record instanceof MissingCellDummyRecord) {
  332. MissingCellDummyRecord mc = (MissingCellDummyRecord)record;
  333. log("Got dummy cell " + mc.getRow() + " " + mc.getColumn());
  334. }
  335. if(record instanceof LastCellOfRowDummyRecord) {
  336. LastCellOfRowDummyRecord lc = (LastCellOfRowDummyRecord)record;
  337. log("Got end-of row, row was " + lc.getRow() + ", last column was " + lc.getLastColumnNumber());
  338. }
  339. if(record instanceof BOFRecord) {
  340. BOFRecord r = (BOFRecord)record;
  341. if(r.getType() == BOFRecord.TYPE_WORKSHEET) {
  342. log("On new sheet");
  343. }
  344. }
  345. if(record instanceof RowRecord) {
  346. RowRecord rr = (RowRecord)record;
  347. log("Starting row #" + rr.getRowNumber());
  348. }
  349. }
  350. private void log(String msg) {
  351. if(logToStdOut) {
  352. System.out.println(msg);
  353. }
  354. }
  355. public Record[] getRecords() {
  356. Record[] result = new Record[_records.size()];
  357. _records.toArray(result);
  358. return result;
  359. }
  360. }
  361. /**
  362. * Make sure that the presence of shared formulas does not cause extra
  363. * end-of-row records.
  364. */
  365. public void testEndOfRow_bug45672() {
  366. readRecords("ex45672.xls");
  367. Record[] rr = r;
  368. int eorCount=0;
  369. int sfrCount=0;
  370. for (int i = 0; i < rr.length; i++) {
  371. Record record = rr[i];
  372. if (record instanceof SharedFormulaRecord) {
  373. sfrCount++;
  374. }
  375. if (record instanceof LastCellOfRowDummyRecord) {
  376. eorCount++;
  377. }
  378. }
  379. if (eorCount == 2) {
  380. throw new AssertionFailedError("Identified bug 45672");
  381. }
  382. assertEquals(1, eorCount);
  383. assertEquals(1, sfrCount);
  384. }
  385. /**
  386. * MulBlank records hold multiple blank cells. Check we
  387. * can handle them correctly.
  388. */
  389. public void testMulBlankHandling() {
  390. readRecords("45672.xls");
  391. // Check that we don't have any MulBlankRecords, but do
  392. // have lots of BlankRecords
  393. Record[] rr = r;
  394. int eorCount=0;
  395. int mbrCount=0;
  396. int brCount=0;
  397. for (int i = 0; i < rr.length; i++) {
  398. Record record = rr[i];
  399. if (record instanceof MulBlankRecord) {
  400. mbrCount++;
  401. }
  402. if (record instanceof BlankRecord) {
  403. brCount++;
  404. }
  405. if (record instanceof LastCellOfRowDummyRecord) {
  406. eorCount++;
  407. }
  408. }
  409. if (mbrCount > 0) {
  410. throw new AssertionFailedError("Identified bug 45672");
  411. }
  412. if (brCount < 20) {
  413. throw new AssertionFailedError("Identified bug 45672");
  414. }
  415. if (eorCount != 2) {
  416. throw new AssertionFailedError("Identified bug 45672");
  417. }
  418. assertEquals(2, eorCount);
  419. }
  420. public void testStringRecordHandling(){
  421. readRecords("53588.xls");
  422. Record[] rr = r;
  423. int missingCount=0;
  424. int lastCount=0;
  425. for (int i = 0; i < rr.length; i++) {
  426. Record record = rr[i];
  427. if (record instanceof MissingCellDummyRecord) {
  428. missingCount++;
  429. }
  430. if (record instanceof LastCellOfRowDummyRecord) {
  431. lastCount++;
  432. }
  433. }
  434. assertEquals(1, missingCount);
  435. assertEquals(1, lastCount);
  436. }
  437. public void testFormulasWithStringResultsHandling() {
  438. readRecords("53433.xls");
  439. int pos = 95;
  440. // First three rows are blank
  441. assertEquals(DimensionsRecord.class, r[pos++].getClass());
  442. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  443. assertEquals(0, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  444. pos++;
  445. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  446. assertEquals(1, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  447. pos++;
  448. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  449. assertEquals(2, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  450. pos++;
  451. // Then rows 4-10 are defined
  452. assertEquals(RowRecord.class, r[pos].getClass());
  453. assertEquals(3, ((RowRecord)r[pos]).getRowNumber());
  454. pos++;
  455. assertEquals(RowRecord.class, r[pos].getClass());
  456. assertEquals(4, ((RowRecord)r[pos]).getRowNumber());
  457. pos++;
  458. assertEquals(RowRecord.class, r[pos].getClass());
  459. assertEquals(5, ((RowRecord)r[pos]).getRowNumber());
  460. pos++;
  461. assertEquals(RowRecord.class, r[pos].getClass());
  462. assertEquals(6, ((RowRecord)r[pos]).getRowNumber());
  463. pos++;
  464. assertEquals(RowRecord.class, r[pos].getClass());
  465. assertEquals(7, ((RowRecord)r[pos]).getRowNumber());
  466. pos++;
  467. assertEquals(RowRecord.class, r[pos].getClass());
  468. assertEquals(8, ((RowRecord)r[pos]).getRowNumber());
  469. pos++;
  470. assertEquals(RowRecord.class, r[pos].getClass());
  471. assertEquals(9, ((RowRecord)r[pos]).getRowNumber());
  472. pos++;
  473. // 5 more blank rows
  474. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  475. assertEquals(10, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  476. pos++;
  477. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  478. assertEquals(11, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  479. pos++;
  480. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  481. assertEquals(12, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  482. pos++;
  483. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  484. assertEquals(13, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  485. pos++;
  486. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  487. assertEquals(14, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  488. pos++;
  489. // 2 defined rows
  490. assertEquals(RowRecord.class, r[pos].getClass());
  491. assertEquals(15, ((RowRecord)r[pos]).getRowNumber());
  492. pos++;
  493. assertEquals(RowRecord.class, r[pos].getClass());
  494. assertEquals(16, ((RowRecord)r[pos]).getRowNumber());
  495. pos++;
  496. // one blank row
  497. assertEquals(MissingRowDummyRecord.class, r[pos].getClass());
  498. assertEquals(17, ((MissingRowDummyRecord)r[pos]).getRowNumber());
  499. pos++;
  500. // one last real row
  501. assertEquals(RowRecord.class, r[pos].getClass());
  502. assertEquals(18, ((RowRecord)r[pos]).getRowNumber());
  503. pos++;
  504. // Now onto the cells
  505. // Because the 3 first rows are missing, should have last-of-row records first
  506. // TODO Fix!
  507. // Onto row 4 (=3)
  508. // Now we have blank cell A4
  509. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  510. assertEquals(3, ((MissingCellDummyRecord)r[pos]).getRow());
  511. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  512. pos++;
  513. // Now 4 real cells, all strings
  514. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  515. assertEquals(3, ((CellValueRecordInterface)r[pos]).getRow());
  516. assertEquals(1, ((CellValueRecordInterface)r[pos]).getColumn());
  517. pos++;
  518. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  519. assertEquals(3, ((CellValueRecordInterface)r[pos]).getRow());
  520. assertEquals(2, ((CellValueRecordInterface)r[pos]).getColumn());
  521. pos++;
  522. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  523. assertEquals(3, ((CellValueRecordInterface)r[pos]).getRow());
  524. assertEquals(3, ((CellValueRecordInterface)r[pos]).getColumn());
  525. pos++;
  526. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  527. assertEquals(3, ((CellValueRecordInterface)r[pos]).getRow());
  528. assertEquals(4, ((CellValueRecordInterface)r[pos]).getColumn());
  529. pos++;
  530. // Final dummy cell for the end-of-row
  531. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  532. assertEquals(3, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  533. assertEquals(4, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  534. pos++;
  535. // Row 5 has string, formula of string, number, formula of string
  536. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  537. assertEquals(4, ((MissingCellDummyRecord)r[pos]).getRow());
  538. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  539. pos++;
  540. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  541. assertEquals(4, ((CellValueRecordInterface)r[pos]).getRow());
  542. assertEquals(1, ((CellValueRecordInterface)r[pos]).getColumn());
  543. pos++;
  544. assertEquals(FormulaRecord.class, r[pos].getClass());
  545. assertEquals(4, ((CellValueRecordInterface)r[pos]).getRow());
  546. assertEquals(2, ((CellValueRecordInterface)r[pos]).getColumn());
  547. pos++;
  548. assertEquals(StringRecord.class, r[pos].getClass());
  549. assertEquals("s1", ((StringRecord)r[pos]).getString());
  550. pos++;
  551. assertEquals(NumberRecord.class, r[pos].getClass());
  552. assertEquals(4, ((CellValueRecordInterface)r[pos]).getRow());
  553. assertEquals(3, ((CellValueRecordInterface)r[pos]).getColumn());
  554. pos++;
  555. assertEquals(FormulaRecord.class, r[pos].getClass());
  556. assertEquals(4, ((CellValueRecordInterface)r[pos]).getRow());
  557. assertEquals(4, ((CellValueRecordInterface)r[pos]).getColumn());
  558. pos++;
  559. assertEquals(StringRecord.class, r[pos].getClass());
  560. assertEquals("s3845", ((StringRecord)r[pos]).getString());
  561. pos++;
  562. // Final dummy cell for the end-of-row
  563. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  564. assertEquals(4, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  565. assertEquals(4, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  566. pos++;
  567. // Row 6 is blank / string formula / number / number / string formula
  568. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  569. assertEquals(5, ((MissingCellDummyRecord)r[pos]).getRow());
  570. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  571. pos++;
  572. assertEquals(FormulaRecord.class, r[pos].getClass());
  573. assertEquals(5, ((CellValueRecordInterface)r[pos]).getRow());
  574. assertEquals(1, ((CellValueRecordInterface)r[pos]).getColumn());
  575. pos++;
  576. assertEquals(StringRecord.class, r[pos].getClass());
  577. assertEquals("s4", ((StringRecord)r[pos]).getString());
  578. pos++;
  579. assertEquals(NumberRecord.class, r[pos].getClass());
  580. assertEquals(5, ((CellValueRecordInterface)r[pos]).getRow());
  581. assertEquals(2, ((CellValueRecordInterface)r[pos]).getColumn());
  582. pos++;
  583. assertEquals(NumberRecord.class, r[pos].getClass());
  584. assertEquals(5, ((CellValueRecordInterface)r[pos]).getRow());
  585. assertEquals(3, ((CellValueRecordInterface)r[pos]).getColumn());
  586. pos++;
  587. assertEquals(FormulaRecord.class, r[pos].getClass());
  588. assertEquals(5, ((CellValueRecordInterface)r[pos]).getRow());
  589. assertEquals(4, ((CellValueRecordInterface)r[pos]).getColumn());
  590. pos++;
  591. assertEquals(StringRecord.class, r[pos].getClass());
  592. assertEquals("s3845", ((StringRecord)r[pos]).getString());
  593. pos++;
  594. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  595. assertEquals(5, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  596. assertEquals(4, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  597. pos++;
  598. // Row 7 is blank / blank / number / number / number
  599. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  600. assertEquals(6, ((MissingCellDummyRecord)r[pos]).getRow());
  601. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  602. pos++;
  603. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  604. assertEquals(6, ((MissingCellDummyRecord)r[pos]).getRow());
  605. assertEquals(1, ((MissingCellDummyRecord)r[pos]).getColumn());
  606. pos++;
  607. assertEquals(NumberRecord.class, r[pos].getClass());
  608. assertEquals(6, ((CellValueRecordInterface)r[pos]).getRow());
  609. assertEquals(2, ((CellValueRecordInterface)r[pos]).getColumn());
  610. pos++;
  611. assertEquals(NumberRecord.class, r[pos].getClass());
  612. assertEquals(6, ((CellValueRecordInterface)r[pos]).getRow());
  613. assertEquals(3, ((CellValueRecordInterface)r[pos]).getColumn());
  614. pos++;
  615. assertEquals(NumberRecord.class, r[pos].getClass());
  616. assertEquals(6, ((CellValueRecordInterface)r[pos]).getRow());
  617. assertEquals(4, ((CellValueRecordInterface)r[pos]).getColumn());
  618. pos++;
  619. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  620. assertEquals(6, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  621. assertEquals(4, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  622. pos++;
  623. // Row 8 is blank / string / number formula / string formula / blank
  624. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  625. assertEquals(7, ((MissingCellDummyRecord)r[pos]).getRow());
  626. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  627. pos++;
  628. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  629. assertEquals(7, ((CellValueRecordInterface)r[pos]).getRow());
  630. assertEquals(1, ((CellValueRecordInterface)r[pos]).getColumn());
  631. pos++;
  632. assertEquals(FormulaRecord.class, r[pos].getClass());
  633. assertEquals(7, ((CellValueRecordInterface)r[pos]).getRow());
  634. assertEquals(2, ((CellValueRecordInterface)r[pos]).getColumn());
  635. pos++;
  636. assertEquals(FormulaRecord.class, r[pos].getClass());
  637. assertEquals(7, ((CellValueRecordInterface)r[pos]).getRow());
  638. assertEquals(3, ((CellValueRecordInterface)r[pos]).getColumn());
  639. pos++;
  640. assertEquals(StringRecord.class, r[pos].getClass());
  641. assertEquals("s4", ((StringRecord)r[pos]).getString());
  642. pos++;
  643. assertEquals(BlankRecord.class, r[pos].getClass());
  644. assertEquals(7, ((CellValueRecordInterface)r[pos]).getRow());
  645. assertEquals(4, ((CellValueRecordInterface)r[pos]).getColumn());
  646. pos++;
  647. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  648. assertEquals(7, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  649. assertEquals(4, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  650. pos++;
  651. // Row 9 is empty, but with a blank at E9
  652. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  653. assertEquals(8, ((MissingCellDummyRecord)r[pos]).getRow());
  654. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  655. pos++;
  656. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  657. assertEquals(8, ((MissingCellDummyRecord)r[pos]).getRow());
  658. assertEquals(1, ((MissingCellDummyRecord)r[pos]).getColumn());
  659. pos++;
  660. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  661. assertEquals(8, ((MissingCellDummyRecord)r[pos]).getRow());
  662. assertEquals(2, ((MissingCellDummyRecord)r[pos]).getColumn());
  663. pos++;
  664. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  665. assertEquals(8, ((MissingCellDummyRecord)r[pos]).getRow());
  666. assertEquals(3, ((MissingCellDummyRecord)r[pos]).getColumn());
  667. pos++;
  668. assertEquals(BlankRecord.class, r[pos].getClass());
  669. assertEquals(8, ((CellValueRecordInterface)r[pos]).getRow());
  670. assertEquals(4, ((CellValueRecordInterface)r[pos]).getColumn());
  671. pos++;
  672. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  673. assertEquals(8, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  674. assertEquals(4, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  675. pos++;
  676. // Row 10 has a string in D10
  677. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  678. assertEquals(9, ((MissingCellDummyRecord)r[pos]).getRow());
  679. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  680. pos++;
  681. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  682. assertEquals(9, ((MissingCellDummyRecord)r[pos]).getRow());
  683. assertEquals(1, ((MissingCellDummyRecord)r[pos]).getColumn());
  684. pos++;
  685. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  686. assertEquals(9, ((MissingCellDummyRecord)r[pos]).getRow());
  687. assertEquals(2, ((MissingCellDummyRecord)r[pos]).getColumn());
  688. pos++;
  689. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  690. assertEquals(9, ((CellValueRecordInterface)r[pos]).getRow());
  691. assertEquals(3, ((CellValueRecordInterface)r[pos]).getColumn());
  692. pos++;
  693. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  694. assertEquals(9, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  695. assertEquals(3, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  696. pos++;
  697. // Now 5 blank rows
  698. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  699. assertEquals(10, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  700. assertEquals(-1, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  701. pos++;
  702. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  703. assertEquals(11, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  704. assertEquals(-1, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  705. pos++;
  706. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  707. assertEquals(12, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  708. assertEquals(-1, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  709. pos++;
  710. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  711. assertEquals(13, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  712. assertEquals(-1, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  713. pos++;
  714. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  715. assertEquals(14, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  716. assertEquals(-1, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  717. pos++;
  718. // Row 16 has a single string in B16
  719. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  720. assertEquals(15, ((MissingCellDummyRecord)r[pos]).getRow());
  721. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  722. pos++;
  723. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  724. assertEquals(15, ((CellValueRecordInterface)r[pos]).getRow());
  725. assertEquals(1, ((CellValueRecordInterface)r[pos]).getColumn());
  726. pos++;
  727. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  728. assertEquals(15, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  729. assertEquals(1, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  730. pos++;
  731. // Row 17 has a single string in D17
  732. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  733. assertEquals(16, ((MissingCellDummyRecord)r[pos]).getRow());
  734. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  735. pos++;
  736. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  737. assertEquals(16, ((MissingCellDummyRecord)r[pos]).getRow());
  738. assertEquals(1, ((MissingCellDummyRecord)r[pos]).getColumn());
  739. pos++;
  740. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  741. assertEquals(16, ((MissingCellDummyRecord)r[pos]).getRow());
  742. assertEquals(2, ((MissingCellDummyRecord)r[pos]).getColumn());
  743. pos++;
  744. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  745. assertEquals(16, ((CellValueRecordInterface)r[pos]).getRow());
  746. assertEquals(3, ((CellValueRecordInterface)r[pos]).getColumn());
  747. pos++;
  748. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  749. assertEquals(16, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  750. assertEquals(3, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  751. pos++;
  752. // Row 18 is blank
  753. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  754. assertEquals(17, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  755. assertEquals(-1, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  756. pos++;
  757. // Row 19 has a single string in E19
  758. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  759. assertEquals(18, ((MissingCellDummyRecord)r[pos]).getRow());
  760. assertEquals(0, ((MissingCellDummyRecord)r[pos]).getColumn());
  761. pos++;
  762. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  763. assertEquals(18, ((MissingCellDummyRecord)r[pos]).getRow());
  764. assertEquals(1, ((MissingCellDummyRecord)r[pos]).getColumn());
  765. pos++;
  766. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  767. assertEquals(18, ((MissingCellDummyRecord)r[pos]).getRow());
  768. assertEquals(2, ((MissingCellDummyRecord)r[pos]).getColumn());
  769. pos++;
  770. assertEquals(MissingCellDummyRecord.class, r[pos].getClass());
  771. assertEquals(18, ((MissingCellDummyRecord)r[pos]).getRow());
  772. assertEquals(3, ((MissingCellDummyRecord)r[pos]).getColumn());
  773. pos++;
  774. assertEquals(LabelSSTRecord.class, r[pos].getClass());
  775. assertEquals(18, ((CellValueRecordInterface)r[pos]).getRow());
  776. assertEquals(4, ((CellValueRecordInterface)r[pos]).getColumn());
  777. pos++;
  778. assertEquals(LastCellOfRowDummyRecord.class, r[pos].getClass());
  779. assertEquals(18, ((LastCellOfRowDummyRecord)r[pos]).getRow());
  780. assertEquals(4, ((LastCellOfRowDummyRecord)r[pos]).getLastColumnNumber());
  781. pos++;
  782. // And that's it!
  783. assertEquals(WindowTwoRecord.class, r[pos++].getClass());
  784. }
  785. }