001: /*
002: * Geotools2 - OpenSource mapping toolkit
003: * http://geotools.org
004: * (C) 2002-2006, Geotools Project Managment Committee (PMC)
005: *
006: * This library is free software; you can redistribute it and/or
007: * modify it under the terms of the GNU Lesser General Public
008: * License as published by the Free Software Foundation;
009: * version 2.1 of the License.
010: *
011: * This library is distributed in the hope that it will be useful,
012: * but WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * Lesser General Public License for more details.
015: *
016: */
017: package org.geotools.data.shapefile;
018:
019: import java.io.File;
020: import java.io.FileInputStream;
021: import java.io.FileOutputStream;
022: import java.io.IOException;
023: import java.nio.channels.ReadableByteChannel;
024: import java.util.logging.Level;
025: import java.util.logging.Logger;
026:
027: import org.geotools.data.shapefile.dbf.DbaseFileHeader;
028: import org.geotools.data.shapefile.dbf.DbaseFileReader;
029: import org.geotools.data.shapefile.dbf.DbaseFileWriter;
030: import org.geotools.TestData;
031:
032: /**
033: *
034: * @source $URL: http://svn.geotools.org/geotools/tags/2.4.1/modules/plugin/shapefile/src/test/java/org/geotools/data/shapefile/DbaseFileTest.java $
035: * @version $Id: DbaseFileTest.java 27862 2007-11-12 19:51:19Z desruisseaux $
036: * @author Ian Schneider
037: * @author James Macgill
038: */
039: public class DbaseFileTest extends TestCaseSupport {
040:
041: private static final Logger LOGGER = org.geotools.util.logging.Logging
042: .getLogger("org.geotools.data.shapefile");
043:
044: static final String TEST_FILE = "shapes/statepop.dbf";
045:
046: private DbaseFileReader dbf = null;
047:
048: public DbaseFileTest(String testName) throws IOException {
049: super (testName);
050: }
051:
052: public static void main(String[] args) {
053: //verbose = true;
054: junit.textui.TestRunner.run(suite(DbaseFileTest.class));
055: }
056:
057: protected void setUp() throws Exception {
058: super .setUp();
059: dbf = new DbaseFileReader(TestData.openChannel(TEST_FILE),
060: false);
061: }
062:
063: public void testNumberofColsLoaded() {
064: assertEquals("Number of attributes found incorect", 252, dbf
065: .getHeader().getNumFields());
066: }
067:
068: protected void tearDown() throws Exception {
069: dbf.close();
070: super .tearDown();
071: }
072:
073: public void testNumberofRowsLoaded() {
074: assertEquals("Number of rows", 49, dbf.getHeader()
075: .getNumRecords());
076: }
077:
078: public void testDataLoaded() throws Exception {
079: Object[] attrs = new Object[dbf.getHeader().getNumFields()];
080: dbf.readEntry(attrs);
081: assertEquals("Value of Column 0 is wrong", "Illinois", attrs[0]);
082: assertEquals("Value of Column 4 is wrong", 143986.61,
083: ((Double) attrs[4]).doubleValue(), 0.001);
084: }
085:
086: public void testRowVsEntry() throws Exception {
087: Object[] attrs = new Object[dbf.getHeader().getNumFields()];
088: ReadableByteChannel ch2 = TestData.openChannel(TEST_FILE);
089: DbaseFileReader dbf2 = new DbaseFileReader(ch2, false);
090: while (dbf.hasNext()) {
091: dbf.readEntry(attrs);
092: DbaseFileReader.Row r = dbf2.readRow();
093: for (int i = 0, ii = attrs.length; i < ii; i++) {
094: assertNotNull(attrs[i]);
095: assertNotNull(r.read(i));
096: assertEquals(attrs[i], r.read(i));
097: }
098: }
099: ch2.close();
100: }
101:
102: public void testHeader() throws Exception {
103: DbaseFileHeader header = new DbaseFileHeader();
104:
105: Level before = LOGGER.getLevel();
106: try {
107: LOGGER.setLevel(Level.INFO);
108:
109: header.addColumn("emptyString", 'C', 20, 0);
110: header.addColumn("emptyInt", 'N', 20, 0);
111: header.addColumn("emptyDouble", 'N', 20, 5);
112: header.addColumn("emptyFloat", 'F', 20, 5);
113: header.addColumn("emptyLogical", 'L', 1, 0);
114: header.addColumn("emptyDate", 'D', 20, 0);
115: int length = header.getRecordLength();
116: header.removeColumn("emptyDate");
117: assertTrue(length != header.getRecordLength());
118: header.addColumn("emptyDate", 'D', 20, 0);
119: assertTrue(length == header.getRecordLength());
120: header.removeColumn("billy");
121: assertTrue(length == header.getRecordLength());
122: } finally {
123: LOGGER.setLevel(before);
124: }
125: }
126:
127: public void testAddColumn() throws Exception {
128: DbaseFileHeader header = new DbaseFileHeader();
129:
130: Level before = LOGGER.getLevel();
131: try {
132: LOGGER.setLevel(Level.INFO);
133:
134: header.addColumn("emptyInt", 'N', 9, 0);
135: assertSame(Integer.class, header.getFieldClass(0));
136: assertEquals(9, header.getFieldLength(0));
137:
138: header.addColumn("emptyString", 'C', 20, 0);
139: assertSame(String.class, header.getFieldClass(1));
140: assertEquals(20, header.getFieldLength(1));
141: } finally {
142: LOGGER.setLevel(before);
143: }
144: }
145:
146: public void testEmptyFields() throws Exception {
147: DbaseFileHeader header = new DbaseFileHeader();
148: header.addColumn("emptyString", 'C', 20, 0);
149: header.addColumn("emptyInt", 'N', 20, 0);
150: header.addColumn("emptyDouble", 'N', 20, 5);
151: header.addColumn("emptyFloat", 'F', 20, 5);
152: header.addColumn("emptyLogical", 'L', 1, 0);
153: header.addColumn("emptyDate", 'D', 20, 0);
154: header.setNumRecords(20);
155: File f = new File(System.getProperty("java.io.tmpdir"),
156: "scratchDBF.dbf");
157: FileOutputStream fout = new FileOutputStream(f);
158: DbaseFileWriter dbf = new DbaseFileWriter(header, fout
159: .getChannel());
160: for (int i = 0; i < header.getNumRecords(); i++) {
161: dbf.write(new Object[6]);
162: }
163: dbf.close();
164: FileInputStream in = new FileInputStream(f);
165: DbaseFileReader r = new DbaseFileReader(in.getChannel(), false);
166: int cnt = 0;
167: while (r.hasNext()) {
168: cnt++;
169: Object[] o = r.readEntry();
170: assertTrue(o.length == r.getHeader().getNumFields());
171: }
172: assertEquals("Bad number of records", cnt, 20);
173: r.close(); // make sure the channel is closed
174: f.delete();
175: }
176:
177: public void testFieldFormatter() throws Exception {
178: DbaseFileWriter.FieldFormatter formatter = new DbaseFileWriter.FieldFormatter();
179:
180: String stringWithInternationChars = "hello " + '\u20ac';
181: // if (verbose) {
182: // System.out.println(stringWithInternationChars);
183: // }
184: String formattedString = formatter.getFieldString(10,
185: stringWithInternationChars);
186:
187: assertEquals(" ".getBytes().length, formattedString
188: .getBytes().length);
189:
190: //test when the string is too big.
191: stringWithInternationChars = '\u20ac' + "1234567890";
192: formattedString = formatter.getFieldString(10,
193: stringWithInternationChars);
194:
195: assertEquals(" ".getBytes().length, formattedString
196: .getBytes().length);
197:
198: }
199:
200: }
|