/*******************************************************************************
 * Copyright (c) 2010, 2015 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.DebugEvent;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.eval.EvaluationManager;
import org.eclipse.jdt.debug.eval.IAstEvaluationEngine;
import org.eclipse.jdt.debug.eval.IEvaluationListener;
import org.eclipse.jdt.debug.eval.IEvaluationResult;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.debug.tests.TestAgainException;

/**
 * Tests that arrays can be accessed with *big* Integers
 */
public class TestIntegerAccessUnboxing15 extends AbstractDebugTest {

	public TestIntegerAccessUnboxing15(String name) {
		super(name);
	}
	
	class Listener implements IEvaluationListener {
		
		private Object lock = new Object();
		private IEvaluationResult endresult;

		/* (non-Javadoc)
		 * @see org.eclipse.jdt.debug.eval.IEvaluationListener#evaluationComplete(org.eclipse.jdt.debug.eval.IEvaluationResult)
		 */
		@Override
		public void evaluationComplete(IEvaluationResult result) {
			synchronized (lock) {
				this.endresult = result;
				lock.notifyAll();
			}
		}
		
		IEvaluationResult getResult() throws Exception {
			synchronized (lock) {
				if (endresult == null) {
					lock.wait(DEFAULT_TIMEOUT);
				}
			}
			if(endresult == null) {
				throw new TestAgainException("Retest - evaluation did not complete");
			}
			return endresult;
		}
		
	}
	
	public void doAccessTest(String snippet, int expected) throws Exception {
		IJavaThread thread= null;
		IAstEvaluationEngine engine = null;
		String typeName = "a.b.c.IntegerAccess";
		createLineBreakpoint(get15Project().findType(typeName), 24);
		try {
			thread= launchToBreakpoint(get15Project(), typeName);
			assertNotNull("Breakpoint not hit within timeout period", thread);
			
			IBreakpoint hit = getBreakpoint(thread);
			assertNotNull("suspended, but not by breakpoint", hit);
			IJavaDebugTarget target = (IJavaDebugTarget) thread.getDebugTarget();
			
			IJavaStackFrame frame = (IJavaStackFrame) thread.getTopStackFrame();
			engine = EvaluationManager.newAstEvaluationEngine(get15Project(), target);
			Listener listener = new Listener();
			engine.evaluate(snippet, frame, listener, DebugEvent.EVALUATION, false);
			IEvaluationResult result = listener.getResult();
			assertFalse("Should be no errors in evaluation", result.hasErrors());
			assertEquals(target.newValue(expected), result.getValue());
		} finally {
			if (engine != null) {
				engine.dispose();
			}
			terminateAndRemove(thread);
			removeAllBreakpoints();
		}
	}	
	
	/* (non-Javadoc)
	 * @see org.eclipse.jdt.debug.tests.AbstractDebugTest#getProjectContext()
	 */
	@Override
	protected IJavaProject getProjectContext() {
		return get15Project();
	}
	
	/**
	 * Test a row can be accessed
	 * 
	 * @throws Exception
	 */
	public void testRowAccess() throws Exception {
		doAccessTest("matrix[new Integer(0)][0]", 1);
	}
	
	/**
	 * Test a column can be accessed.
	 * 
	 * @throws Exception
	 */
	public void testColumnAccess() throws Exception {
		doAccessTest("matrix[2][new Integer(2)]", 9);
	}

	public void testRowColumnAccess() throws Exception {
		doAccessTest("matrix[1][new Integer(1)]", 5);
	}
}
