// Modified or written by Object Mentor, Inc. for inclusion with FitNesse.
// Copyright (c) 2002 Cunningham & Cunningham, Inc.
// Released under the terms of the GNU General Public License version 2 or later.
package fit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import fit.exception.FitMatcherException;
class FitMatcher {
private String expression;
private Object parameter;
public FitMatcher(String expression, Object parameter) {
this.expression = expression;
this.parameter = parameter;
}
public boolean matches() throws Exception {
Pattern p = Pattern.compile("\\s*_?\\s*(<|>|<=|>=)\\s*([-+]?[\\d]*\\.?[\\d]+)");
Matcher m = p.matcher(expression);
if (m.matches()) {
String op = m.group(1);
String operandString = m.group(2);
double operand = Double.parseDouble(operandString);
double n = ((Number) parameter).doubleValue();
if (op.equals("<")) return (n < operand);
if (op.equals(">")) return (n > operand);
if (op.equals("<=")) return (n <= operand);
if (op.equals(">=")) return (n >= operand);
return false;
}
p = Pattern.compile("\\s*([-+]?[\\d]*\\.?[\\d]+)\\s*(<|>|<=|>=)\\s*_\\s*(<|>|<=|>=)\\s*([-+]?[\\d]*\\.?[\\d]+)");
m = p.matcher(expression);
if (m.matches()) {
double a = Double.parseDouble(m.group(1));
String aop = m.group(2);
String bop = m.group(3);
double b = Double.parseDouble(m.group(4));
double n = ((Number) parameter).doubleValue();
boolean an = false;
if (aop.equals("<")) an = a < n;
if (aop.equals("<=")) an = a <= n;
if (aop.equals(">")) an = a > n;
if (aop.equals(">=")) an = a >= n;
boolean nb = false;
if (bop.equals("<")) nb = n < b;
if (bop.equals("<=")) nb = n <= b;
if (bop.equals(">")) nb = n > b;
if (bop.equals(">=")) nb = n >= b;
return an && nb;
}
throw new FitMatcherException("Invalid FitMatcher Expression");
}
public String message() {
String message = null;
String parmString = "<b>" + parameter.toString() + "</b>";
if (!expression.contains("_"))
message = parmString + expression;
else
message = expression.replaceFirst("_", parmString);
return message;
}
}