407 lines
15 KiB
Java
407 lines
15 KiB
Java
/* ====================================================================
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
this work for additional information regarding copyright ownership.
|
|
The ASF licenses this file to You 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 org.apache.poi.ss.util;
|
|
|
|
import org.apache.poi.ss.SpreadsheetVersion;
|
|
import org.apache.poi.ss.util.CellReference;
|
|
|
|
import org.junit.Test;
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertFalse;
|
|
import static org.junit.Assert.assertNotNull;
|
|
import static org.junit.Assert.assertTrue;
|
|
import static org.junit.Assert.fail;
|
|
|
|
/**
|
|
* Tests that the common CellReference works as we need it to.
|
|
* Note - some additional testing is also done in the HSSF class,
|
|
* {@link org.apache.poi.hssf.util.TestCellReference}
|
|
*/
|
|
public final class TestCellReference {
|
|
@Test
|
|
public void testConstructors() {
|
|
CellReference cellReference;
|
|
final String sheet = "Sheet1";
|
|
final String cellRef = "A1";
|
|
final int row = 0;
|
|
final int col = 0;
|
|
final boolean absRow = true;
|
|
final boolean absCol = false;
|
|
|
|
cellReference = new CellReference(row, col);
|
|
assertEquals("A1", cellReference.formatAsString());
|
|
|
|
cellReference = new CellReference(row, col, absRow, absCol);
|
|
assertEquals("A$1", cellReference.formatAsString());
|
|
|
|
cellReference = new CellReference(row, (short)col);
|
|
assertEquals("A1", cellReference.formatAsString());
|
|
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals("A1", cellReference.formatAsString());
|
|
|
|
cellReference = new CellReference(sheet, row, col, absRow, absCol);
|
|
assertEquals("Sheet1!A$1", cellReference.formatAsString());
|
|
}
|
|
|
|
@Test
|
|
public void testFormatAsString() {
|
|
CellReference cellReference;
|
|
|
|
cellReference = new CellReference(null, 0, 0, false, false);
|
|
assertEquals("A1", cellReference.formatAsString());
|
|
|
|
//absolute references
|
|
cellReference = new CellReference(null, 0, 0, true, false);
|
|
assertEquals("A$1", cellReference.formatAsString());
|
|
|
|
//sheet name with no spaces
|
|
cellReference = new CellReference("Sheet1", 0, 0, true, false);
|
|
assertEquals("Sheet1!A$1", cellReference.formatAsString());
|
|
|
|
//sheet name with spaces
|
|
cellReference = new CellReference("Sheet 1", 0, 0, true, false);
|
|
assertEquals("'Sheet 1'!A$1", cellReference.formatAsString());
|
|
}
|
|
|
|
@Test
|
|
public void testGetCellRefParts() {
|
|
CellReference cellReference;
|
|
String[] parts;
|
|
|
|
String cellRef = "A1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(0, cellReference.getCol());
|
|
parts = cellReference.getCellRefParts();
|
|
assertNotNull(parts);
|
|
assertEquals(null, parts[0]);
|
|
assertEquals("1", parts[1]);
|
|
assertEquals("A", parts[2]);
|
|
|
|
cellRef = "AA1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26, cellReference.getCol());
|
|
parts = cellReference.getCellRefParts();
|
|
assertNotNull(parts);
|
|
assertEquals(null, parts[0]);
|
|
assertEquals("1", parts[1]);
|
|
assertEquals("AA", parts[2]);
|
|
|
|
cellRef = "AA100";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26, cellReference.getCol());
|
|
parts = cellReference.getCellRefParts();
|
|
assertNotNull(parts);
|
|
assertEquals(null, parts[0]);
|
|
assertEquals("100", parts[1]);
|
|
assertEquals("AA", parts[2]);
|
|
|
|
cellRef = "AAA300";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(702, cellReference.getCol());
|
|
parts = cellReference.getCellRefParts();
|
|
assertNotNull(parts);
|
|
assertEquals(null, parts[0]);
|
|
assertEquals("300", parts[1]);
|
|
assertEquals("AAA", parts[2]);
|
|
|
|
cellRef = "ZZ100521";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26*26+25, cellReference.getCol());
|
|
parts = cellReference.getCellRefParts();
|
|
assertNotNull(parts);
|
|
assertEquals(null, parts[0]);
|
|
assertEquals("100521", parts[1]);
|
|
assertEquals("ZZ", parts[2]);
|
|
|
|
cellRef = "ZYX987";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26*26*26 + 25*26 + 24 - 1, cellReference.getCol());
|
|
parts = cellReference.getCellRefParts();
|
|
assertNotNull(parts);
|
|
assertEquals(null, parts[0]);
|
|
assertEquals("987", parts[1]);
|
|
assertEquals("ZYX", parts[2]);
|
|
|
|
cellRef = "AABC10065";
|
|
cellReference = new CellReference(cellRef);
|
|
parts = cellReference.getCellRefParts();
|
|
assertNotNull(parts);
|
|
assertEquals(null, parts[0]);
|
|
assertEquals("10065", parts[1]);
|
|
assertEquals("AABC", parts[2]);
|
|
}
|
|
|
|
@Test
|
|
public void testGetColNumFromRef() {
|
|
String cellRef = "A1";
|
|
CellReference cellReference = new CellReference(cellRef);
|
|
assertEquals(0, cellReference.getCol());
|
|
|
|
cellRef = "AA1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26, cellReference.getCol());
|
|
|
|
cellRef = "AB1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(27, cellReference.getCol());
|
|
|
|
cellRef = "BA1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26+26, cellReference.getCol());
|
|
|
|
cellRef = "CA1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26+26+26, cellReference.getCol());
|
|
|
|
cellRef = "ZA1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26*26, cellReference.getCol());
|
|
|
|
cellRef = "ZZ1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26*26+25, cellReference.getCol());
|
|
|
|
cellRef = "AAA1";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(26*26+26, cellReference.getCol());
|
|
|
|
|
|
cellRef = "A1100";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(0, cellReference.getCol());
|
|
|
|
cellRef = "BC15";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(54, cellReference.getCol());
|
|
}
|
|
|
|
@Test
|
|
public void testGetRowNumFromRef() {
|
|
String cellRef = "A1";
|
|
CellReference cellReference = new CellReference(cellRef);
|
|
assertEquals(0, cellReference.getRow());
|
|
|
|
cellRef = "A12";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(11, cellReference.getRow());
|
|
|
|
cellRef = "AS121";
|
|
cellReference = new CellReference(cellRef);
|
|
assertEquals(120, cellReference.getRow());
|
|
}
|
|
|
|
@Test
|
|
public void testConvertNumToColString() {
|
|
short col = 702;
|
|
String collRef = new CellReference(0, col).formatAsString();
|
|
assertEquals("AAA1", collRef);
|
|
|
|
short col2 = 0;
|
|
String collRef2 = new CellReference(0, col2).formatAsString();
|
|
assertEquals("A1", collRef2);
|
|
|
|
short col3 = 27;
|
|
String collRef3 = new CellReference(0, col3).formatAsString();
|
|
assertEquals("AB1", collRef3);
|
|
|
|
short col4 = 2080;
|
|
String collRef4 = new CellReference(0, col4).formatAsString();
|
|
assertEquals("CBA1", collRef4);
|
|
}
|
|
|
|
@Test
|
|
public void testBadRowNumber() {
|
|
SpreadsheetVersion v97 = SpreadsheetVersion.EXCEL97;
|
|
SpreadsheetVersion v2007 = SpreadsheetVersion.EXCEL2007;
|
|
|
|
confirmCrInRange(true, "A", "1", v97);
|
|
confirmCrInRange(true, "IV", "65536", v97);
|
|
confirmCrInRange(false, "IV", "65537", v97);
|
|
confirmCrInRange(false, "IW", "65536", v97);
|
|
|
|
confirmCrInRange(true, "A", "1", v2007);
|
|
confirmCrInRange(true, "XFD", "1048576", v2007);
|
|
confirmCrInRange(false, "XFD", "1048577", v2007);
|
|
confirmCrInRange(false, "XFE", "1048576", v2007);
|
|
|
|
assertFalse("Identified bug 47312a", CellReference.cellReferenceIsWithinRange("B", "0", v97));
|
|
|
|
confirmCrInRange(false, "A", "0", v97);
|
|
confirmCrInRange(false, "A", "0", v2007);
|
|
}
|
|
|
|
@Test
|
|
public void testInvalidReference() {
|
|
try {
|
|
new CellReference("Sheet1!#REF!");
|
|
fail("Shouldn't be able to create a #REF! refence");
|
|
} catch(IllegalArgumentException expected) {}
|
|
|
|
try {
|
|
new CellReference("'MySheetName'!#REF!");
|
|
fail("Shouldn't be able to create a #REF! refence");
|
|
} catch(IllegalArgumentException expected) {}
|
|
|
|
try {
|
|
new CellReference("#REF!");
|
|
fail("Shouldn't be able to create a #REF! refence");
|
|
} catch(IllegalArgumentException expected) {}
|
|
}
|
|
|
|
private static void confirmCrInRange(boolean expResult, String colStr, String rowStr,
|
|
SpreadsheetVersion sv) {
|
|
if (expResult == CellReference.cellReferenceIsWithinRange(colStr, rowStr, sv)) {
|
|
return;
|
|
}
|
|
fail("expected (c='" + colStr + "', r='" + rowStr + "' to be "
|
|
+ (expResult ? "within" : "out of") + " bounds for version " + sv.name());
|
|
}
|
|
|
|
@Test
|
|
public void testConvertColStringToIndex() {
|
|
assertEquals(0, CellReference.convertColStringToIndex("A"));
|
|
assertEquals(1, CellReference.convertColStringToIndex("B"));
|
|
assertEquals(14, CellReference.convertColStringToIndex("O"));
|
|
assertEquals(701, CellReference.convertColStringToIndex("ZZ"));
|
|
assertEquals(18252, CellReference.convertColStringToIndex("ZZA"));
|
|
|
|
assertEquals(0, CellReference.convertColStringToIndex("$A"));
|
|
assertEquals(1, CellReference.convertColStringToIndex("$B"));
|
|
|
|
try {
|
|
CellReference.convertColStringToIndex("A$");
|
|
fail("Should throw exception here");
|
|
} catch (IllegalArgumentException expected) {
|
|
assertTrue(expected.getMessage().contains("A$"));
|
|
}
|
|
}
|
|
|
|
@Test
|
|
public void testConvertNumColColString() {
|
|
assertEquals("A", CellReference.convertNumToColString(0));
|
|
assertEquals("AV", CellReference.convertNumToColString(47));
|
|
assertEquals("AW", CellReference.convertNumToColString(48));
|
|
assertEquals("BF", CellReference.convertNumToColString(57));
|
|
|
|
assertEquals("", CellReference.convertNumToColString(-1));
|
|
assertEquals("", CellReference.convertNumToColString(Integer.MIN_VALUE));
|
|
assertEquals("", CellReference.convertNumToColString(Integer.MAX_VALUE));
|
|
assertEquals("FXSHRXW", CellReference.convertNumToColString(Integer.MAX_VALUE-1));
|
|
}
|
|
|
|
/**
|
|
* bug 59684: separateRefParts fails on entire-column references
|
|
*/
|
|
@Test
|
|
public void entireColumnReferences() {
|
|
CellReference ref = new CellReference("HOME!$169");
|
|
assertEquals("HOME", ref.getSheetName());
|
|
assertEquals(168, ref.getRow());
|
|
assertEquals(-1, ref.getCol());
|
|
assertTrue("row absolute", ref.isRowAbsolute());
|
|
//assertFalse("column absolute/relative is undefined", ref.isColAbsolute());
|
|
}
|
|
|
|
@Test
|
|
public void getSheetName() {
|
|
assertEquals(null, new CellReference("A5").getSheetName());
|
|
assertEquals(null, new CellReference(null, 0, 0, false, false).getSheetName());
|
|
// FIXME: CellReference is inconsistent
|
|
assertEquals("", new CellReference("", 0, 0, false, false).getSheetName());
|
|
assertEquals("Sheet1", new CellReference("Sheet1!A5").getSheetName());
|
|
assertEquals("Sheet 1", new CellReference("'Sheet 1'!A5").getSheetName());
|
|
}
|
|
|
|
@Test
|
|
public void testToString() {
|
|
CellReference ref = new CellReference("'Sheet 1'!A5");
|
|
assertEquals("org.apache.poi.ss.util.CellReference ['Sheet 1'!A5]", ref.toString());
|
|
}
|
|
|
|
@Test
|
|
public void testEqualsAndHashCode() {
|
|
CellReference ref1 = new CellReference("'Sheet 1'!A5");
|
|
CellReference ref2 = new CellReference("Sheet 1", 4, 0, false, false);
|
|
assertEquals("equals", ref1, ref2);
|
|
assertEquals("hash code", ref1.hashCode(), ref2.hashCode());
|
|
|
|
assertFalse("null", ref1.equals(null));
|
|
assertFalse("3D vs 2D", ref1.equals(new CellReference("A5")));
|
|
assertFalse("type", ref1.equals(new Integer(0)));
|
|
}
|
|
|
|
@Test
|
|
public void isRowWithinRange() {
|
|
SpreadsheetVersion ss = SpreadsheetVersion.EXCEL2007;
|
|
assertFalse("1 before first row", CellReference.isRowWithinRange("0", ss));
|
|
assertTrue("first row", CellReference.isRowWithinRange("1", ss));
|
|
assertTrue("last row", CellReference.isRowWithinRange("1048576", ss));
|
|
assertFalse("1 beyond last row", CellReference.isRowWithinRange("1048577", ss));
|
|
}
|
|
|
|
@Test
|
|
public void isColWithinRange() {
|
|
SpreadsheetVersion ss = SpreadsheetVersion.EXCEL2007;
|
|
assertTrue("(empty)", CellReference.isColumnWithinRange("", ss));
|
|
assertTrue("first column (A)", CellReference.isColumnWithinRange("A", ss));
|
|
assertTrue("last column (XFD)", CellReference.isColumnWithinRange("XFD", ss));
|
|
assertFalse("1 beyond last column (XFE)", CellReference.isColumnWithinRange("XFE", ss));
|
|
}
|
|
|
|
@Test(expected=IllegalArgumentException.class)
|
|
public void unquotedSheetName() {
|
|
new CellReference("'Sheet 1!A5");
|
|
}
|
|
@Test(expected=IllegalArgumentException.class)
|
|
public void mismatchedQuotesSheetName() {
|
|
new CellReference("Sheet 1!A5");
|
|
}
|
|
|
|
@Test
|
|
public void escapedSheetName() {
|
|
String escapedName = "'Don''t Touch'!A5";
|
|
String unescapedName = "'Don't Touch'!A5";
|
|
new CellReference(escapedName);
|
|
try {
|
|
new CellReference(unescapedName);
|
|
fail("Sheet names containing apostrophe's must be escaped via a repeated apostrophe");
|
|
} catch (IllegalArgumentException e) {
|
|
assertTrue(e.getMessage().startsWith("Bad sheet name quote escaping: "));
|
|
}
|
|
}
|
|
|
|
@Test(expected=IllegalArgumentException.class)
|
|
public void negativeRow() {
|
|
new CellReference("sheet", -2, 0, false, false);
|
|
}
|
|
@Test(expected=IllegalArgumentException.class)
|
|
public void negativeColumn() {
|
|
new CellReference("sheet", 0, -2, false, false);
|
|
}
|
|
|
|
@Test(expected=IllegalArgumentException.class)
|
|
public void classifyEmptyStringCellReference() {
|
|
CellReference.classifyCellReference("", SpreadsheetVersion.EXCEL2007);
|
|
}
|
|
@Test(expected=IllegalArgumentException.class)
|
|
public void classifyInvalidFirstCharCellReference() {
|
|
CellReference.classifyCellReference("!A5", SpreadsheetVersion.EXCEL2007);
|
|
}
|
|
}
|