test/tools/apt/lib/TestProcessor.java

Thu, 25 Aug 2011 17:18:25 -0700

author
schien
date
Thu, 25 Aug 2011 17:18:25 -0700
changeset 1067
f497fac86cf9
parent 554
9d9f26857129
permissions
-rw-r--r--

Added tag jdk8-b02 for changeset b3c059de2a61

duke@1 1 /*
ohair@554 2 * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
duke@1 7 * published by the Free Software Foundation.
duke@1 8 *
duke@1 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 13 * accompanied this code).
duke@1 14 *
duke@1 15 * You should have received a copy of the GNU General Public License version
duke@1 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 18 *
ohair@554 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@554 20 * or visit www.oracle.com if you need additional information or have any
ohair@554 21 * questions.
duke@1 22 */
duke@1 23
duke@1 24
duke@1 25 import java.lang.reflect.Method;
duke@1 26 import java.util.*;
duke@1 27 import com.sun.mirror.apt.*;
duke@1 28
duke@1 29
duke@1 30 /**
duke@1 31 * Annotation processor for the @Test annotation.
duke@1 32 * Invokes each method so annotated, and verifies the result.
duke@1 33 * Throws an Error on failure.
duke@1 34 *
duke@1 35 * @author Scott Seligman
duke@1 36 */
duke@1 37 public class TestProcessor implements AnnotationProcessor {
duke@1 38
duke@1 39 AnnotationProcessorEnvironment env;
duke@1 40
duke@1 41 // The tester that's running.
duke@1 42 Tester tester = Tester.activeTester;
duke@1 43
duke@1 44 TestProcessor(AnnotationProcessorEnvironment env,
duke@1 45 Tester tester) {
duke@1 46 this.env = env;
duke@1 47 this.tester = tester;
duke@1 48 }
duke@1 49
duke@1 50
duke@1 51 /**
duke@1 52 * Reflectively invoke the @Test-annotated methods of the live
duke@1 53 * tester. Those methods perform the actual exercising of the
duke@1 54 * mirror API. Then back here to verify the results by
duke@1 55 * reading the live annotations. Convoluted, you say?
duke@1 56 */
duke@1 57 public void process() {
duke@1 58 System.out.printf("\n> Processing %s\n", tester.getClass());
duke@1 59
duke@1 60 boolean failed = false; // true if a test returns wrong result
duke@1 61
duke@1 62 for (Method m : tester.getClass().getDeclaredMethods()) {
duke@1 63 Test anno = m.getAnnotation(Test.class);
duke@1 64 Ignore ignore = m.getAnnotation(Ignore.class);
duke@1 65 if (anno != null) {
duke@1 66 if (ignore == null) {
duke@1 67 System.out.println(">> Invoking test " + m.getName());
duke@1 68 Object result;
duke@1 69 try {
duke@1 70 result = m.invoke(tester);
duke@1 71 } catch (Exception e) {
duke@1 72 throw new Error("Test invocation failed", e);
duke@1 73 }
duke@1 74 boolean ok = true; // result of this test
duke@1 75 if (Collection.class.isAssignableFrom(m.getReturnType())) {
duke@1 76 ok = verifyResults((Collection) result,
duke@1 77 anno.result(), anno.ordered());
duke@1 78 } else if (m.getReturnType() != void.class) {
duke@1 79 ok = verifyResult(result, anno.result());
duke@1 80 }
duke@1 81 if (!ok) {
duke@1 82 System.out.println(">>> Expected: " + anno);
duke@1 83 System.out.println(">>> Got: " + result);
duke@1 84 failed = true;
duke@1 85 }
duke@1 86 } else {
duke@1 87 System.out.println(">> Ignoring test " + m.getName());
duke@1 88 if (ignore.value().length() > 0) {
duke@1 89 System.out.println(">>> Reason: " + ignore.value());
duke@1 90 }
duke@1 91 }
duke@1 92 }
duke@1 93 }
duke@1 94 if (failed) {
duke@1 95 throw new Error("Test(s) returned unexpected result");
duke@1 96 }
duke@1 97 }
duke@1 98
duke@1 99 /**
duke@1 100 * Verify that a single-valued (non-Collection) result matches
duke@1 101 * its expected value.
duke@1 102 */
duke@1 103 private boolean verifyResult(Object result, String[] expected) {
duke@1 104 assert expected.length == 1 :
duke@1 105 "Single-valued test expecting " + expected.length + " results";
duke@1 106 return expected[0].equals(String.valueOf(result));
duke@1 107 }
duke@1 108
duke@1 109 /**
duke@1 110 * Verify that a multi-valued result (a Collection) matches
duke@1 111 * its expected values.
duke@1 112 */
duke@1 113 private boolean verifyResults(Collection result,
duke@1 114 String[] expected, boolean ordered) {
duke@1 115 if (result.size() != expected.length) {
duke@1 116 return false;
duke@1 117 }
duke@1 118
duke@1 119 // Convert result to an array of strings.
duke@1 120 String[] res = new String[result.size()];
duke@1 121 int i = 0;
duke@1 122 for (Object e : result) {
duke@1 123 res[i++] = String.valueOf(e);
duke@1 124 }
duke@1 125
duke@1 126 if (!ordered) {
duke@1 127 Arrays.sort(res);
duke@1 128 Arrays.sort(expected);
duke@1 129 }
duke@1 130 return Arrays.equals(res, expected);
duke@1 131 }
duke@1 132 }

mercurial