/*
* RTLOperationTest.java - This file is part of the Jakstab project.
* Copyright 2007-2015 Johannes Kinder <jk@jakstab.org>
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, see <http://www.gnu.org/licenses/>.
*/
package org.jakstab.rtl.expressions;
import static org.junit.Assert.*;
import org.jakstab.rtl.*;
import org.jakstab.util.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* @author Johannes Kinder
*/
public class RTLOperationTest {
@SuppressWarnings("unused")
private static final Logger logger = Logger
.getLogger(RTLOperationTest.class);
private static RTLNumber num1234_32;
private static RTLNumber num7_32;
private static RTLNumber num1_32;
private static RTLNumber num0_32;
private static RTLExpression opAnd;
private static RTLNumber num5_8bit;
private static RTLNumber num5_32bit;
private static RTLNumber neg125_8;
private static RTLVariable var8;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
num1234_32 = ExpressionFactory.createNumber(1234, 32);
num7_32 = ExpressionFactory.createNumber(7, 32);
num1_32 = ExpressionFactory.createNumber(1, 32);
num0_32 = ExpressionFactory.createNumber(0, 32);
num5_8bit = ExpressionFactory.createNumber(5, 8);
num5_32bit = ExpressionFactory.createNumber(5, 32);
opAnd = ExpressionFactory.createAnd(num1234_32, num7_32);
var8 = ExpressionFactory.createVariable("y8", 8);
neg125_8 = ExpressionFactory.createNumber(-125, 8);
}
/**
* @throws java.lang.Exception
*/
@After
public void tearDown() throws Exception {
}
/**
* Test method for {@link org.jakstab.rtl.expressions.RTLOperation#evaluate(org.jakstab.rtl.Context)}.
*/
@Test
public void testEvaluate() throws TypeInferenceException {
Context emptyContext = new Context();
RTLExpression result = opAnd.evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(1234 & 7, 32), result);
RTLExpression opShift = ExpressionFactory.createShiftRight(num1234_32, num1_32);
result = opShift.evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(1234 >> 1, 32), result);
assertEquals(ExpressionFactory.createNumber(1234 + 7 + 1, 32), ExpressionFactory.createPlus(num1234_32, num7_32, num1_32).evaluate(emptyContext));
// removal of 32 bit int changes bitwidth of expression that
// includes a lower bit variable or number
RTLExpression op = ExpressionFactory.createPlus(num0_32, ExpressionFactory.createSignExtend(
ExpressionFactory.createNumber(8, 8), ExpressionFactory.createNumber(31, 8), var8));
Context context = new Context();
context.addAssignment(var8, num5_8bit);
assertEquals(num5_32bit, op.evaluate(context));
// Used to return !true...
op = ExpressionFactory.createEqual(ExpressionFactory.TRUE, ExpressionFactory.FALSE);
result = op.evaluate(context);
assertEquals(ExpressionFactory.FALSE, result);
}
@Test
public void testBitOperations() {
Context emptyContext = new Context();
RTLExpression castedValue = ExpressionFactory.createZeroFill(
ExpressionFactory.createNumber(8),
ExpressionFactory.createNumber(31),
num5_8bit);
RTLExpression result = ExpressionFactory.createOr(num7_32, castedValue).evaluate(emptyContext);
assertEquals(num7_32, result);
}
@Test
public void testZeroFill() {
Context emptyContext = new Context();
RTLNumber m5 = ExpressionFactory.createNumber(-5, 8);
RTLExpression result = ExpressionFactory.createZeroFill(8, 31, m5).evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(0xFB, 32), result);
}
@Test
public void testSignExtend() {
Context emptyContext = new Context();
RTLNumber m5 = ExpressionFactory.createNumber(-5, 8);
RTLExpression result = ExpressionFactory.createSignExtend(8, 31, m5).evaluate(emptyContext);
assertEquals(32, result.getBitWidth());
assertEquals(ExpressionFactory.createNumber(-5, 32), result);
}
@Test
public void testShiftRight() {
Context emptyContext = new Context();
RTLNumber x = ExpressionFactory.createNumber(0xFF0000000L, 32);
RTLExpression result = ExpressionFactory.createShiftRight(x, ExpressionFactory.createNumber(30, 8)).evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(3, 32), result);
}
@Test
public void testMinus() throws TypeInferenceException {
Context emptyContext = new Context();
RTLExpression result = ExpressionFactory.createMinus(num1_32, num7_32).evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(-6, 32), result);
result = ExpressionFactory.createMinus(num1234_32, num5_32bit).evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(1229, 32), result);
result = ExpressionFactory.createMinus(neg125_8, num5_8bit).evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(126, 8), result);
result = ExpressionFactory.createPlus(var8, num5_8bit);
result = ExpressionFactory.createMinus(result, var8).evaluate(emptyContext);
assertEquals(num5_8bit, result);
result = ExpressionFactory.createPlus(ExpressionFactory.createNeg(num5_8bit), var8);
result = ExpressionFactory.createMinus(var8, result).evaluate(emptyContext);
assertEquals(num5_8bit, result);
}
@Test
public void testAdd() throws TypeInferenceException {
Context emptyContext = new Context();
RTLExpression result = ExpressionFactory.createPlus(
ExpressionFactory.createNumber(125, 8),
num5_8bit).evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(-126, 8), result);
result = ExpressionFactory.createPlus(ExpressionFactory.createNumber(120, 8),
ExpressionFactory.createNumber(110, 8),
ExpressionFactory.createNumber(60, 8),
ExpressionFactory.createNumber(95, 8)).evaluate(emptyContext);
assertEquals(ExpressionFactory.createNumber(-127, 8), result);
}
@Test
public void testComparisons() {
Context emptyContext = new Context();
assertEquals(ExpressionFactory.TRUE, ExpressionFactory.createLessThan(num5_32bit, num1234_32).evaluate(emptyContext));
assertEquals(ExpressionFactory.FALSE, ExpressionFactory.createLessThan(num5_8bit, neg125_8).evaluate(emptyContext));
assertEquals(ExpressionFactory.TRUE, ExpressionFactory.createUnsignedLessThan(num5_8bit, neg125_8).evaluate(emptyContext));
assertEquals(ExpressionFactory.TRUE, ExpressionFactory.createUnsignedLessOrEqual(num5_8bit, neg125_8).evaluate(emptyContext));
}
}