/*******************************************************************************
 * 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 LongAssignmentOperatorsTests extends Tests {

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

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

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

	// long += {byte, char, short, int, long, float, double}

	public void testLongPlusAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar += xByteValue;
		IValue value = eval(xVarLong + plusAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar += yByteValue;
		value = eval(xVarLong + plusAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar += xByteValue;
		value = eval(yVarLong + plusAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar += yByteValue;
		value = eval(yVarLong + plusAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongPlusAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar += xCharValue;
		IValue value = eval(xVarLong + plusAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar += yCharValue;
		value = eval(xVarLong + plusAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar += xCharValue;
		value = eval(yVarLong + plusAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar += yCharValue;
		value = eval(yVarLong + plusAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongPlusAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar += xShortValue;
		IValue value = eval(xVarLong + plusAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar += yShortValue;
		value = eval(xVarLong + plusAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar += xShortValue;
		value = eval(yVarLong + plusAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar += yShortValue;
		value = eval(yVarLong + plusAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongPlusAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar += xIntValue;
		IValue value = eval(xVarLong + plusAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar += yIntValue;
		value = eval(xVarLong + plusAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar += xIntValue;
		value = eval(yVarLong + plusAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar += yIntValue;
		value = eval(yVarLong + plusAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongPlusAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar += xLongValue;
		IValue value = eval(xVarLong + plusAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar += yLongValue;
		value = eval(xVarLong + plusAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar += xLongValue;
		value = eval(yVarLong + plusAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar += yLongValue;
		value = eval(yVarLong + plusAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongPlusAssignmentFloat() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar += xFloatValue;
		IValue value = eval(xVarLong + plusAssignmentOp + xFloat);
		String typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment float : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar += yFloatValue;
		value = eval(xVarLong + plusAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar += xFloatValue;
		value = eval(yVarLong + plusAssignmentOp + xFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar += yFloatValue;
		value = eval(yVarLong + plusAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongPlusAssignmentDouble() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar += xDoubleValue;
		IValue value = eval(xVarLong + plusAssignmentOp + xDouble);
		String typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment double : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar += yDoubleValue;
		value = eval(xVarLong + plusAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar += xDoubleValue;
		value = eval(yVarLong + plusAssignmentOp + xDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar += yDoubleValue;
		value = eval(yVarLong + plusAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long plusAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long plusAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long -= {byte, char, short, int, long, float, double}

	public void testLongMinusAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar -= xByteValue;
		IValue value = eval(xVarLong + minusAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar -= yByteValue;
		value = eval(xVarLong + minusAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar -= xByteValue;
		value = eval(yVarLong + minusAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar -= yByteValue;
		value = eval(yVarLong + minusAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMinusAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar -= xCharValue;
		IValue value = eval(xVarLong + minusAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar -= yCharValue;
		value = eval(xVarLong + minusAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar -= xCharValue;
		value = eval(yVarLong + minusAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar -= yCharValue;
		value = eval(yVarLong + minusAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMinusAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar -= xShortValue;
		IValue value = eval(xVarLong + minusAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar -= yShortValue;
		value = eval(xVarLong + minusAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar -= xShortValue;
		value = eval(yVarLong + minusAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar -= yShortValue;
		value = eval(yVarLong + minusAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMinusAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar -= xIntValue;
		IValue value = eval(xVarLong + minusAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar -= yIntValue;
		value = eval(xVarLong + minusAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar -= xIntValue;
		value = eval(yVarLong + minusAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar -= yIntValue;
		value = eval(yVarLong + minusAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMinusAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar -= xLongValue;
		IValue value = eval(xVarLong + minusAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar -= yLongValue;
		value = eval(xVarLong + minusAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar -= xLongValue;
		value = eval(yVarLong + minusAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar -= yLongValue;
		value = eval(yVarLong + minusAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMinusAssignmentFloat() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar -= xFloatValue;
		IValue value = eval(xVarLong + minusAssignmentOp + xFloat);
		String typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment float : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar -= yFloatValue;
		value = eval(xVarLong + minusAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar -= xFloatValue;
		value = eval(yVarLong + minusAssignmentOp + xFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar -= yFloatValue;
		value = eval(yVarLong + minusAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMinusAssignmentDouble() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar -= xDoubleValue;
		IValue value = eval(xVarLong + minusAssignmentOp + xDouble);
		String typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment double : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar -= yDoubleValue;
		value = eval(xVarLong + minusAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar -= xDoubleValue;
		value = eval(yVarLong + minusAssignmentOp + xDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar -= yDoubleValue;
		value = eval(yVarLong + minusAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long minusAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long minusAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long *= {byte, char, short, int, long, float, double}

	public void testLongMultiplyAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar *= xByteValue;
		IValue value = eval(xVarLong + multiplyAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar *= yByteValue;
		value = eval(xVarLong + multiplyAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar *= xByteValue;
		value = eval(yVarLong + multiplyAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar *= yByteValue;
		value = eval(yVarLong + multiplyAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMultiplyAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar *= xCharValue;
		IValue value = eval(xVarLong + multiplyAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar *= yCharValue;
		value = eval(xVarLong + multiplyAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar *= xCharValue;
		value = eval(yVarLong + multiplyAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar *= yCharValue;
		value = eval(yVarLong + multiplyAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMultiplyAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar *= xShortValue;
		IValue value = eval(xVarLong + multiplyAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar *= yShortValue;
		value = eval(xVarLong + multiplyAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar *= xShortValue;
		value = eval(yVarLong + multiplyAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar *= yShortValue;
		value = eval(yVarLong + multiplyAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMultiplyAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar *= xIntValue;
		IValue value = eval(xVarLong + multiplyAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar *= yIntValue;
		value = eval(xVarLong + multiplyAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar *= xIntValue;
		value = eval(yVarLong + multiplyAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar *= yIntValue;
		value = eval(yVarLong + multiplyAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMultiplyAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar *= xLongValue;
		IValue value = eval(xVarLong + multiplyAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar *= yLongValue;
		value = eval(xVarLong + multiplyAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar *= xLongValue;
		value = eval(yVarLong + multiplyAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar *= yLongValue;
		value = eval(yVarLong + multiplyAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMultiplyAssignmentFloat() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar *= xFloatValue;
		IValue value = eval(xVarLong + multiplyAssignmentOp + xFloat);
		String typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment float : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar *= yFloatValue;
		value = eval(xVarLong + multiplyAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar *= xFloatValue;
		value = eval(yVarLong + multiplyAssignmentOp + xFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar *= yFloatValue;
		value = eval(yVarLong + multiplyAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongMultiplyAssignmentDouble() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar *= xDoubleValue;
		IValue value = eval(xVarLong + multiplyAssignmentOp + xDouble);
		String typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment double : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar *= yDoubleValue;
		value = eval(xVarLong + multiplyAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar *= xDoubleValue;
		value = eval(yVarLong + multiplyAssignmentOp + xDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar *= yDoubleValue;
		value = eval(yVarLong + multiplyAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long multiplyAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long multiplyAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long /= {byte, char, short, int, long, float, double}

	public void testLongDivideAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar /= xByteValue;
		IValue value = eval(xVarLong + divideAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar /= yByteValue;
		value = eval(xVarLong + divideAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar /= xByteValue;
		value = eval(yVarLong + divideAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar /= yByteValue;
		value = eval(yVarLong + divideAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongDivideAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar /= xCharValue;
		IValue value = eval(xVarLong + divideAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar /= yCharValue;
		value = eval(xVarLong + divideAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar /= xCharValue;
		value = eval(yVarLong + divideAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar /= yCharValue;
		value = eval(yVarLong + divideAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongDivideAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar /= xShortValue;
		IValue value = eval(xVarLong + divideAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar /= yShortValue;
		value = eval(xVarLong + divideAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar /= xShortValue;
		value = eval(yVarLong + divideAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar /= yShortValue;
		value = eval(yVarLong + divideAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongDivideAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar /= xIntValue;
		IValue value = eval(xVarLong + divideAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar /= yIntValue;
		value = eval(xVarLong + divideAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar /= xIntValue;
		value = eval(yVarLong + divideAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar /= yIntValue;
		value = eval(yVarLong + divideAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongDivideAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar /= xLongValue;
		IValue value = eval(xVarLong + divideAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar /= yLongValue;
		value = eval(xVarLong + divideAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar /= xLongValue;
		value = eval(yVarLong + divideAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar /= yLongValue;
		value = eval(yVarLong + divideAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongDivideAssignmentFloat() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar /= xFloatValue;
		IValue value = eval(xVarLong + divideAssignmentOp + xFloat);
		String typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment float : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar /= yFloatValue;
		value = eval(xVarLong + divideAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar /= xFloatValue;
		value = eval(yVarLong + divideAssignmentOp + xFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar /= yFloatValue;
		value = eval(yVarLong + divideAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongDivideAssignmentDouble() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar /= xDoubleValue;
		IValue value = eval(xVarLong + divideAssignmentOp + xDouble);
		String typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment double : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar /= yDoubleValue;
		value = eval(xVarLong + divideAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar /= xDoubleValue;
		value = eval(yVarLong + divideAssignmentOp + xDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar /= yDoubleValue;
		value = eval(yVarLong + divideAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long divideAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long divideAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long %= {byte, char, short, int, long, float, double}

	public void testLongRemainderAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar %= xByteValue;
		IValue value = eval(xVarLong + remainderAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar %= yByteValue;
		value = eval(xVarLong + remainderAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar %= xByteValue;
		value = eval(yVarLong + remainderAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar %= yByteValue;
		value = eval(yVarLong + remainderAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRemainderAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar %= xCharValue;
		IValue value = eval(xVarLong + remainderAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar %= yCharValue;
		value = eval(xVarLong + remainderAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar %= xCharValue;
		value = eval(yVarLong + remainderAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar %= yCharValue;
		value = eval(yVarLong + remainderAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRemainderAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar %= xShortValue;
		IValue value = eval(xVarLong + remainderAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar %= yShortValue;
		value = eval(xVarLong + remainderAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar %= xShortValue;
		value = eval(yVarLong + remainderAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar %= yShortValue;
		value = eval(yVarLong + remainderAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRemainderAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar %= xIntValue;
		IValue value = eval(xVarLong + remainderAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar %= yIntValue;
		value = eval(xVarLong + remainderAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar %= xIntValue;
		value = eval(yVarLong + remainderAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar %= yIntValue;
		value = eval(yVarLong + remainderAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRemainderAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar %= xLongValue;
		IValue value = eval(xVarLong + remainderAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar %= yLongValue;
		value = eval(xVarLong + remainderAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar %= xLongValue;
		value = eval(yVarLong + remainderAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar %= yLongValue;
		value = eval(yVarLong + remainderAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRemainderAssignmentFloat() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar %= xFloatValue;
		IValue value = eval(xVarLong + remainderAssignmentOp + xFloat);
		String typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment float : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar %= yFloatValue;
		value = eval(xVarLong + remainderAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment float : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar %= xFloatValue;
		value = eval(yVarLong + remainderAssignmentOp + xFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar %= yFloatValue;
		value = eval(yVarLong + remainderAssignmentOp + yFloat);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment float : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment float : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRemainderAssignmentDouble() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar %= xDoubleValue;
		IValue value = eval(xVarLong + remainderAssignmentOp + xDouble);
		String typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment double : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar %= yDoubleValue;
		value = eval(xVarLong + remainderAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment double : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar %= xDoubleValue;
		value = eval(yVarLong + remainderAssignmentOp + xDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar %= yDoubleValue;
		value = eval(yVarLong + remainderAssignmentOp + yDouble);
		typeName = value.getReferenceTypeName();
		assertEquals("long remainderAssignment double : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long remainderAssignment double : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long <<= {byte, char, short, int, long, float, double}

	public void testLongLeftShiftAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar <<= xByteValue;
		IValue value = eval(xVarLong + leftShiftAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar <<= yByteValue;
		value = eval(xVarLong + leftShiftAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar <<= xByteValue;
		value = eval(yVarLong + leftShiftAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar <<= yByteValue;
		value = eval(yVarLong + leftShiftAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongLeftShiftAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar <<= xCharValue;
		IValue value = eval(xVarLong + leftShiftAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar <<= yCharValue;
		value = eval(xVarLong + leftShiftAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar <<= xCharValue;
		value = eval(yVarLong + leftShiftAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar <<= yCharValue;
		value = eval(yVarLong + leftShiftAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongLeftShiftAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar <<= xShortValue;
		IValue value = eval(xVarLong + leftShiftAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar <<= yShortValue;
		value = eval(xVarLong + leftShiftAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar <<= xShortValue;
		value = eval(yVarLong + leftShiftAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar <<= yShortValue;
		value = eval(yVarLong + leftShiftAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongLeftShiftAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar <<= xIntValue;
		IValue value = eval(xVarLong + leftShiftAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar <<= yIntValue;
		value = eval(xVarLong + leftShiftAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar <<= xIntValue;
		value = eval(yVarLong + leftShiftAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar <<= yIntValue;
		value = eval(yVarLong + leftShiftAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongLeftShiftAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar <<= xLongValue;
		IValue value = eval(xVarLong + leftShiftAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar <<= yLongValue;
		value = eval(xVarLong + leftShiftAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar <<= xLongValue;
		value = eval(yVarLong + leftShiftAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar <<= yLongValue;
		value = eval(yVarLong + leftShiftAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long leftShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long leftShiftAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long >>= {byte, char, short, int, long, float, double}

	public void testLongRightShiftAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>= xByteValue;
		IValue value = eval(xVarLong + rightShiftAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>= yByteValue;
		value = eval(xVarLong + rightShiftAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>= xByteValue;
		value = eval(yVarLong + rightShiftAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>= yByteValue;
		value = eval(yVarLong + rightShiftAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRightShiftAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>= xCharValue;
		IValue value = eval(xVarLong + rightShiftAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>= yCharValue;
		value = eval(xVarLong + rightShiftAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>= xCharValue;
		value = eval(yVarLong + rightShiftAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>= yCharValue;
		value = eval(yVarLong + rightShiftAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRightShiftAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>= xShortValue;
		IValue value = eval(xVarLong + rightShiftAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>= yShortValue;
		value = eval(xVarLong + rightShiftAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>= xShortValue;
		value = eval(yVarLong + rightShiftAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>= yShortValue;
		value = eval(yVarLong + rightShiftAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRightShiftAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>= xIntValue;
		IValue value = eval(xVarLong + rightShiftAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>= yIntValue;
		value = eval(xVarLong + rightShiftAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>= xIntValue;
		value = eval(yVarLong + rightShiftAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>= yIntValue;
		value = eval(yVarLong + rightShiftAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongRightShiftAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>= xLongValue;
		IValue value = eval(xVarLong + rightShiftAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>= yLongValue;
		value = eval(xVarLong + rightShiftAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>= xLongValue;
		value = eval(yVarLong + rightShiftAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>= yLongValue;
		value = eval(yVarLong + rightShiftAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long rightShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long rightShiftAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long >>>= {byte, char, short, int, long, float, double}

	public void testLongUnsignedRightShiftAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>>= xByteValue;
		IValue value = eval(xVarLong + unsignedRightShiftAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>>= yByteValue;
		value = eval(xVarLong + unsignedRightShiftAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>>= xByteValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>>= yByteValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongUnsignedRightShiftAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>>= xCharValue;
		IValue value = eval(xVarLong + unsignedRightShiftAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>>= yCharValue;
		value = eval(xVarLong + unsignedRightShiftAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>>= xCharValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>>= yCharValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongUnsignedRightShiftAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>>= xShortValue;
		IValue value = eval(xVarLong + unsignedRightShiftAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>>= yShortValue;
		value = eval(xVarLong + unsignedRightShiftAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>>= xShortValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>>= yShortValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongUnsignedRightShiftAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>>= xIntValue;
		IValue value = eval(xVarLong + unsignedRightShiftAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>>= yIntValue;
		value = eval(xVarLong + unsignedRightShiftAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>>= xIntValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>>= yIntValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongUnsignedRightShiftAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar >>>= xLongValue;
		IValue value = eval(xVarLong + unsignedRightShiftAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar >>>= yLongValue;
		value = eval(xVarLong + unsignedRightShiftAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar >>>= xLongValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar >>>= yLongValue;
		value = eval(yVarLong + unsignedRightShiftAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long unsignedRightShiftAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long unsignedRightShiftAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long |= {byte, char, short, int, long, float, double}

	public void testLongOrAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar |= xByteValue;
		IValue value = eval(xVarLong + orAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar |= yByteValue;
		value = eval(xVarLong + orAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar |= xByteValue;
		value = eval(yVarLong + orAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar |= yByteValue;
		value = eval(yVarLong + orAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongOrAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar |= xCharValue;
		IValue value = eval(xVarLong + orAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar |= yCharValue;
		value = eval(xVarLong + orAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar |= xCharValue;
		value = eval(yVarLong + orAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar |= yCharValue;
		value = eval(yVarLong + orAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongOrAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar |= xShortValue;
		IValue value = eval(xVarLong + orAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar |= yShortValue;
		value = eval(xVarLong + orAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar |= xShortValue;
		value = eval(yVarLong + orAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar |= yShortValue;
		value = eval(yVarLong + orAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongOrAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar |= xIntValue;
		IValue value = eval(xVarLong + orAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar |= yIntValue;
		value = eval(xVarLong + orAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar |= xIntValue;
		value = eval(yVarLong + orAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar |= yIntValue;
		value = eval(yVarLong + orAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongOrAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar |= xLongValue;
		IValue value = eval(xVarLong + orAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar |= yLongValue;
		value = eval(xVarLong + orAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar |= xLongValue;
		value = eval(yVarLong + orAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar |= yLongValue;
		value = eval(yVarLong + orAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long orAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long orAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long &= {byte, char, short, int, long, float, double}

	public void testLongAndAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar &= xByteValue;
		IValue value = eval(xVarLong + andAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar &= yByteValue;
		value = eval(xVarLong + andAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar &= xByteValue;
		value = eval(yVarLong + andAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar &= yByteValue;
		value = eval(yVarLong + andAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongAndAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar &= xCharValue;
		IValue value = eval(xVarLong + andAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar &= yCharValue;
		value = eval(xVarLong + andAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar &= xCharValue;
		value = eval(yVarLong + andAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar &= yCharValue;
		value = eval(yVarLong + andAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongAndAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar &= xShortValue;
		IValue value = eval(xVarLong + andAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar &= yShortValue;
		value = eval(xVarLong + andAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar &= xShortValue;
		value = eval(yVarLong + andAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar &= yShortValue;
		value = eval(yVarLong + andAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongAndAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar &= xIntValue;
		IValue value = eval(xVarLong + andAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar &= yIntValue;
		value = eval(xVarLong + andAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar &= xIntValue;
		value = eval(yVarLong + andAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar &= yIntValue;
		value = eval(yVarLong + andAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongAndAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar &= xLongValue;
		IValue value = eval(xVarLong + andAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar &= yLongValue;
		value = eval(xVarLong + andAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar &= xLongValue;
		value = eval(yVarLong + andAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar &= yLongValue;
		value = eval(yVarLong + andAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long andAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long andAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	// long ^= {byte, char, short, int, long, float, double}

	public void testLongXorAssignmentByte() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar ^= xByteValue;
		IValue value = eval(xVarLong + xorAssignmentOp + xByte);
		String typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment byte : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar ^= yByteValue;
		value = eval(xVarLong + xorAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment byte : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar ^= xByteValue;
		value = eval(yVarLong + xorAssignmentOp + xByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar ^= yByteValue;
		value = eval(yVarLong + xorAssignmentOp + yByte);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment byte : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment byte : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongXorAssignmentChar() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar ^= xCharValue;
		IValue value = eval(xVarLong + xorAssignmentOp + xChar);
		String typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment char : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar ^= yCharValue;
		value = eval(xVarLong + xorAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment char : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar ^= xCharValue;
		value = eval(yVarLong + xorAssignmentOp + xChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar ^= yCharValue;
		value = eval(yVarLong + xorAssignmentOp + yChar);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment char : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment char : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongXorAssignmentShort() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar ^= xShortValue;
		IValue value = eval(xVarLong + xorAssignmentOp + xShort);
		String typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment short : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar ^= yShortValue;
		value = eval(xVarLong + xorAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment short : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar ^= xShortValue;
		value = eval(yVarLong + xorAssignmentOp + xShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar ^= yShortValue;
		value = eval(yVarLong + xorAssignmentOp + yShort);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment short : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment short : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongXorAssignmentInt() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar ^= xIntValue;
		IValue value = eval(xVarLong + xorAssignmentOp + xInt);
		String typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment int : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar ^= yIntValue;
		value = eval(xVarLong + xorAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment int : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar ^= xIntValue;
		value = eval(yVarLong + xorAssignmentOp + xInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar ^= yIntValue;
		value = eval(yVarLong + xorAssignmentOp + yInt);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment int : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment int : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}

	public void testLongXorAssignmentLong() throws Throwable {
		try {
		init();
		long tmpxVar = xVarLongValue;
		tmpxVar ^= xLongValue;
		IValue value = eval(xVarLong + xorAssignmentOp + xLong);
		String typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment long : wrong type : ", "long", typeName);
		long longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		tmpxVar ^= yLongValue;
		value = eval(xVarLong + xorAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment long : wrong result : ", tmpxVar, longValue);
		value = eval(xVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpxVar, longValue);

		long tmpyVar = yVarLongValue;
		tmpyVar ^= xLongValue;
		value = eval(yVarLong + xorAssignmentOp + xLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);

		tmpyVar ^= yLongValue;
		value = eval(yVarLong + xorAssignmentOp + yLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long xorAssignment long : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long xorAssignment long : wrong result : ", tmpyVar, longValue);
		value = eval(yVarLong);
		typeName = value.getReferenceTypeName();
		assertEquals("long local variable value : wrong type : ", "long", typeName);
		longValue = ((IJavaPrimitiveValue)value).getLongValue();
		assertEquals("long local variable value : wrong result : ", tmpyVar, longValue);
		} finally {
		end();
		}
	}


}
