/* * Copyright (c) 2010-2014, Isode Limited, London, England. * All rights reserved. */ /* * Copyright (c) 2010, Remko Tronçon. * All rights reserved. */ package com.isode.stroke.parser; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; public class XMLParserTest { @Before public void setUp() { client_ = new Client(); } private XMLParser parser() { return PlatformXMLParserFactory.createXMLParser(client_); } private void join(XMLParser parser) { } @Test public void testParse_characters() { XMLParser testling = parser(); String data = "ABCZ\u0041\u00DF\u00F7\u0410\u0498"; assertTrue(testling.parse("" + data + "")); join(testling); assertEquals(3, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("body", client_.events.get(0).data); assertEquals(Client.Type.CharacterData, client_.events.get(1).type); assertEquals(data, client_.events.get(1).data); assertEquals(Client.Type.EndElement, client_.events.get(2).type); assertEquals("body", client_.events.get(2).data); } @Test public void testParse_NestedElements() { XMLParser testling = parser(); assertTrue(testling.parse( "" + "" + "")); join(testling); assertEquals(4, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("iq", client_.events.get(0).data); assertEquals(1, client_.events.get(0).attributes.getEntries().size()); assertEquals("get", client_.events.get(0).attributes.getAttribute("type")); assertEquals("", client_.events.get(0).ns); assertEquals(Client.Type.StartElement, client_.events.get(1).type); assertEquals("query", client_.events.get(1).data); assertEquals(0, client_.events.get(1).attributes.getEntries().size()); assertEquals("jabber:iq:version", client_.events.get(1).ns); assertEquals(Client.Type.EndElement, client_.events.get(2).type); assertEquals("query", client_.events.get(2).data); assertEquals("jabber:iq:version", client_.events.get(2).ns); assertEquals(Client.Type.EndElement, client_.events.get(3).type); assertEquals("iq", client_.events.get(3).data); assertEquals("", client_.events.get(3).ns); } @Test public void testParse_ElementInNamespacedElement() { XMLParser testling = parser(); assertTrue(testling.parse( "" + "Swift" + "")); join(testling); assertEquals(5, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("query", client_.events.get(0).data); assertEquals(0, client_.events.get(0).attributes.getEntries().size()); assertEquals("jabber:iq:version", client_.events.get(0).ns); assertEquals(Client.Type.StartElement, client_.events.get(1).type); assertEquals("name", client_.events.get(1).data); assertEquals("jabber:iq:version", client_.events.get(1).ns); assertEquals(Client.Type.CharacterData, client_.events.get(2).type); assertEquals("Swift", client_.events.get(2).data); assertEquals(Client.Type.EndElement, client_.events.get(3).type); assertEquals("name", client_.events.get(3).data); assertEquals("jabber:iq:version", client_.events.get(3).ns); assertEquals(Client.Type.EndElement, client_.events.get(4).type); assertEquals("query", client_.events.get(4).data); assertEquals("jabber:iq:version", client_.events.get(4).ns); } @Test public void testParse_CharacterData() { XMLParser testling = parser(); assertTrue(testling.parse("blabliblo")); join(testling); assertEquals(7, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("html", client_.events.get(0).data); assertEquals(Client.Type.CharacterData, client_.events.get(1).type); assertEquals("bla", client_.events.get(1).data); assertEquals(Client.Type.StartElement, client_.events.get(2).type); assertEquals("i", client_.events.get(2).data); assertEquals(Client.Type.CharacterData, client_.events.get(3).type); assertEquals("bli", client_.events.get(3).data); assertEquals(Client.Type.EndElement, client_.events.get(4).type); assertEquals("i", client_.events.get(4).data); assertEquals(Client.Type.CharacterData, client_.events.get(5).type); assertEquals("blo", client_.events.get(5).data); assertEquals(Client.Type.EndElement, client_.events.get(6).type); assertEquals("html", client_.events.get(6).data); } @Test public void testParse_NamespacePrefix() { XMLParser testling = parser(); assertTrue(testling.parse("")); join(testling); assertEquals(4, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("x", client_.events.get(0).data); assertEquals("bla", client_.events.get(0).ns); assertEquals(Client.Type.StartElement, client_.events.get(1).type); assertEquals("y", client_.events.get(1).data); assertEquals("bla", client_.events.get(1).ns); assertEquals(Client.Type.EndElement, client_.events.get(2).type); assertEquals("y", client_.events.get(2).data); assertEquals("bla", client_.events.get(2).ns); assertEquals(Client.Type.EndElement, client_.events.get(3).type); assertEquals("x", client_.events.get(3).data); assertEquals("bla", client_.events.get(3).ns); } @Test public void testParse_UnhandledXML() { XMLParser testling = parser(); assertTrue(testling.parse("")); join(testling); assertEquals(2, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("iq", client_.events.get(0).data); assertEquals(Client.Type.EndElement, client_.events.get(1).type); assertEquals("iq", client_.events.get(1).data); } //@Test /*TODO: uncomment if we ever get a sane incremental parser */ public void testParse_InvalidXML() { XMLParser testling = parser(); assertTrue(!testling.parse("")); } //@Test /*TODO: uncomment if we ever get a sane incremental parser */ public void testParse_InErrorState() { XMLParser testling = parser(); assertTrue(!testling.parse("")); assertTrue(!testling.parse("")); } @Test public void testParse_Incremental() { XMLParser testling = parser(); assertTrue(testling.parse("")); join(testling); assertEquals(2, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("iq", client_.events.get(0).data); assertEquals(Client.Type.EndElement, client_.events.get(1).type); assertEquals("iq", client_.events.get(1).data); } @Test public void testParse_IncrementalWithCloses() { XMLParser testling = parser(); assertTrue(testling.parse("<>")); join(testling); assertEquals(3, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("iq", client_.events.get(0).data); assertEquals(Client.Type.CharacterData, client_.events.get(1).type); assertEquals("<>", client_.events.get(1).data); assertEquals(Client.Type.EndElement, client_.events.get(2).type); assertEquals("iq", client_.events.get(2).data); } @Test public void testParse_WhitespaceInAttribute() { XMLParser testling = parser(); assertTrue(testling.parse( "")); assertTrue(testling.parse( "")); join(testling); assertEquals(3, client_.events.size()); assertEquals(Client.Type.StartElement, client_.events.get(0).type); assertEquals("query", client_.events.get(0).data); assertEquals(Client.Type.StartElement, client_.events.get(1).type); assertEquals("presence", client_.events.get(1).data); assertEquals(Client.Type.EndElement, client_.events.get(2).type); assertEquals("presence", client_.events.get(2).data); } private static class Client implements XMLParserClient { public enum Type { StartElement, EndElement, CharacterData }; private class Event { Event( Type type, String data, String ns, AttributeMap attributes) { this.type = type; this.data = data; this.ns = ns; this.attributes = attributes; } Event(Type type, String data, String ns) { this.type = type; this.data = data; this.ns = ns; } Event(Type type, String data) { this(type, data, ""); } Type type; String data; String ns; AttributeMap attributes; }; Client() { } public void handleStartElement(String element, String ns, AttributeMap attributes) { events.add(new Event(Type.StartElement, element, ns, attributes)); } public void handleEndElement(String element, String ns) { events.add(new Event(Type.EndElement, element, ns)); } public void handleCharacterData(String data) { events.add(new Event(Type.CharacterData, data)); } List events = new ArrayList(); }; private Client client_; }