@Test
 public void shouldDuplicateResultOnStackWhenSimpleExpressionResultIsToBeDuplicatedOnStack() {
   SimpleExpression simpleExpression = mock(SimpleExpression.class);
   when(simpleExpression.isResultDuplicatedOnStack()).thenReturn(true);
   when(simpleExpression.isResultLeftOnStack()).thenReturn(false);
   analyser.visitEnd(simpleExpression);
   verify(writer).pushDuplicate();
 }
 @Test
 public void shouldPopResultFromStackWhenSimpleExpressionResultIsNotToBeLeftOnStack() {
   SimpleExpression simpleExpression = mock(SimpleExpression.class);
   when(simpleExpression.isResultLeftOnStack()).thenReturn(false);
   when(simpleExpression.isResultDuplicatedOnStack()).thenReturn(false);
   analyser.visitEnd(simpleExpression);
   verify(writer).pop();
 }
	public String ToString()
	{
		StringBuilder str = new StringBuilder();

		str.append('(');
		str.append(e1.toString());
		str.append(' ');

		switch (op)
		{
		case AND:
			str.append("&&");
			break;
		case OR:
			str.append("||");
			break;

		case EQBOOL:
			str.append("==");
			break;
		case LT:
			str.append('<');
			break;
		case GT:
			str.append('>');
			break;
		case LEQ:
			str.append("<=");
			break;
		case GEQ:
			str.append(">=");
			break;

		case PLUS:
			str.append('+');
			break;
		case MINUS:
			str.append('-');
			break;
		case TIMES:
			str.append('*');
			break;
		case DIV:
			str.append('/');
			break;

		default:
			return "";
		}

		str.append(' ');
		str.append(e2.toString());
		str.append(')');

		return str.toString();
	}
	public ObjectType getExpressionType()
	{
		ObjectType e1Type = e1.getExpressionType(), e2Type = e2.getExpressionType();

		switch (op)
		{
		case EQBOOL:
			if (e1Type.equals(e2Type))
			{
				return ObjectType.booleanType;
			}
			break;

		case AND:
		case OR:
			if (e1Type.equals(ObjectType.booleanType)
			&& e2Type.equals(ObjectType.booleanType))
			{
				return ObjectType.booleanType;
			}
			break;

		case LT:
		case GT:
		case LEQ:
		case GEQ:
			if (e1Type.equals(ObjectType.intType)
			&& e2Type.equals(ObjectType.intType))
			{
				return ObjectType.booleanType;
			}
			break;

		case PLUS:
			if (e1Type.equals(ObjectType.stringType)
			|| e2Type.equals(ObjectType.stringType))
			{
				return ObjectType.stringType;
			}
			else if (e1Type.equals(ObjectType.intType)
					&& e2Type.equals(ObjectType.intType))
			{
				return ObjectType.intType;
			}

			//erreur
			break;
			//return ObjectType.intType;

		case MINUS:
		case TIMES:
		case DIV:
			if (e1Type.equals(ObjectType.intType)
			&& e2Type.equals(ObjectType.intType))
			{
				return ObjectType.intType;
			}

			//erreur
			break;
			//return ObjectType.intType;

		default:
			return ObjectType.undefinedType;

		}

		return ObjectType.undefinedType;

	}