package org.geotools.data.shapefile.dbf;
import static org.junit.Assert.*;
import java.nio.charset.Charset;
import java.util.TimeZone;
import org.geotools.data.shapefile.dbf.DbaseFileWriter;
import org.junit.Before;
import org.junit.Test;
public class DbaseFieldFormatterTest {
private DbaseFileWriter.FieldFormatter victim;
@Before
public void setup() {
Charset charset = Charset.defaultCharset();
TimeZone timeZone = TimeZone.getDefault();
victim = new DbaseFileWriter.FieldFormatter(charset, timeZone, false);
}
private String checkOutput(Number n, int sz, int places) {
String s = victim.getFieldString(sz, places, n);
// assertEquals("Formatted Output", xpected, s.trim());
boolean ascii = true;
int i, c = 0;;
for (i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (c > 127) {
ascii = false;
break;
}
}
assertTrue("ascii ["+i+"]:" + c, ascii);
assertEquals("Length", sz, s.length());
assertEquals("Value", n.doubleValue(), Double.valueOf(s), Math.pow(10.0, -places));
System.out.printf("%36s->%36s%n", n, s);
return s;
}
@Test
public void testNaN() {
checkOutput(Double.NaN, 33, 31);
}
@Test
public void testNegative() {
checkOutput(Double.valueOf(-1.0e39), 33, 31);
}
@Test
public void testSmall() {
checkOutput(Double.valueOf(42.123), 33, 31);
}
@Test
public void testLarge() {
checkOutput(12345.678, 33, 31);
}
@Test(expected=IllegalArgumentException.class)
public void testNotFit_1() {
checkOutput(12345.678, 6, 2);
}
@Test(expected=IllegalArgumentException.class)
public void testNotFit_2() {
checkOutput(Double.valueOf(Math.PI * 1.0E10), 4, 1);
}
@Test
public void testSqueeze_ok() {
checkOutput(Double.valueOf(Math.PI), 3, 1);
}
@Test(expected=IllegalArgumentException.class)
public void testSqueeze_x1() {
checkOutput(Double.valueOf(Math.PI), 2, 1);
}
@Test(expected=IllegalArgumentException.class)
public void testSqueeze_x2() {
checkOutput(Double.valueOf(-Math.PI), 3, 1);
}
@Test
public void testMax() {
checkOutput(Double.MAX_VALUE, 33, 31);
}
@Test
public void testMin() {
checkOutput(Double.MIN_VALUE, 33, 31);
}
@Test
public void testIntegral() {
checkOutput(Double.valueOf(1999.0), 33, 31);
}
@Test
public void testPI() {
checkOutput(Double.valueOf(Math.PI), 33, 31);
}
@Test
public void testPI_10() {
checkOutput(Double.valueOf(Math.PI * 1.0E10), 33, 31);
}
@Test
public void testPI_100() {
checkOutput(Double.valueOf(Math.PI * 1.0E100), 33, 31);
}
@Test
public void testNoValue_1() {
// "Any floating point number smaller than –10e38 is considered by a shapefile reader to represent a "no data" value.", per ESRI
checkOutput(Double.valueOf(-1.00001e38), 33, 31);
}
@Test
public void testInt_1999() {
checkOutput(Integer.valueOf(1999), 33, 31);
}
@Test
public void testInt_0() {
checkOutput(Integer.valueOf(0), 33, 31);
}
@Test
public void testInt_12345678() {
checkOutput(Integer.valueOf(12345678), 33, 31);
}
@Test
public void testInt_m1() {
checkOutput(Integer.valueOf(-1), 33, 31);
}
@Test
public void testInt_m987654321() {
checkOutput(Integer.valueOf(-987654321), 33, 31);
}
@Test
public void testNoValue_2() {
// "Any floating point number smaller than –10e38 is considered by a shapefile reader to represent a "no data" value.", per ESRI
checkOutput(Double.valueOf(-1.00001e38), 12, 6);
}
@Test
public void testI_1999() {
checkOutput(Integer.valueOf(1999), 8, 0);
}
@Test
public void testI_0() {
checkOutput(Integer.valueOf(0), 3, 0);
}
@Test(expected=IllegalArgumentException.class)
public void testI_12345678_x() {
checkOutput(Integer.valueOf(12345678), 6, 0);
}
@Test
public void testI_12345678_ok() {
checkOutput(Integer.valueOf(12345678), 8, 0);
}
@Test
public void testI_m1() {
checkOutput(Integer.valueOf(-1), 12, 0);
}
@Test
public void testI_m987654321() {
checkOutput(Integer.valueOf(-987654321), 10, 0);
}
}