/*******************************************************************************
 * Copyright (c) 2002, 2005 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.eval;

import org.eclipse.debug.core.model.IValue;
import org.eclipse.jdt.debug.core.IJavaPrimitiveValue;

public class LoopTests extends Tests {

	public LoopTests(String arg) {
		super(arg);
	}

	protected void init() throws Exception {
		initializeFrame("EvalSimpleTests",37,1);
	}

	protected void end() throws Exception {
		destroyFrame();
	}

	// while
	public void testWhile() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt= 0; yVarInt=0; while (xVarInt < 5) {xVarInt++; yVarInt++;} return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 5, intValue);
		} finally {
			end();
		}
	}

	// do while
	public void testDoWhile() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt= 0; yVarInt=0; do {xVarInt++; yVarInt++;} while (xVarInt < 5); return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 5, intValue);
		} finally {
			end();
		}
	}

	// for
	public void testFor() throws Throwable {
		try {
			init();
			IValue value = eval("for (xVarInt= 0, yVarInt=0; xVarInt < 5; xVarInt++) {yVarInt++;}  return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 5, intValue);
		} finally {
			end();
		}
	}
	
	// while break
	public void testWhileBreak() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt= 0; yVarInt=0; while (xVarInt < 5) {xVarInt++; if (xVarInt == 3) {break;} yVarInt++;} return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 2, intValue);
		} finally {
			end();
		}
	}

	// do while break
	public void testDoWhileBreak() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt= 0; yVarInt=0; do {xVarInt++; if (xVarInt == 3) {break;} yVarInt++;} while (xVarInt < 5); return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 2, intValue);
		} finally {
			end();
		}
	}

	// for break
	public void testForBreak() throws Throwable {
		try {
			init();
			IValue value = eval("for (xVarInt= 0, yVarInt=0; xVarInt < 5; xVarInt++) {if (xVarInt == 3) {break;} yVarInt++;}  return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 3, intValue);
		} finally {
			end();
		}
	}
	
	// while continue
	public void testWhileContinue() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt= 0; yVarInt=0; while (xVarInt < 5) {xVarInt++; if (xVarInt == 3) {continue;} yVarInt++;} return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 4, intValue);
		} finally {
			end();
		}
	}

	// do while continue
	public void testDoWhileContinue() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt= 0; yVarInt=0; do {xVarInt++; if (xVarInt == 3) {continue;} yVarInt++;} while (xVarInt < 5); return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 4, intValue);
		} finally {
			end();
		}
	}

	// for continue
	public void testForContinue() throws Throwable {
		try {
			init();
			IValue value = eval("for (xVarInt= 0, yVarInt=0; xVarInt < 5; xVarInt++) {if (xVarInt == 3) {continue;} yVarInt++;}  return yVarInt;");
			String typeName = value.getReferenceTypeName();
			assertEquals("int : wrong type : ", "int", typeName);
			int intValue = ((IJavaPrimitiveValue)value).getIntValue();
			assertEquals("int : wrong result : ", 4, intValue);
		} finally {
			end();
		}
	}
	}
