All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.evosuite.symbolic.vm.ConstraintNormalizer Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2010-2018 Gordon Fraser, Andrea Arcuri and EvoSuite
 * contributors
 *
 * This file is part of EvoSuite.
 *
 * EvoSuite is free software: you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3.0 of the License, or
 * (at your option) any later version.
 *
 * EvoSuite 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
 * Lesser Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with EvoSuite. If not, see .
 */
package org.evosuite.symbolic.vm;

import org.evosuite.symbolic.expr.Comparator;
import org.evosuite.symbolic.expr.Constraint;
import org.evosuite.symbolic.expr.Expression;
import org.evosuite.symbolic.expr.IntegerConstraint;
import org.evosuite.symbolic.expr.RealConstraint;
import org.evosuite.symbolic.expr.StringConstraint;
import org.evosuite.symbolic.expr.bv.IntegerComparison;
import org.evosuite.symbolic.expr.bv.IntegerConstant;
import org.evosuite.symbolic.expr.bv.RealComparison;
import org.evosuite.symbolic.expr.bv.StringComparison;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Transforms an IntegerConstraint into its corresponding StringConstriant,
 * RealConstraint or IntegerConstraint
 * 
 * @author galeotti
 * 
 */
public final class ConstraintNormalizer {

	static Logger log = LoggerFactory.getLogger(ConstraintNormalizer.class);

	/**
	 * Transforms an IntegerConstraint into a corresponding StringConstraint,
	 * RealConstraint or IntegerConstraint.
	 * 
	 * @param c
	 *            a constraint to be normalized
	 * @return
	 */
	public static Constraint normalize(IntegerConstraint c) {

		Expression left = c.getLeftOperand();
		Expression right = c.getRightOperand();
		if (left instanceof StringComparison
				|| right instanceof StringComparison) {
			return createStringConstraint(c);
		} else if (left instanceof RealComparison
				|| right instanceof RealComparison) {
			return createRealConstraint(c);
		} else if (left instanceof IntegerComparison
				|| right instanceof IntegerComparison) {
			return normalizeIntegerConstriant(c);
		}
		// return without normalization
		log.debug("Un-normalized constraint: " + c);
		return c;
	}

	private static Constraint createStringConstraint(IntegerConstraint c) {

		if (c.getLeftOperand() instanceof StringComparison) {
			StringComparison string_comparison = (StringComparison) c
					.getLeftOperand();
			@SuppressWarnings("unchecked")
			Expression number_expr = (Expression) c
					.getRightOperand();
			IntegerConstant constant = new IntegerConstant(
					number_expr.getConcreteValue());
			return new StringConstraint(string_comparison, c.getComparator(),
					constant);
		} else {
			assert c.getRightOperand() instanceof StringComparison;
			StringComparison string_comparison = (StringComparison) c
					.getRightOperand();
			@SuppressWarnings("unchecked")
			Expression number_expr = (Expression) c
					.getLeftOperand();
			IntegerConstant constant = new IntegerConstant(
					number_expr.getConcreteValue());
			return new StringConstraint(string_comparison, c.getComparator(),
					constant);
		}
	}

	private static Constraint createRealConstraint(IntegerConstraint c) {

		if (c.getLeftOperand() instanceof RealComparison) {

			RealComparison cmp = (RealComparison) c.getLeftOperand();
			int value = ((Number) c.getRightOperand().getConcreteValue())
					.intValue();
			Comparator op = c.getComparator();

			Expression cmp_left = cmp.getLeftOperant();
			Expression cmp_right = cmp.getRightOperant();
			return createRealConstraint(cmp_left, op, cmp_right, value);

		} else {

			assert (c.getRightOperand() instanceof RealComparison);
			RealComparison cmp = (RealComparison) c.getRightOperand();

			Comparator op = c.getComparator();
			Comparator swap_op = op.swap();
			int value = ((Number) c.getLeftOperand().getConcreteValue())
					.intValue();
			int swap_value = -value;
			Expression cmp_left = cmp.getLeftOperant();
			Expression cmp_right = cmp.getRightOperant();

			return createRealConstraint(cmp_left, swap_op, cmp_right,
					swap_value);

		}

	}

