From 844995fc606085af7c102954ee342edfd8cd623a Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Thu, 8 May 2014 00:38:50 +0200 Subject: All tests now succeed on all platforms again; 'optional' expected messages added. expanded some tests. Added a check if the bootclasspath supports a certain version, i.e. don't try to run a JDK7-only test if AutoClosable isn't available. --- test/core/src/lombok/AbstractRunTests.java | 38 ++++++++++++++++++++---- test/core/src/lombok/CompilerMessageMatcher.java | 14 ++++++++- 2 files changed, 45 insertions(+), 7 deletions(-) (limited to 'test/core') diff --git a/test/core/src/lombok/AbstractRunTests.java b/test/core/src/lombok/AbstractRunTests.java index 34f6cbf4..2a04d21a 100644 --- a/test/core/src/lombok/AbstractRunTests.java +++ b/test/core/src/lombok/AbstractRunTests.java @@ -56,12 +56,15 @@ public abstract class AbstractRunTests { public boolean compareFile(DirectoryRunner.TestParams params, File file) throws Throwable { ConfigurationKeysLoader.LoaderLoader.loadAllConfigurationKeys(); final LombokTestSource sourceDirectives = LombokTestSource.readDirectives(file); - if (sourceDirectives.isIgnore() || !sourceDirectives.versionWithinLimit(params.getVersion())) return false; + if (sourceDirectives.isIgnore()) return false; + if (!sourceDirectives.versionWithinLimit(params.getVersion())) return false; + if (!sourceDirectives.versionWithinLimit(getClasspathVersion())) return false; String fileName = file.getName(); LombokTestSource expected = LombokTestSource.read(params.getAfterDirectory(), params.getMessagesDirectory(), fileName); - if (expected.isIgnore() || !expected.versionWithinLimit(params.getVersion())) return false; + if (expected.isIgnore()) return false; + if (!expected.versionWithinLimit(params.getVersion())) return false; LinkedHashSet messages = new LinkedHashSet(); StringWriter writer = new StringWriter(); @@ -78,6 +81,22 @@ public abstract class AbstractRunTests { return true; } + private static int getClasspathVersion() { + try { + Class.forName("java.lang.AutoCloseable"); + } catch (ClassNotFoundException e) { + return 6; + } + + try { + Class.forName("java.util.stream.Stream"); + } catch (ClassNotFoundException e) { + return 7; + } + + return 8; + } + protected abstract void transformCode(Collection messages, StringWriter result, File file) throws Throwable; protected String readFile(File file) throws IOException { @@ -176,24 +195,31 @@ public abstract class AbstractRunTests { } } + @SuppressWarnings("null") /* eclipse bug; it falsely thinks stuffAc will always be null or some such hogwash. */ private static void compareMessages(String name, LombokImmutableList expected, LinkedHashSet actual) { Iterator expectedIterator = expected.iterator(); Iterator actualIterator = actual.iterator(); + CompilerMessage stuffAc = null; while (true) { boolean exHasNext = expectedIterator.hasNext(); - boolean acHasNext = actualIterator.hasNext(); + boolean acHasNext = stuffAc != null || actualIterator.hasNext(); if (!exHasNext && !acHasNext) break; if (exHasNext && acHasNext) { CompilerMessageMatcher cmm = expectedIterator.next(); - CompilerMessage cm = actualIterator.next(); + CompilerMessage cm = stuffAc == null ? actualIterator.next() : stuffAc; if (cmm.matches(cm)) continue; + if (cmm.isOptional()) stuffAc = cm; fail(String.format("[%s] Expected message '%s' but got message '%s'", name, cmm, cm)); throw new AssertionError("fail should have aborted already."); } - if (exHasNext) fail(String.format("[%s] Expected message '%s' but ran out of actual messages", name, expectedIterator.next())); + + while (expectedIterator.hasNext()) { + if (expectedIterator.next().isOptional()) continue; + fail(String.format("[%s] Expected message '%s' but ran out of actual messages", name, expectedIterator.next())); + } if (acHasNext) fail(String.format("[%s] Unexpected message: %s", name, actualIterator.next())); - throw new AssertionError("fail should have aborted already."); + break; } } diff --git a/test/core/src/lombok/CompilerMessageMatcher.java b/test/core/src/lombok/CompilerMessageMatcher.java index cffad88a..0d6c0889 100644 --- a/test/core/src/lombok/CompilerMessageMatcher.java +++ b/test/core/src/lombok/CompilerMessageMatcher.java @@ -37,9 +37,14 @@ public class CompilerMessageMatcher { /** Line Number (starting at 1) */ private final List lineNumbers = new ArrayList(); private final List> messages = new ArrayList>(); + private boolean optional; private CompilerMessageMatcher() {} + public boolean isOptional() { + return optional; + } + public static CompilerMessageMatcher asCompilerMessageMatcher(CompilerMessage message) { CompilerMessageMatcher cmm = new CompilerMessageMatcher(); cmm.lineNumbers.add((int) message.getLine()); @@ -50,7 +55,7 @@ public class CompilerMessageMatcher { @Override public String toString() { StringBuilder out = new StringBuilder(); for (int i = 0; i < lineNumbers.size(); i++) { - out.append(lineNumbers.get(i)); + out.append(lineNumbers.get(i)).append(" "); for (String part : messages.get(i)) out.append(part).append(" "); if (out.length() > 0) out.setLength(out.length() - 1); out.append(" |||| "); @@ -87,10 +92,17 @@ public class CompilerMessageMatcher { private static CompilerMessageMatcher read(String line) { line = line.trim(); if (line.isEmpty()) return null; + boolean optional = false; + + if (line.startsWith("OPTIONAL ")) { + line = line.substring(9); + optional = true; + } String[] parts = line.split("\\s*\\|\\|\\|\\|\\s*"); CompilerMessageMatcher cmm = new CompilerMessageMatcher(); + cmm.optional = optional; for (String part : parts) { Matcher m = PATTERN.matcher(part); if (!m.matches()) throw new IllegalArgumentException("Typo in test file: " + line); -- cgit