/*******************************************************************************
 * Copyright (c) 2008 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.debug.tests.variables;

import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILogicalStructureType;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.jdt.debug.core.IJavaArray;
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.IJavaVariable;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;

/**
 * Tests for logical structures
 */
public class TestLogicalStructures extends AbstractDebugTest {

	/**
	 * Constructs test.
	 *
	 * @param name test name
	 */
	public TestLogicalStructures(String name) {
		super(name);
	}

	/**
	 * Test the logical structure for a list.
	 *
	 * @throws Exception
	 */
	public void testListLogicalStructure() throws Exception {
		String typeName = "LogicalStructures";
		createLineBreakpoint(33, typeName);
		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			IBreakpoint hit = getBreakpoint(thread);
			assertNotNull("suspended, but not by breakpoint", hit);

			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
			assertNotNull("missing top frame", frame);

			IJavaVariable variable = frame.findVariable("list");
			assertNotNull("Missing variable 'list'", variable);

			IValue value = variable.getValue();
			ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value);
			assertEquals("Should be one logical structure type", 1, types.length);

			IJavaObject logicalValue = (IJavaObject) types[0].getLogicalStructure(value);
			assertEquals("Logical value should be an array", "java.lang.Object[]", logicalValue.getJavaType().getName());

			IJavaArray array = (IJavaArray) logicalValue;
			assertEquals("Should be two elements in the structure", 2, array.getLength());

		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Test the logical structure for a map.
	 *
	 * @throws Exception
	 */
	public void testMapLogicalStructure() throws Exception {
		String typeName = "LogicalStructures";
		createLineBreakpoint(33, typeName);
		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			IBreakpoint hit = getBreakpoint(thread);
			assertNotNull("suspended, but not by breakpoint", hit);

			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
			assertNotNull("missing top frame", frame);

			IJavaVariable variable = frame.findVariable("map");
			assertNotNull("Missing variable 'map'", variable);

			IValue value = variable.getValue();
			ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value);
			assertEquals("Should be one logical structure type", 1, types.length);

			IJavaObject logicalValue = (IJavaObject) types[0].getLogicalStructure(value);
			assertEquals("Logical value should be an array", "java.lang.Object[]", logicalValue.getJavaType().getName());

			IJavaArray array = (IJavaArray) logicalValue;
			assertEquals("Should be two elements in the structure", 2, array.getLength());

		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

	/**
	 * Test the logical structure for a map entry.
	 *
	 * @throws Exception
	 */
	public void testEntryLogicalStructure() throws Exception {
		String typeName = "LogicalStructures";
		createLineBreakpoint(33, typeName);
		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);

			IBreakpoint hit = getBreakpoint(thread);
			assertNotNull("suspended, but not by breakpoint", hit);

			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
			assertNotNull("missing top frame", frame);

			IJavaVariable variable = frame.findVariable("entry");
			assertNotNull("Missing variable 'entry'", variable);

			IValue value = variable.getValue();
			ILogicalStructureType[] types = DebugPlugin.getLogicalStructureTypes(value);
			assertEquals("Should be one logical structure type", 1, types.length);

			IJavaObject logicalValue = (IJavaObject) types[0].getLogicalStructure(value);
			IVariable[] children = logicalValue.getVariables();
			assertEquals("Should be two elements in the structure", 2, children.length);
			assertEquals("First entry should be key", "key", children[0].getName());
			assertEquals("Second entry should be value", "value", children[1].getName());

		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}
}
