/*******************************************************************************
 *  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();
        }               
    }

}
