/* * ExpressionSimplifierTest.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.junit.Before; import org.junit.Test; public class ExpressionSimplifierTest { private ExpressionSimplifier simplifier; RTLVariable eax; RTLVariable ebx; RTLExpression five; RTLExpression eaxPlusEbx; @Before public void setUp() throws Exception { simplifier = ExpressionSimplifier.getInstance(); eax = ExpressionFactory.createVariable("eax", 32); ebx = ExpressionFactory.createVariable("ebx", 32); five = ExpressionFactory.createNumber(5, 32); eaxPlusEbx = ExpressionFactory.createPlus(eax, ebx); } @Test public void doNotModifySingleVariable() { assertEquals(eax, simplifier.simplify(eax)); } @Test public void substitute() { RTLExpression e = ExpressionFactory.createOr(ExpressionFactory.createLessThan(eax, five), ExpressionFactory.createEqual(eax, five)); assertEquals(ExpressionFactory.createLessOrEqual(eax, five), simplifier.simplify(e)); e = ExpressionFactory.createOr(ExpressionFactory.createLessThan(eax, eaxPlusEbx), ExpressionFactory.createEqual(eax, eaxPlusEbx)); assertEquals(ExpressionFactory.createLessOrEqual(eax, eaxPlusEbx), simplifier.simplify(e)); } @Test public void innerSubstitute() { RTLExpression e1 = ExpressionFactory.createOr(ExpressionFactory.createLessThan(eax, five), ExpressionFactory.createEqual(eax, five)); RTLExpression e2 = ExpressionFactory.createOr(ExpressionFactory.createLessThan(eax, eaxPlusEbx), ExpressionFactory.createEqual(eax, eaxPlusEbx)); RTLExpression e = ExpressionFactory.createAnd(e1, e2); assertEquals(ExpressionFactory.createAnd( ExpressionFactory.createLessOrEqual(eax, five), ExpressionFactory.createLessOrEqual(eax, eaxPlusEbx)), simplifier.simplify(e)); } @Test public void complexSubstitute() { RTLExpression fiftyEight = ExpressionFactory.createNumber(58, 32); RTLExpression eaxMinus58 = ExpressionFactory.createMinus(eax, fiftyEight); RTLExpression num0 = ExpressionFactory.createNumber(0, 32); RTLExpression e = ExpressionFactory.createAnd( ExpressionFactory.createEqual( ExpressionFactory.createLessThan(eaxMinus58, num0), ExpressionFactory.createAnd( ExpressionFactory.createLessThan(num0, eaxMinus58), ExpressionFactory.createLessThan(eax, num0) )), ExpressionFactory.createNotEqual(eax, fiftyEight)); System.out.println("Expression to simplify: " + e); RTLExpression result = simplifier.simplify(e); assertNotSame(result, e); assertEquals(ExpressionFactory.createLessThan(fiftyEight, eax), result); } @Test public void bitwidths() { RTLExpression e = ExpressionFactory.createOr(ExpressionFactory.createLessThan(eax, five), ExpressionFactory.createEqual(eax, five)); assertEquals(1, simplifier.simplify(e).getBitWidth()); e = ExpressionFactory.createOr(eax, eax); assertEquals(eax.getBitWidth(), simplifier.simplify(e).getBitWidth()); } }