/*******************************************************************************
 * Copyright (c) 2015, 2017 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;

public class TestsBreakpointConditions extends Tests {

	public TestsBreakpointConditions(String name) {
		super(name);
	}

	public void init() throws Exception {
		initializeFrame("EvalSimpleTests", 37, 1, 1);
	}

	protected void end() throws Exception {
		destroyFrame();
	}

	public void testCondition1() throws Throwable {
		try {
			init();
			IValue value = eval("System.out.println(\"test\");true");
			System.out.println(value);

		}
		finally {
			end();
		}

	}

	public void testCondition2() throws Throwable {
		try {
			init();
			IValue value = eval("System.out.println(\"test\"); (1==1)");
			System.out.println(value);

		} finally {
			end();
		}

	}

	public void testCondition3() throws Throwable {
		try {
			init();
			IValue value = eval("System.out.println(\"test\");return true");
			System.out.println(value);

		}
		finally {
			end();
		}

	}
	/*
	 * To test throw as a last statement
	 */
	public void testCondition4() throws Throwable {
		try {
			init();
			IValue value = eval("System.out.println(\"test\");throw new Exception(\"test\")");
			System.out.println(value);

		}
		finally {
			end();
		}

	}

	/*
	 * To test xVarInt < (xVarInt + 100)
	 */
	public void testCondition5() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt < (xVarInt + 100)");
			System.out.println(value);

		}
		finally {
			end();
		}

	}
	/*
	 * To test xVarInt < 100
	 */
	public void testCondition6() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt < 100");
			System.out.println(value);

		}
		finally {
			end();
		}

	}

	/*
	 * To test xVarInt > 100
	 */
	public void testCondition7() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt > -7");
			System.out.println(value);

		}
		finally {
			end();
		}

	}

	/*
	 * To test xVarInt == 100
	 */
	public void testCondition8() throws Throwable {
		try {
			init();
			IValue value = eval("xVarInt == -7");
			System.out.println(value);

		}
		finally {
			end();
		}

	}

	/*
	 * To test return xVarInt < 100
	 */
	public void testCondition9() throws Throwable {
		try {
			init();
			IValue value = eval("return xVarInt < 100");
			System.out.println(value);

		}
		finally {
			end();
		}

	}

	/*
	 * To test return xVarInt > 100
	 */
	public void testCondition10() throws Throwable {
		try {
			init();
			IValue value = eval("return xVarInt > -7");
			System.out.println(value);

		}
		finally {
			end();
		}

	}

	/*
	 * To test if as last statement
	 */
	public void testCondition11() throws Throwable {
		try {
			init();
			IValue value = eval("if (xVarInt > 3) { System.out.println(\"test if\");} ");
			System.out.println(value);

		}
		finally {
			end();
		}

	}

	/*
	 * To test while as last statement
	 */
	public void testCondition12() throws Throwable {
		try {
			init();
			IValue value = eval("while (xVarInt < 3) { System.out.println(\"test while\");xVarInt++; } ");
			System.out.println(value);

		}
		finally {
			end();
		}

	}
}
