/******************************************************************************* * Copyright (c) 2008 Ralf Ebert * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Ralf Ebert - initial API and implementation *******************************************************************************/ package com.swtxml.tinydom; import static org.easymock.EasyMock.anyObject; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.expectLastCall; import static org.easymock.EasyMock.replay; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.junit.Test; import com.swtxml.definition.INamespaceResolver; import com.swtxml.definition.ITagDefinition; import com.swtxml.definition.internal.AttributeDefinition; import com.swtxml.definition.internal.ForeignAttributeDefinition; import com.swtxml.definition.internal.NamespaceDefinition; import com.swtxml.definition.internal.TagDefinition; import com.swtxml.resources.ClassResource; import com.swtxml.util.parser.ParseException; import com.swtxml.util.types.SimpleTypes; public class TinyDomParserTest { public static class CollectNumbers implements ITagVisitor { private String numbers = ""; public String getNumbers() { return numbers; } public void visit(Tag tag) { numbers += tag.getAttributeValue("no"); } } private INamespaceResolver sampleNamespace() { NamespaceDefinition testNamespace = new NamespaceDefinition("test"); TagDefinition tag = new TagDefinition("test", ITagDefinition.ROOT).allowNested(); testNamespace.defineTag(tag); tag.defineAttribute(new AttributeDefinition("no", SimpleTypes.STRING)); return namespace("test", testNamespace); } private INamespaceResolver namespace(String name, NamespaceDefinition testNamespace) { INamespaceResolver namespaceResolver = createMock(INamespaceResolver.class); expect(namespaceResolver.resolveNamespace(name)).andReturn(testNamespace); replay(namespaceResolver); return namespaceResolver; } @Test public void testDepthFirstTagProcessing() { Tag root = parseNumbers(); CollectNumbers collectNumbers = new CollectNumbers(); root.visitDepthFirst(collectNumbers, collectNumbers); assertEquals("112233445566", collectNumbers.getNumbers()); } @Test public void testHierarchy() { Tag root = parseNumbers(); assertNull(root.getParent()); assertEquals(2, root.getChildren().size()); assertEquals(root, root.getChildren().get(0).getParent()); assertEquals("test", root.getName()); } @Test public void testAttributes() { Tag root = parseNumbers(); assertEquals("1", root.getAttributeValue("no")); } @Test public void testForeignAttributes() { Tag root = parseNumbers(); assertEquals("1", root.getAttributeValue("no")); } @Test public void testAdapters() { Tag no1 = parseNumbers(); Tag no2 = no1.getChildren().get(0); Tag no3 = no2.getChildren().get(0); Tag no4 = no3.getChildren().get(0); String str2 = "Hallo"; no2.addAdapter(str2); String str1 = "xxx"; no1.addAdapter(str1); assertEquals(null, no4.getAdapter(String.class)); assertEquals(null, no3.getAdapter(String.class)); assertEquals(str2, no2.getAdapter(String.class)); assertEquals(str1, no1.getAdapter(String.class)); assertEquals(0, no4.getAdapterChildren(String.class).size()); assertEquals(0, no3.getAdapterChildren(String.class).size()); assertEquals(0, no2.getAdapterChildren(String.class).size()); assertArrayEquals(new Object[] { str2 }, no1.getAdapterChildren(String.class).toArray()); assertEquals(null, no4.getAdapterParent(String.class)); assertEquals(str2, no3.getAdapterParent(String.class)); assertEquals(str1, no2.getAdapterParent(String.class)); assertEquals(null, no1.getAdapterParent(String.class)); assertEquals(str2, no4.getAdapterParentRecursive(String.class)); assertEquals(str2, no3.getAdapterParentRecursive(String.class)); assertEquals(str1, no2.getAdapterParentRecursive(String.class)); assertEquals(null, no1.getAdapterParentRecursive(String.class)); } private Tag parseNumbers() { INamespaceResolver namespaceResolver = sampleNamespace(); TinyDomParser parser = new TinyDomParser(namespaceResolver, new ClassResource(getClass(), "numbers.xml")); Tag root = parser.parse(); return root; } @Test public void testLocationInfo() { Tag root = parseNumbers(); assertEquals("numbers.xml [line 2] ", root.getLocationInfo()); } @Test public void testWrongTag() { INamespaceResolver namespaceResolver = sampleNamespace(); TinyDomParser parser = new TinyDomParser(namespaceResolver, new ClassResource(getClass(), "wrongtag.xml")); try { parser.parse(); fail("expected exception"); } catch (ParseException e) { assertTrue(e.getMessage().contains("line 2")); assertTrue(e.getMessage().contains("invalid")); assertTrue(e.getMessage().contains("test")); } } @Test public void testWrongAttribute() { INamespaceResolver namespaceResolver = sampleNamespace(); TinyDomParser parser = new TinyDomParser(namespaceResolver, new ClassResource(getClass(), "wrongattribute.xml")); try { parser.parse(); fail("expected exception"); } catch (ParseException e) { assertTrue(e.getMessage().contains("line 2")); assertTrue(e.getMessage().contains("invalid")); assertTrue(e.getMessage().contains("test")); } } @Test public void testProcessingError() { ITagVisitor visitor = createMock(ITagVisitor.class); visitor.visit((Tag) anyObject()); expectLastCall().andThrow(new ParseException("NO")); replay(visitor); INamespaceResolver namespaceResolver = sampleNamespace(); TinyDomParser parser = new TinyDomParser(namespaceResolver, new ClassResource(getClass(), "numbers.xml")); Tag root = parser.parse(); try { root.visitDepthFirst(visitor); fail("expected"); } catch (ParseException e) { assertTrue(e.getMessage().contains("line 2")); assertTrue(e.getMessage().contains("NO")); } } @Test public void testInvalidScope() { NamespaceDefinition testNamespace = new NamespaceDefinition("test"); TagDefinition test = new TagDefinition("test", ITagDefinition.ROOT); testNamespace.defineTag(test); testNamespace.defineTag(new TagDefinition("yes", test)); INamespaceResolver namespaceResolver = namespace("test", testNamespace); TinyDomParser parser = new TinyDomParser(namespaceResolver, new ClassResource(getClass(), "invalidscope.xml")); try { parser.parse(); fail("expected exception"); } catch (ParseException e) { assertTrue(e.getMessage().contains("line 4")); assertTrue(e.getMessage().contains("test")); } } @Test public void testForeignAttribute() { NamespaceDefinition testNamespace = new NamespaceDefinition("test"); TagDefinition test = new TagDefinition("test", ITagDefinition.ROOT); test.defineAttribute(new AttributeDefinition("hallo", SimpleTypes.STRING)); testNamespace.defineTag(test); NamespaceDefinition attrSpace = new NamespaceDefinition("test"); attrSpace.defineForeignAttribute(new ForeignAttributeDefinition("hallo", SimpleTypes.STRING, test)); INamespaceResolver namespaceResolver = createMock(INamespaceResolver.class); expect(namespaceResolver.resolveNamespace("test")).andReturn(testNamespace); expect(namespaceResolver.resolveNamespace("attrs")).andReturn(attrSpace); replay(namespaceResolver); TinyDomParser parser = new TinyDomParser(namespaceResolver, new ClassResource(getClass(), "foreignattributes.xml")); Tag element = parser.parse(); assertEquals("tag-welt", element.getAttributeValue("hallo")); assertEquals("tag-welt", element.getAttributeValue(testNamespace, "hallo")); assertEquals("namespace-welt", element.getAttributeValue(attrSpace, "hallo")); } @Test public void testInvalidForeignAttribute() { NamespaceDefinition testNamespace = new NamespaceDefinition("test"); TagDefinition test = new TagDefinition("test", ITagDefinition.ROOT); test.defineAttribute(new AttributeDefinition("hallo", SimpleTypes.STRING)); testNamespace.defineTag(test); NamespaceDefinition attrSpace = new NamespaceDefinition("test"); INamespaceResolver namespaceResolver = createMock(INamespaceResolver.class); expect(namespaceResolver.resolveNamespace("test")).andReturn(testNamespace); expect(namespaceResolver.resolveNamespace("attrs")).andReturn(attrSpace); replay(namespaceResolver); TinyDomParser parser = new TinyDomParser(namespaceResolver, new ClassResource(getClass(), "foreignattributes.xml")); try { parser.parse(); fail("expected exception"); } catch (ParseException e) { assertTrue(e.getMessage().contains("line 2")); assertTrue(e.getMessage().contains("f:hallo")); assertTrue(e.getMessage().contains("test")); } } @Test public void testInvalidScopedForeignAttribute() { NamespaceDefinition testNamespace = new NamespaceDefinition("test"); TagDefinition test = new TagDefinition("test", ITagDefinition.ROOT); test.defineAttribute(new AttributeDefinition("hallo", SimpleTypes.STRING)); testNamespace.defineTag(test); TagDefinition yes = new TagDefinition("yes", test); testNamespace.defineTag(yes); NamespaceDefinition attrSpace = new NamespaceDefinition("test"); attrSpace.defineForeignAttribute(new ForeignAttributeDefinition("hallo", SimpleTypes.STRING, yes)); INamespaceResolver namespaceResolver = createMock(INamespaceResolver.class); expect(namespaceResolver.resolveNamespace("test")).andReturn(testNamespace); expect(namespaceResolver.resolveNamespace("attrs")).andReturn(attrSpace); replay(namespaceResolver); TinyDomParser parser = new TinyDomParser(namespaceResolver, new ClassResource(getClass(), "foreignattributes.xml")); try { parser.parse(); fail("expected exception"); } catch (ParseException e) { assertTrue(e.getMessage().contains("line 2")); assertTrue(e.getMessage().contains("f:hallo")); assertTrue(e.getMessage().contains("test")); } } }