/*******************************************************************************
 *  Copyright (c) 2000, 2012 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.core;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
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.IJavaType;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;

/**
 * Tests equality of Java types.
 */
public class TypeTests extends AbstractDebugTest {

	public TypeTests(String name) {
		super(name);
	}

	public void testDeclaringTypes() throws Exception {
		IJavaType[] types = new IJavaType[3];
		int index = 0;
		String typeName = "Breakpoints";
		List<IJavaLineBreakpoint> bps = new ArrayList<IJavaLineBreakpoint>();
		// main
		bps.add(createLineBreakpoint(52, typeName));
		// threading
		bps.add(createLineBreakpoint(66, typeName));
		// InnerRunnable.run
		bps.add(createLineBreakpoint(61, typeName));

		IJavaThread thread= null;
		try {
			thread= launchToBreakpoint(typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			while (!bps.isEmpty()) {
				IBreakpoint hit = getBreakpoint(thread);
				assertNotNull("suspended, but not by breakpoint", hit);
				assertTrue("hit un-registered breakpoint", bps.contains(hit));
				assertTrue("suspended, but not by line breakpoint", hit instanceof ILineBreakpoint);
				ILineBreakpoint breakpoint= (ILineBreakpoint) hit;
				int lineNumber = breakpoint.getLineNumber();
				IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
				types[index] = frame.getReferenceType();

				if (index == 1) {
					assertEquals("First two types should be the same", types[0], types[1]);
				}

				if (index == 2) {
					assertTrue("Last two types should be different", !types[0].equals(types[2]));
				}

				index++;
				int stackLine = frame.getLineNumber();
				assertTrue("line numbers of breakpoint and stack frame do not match", lineNumber == stackLine);
				bps.remove(breakpoint);
				breakpoint.delete();
				if (!bps.isEmpty()) {
					thread = resume(thread);
				}
			}
		} finally {
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}

    public void testClassLoader() throws Exception {
        String typeName = "Breakpoints";
        List<IJavaLineBreakpoint> bps = new ArrayList<IJavaLineBreakpoint>();
        // instance method
        bps.add(createLineBreakpoint(81, typeName));
        bps.add(createLineBreakpoint(88, typeName));
        IJavaObject[] loaders = new IJavaObject[2];
        int index = 0;

        IJavaThread thread= null;
        try {
            thread= launchToBreakpoint(typeName);
            assertNotNull("Breakpoint not hit within timeout period", thread);
            while (!bps.isEmpty()) {
                IBreakpoint hit = getBreakpoint(thread);
                assertNotNull("suspended, but not by breakpoint", hit);
                assertTrue("hit un-registered breakpoint", bps.contains(hit));
                assertTrue("suspended, but not by line breakpoint", hit instanceof ILineBreakpoint);
                ILineBreakpoint breakpoint= (ILineBreakpoint) hit;
                int lineNumber = breakpoint.getLineNumber();
                IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
                loaders[index] = frame.getReferenceType().getClassLoaderObject();
                assertNotNull("class loader cannot be null", loaders[index]);

                if (index == 1) {
                    assertEquals("First two class loaders should be the same", loaders[0], loaders[1]);
                }

                index++;
                int stackLine = frame.getLineNumber();
                assertTrue("line numbers of breakpoint and stack frame do not match", lineNumber == stackLine);
                bps.remove(breakpoint);
                breakpoint.delete();
                if (!bps.isEmpty()) {
                    thread = resume(thread);
                }
            }
        } finally {
            terminateAndRemove(thread);
            removeAllBreakpoints();
        }
    }

}
