package sushi.traffic.importer.tests;
import static org.junit.Assert.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import sushi.event.SushiEvent;
import sushi.event.collection.SushiMapTree;
import sushi.traffic.importer.TomTomHelper;
import sushi.traffic.importer.TomTomTrafficimporter;
public class TestTrafficImporter {
private String traffic_2poi = "tomtom/traffic_2poi.json";
private String traffic_2poi_both_cpoi = "tomtom/traffic_2poi_both_cpoi.json";
private String traffic_empty = "tomtom/traffic_empty.json";
private TomTomTrafficimporter ttti;
@Before
public void setUp() throws Exception {
ttti = new TomTomTrafficimporter();
}
@Test
public void testFlattening2Poi1withCpoi() throws JSONException {
String jsonstring = getStringFromInputStream(getClass().getClassLoader().getResourceAsStream(traffic_2poi));
JSONObject traffic_2poi_json = new JSONObject(jsonstring);
List <JSONObject> flattenIncidents = ttti.getFlattenTrafficIncidents(traffic_2poi_json.getJSONObject("tm"));
assertTrue("expected 6, got " + flattenIncidents.size(), flattenIncidents.size() == 6);
}
@Test
public void testFlattening2PoiBothwithCpoi() throws JSONException {
String jsonstring = getStringFromInputStream(getClass().getClassLoader().getResourceAsStream(traffic_2poi_both_cpoi));
JSONObject traffic_2poi_both_cpoi_json = new JSONObject(jsonstring);
List <JSONObject> flattenIncidents = ttti.getFlattenTrafficIncidents(traffic_2poi_both_cpoi_json.getJSONObject("tm"));
assertTrue("expected 10, got "+ flattenIncidents.size(),flattenIncidents.size() == 10);
}
@Test
public void testFlatteningForEmptyRespond() throws JSONException{
String jsonstring = getStringFromInputStream(getClass().getClassLoader().getResourceAsStream(traffic_empty));
JSONObject traffic_empty_json = new JSONObject(jsonstring);
List <JSONObject> flattenIncidents = ttti.getFlattenTrafficIncidents(traffic_empty_json.getJSONObject("tm"));
assertTrue(flattenIncidents.size() == 0);
}
// convert InputStream to String
private static String getStringFromInputStream(InputStream is) {
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
@Test
public void testTomTomHelper() throws IOException{
assertTrue("StreetnumbersOfExampleUseCase should have 6 Streets",TomTomHelper.getStreetnumbersOfExampleUsecase().size() == 6);
}
@Test
public void testFilterEvents() throws IOException{
// event is should not be filtered away cause B109 is in the streetnumbersofexampleusecase.txt
SushiMapTree<String, Serializable> values1 = new SushiMapTree<>();
values1.addRootElement("startStreet", "B109");
values1.addRootElement("endStreet", "-");
values1.addRootElement("onRoadnumbers", "-");
SushiEvent trafficEvent1 = new SushiEvent(ttti.getTrafficEventtype(), new Date(), values1);
// event is ok, cause A10 is in the streetnumbersofexampleusecase.txt
SushiMapTree<String, Serializable> values2 = new SushiMapTree<>();
values2.addRootElement("startStreet", "B110");
values2.addRootElement("endStreet", "A10");
values2.addRootElement("onRoadnumbers", "A10");
SushiEvent trafficEvent2 = new SushiEvent(ttti.getTrafficEventtype(), new Date(), values2);
// B1 is not in the list, therefore filter it away
SushiMapTree<String, Serializable> values3 = new SushiMapTree<>();
values3.addRootElement("startStreet", "B1");
values3.addRootElement("endStreet", "-");
values3.addRootElement("onRoadnumbers", "-");
SushiEvent trafficEvent3 = new SushiEvent(ttti.getTrafficEventtype(), new Date(), values3);
ArrayList<SushiEvent> trafficevents = new ArrayList<SushiEvent>(Arrays.asList(trafficEvent1, trafficEvent2, trafficEvent3));
ArrayList<SushiEvent> filteredEvents = ttti.filterEvents(trafficevents);
assertTrue("should be 2 but was " + filteredEvents.size(), filteredEvents.size() == 2);
}
}