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