Index: trunk/autoquest-core-events-test/src/test/java/de/ugoe/cs/autoquest/eventcore/guimodel/GUIModelTest.java
===================================================================
--- trunk/autoquest-core-events-test/src/test/java/de/ugoe/cs/autoquest/eventcore/guimodel/GUIModelTest.java	(revision 1088)
+++ trunk/autoquest-core-events-test/src/test/java/de/ugoe/cs/autoquest/eventcore/guimodel/GUIModelTest.java	(revision 1088)
@@ -0,0 +1,817 @@
+//   Copyright 2012 Georg-August-Universität Göttingen, Germany
+//
+//   Licensed under the Apache License, Version 2.0 (the "License");
+//   you may not use this file except in compliance with the License.
+//   You may obtain a copy of the License at
+//
+//       http://www.apache.org/licenses/LICENSE-2.0
+//
+//   Unless required by applicable law or agreed to in writing, software
+//   distributed under the License is distributed on an "AS IS" BASIS,
+//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//   See the License for the specific language governing permissions and
+//   limitations under the License.
+
+package de.ugoe.cs.autoquest.eventcore.guimodel;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+/**
+ *
+ * @author Patrick Harms
+ */
+public class GUIModelTest {
+    
+    /**
+     * 
+     */
+    private IGUIElementFactory guiElementFactory = new TestGUIElementFactory();
+
+    /**
+     * 
+     */
+    @Test
+    public void test_PathIntegration_01() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        
+        IGUIElement element = model.integratePath(guiElementPath, guiElementFactory);
+        
+        assertTrue(element instanceof TestGUIElement);
+        assertEquals(guiElementPath.get(0), element.getSpecification());
+        assertNull(element.getParent());
+        
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        assertEquals(element, model.getRootElements().get(0));
+        
+        assertNotNull(model.getChildren(element));
+        assertTrue(model.getChildren(element).isEmpty());
+        
+        assertNull(model.getParent(element));
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_PathIntegration_02() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        for (int i = 0; i < 5; i++) {
+            guiElementPath.add(new TestGUIElementSpec("guiElem" + i));
+        }
+        
+        IGUIElement element = model.integratePath(guiElementPath, guiElementFactory);
+        
+        for (int i = 4; i >= 0; i--) {
+            assertTrue(element instanceof TestGUIElement);
+            assertEquals(guiElementPath.get(i), element.getSpecification());
+            
+            assertNotNull(model.getChildren(element));
+            
+            if (i == 4) {
+                assertTrue(model.getChildren(element).isEmpty());
+            }
+            else {
+                assertEquals(1, model.getChildren(element).size());
+                assertEquals(guiElementPath.get(i + 1),
+                             model.getChildren(element).get(0).getSpecification());
+            }
+            
+            element = element.getParent();
+        }
+        
+        assertNull(element);
+
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        assertNotNull(model.getRootElements().get(0));
+        assertEquals(guiElementPath.get(0), model.getRootElements().get(0).getSpecification());
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_PathIntegration_03() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        for (int i = 0; i < 20; i++) {
+            List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+            
+            for (int j = 0; j < 5; j++) {
+                guiElementPath.add(new TestGUIElementSpec("guiElem_" + i + "_" + j));
+            }
+            
+            IGUIElement element = model.integratePath(guiElementPath, guiElementFactory);
+            
+            for (int j = 4; j >= 0; j--) {
+                assertTrue(element instanceof TestGUIElement);
+                assertEquals(guiElementPath.get(j), element.getSpecification());
+                
+                assertNotNull(model.getChildren(element));
+                
+                if (j == 4) {
+                    assertTrue(model.getChildren(element).isEmpty());
+                }
+                else {
+                    assertEquals(1, model.getChildren(element).size());
+                    assertEquals(guiElementPath.get(j + 1),
+                                 model.getChildren(element).get(0).getSpecification());
+                }
+                
+                element = element.getParent();
+            }
+            
+            assertNull(element);
+
+        }
+        
+        assertNotNull(model.getRootElements());
+        assertEquals(20, model.getRootElements().size());
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_PathIntegration_04() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        
+        IGUIElement element1 = model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        
+        IGUIElement element2 = model.integratePath(guiElementPath, guiElementFactory);
+        
+        assertSame(element1, element2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_PathIntegration_05() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        for (int i = 0; i < 5; i++) {
+            guiElementPath.add(new TestGUIElementSpec("guiElem" + i));
+        }
+        
+        IGUIElement element1 = model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath = new ArrayList<IGUIElementSpec>();
+        for (int i = 0; i < 5; i++) {
+            guiElementPath.add(new TestGUIElementSpec("guiElem" + i));
+        }
+        
+        IGUIElement element2 = model.integratePath(guiElementPath, guiElementFactory);
+        
+        assertSame(element1, element2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_PathIntegration_06() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem2"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem3"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem4"));
+        
+        IGUIElement element1 = model.integratePath(guiElementPath, guiElementFactory);
+
+        guiElementPath.remove(2);
+        guiElementPath.remove(2);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem5"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem6"));
+
+        IGUIElement element2 = model.integratePath(guiElementPath, guiElementFactory);
+        
+        assertFalse(element1.equals(element2));
+        
+        element1 = element1.getParent();
+        assertFalse(element1.equals(element2));
+        
+        element2 = element2.getParent();
+        assertFalse(element1.equals(element2));
+        
+        element1 = element1.getParent();
+        assertFalse(element1.equals(element2));
+        
+        element2 = element2.getParent();
+        assertSame(element1, element2);
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_CondenseModel_01() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        for (int i = 0; i < 20; i++) {
+            List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+            
+            for (int j = 0; j < 5; j++) {
+                guiElementPath.add(new TestGUIElementSpec("guiElem_" + i + "_" + j, "spec_" + j));
+            }
+            
+            model.integratePath(guiElementPath, guiElementFactory);
+        }
+        
+        assertNotNull(model.getRootElements());
+        assertEquals(20, model.getRootElements().size());
+        
+        model.condenseModel();
+        
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        
+        IGUIElement element = model.getRootElements().get(0);
+        
+        for (int i = 0; i < 5; i++) {
+            assertNotNull(element);
+            assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+            assertTrue(((TestGUIElementSpec) element.getSpecification()).id.endsWith("_" + i));
+
+            if (i < 4) {
+                assertNotNull(model.getChildren(element));
+                assertEquals(1, model.getChildren(element).size());
+                element = model.getChildren(element).get(0);
+            }
+            else {
+                assertNotNull(model.getChildren(element));
+                assertEquals(0, model.getChildren(element).size());
+            }
+        }
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_CondenseModel_02() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        for (int j = 0; j < 3; j++) {
+            guiElementPath.add(new TestGUIElementSpec("guiElem_" + j));
+        }
+        
+        for (int i = 0; i < 20; i++) {
+            for (int j = 3; j < 5; j++) {
+                guiElementPath.add(new TestGUIElementSpec("guiElem_" + i + "_" + j, "spec_" + j));
+            }
+            
+            model.integratePath(guiElementPath, guiElementFactory);
+            
+            for (int j = 3; j < 5; j++) {
+                guiElementPath.remove(3);
+            }
+        }
+        
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        
+        IGUIElement element = model.getRootElements().get(0);
+        
+        for (int i = 0; i < 3; i++) {
+            assertNotNull(element);
+            assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+            assertEquals("guiElem_" + i, ((TestGUIElementSpec) element.getSpecification()).id);
+
+            if (i < 2) {
+                assertNotNull(model.getChildren(element));
+                assertEquals(1, model.getChildren(element).size());
+                element = model.getChildren(element).get(0);
+            }
+            else {
+                assertNotNull(model.getChildren(element));
+                assertEquals(20, model.getChildren(element).size());
+            }
+        }
+
+        model.condenseModel();
+        
+        assertNotNull(model.getRootElements());
+        assertEquals(1, model.getRootElements().size());
+        
+        element = model.getRootElements().get(0);
+        
+        for (int i = 0; i < 5; i++) {
+            assertNotNull(element);
+            assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+            assertTrue(((TestGUIElementSpec) element.getSpecification()).id.endsWith("_" + i));
+
+            if (i < 4) {
+                assertNotNull(model.getChildren(element));
+                assertEquals(1, model.getChildren(element).size());
+                element = model.getChildren(element).get(0);
+            }
+            else {
+                assertNotNull(model.getChildren(element));
+                assertEquals(0, model.getChildren(element).size());
+            }
+        }
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_Traverser_01() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem2"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem3"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem4"));
+        
+        model.integratePath(guiElementPath, guiElementFactory);
+
+        guiElementPath.remove(2);
+        guiElementPath.remove(2);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem5"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem6"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(3);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem7"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem8"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem9"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem10"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        // the model created is
+        // guiElem1
+        //   |-- guiElem2
+        //   |     |-- guiElem3
+        //   |     |     \-- guiElem4
+        //   |     |
+        //   |     \-- guiElem5
+        //   |           |-- guiElem6
+        //   |           \-- guiElem7
+        //   |                 \-- guiElem8
+        //   \-- guiElem9
+        //         \-- guiElem10
+        
+        GUIModel.Traverser traverser = model.getTraverser();
+        assertNotNull(traverser);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.parent());
+        
+        // guiElem1
+        IGUIElement element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem1", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem2
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem2", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem3
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem3", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem4
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem4", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+
+        // guiElem3
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem3", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem5
+        element = traverser.nextSibling();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem5", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem6
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem6", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem7
+        element = traverser.nextSibling();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem7", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem8
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem8", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem7
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem7", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem5
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem5", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem2
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem2", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem9
+        element = traverser.nextSibling();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem9", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem10
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem10", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem9
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem9", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem1
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem1", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        assertNull(traverser.parent());
+    }
+
+    /**
+     * 
+     */
+    @Test
+    public void test_Traverser_02() throws Exception {
+        GUIModel model = new GUIModel();
+        
+        List<IGUIElementSpec> guiElementPath = new ArrayList<IGUIElementSpec>();
+        guiElementPath.add(new TestGUIElementSpec("guiElem1"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem2"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem3"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem4"));
+        
+        model.integratePath(guiElementPath, guiElementFactory);
+
+        guiElementPath.remove(2);
+        guiElementPath.remove(2);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem5"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem6"));
+
+        IGUIElement target = model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(3);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem7"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem8"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        guiElementPath.remove(1);
+        
+        guiElementPath.add(new TestGUIElementSpec("guiElem9"));
+        guiElementPath.add(new TestGUIElementSpec("guiElem10"));
+
+        model.integratePath(guiElementPath, guiElementFactory);
+        
+        // the model created is
+        // guiElem1
+        //   |-- guiElem2
+        //   |     |-- guiElem3
+        //   |     |     \-- guiElem4
+        //   |     |
+        //   |     \-- guiElem5
+        //   |           |-- guiElem6
+        //   |           \-- guiElem7
+        //   |                 \-- guiElem8
+        //   \-- guiElem9
+        //         \-- guiElem10
+        
+        GUIModel.Traverser traverser = model.getTraverser(target);
+        assertNotNull(traverser);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem7
+        IGUIElement element = traverser.nextSibling();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem7", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem8
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem8", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem7
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem7", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem5
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem5", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem2
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem2", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertTrue(traverser.hasNextSibling());
+        
+        // guiElem9
+        element = traverser.nextSibling();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem9", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem10
+        element = traverser.firstChild();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem10", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertFalse(traverser.hasFirstChild());
+        assertNull(traverser.firstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem9
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem9", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        // guiElem1
+        element = traverser.parent();
+        assertNotNull(element);
+        assertTrue(element.getSpecification() instanceof TestGUIElementSpec);
+        assertEquals("guiElem1", ((TestGUIElementSpec) element.getSpecification()).id);
+        assertTrue(traverser.hasFirstChild());
+        assertFalse(traverser.hasNextSibling());
+        assertNull(traverser.nextSibling());
+        
+        assertNull(traverser.parent());
+    }
+
+    /**
+     *
+     * @author Patrick Harms
+     */
+    private class TestGUIElementFactory implements IGUIElementFactory {
+
+        /* (non-Javadoc)
+         * @see IGUIElementFactory#instantiateGUIElement(IGUIElementSpec, IGUIElement)
+         */
+        @Override
+        public IGUIElement instantiateGUIElement(IGUIElementSpec specification, IGUIElement parent)
+            throws GUIModelConfigurationException
+        {
+            assertTrue(specification instanceof TestGUIElementSpec);
+            
+            return new TestGUIElement((TestGUIElementSpec) specification, parent);
+        }
+
+    }
+
+    /**
+     *
+     * @author Patrick Harms
+     */
+    private class TestGUIElementSpec implements IGUIElementSpec {
+
+        /**  */
+        private static final long serialVersionUID = 1L;
+        
+        /** */
+        private String id;
+
+        /** */
+        private String similarityId;
+
+        /**
+         *
+         */
+        public TestGUIElementSpec(String id) {
+            this(id, "");
+        }
+
+        /**
+         *
+         */
+        public TestGUIElementSpec(String id, String similarityId) {
+            this.id = id;
+            this.similarityId = similarityId;
+            assertNotNull(id);
+            assertNotNull(similarityId);
+        }
+
+        /* (non-Javadoc)
+         * @see de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElementSpec#getType()
+         */
+        @Override
+        public String getType() {
+            return "TestGUIElement";
+        }
+
+        /* (non-Javadoc)
+         * @see de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElementSpec#getTypeHierarchy()
+         */
+        @Override
+        public String[] getTypeHierarchy() {
+            return new String[] { "TestGUIElement" };
+        }
+
+        /* (non-Javadoc)
+         * @see IGUIElementSpec#getSimilarity(IGUIElementSpec)
+         */
+        @Override
+        public boolean getSimilarity(IGUIElementSpec other) {
+            return (other instanceof TestGUIElementSpec ?
+                ((TestGUIElementSpec) other).similarityId.equals(similarityId) : false);
+        }
+
+        /* (non-Javadoc)
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals(Object other) {
+            return (other instanceof TestGUIElementSpec ?
+                ((TestGUIElementSpec) other).id.equals(id) : false);
+        }
+
+    }
+
+    /**
+     *
+     * @author Patrick Harms
+     */
+    public class TestGUIElement extends AbstractDefaultGUIElement implements IGUIElement {
+
+        /**  */
+        private static final long serialVersionUID = 1L;
+
+        /**
+         *
+         */
+        public TestGUIElement(TestGUIElementSpec specification, IGUIElement parent) {
+            super(specification, parent);
+        }
+
+        /* (non-Javadoc)
+         * @see de.ugoe.cs.autoquest.eventcore.IEventTarget#getPlatform()
+         */
+        @Override
+        public String getPlatform() {
+            return "TEST";
+        }
+
+        /* (non-Javadoc)
+         * @see de.ugoe.cs.autoquest.eventcore.IEventTarget#getStringIdentifier()
+         */
+        @Override
+        public String getStringIdentifier() {
+            return ((TestGUIElementSpec) super.getSpecification()).id;
+        }
+
+        /* (non-Javadoc)
+         * @see de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement#updateSpecification(de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElementSpec)
+         */
+        @Override
+        public void updateSpecification(IGUIElementSpec furtherSpec) {
+            // do nothing
+        }
+
+    }
+
+}
