vmtest/src/main/java/org/apidesign/bck2brwsr/vmtest/impl/CompareCase.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 07 Feb 2013 12:58:12 +0100
branchemul
changeset 694 0d277415ed02
parent 623 4af0d3dedb9d
permissions -rw-r--r--
Rebasing the Inflater support on jzlib which, unlike GNU ClassPath, has correct implementation of Huffman code. Making the implementation more easily testable by turning Inflater and ZipInputStream into pure delegates. Current implementation is going to need proper long support.
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package org.apidesign.bck2brwsr.vmtest.impl;
    19 
    20 import org.apidesign.bck2brwsr.vmtest.*;
    21 import java.lang.reflect.Method;
    22 import java.util.ArrayList;
    23 import java.util.List;
    24 import org.apidesign.bck2brwsr.launcher.Launcher;
    25 import org.testng.Assert;
    26 import org.testng.ITest;
    27 import org.testng.annotations.Factory;
    28 import org.testng.annotations.Test;
    29 
    30 /** A TestNG {@link Factory} that seeks for {@link Compare} annotations
    31  * in provided class and builds set of tests that compare the computations
    32  * in real as well as JavaScript virtual machines. Use as:<pre>
    33  * {@code @}{@link Factory} public static create() {
    34  *   return @{link VMTest}.{@link #create(YourClass.class);
    35  * }</pre>
    36  *
    37  * @author Jaroslav Tulach <jtulach@netbeans.org>
    38  */
    39 public final class CompareCase implements ITest {
    40     private final Bck2BrwsrCase first, second;
    41     private final Method m;
    42     
    43     private CompareCase(Method m, Bck2BrwsrCase first, Bck2BrwsrCase second) {
    44         this.first = first;
    45         this.second = second;
    46         this.m = m;
    47     }
    48 
    49     /** Inspects <code>clazz</code> and for each {@lik Compare} method creates
    50      * instances of tests. Each instance runs the test in different virtual
    51      * machine and at the end they compare the results.
    52      * 
    53      * @param clazz the class to inspect
    54      * @return the set of created tests
    55      */
    56     public static Object[] create(Class<?> clazz) {
    57         Method[] arr = clazz.getMethods();
    58         List<Object> ret = new ArrayList<>();
    59         
    60         final LaunchSetup l = LaunchSetup.INSTANCE;
    61         ret.add(l);
    62         
    63         String[] brwsr;
    64         {
    65             String p = System.getProperty("vmtest.brwsrs");
    66             if (p != null) {
    67                 brwsr = p.split(",");
    68             } else {
    69                 brwsr = new String[0];
    70             }
    71         }
    72         
    73         for (Method m : arr) {
    74             registerCompareCases(m, l, ret, brwsr);
    75             registerBrwsrCases(m, l, ret, brwsr);
    76         }
    77         return ret.toArray();
    78     }
    79 
    80     /** Test that compares the previous results.
    81      * @throws Throwable 
    82      */
    83     @Test(dependsOnGroups = "run") public void compareResults() throws Throwable {
    84         Object v1 = first.value;
    85         Object v2 = second.value;
    86         if (v1 != null) {
    87             v1 = v1.toString();
    88         } else {
    89             v1 = "null";
    90         }
    91         try {
    92             Assert.assertEquals(v2, v1, "Comparing results");
    93         } catch (AssertionError e) {
    94             StringBuilder sb = new StringBuilder();
    95             sb.append(e.getMessage());
    96             Bck2BrwsrCase.dumpJS(sb, second);
    97             throw new AssertionError(sb.toString());
    98         }
    99     }
   100     
   101     /** Test name.
   102      * @return name of the tested method followed by a suffix
   103      */
   104     @Override
   105     public String getTestName() {
   106         return m.getName() + "[Compare " + second.typeName() + "]";
   107     }
   108     
   109     private static void registerCompareCases(Method m, final LaunchSetup l, List<Object> ret, String[] brwsr) {
   110         Compare c = m.getAnnotation(Compare.class);
   111         if (c == null) {
   112             return;
   113         }
   114         final Bck2BrwsrCase real = new Bck2BrwsrCase(m, "Java", null, false, null, null);
   115         ret.add(real);
   116         if (c.scripting()) {
   117             final Bck2BrwsrCase js = new Bck2BrwsrCase(m, "JavaScript", l.javaScript(), false, null, null);
   118             ret.add(js);
   119             ret.add(new CompareCase(m, real, js));
   120         }
   121         for (String b : brwsr) {
   122             final Launcher s = l.brwsr(b);
   123             ret.add(s);
   124             final Bck2BrwsrCase cse = new Bck2BrwsrCase(m, b, s, false, null, null);
   125             ret.add(cse);
   126             ret.add(new CompareCase(m, real, cse));
   127         }
   128     }
   129     private static void registerBrwsrCases(Method m, final LaunchSetup l, List<Object> ret, String[] brwsr) {
   130         BrwsrTest c = m.getAnnotation(BrwsrTest.class);
   131         if (c == null) {
   132             return;
   133         }
   134         HtmlFragment f = m.getAnnotation(HtmlFragment.class);
   135         if (f == null) {
   136             f = m.getDeclaringClass().getAnnotation(HtmlFragment.class);
   137         }
   138         Http.Resource[] r = {};
   139         Http h = m.getAnnotation(Http.class);
   140         if (h == null) {
   141             h = m.getDeclaringClass().getAnnotation(Http.class);
   142             if (h != null) {
   143                 r = h.value();
   144             }
   145         } else {
   146             r = h.value();
   147         }
   148         if (brwsr.length == 0) {
   149             final Launcher s = l.brwsr(null);
   150             ret.add(s);
   151             ret.add(new Bck2BrwsrCase(m, "Brwsr", s, true, f, r));
   152         } else {
   153             for (String b : brwsr) {
   154                 final Launcher s = l.brwsr(b);
   155                 ret.add(s);
   156                 ret.add(new Bck2BrwsrCase(m, b, s, true, f, r));
   157             }
   158         }
   159     }
   160 }