diff options
author | Reinier Zwitserloot <reinier@zwitserloot.com> | 2012-10-25 00:07:44 +0200 |
---|---|---|
committer | Reinier Zwitserloot <reinier@zwitserloot.com> | 2012-10-25 00:07:44 +0200 |
commit | d2808d407a65da9fe1e290a83df0f0da107f0cf8 (patch) | |
tree | 80e577330ebef88dbd91c1de59951cbff94af9e8 /test/core/src/lombok/CompilerMessageMatcher.java | |
parent | 2d216118986115bf309c050cd841bbe8b62b80b3 (diff) | |
download | lombok-d2808d407a65da9fe1e290a83df0f0da107f0cf8.tar.gz lombok-d2808d407a65da9fe1e290a83df0f0da107f0cf8.tar.bz2 lombok-d2808d407a65da9fe1e290a83df0f0da107f0cf8.zip |
The testrunner now uses a different mechanism to verify correctness of produced errors and warnings (i.e. we intentionally compile code with errors in them to verify that the appropriate error or warning message is emitted when lombok is active during a compilation run of either javac or ecj) - instead of string comparisons, it's a little more complex. This to enable testing of both javac6 and javac7, even if they produce (slightly) different error output.
Updated all message files in the 'expected output' directories to represent this change.
Diffstat (limited to 'test/core/src/lombok/CompilerMessageMatcher.java')
-rw-r--r-- | test/core/src/lombok/CompilerMessageMatcher.java | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/test/core/src/lombok/CompilerMessageMatcher.java b/test/core/src/lombok/CompilerMessageMatcher.java new file mode 100644 index 00000000..b7902395 --- /dev/null +++ b/test/core/src/lombok/CompilerMessageMatcher.java @@ -0,0 +1,62 @@ +package lombok; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CompilerMessageMatcher { + /** Line Number (starting at 1) */ + private final long line; + + /** Position is either column number, OR position in file starting from the first byte. */ + private final long position; + private final Collection<String> messageParts; + + public CompilerMessageMatcher(long line, long position, String message) { + this.line = line; + this.position = position; + this.messageParts = Arrays.asList(message.split("\\s+")); + } + + @Override public String toString() { + StringBuilder parts = new StringBuilder(); + for (String part : messageParts) parts.append(part).append(" "); + if (parts.length() > 0) parts.setLength(parts.length() - 1); + return String.format("%d:%d %s", line, position, parts); + } + + public boolean matches(CompilerMessage message) { + if (message.line != this.line) return false; + if (message.position != this.position) return false; + for (String token : messageParts) { + if (!message.message.contains(token)) return false; + } + return true; + } + + public static List<CompilerMessageMatcher> readAll(InputStream rawIn) throws IOException { + BufferedReader in = new BufferedReader(new InputStreamReader(rawIn, "UTF-8")); + List<CompilerMessageMatcher> out = new ArrayList<CompilerMessageMatcher>(); + for (String line = in.readLine(); line != null; line = in.readLine()) { + CompilerMessageMatcher cmm = read(line); + if (cmm != null) out.add(cmm); + } + return out; + } + + private static final Pattern PATTERN = Pattern.compile("^(\\d+):(\\d+) (.*)$"); + private static CompilerMessageMatcher read(String line) { + line = line.trim(); + if (line.isEmpty()) return null; + Matcher m = PATTERN.matcher(line); + if (!m.matches()) throw new IllegalArgumentException("Typo in test file: " + line); + return new CompilerMessageMatcher(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)), m.group(3)); + } +} |