diff options
author | Jesse Wilson <jessewilson@google.com> | 2010-03-30 15:53:36 -0700 |
---|---|---|
committer | Jesse Wilson <jessewilson@google.com> | 2010-03-30 23:36:22 -0700 |
commit | 320b780fdfb5d779f5ce1c7e15e66e320f0e5932 (patch) | |
tree | 0a56f7e37addf93713e46fc105f1d0e4be9f0458 /tools/runner/java/vogar/Expectation.java | |
parent | 105e31569df7b3a158a603613a5ad4bb8316f2e2 (diff) | |
download | libcore-320b780fdfb5d779f5ce1c7e15e66e320f0e5932.zip libcore-320b780fdfb5d779f5ce1c7e15e66e320f0e5932.tar.gz libcore-320b780fdfb5d779f5ce1c7e15e66e320f0e5932.tar.bz2 |
Splitting TestRun into Action and Outcome.
Changing Vogar to prefer the word "action" over "test" to avoid
deemphisizing benchmarks and main classes.
Moving expectation management out of TestRun and into Expectation
and the ExpectationStore. The parse method moved, but it is unchanged.
Renamed ExpectedResult to Expectation.
Currently outcome has 2 names: an outcome name and an action name.
At the moment these are always equal. In a follow up to this change
I intend to allow a single action to have multiple outcomes, which
will allow JUnit tests to be tracked at the right granularity when
executed by vogar.
Diffstat (limited to 'tools/runner/java/vogar/Expectation.java')
-rw-r--r-- | tools/runner/java/vogar/Expectation.java | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/tools/runner/java/vogar/Expectation.java b/tools/runner/java/vogar/Expectation.java new file mode 100644 index 0000000..b52b5a3 --- /dev/null +++ b/tools/runner/java/vogar/Expectation.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package vogar; + +import java.util.regex.Pattern; + +/** + * The expected result of an action execution. This is typically encoded in the + * expectations text file, which has the following format: + * <pre> + * test java.io.StreamTokenizer.Reset + * result UNSUPPORTED + * pattern .*should get token \[, but get -1.* + * + * # should we fix this? + * test java.util.Arrays.CopyMethods + * result COMPILE_FAILED + * pattern .*cannot find symbol.* + * </pre> + */ +final class Expectation { + + /** The pattern to use when no expected output is specified */ + private static final Pattern MATCH_ALL_PATTERN + = Pattern.compile(".*", Pattern.MULTILINE | Pattern.DOTALL); + + /** The expectation of a general successful run. */ + static final Expectation SUCCESS = new Expectation(Result.SUCCESS, null); + + /** The action's expected result, such as {@code EXEC_FAILED}. */ + private final Result result; + + /** The pattern the expected output will match. */ + private final Pattern pattern; + + public Expectation(Result result, String pattern) { + if (result == null) { + throw new IllegalArgumentException(); + } + + this.result = result; + this.pattern = pattern != null + ? Pattern.compile(pattern, Pattern.MULTILINE | Pattern.DOTALL) + : MATCH_ALL_PATTERN; + } + + public Result getResult() { + return result; + } + + /** + * Returns true if {@code outcome} matches this expectation. + */ + public boolean matches(Outcome outcome) { + return result == outcome.getResult() && patternMatches(outcome); + } + + /** + * Returns the failure message for this failed run. This message is intended + * to help to diagnose why the run result didn't match what was expected. + */ + public String getFailureMessage(Outcome outcome) { + StringBuilder builder = new StringBuilder(); + + if (result != Result.SUCCESS && result != outcome.getResult()) { + builder.append("Expected result: ") + .append(result) + .append("\n"); + } + + if (!patternMatches(outcome)) { + builder.append("Expected output to match \"") + .append(pattern.pattern()) + .append("\"\n"); + } + + for (String output : outcome.getOutputLines()) { + builder.append(output).append("\n"); + } + + return builder.toString(); + } + + private boolean patternMatches(Outcome outcome) { + return pattern.matcher(Strings.join(outcome.getOutputLines(), "\n")).matches(); + } +} |