package de.ugoe.cs.autoquest.eventcore.guimodel;

import static org.junit.Assert.*;

import org.junit.Test;

/**
 * Test of {@link GUIElementTree}
 * @author Fabian Glaser
 *
 */
public class GUIElementTreeTest {

	@Test
	public void testAdd() {
		GUIElementTree tree = new GUIElementTree();
		IGUIElementSpec spec = new MockGUIElementSpec();
		tree.add(10l, null, spec);
		
		assertEquals(1, tree.size());
	}
	
	@Test
	public void testAddWithParent(){
		GUIElementTree tree = new GUIElementTree();
		IGUIElementSpec parentspec = new MockGUIElementSpec();
		IGUIElementSpec spec = new MockGUIElementSpec();
		tree.add(10l, null, parentspec);
		tree.add(20l, 10l, spec);
		
		assertEquals(2, tree.size());
		
		IGUIElement element = tree.find(20l);
		assertEquals(parentspec, element.getParent().getSpecification());
	}

	@Test
	public void testFindExisting() {
		GUIElementTree tree = new GUIElementTree();
		IGUIElementSpec spec = new MockGUIElementSpec();
		tree.add(10l, 0l, spec);
		
		IGUIElement element = tree.find(10l);
		assertNotNull(element);
	}
	
	@Test
	public void testFindNonExisting(){
		GUIElementTree tree = new GUIElementTree();
		try{
			tree.find(10l);
			fail("Exception was not thrown.");
		}
		catch(Exception e){		
		}
	}

	@Test
	public void testRemoveSingleElement() {
		GUIElementTree tree = new GUIElementTree();
		IGUIElementSpec spec = new MockGUIElementSpec(); 
		tree.add(10l, null, spec);
		
		assertEquals(1, tree.size());
		assertEquals(1, tree.remove(10l));
	}
	
	@Test
	public void testRemoveWithChildElement(){
		GUIElementTree tree = new GUIElementTree();
		IGUIElementSpec parentspec = new MockGUIElementSpec();
		IGUIElementSpec spec = new MockGUIElementSpec();
		tree.add(10l, null, parentspec);
		tree.add(20l, 10l, spec);
		
		assertEquals(2, tree.remove(10l));
		assertEquals(0, tree.size());
	}
	
	@Test
	public void testRemoveNonExisting(){
		GUIElementTree tree = new GUIElementTree();
		assertEquals(0, tree.remove(10l));
	}

	@Test
	public void testGetGUIModel() {
		GUIElementTree tree = new GUIElementTree();
		assertNotNull(tree.getGUIModel());
	}
}
