package nodebox.function;
import com.google.common.collect.ImmutableMap;
import org.junit.Test;
import java.awt.*;
import java.util.List;
import java.util.Map;
import static junit.framework.TestCase.*;
import static nodebox.function.DataFunctions.importCSV;
import static nodebox.function.DataFunctions.lookup;
import static nodebox.util.Assertions.assertResultsEqual;
public class DataFunctionsTest {
@Test
public void testLookupNull() {
assertNull(lookup(null, "xxx"));
assertNull(lookup(new Point(11, 22), null));
}
@Test
public void testLookupInMap() {
Map<String, Integer> greek = ImmutableMap.of("alpha", 1, "beta", 2, "gamma", 3);
assertEquals(1, lookup(greek, "alpha"));
assertEquals(2, lookup(greek, "beta"));
assertNull(lookup(greek, "xxx"));
}
@Test
public void testLookupInObject() {
Point awtPoint = new Point(11, 22);
assertEquals(11.0, lookup(awtPoint, "x"));
assertEquals(22.0, lookup(awtPoint, "y"));
assertNull(lookup(awtPoint, "xxx"));
}
@Test
public void testNestedLookup() {
Map<String, Integer> m = ImmutableMap.of("alpha", 1, "beta", 2, "gamma", 3);
Map<String, Map<String, Integer>> mm = ImmutableMap.of("greek", m);
assertEquals(1, lookup(mm, "greek.alpha"));
assertEquals(2, lookup(mm, "greek.beta"));
assertNull(lookup(mm, "greek.xxx"));
assertNull(lookup(mm, "greek.alpha.test"));
}
@Test
public void testImportCSV() {
List<Map<String, Object>> l = importSimpleCSV("src/test/files/colors.csv");
assertEquals(5, l.size());
Map<String, Object> black = l.get(0);
assertResultsEqual(black.keySet(), "Name", "Red", "Green", "Blue");
assertEquals("Black", black.get("Name"));
// Numerical data is automatically converted to doubles.
assertEquals(0.0, black.get("Red"));
}
@Test
public void testImportCSVUnicode() {
List<Map<String, Object>> l = importSimpleCSV("src/test/files/unicode.csv");
assertEquals(2, l.size());
Map<String, Object> frederik = l.get(0);
assertResultsEqual(frederik.keySet(), "Name", "Age");
assertEquals("Fr\u00e9d\u00ebr\u00eck", frederik.get("Name"));
Map<String, Object> bob = l.get(1);
assertEquals("B\u00f8b", bob.get("Name"));
}
@Test
public void testImportEmptyCSV() {
List l = importSimpleCSV(null);
assertTrue(l.isEmpty());
}
@Test(expected = RuntimeException.class)
public void testImportNonexistentCSV() {
importSimpleCSV("blah/blah.csv");
}
@Test
public void testImportCSVWithWhitespace() {
List<Map<String, Object>> l = importSimpleCSV("src/test/files/whitespace.csv");
assertEquals(2, l.size());
Map<String, Object> alice = l.get(0);
assertResultsEqual(alice.keySet(), "Name", "Age");
assertEquals("Alice", alice.get("Name"));
// Numerical data is automatically converted to doubles.
assertEquals(41.0, alice.get("Age"));
}
@Test
public void testImportCSVWithBadHeaders() {
List<Map<String, Object>> l = importSimpleCSV("src/test/files/bad-headers.csv");
assertEquals(2, l.size());
Map<String, Object> row1 = l.get(0);
assertResultsEqual(row1.keySet(), "Alpha", "Column 2", "Column 3");
assertResultsEqual(row1.values(), 1.0, 2.0, 3.0);
}
@Test
public void testImportCSVWithDuplicateHeaders() {
List<Map<String, Object>> l = importSimpleCSV("src/test/files/duplicate-headers.csv");
assertEquals(2, l.size());
Map<String, Object> row1 = l.get(0);
assertResultsEqual(row1.keySet(), "Strings" , "Numbers 1", "Integers", "Numbers 2", "Floats");
assertResultsEqual(row1.values(), 1.0, 2.0, 3.0, 4.0, 5.0);
}
@Test
public void testImportCSVWithDifferentFloatingPoint() {
List<Map<String, Object>> l = importCSV("src/test/files/floats.csv", "semicolon", "double", "period");
assertEquals(2, l.size());
assertResultsEqual(l.get(0).values(), 2.5, 10.99, "40,000.60", 10000.10, "10.000,10");
assertResultsEqual(l.get(1).values(), 25.0, 1099.0, "40.000,60", 20200.20, "20.200,20");
l = importCSV("src/test/files/floats.csv", "semicolon", "double", "comma");
assertResultsEqual(l.get(0).values(), 25.0, 1099.0, "40,000.60", "10,000.10", 10000.10);
assertResultsEqual(l.get(1).values(), 2.5, 10.99, "40.000,60", "20,200.20", 20200.20);
}
@Test
public void testImportCSVWithMixedInput() {
List<Map<String, Object>> l = importSimpleCSV("src/test/files/mixed-input.csv");
assertEquals(4, l.size());
assertResultsEqual(l.get(0).values(), 100.0, "0", "zero", 0.0);
assertResultsEqual(l.get(1).values(), 255.0, "100", "0", 255.0);
assertResultsEqual(l.get(2).values(), 0.0, "100 k", "0", 255.0);
assertResultsEqual(l.get(3).values(), 100.0, "200", "255.0", 0.0);
}
private List<Map<String, Object>> importSimpleCSV(String fileName) {
return importCSV(fileName, "comma", "double", "period");
}
}