/** * Writes out the given event to the specified file in the XML format, * then reads the file again and makes sure the freshly read in event * has the same attributes as the original event. * * @param <T> the type/class of the event * @param eventsFile filename where to write the event into * @param event the event to test * @return the read-in event */ public static <T extends Event> T testWriteReadXml(final String eventsFile, final T event) { EventWriterXML writer = new EventWriterXML(eventsFile); writer.handleEvent(event); writer.closeFile(); assertTrue(new File(eventsFile).exists()); EventsManager events = EventsUtils.createEventsManager(); EventsCollector collector = new EventsCollector(); events.addHandler(collector); new MatsimEventsReader(events).readFile(eventsFile); assertEquals("there must be 1 event.", 1, collector.getEvents().size()); Event readEvent = collector.getEvents().iterator().next(); assertEquals("event has wrong class.", event.getClass(), readEvent.getClass()); Map<String, String> writtenAttributes = event.getAttributes(); Map<String, String> readAttributes = readEvent.getAttributes(); for (Map.Entry<String, String> attribute : writtenAttributes.entrySet()) { assertEquals("attribute '" + attribute.getKey() + "' is different after reading the event.", attribute.getValue(), readAttributes.get(attribute.getKey())); } return (T) readEvent; }
@Test public void testNullAttribute() { String filename = this.utils.getOutputDirectory() + "testEvents.xml"; EventWriterXML writer = new EventWriterXML(filename); GenericEvent event = new GenericEvent("TEST", 3600.0); event.getAttributes().put("dummy", null); writer.handleEvent(event); writer.closeFile(); Assert.assertTrue(new File(filename).exists()); EventsManager events = EventsUtils.createEventsManager(); EventsCollector collector = new EventsCollector(); events.addHandler(collector); // this is already a test: is the XML valid so it can be parsed again? new MatsimEventsReader(events).readFile(filename); Assert.assertEquals("there must be 1 event.", 1, collector.getEvents().size()); } }
/** * Some people use the ids as names, including special characters in there... so make sure attribute * values are correctly encoded when written to a file. */ @Test public void testSpecialCharacters() { String filename = this.utils.getOutputDirectory() + "testEvents.xml"; EventWriterXML writer = new EventWriterXML(filename); writer.handleEvent(new LinkLeaveEvent(3600.0, Id.create("vehicle>3", Vehicle.class), Id.create("link<2", Link.class))); writer.handleEvent(new LinkLeaveEvent(3601.0, Id.create("vehicle\"4", Vehicle.class), Id.create("link'3", Link.class))); writer.closeFile(); Assert.assertTrue(new File(filename).exists()); EventsManager events = EventsUtils.createEventsManager(); EventsCollector collector = new EventsCollector(); events.addHandler(collector); // this is already a test: is the XML valid so it can be parsed again? new MatsimEventsReader(events).readFile(filename); Assert.assertEquals("there must be 2 events.", 2, collector.getEvents().size()); LinkLeaveEvent event1 = (LinkLeaveEvent) collector.getEvents().get(0); LinkLeaveEvent event2 = (LinkLeaveEvent) collector.getEvents().get(1); Assert.assertEquals("link<2", event1.getLinkId().toString()); Assert.assertEquals("vehicle>3", event1.getVehicleId().toString()); Assert.assertEquals("link'3", event2.getLinkId().toString()); Assert.assertEquals("vehicle\"4", event2.getVehicleId().toString()); }