1 package org.testng.internal;
2 
3 import org.testng.IExpectedExceptionsHolder;
4 import org.testng.ITestNGMethod;
5 import org.testng.annotations.IExpectedExceptionsAnnotation;
6 import org.testng.annotations.ITestAnnotation;
7 import org.testng.internal.annotations.IAnnotationFinder;
8 
9 import java.util.regex.Pattern;
10 
11 /**
12  * A class that contains the expected exceptions and the message regular expression.
13  * @author cbeust
14  */
15 public class RegexpExpectedExceptionsHolder implements IExpectedExceptionsHolder {
16   public static final String DEFAULT_REGEXP = ".*";
17 
18   private final IAnnotationFinder finder;
19   private final ITestNGMethod method;
20 
RegexpExpectedExceptionsHolder(IAnnotationFinder finder, ITestNGMethod method)21   public RegexpExpectedExceptionsHolder(IAnnotationFinder finder, ITestNGMethod method) {
22     this.finder = finder;
23     this.method = method;
24   }
25 
26   /**
27    *   message / regEx  .*      other
28    *   null             true    false
29    *   non-null         true    match
30    */
31   @Override
isThrowableMatching(Throwable ite)32   public boolean isThrowableMatching(Throwable ite) {
33     String messageRegExp = getRegExp();
34 
35     if (DEFAULT_REGEXP.equals(messageRegExp)) {
36       return true;
37     }
38 
39     final String message = ite.getMessage();
40     return message != null && Pattern.compile(messageRegExp, Pattern.DOTALL).matcher(message).matches();
41   }
42 
getWrongExceptionMessage(Throwable ite)43   public String getWrongExceptionMessage(Throwable ite) {
44     return "The exception was thrown with the wrong message:" +
45            " expected \"" + getRegExp() + "\"" +
46            " but got \"" + ite.getMessage() + "\"";
47   }
48 
getRegExp()49   private String getRegExp() {
50     IExpectedExceptionsAnnotation expectedExceptions =
51         finder.findAnnotation(method, IExpectedExceptionsAnnotation.class);
52     if (expectedExceptions != null) {
53       // Old syntax => default value
54       return DEFAULT_REGEXP;
55     }
56 
57     // New syntax
58     ITestAnnotation testAnnotation = finder.findAnnotation(method, ITestAnnotation.class);
59     if (testAnnotation != null) {
60       return testAnnotation.getExpectedExceptionsMessageRegExp();
61     }
62 
63     return DEFAULT_REGEXP;
64   }
65 }
66