	private static RealConstraint createRealConstraint(
			Expression cmp_left, Comparator op,
			Expression cmp_right, int value) {
		switch (op) {
		case EQ:
			if (value < 0) {
				return (new RealConstraint(cmp_left, Comparator.LT, cmp_right));
			} else if (value == 0) {
				return (new RealConstraint(cmp_left, Comparator.EQ, cmp_right));
			} else {
				return (new RealConstraint(cmp_left, Comparator.GT, cmp_right));
			}
		case NE:
			if (value < 0) {
				return (new RealConstraint(cmp_left, Comparator.GE, cmp_right));
			} else if (value == 0) {
				return (new RealConstraint(cmp_left, Comparator.NE, cmp_right));
			} else {
				return (new RealConstraint(cmp_left, Comparator.LE, cmp_right));
			}
		case LE:
			if (value < 0) {
				return (new RealConstraint(cmp_left, Comparator.LT, cmp_right));
			} else if (value == 0) {
				return (new RealConstraint(cmp_left, Comparator.LE, cmp_right));
			} else {
				throw new RuntimeException("Unexpected Constraint");
			}
		case LT:
			if (value < 0) {
				throw new RuntimeException("Unexpected Constraint");
			} else if (value == 0) {
				return (new RealConstraint(cmp_left, Comparator.LT, cmp_right));
			} else {
				return (new RealConstraint(cmp_left, Comparator.LE, cmp_right));
			}
		case GE:
			if (value < 0) {
				throw new RuntimeException("Unexpected Constraint");
			} else if (value == 0) {
				return (new RealConstraint(cmp_left, Comparator.GE, cmp_right));
			} else {
				return (new RealConstraint(cmp_left, Comparator.GT, cmp_right));
			}
		case GT:
			if (value < 0) {
				return (new RealConstraint(cmp_left, Comparator.GE, cmp_right));
			} else if (value == 0) {
				return (new RealConstraint(cmp_left, Comparator.GT, cmp_right));
			} else {
				throw new RuntimeException("Unexpected Constraint");
			}
		default:
			throw new IllegalArgumentException("Unknown operator : " + op);
		}
	}

	private static Constraint normalizeIntegerConstriant(IntegerConstraint c) {

		if (c.getLeftOperand() instanceof IntegerComparison) {
			IntegerComparison cmp = (IntegerComparison) c.getLeftOperand();
			int value = ((Number) c.getRightOperand().getConcreteValue())
					.intValue();
			Comparator op = c.getComparator();
			Expression cmp_left = cmp.getLeftOperant();
			Expression cmp_right = cmp.getRightOperant();
			return createIntegerConstraint(cmp_left, op, cmp_right, value);

		} else {
			assert (c.getRightOperand() instanceof IntegerComparison);

			IntegerComparison cmp = (IntegerComparison) c.getRightOperand();
			int value = ((Number) c.getLeftOperand().getConcreteValue())
					.intValue();
			Comparator op = c.getComparator();
			Expression cmp_left = cmp.getLeftOperant();
			Expression cmp_right = cmp.getRightOperant();
			Comparator swap_op = op.swap();
			int swap_value = -value;
			return createIntegerConstraint(cmp_left, swap_op, cmp_right,
					swap_value);

		}
	}

	private static IntegerConstraint createIntegerConstraint(
			Expression cmp_left, Comparator op,
			Expression cmp_right, int value) {
		switch (op) {
		case EQ:
			if (value < 0) {
				return (new IntegerConstraint(cmp_left, Comparator.LT,
						cmp_right));
			} else if (value == 0) {
				return (new IntegerConstraint(cmp_left, Comparator.EQ,
						cmp_right));
			} else {
				return (new IntegerConstraint(cmp_left, Comparator.GT,
						cmp_right));
			}
		case NE:
			if (value < 0) {
				return (new IntegerConstraint(cmp_left, Comparator.GE,
						cmp_right));
			} else if (value == 0) {
				return (new IntegerConstraint(cmp_left, Comparator.NE,
						cmp_right));
			} else {
				return (new IntegerConstraint(cmp_left, Comparator.LE,
						cmp_right));
			}
		case LE:
			if (value < 0) {
				return (new IntegerConstraint(cmp_left, Comparator.LT,
						cmp_right));
			} else if (value == 0) {
				return (new IntegerConstraint(cmp_left, Comparator.LE,
						cmp_right));
			} else {
				throw new RuntimeException("Unexpected Constraint");
			}
		case LT:
			if (value < 0) {
				throw new RuntimeException("Unexpected Constraint");
			} else if (value == 0) {
				return (new IntegerConstraint(cmp_left, Comparator.LT,
						cmp_right));
			} else {
				return (new IntegerConstraint(cmp_left, Comparator.LE,
						cmp_right));
			}
		case GE:
			if (value < 0) {
				throw new RuntimeException("Unexpected Constraint");
			} else if (value == 0) {
				return (new IntegerConstraint(cmp_left, Comparator.GE,
						cmp_right));
			} else {
				return (new IntegerConstraint(cmp_left, Comparator.GT,
						cmp_right));
			}
		case GT:
			if (value < 0) {
				return (new IntegerConstraint(cmp_left, Comparator.GE,
						cmp_right));
			} else if (value == 0) {
				return (new IntegerConstraint(cmp_left, Comparator.GT,
						cmp_right));
			} else {
				throw new RuntimeException("Unexpected Constraint");
			}
		default:
			throw new IllegalStateException("Unknown operator " + op);
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy