/*
 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/* @test
 * @summary unit tests for java.lang.invoke.MethodType
 * @compile MethodTypeTest.java
 * @run junit/othervm test.java.lang.invoke.MethodTypeTest
 */

package test.java.lang.invoke;

import java.lang.invoke.MethodType;
import java.lang.reflect.Method;

import java.util.*;
import org.junit.*;
import static org.junit.Assert.*;

/**
 *
 * @author jrose
 */
public class MethodTypeTest {

    private Class<?> rtype;
    private Class<?>[] ptypes;
    private MethodType mt_viS, mt_OO, mt_OO2, mt_vv, mt_Vv, mt_Ov;
    private MethodType mt_iSI, mt_ISi, mt_ISI, mt_iSi;
    private MethodType mt_viO, mt_iO2, mt_OOi, mt_iOi;
    private MethodType mt_VIO, mt_IO2, mt_OOI, mt_IOI, mt_VIS;
    private MethodType mt_vOiSzA, mt_OO99;
    private MethodType[] GALLERY;
    private Method compareTo;

    @Before
    public void setUp() throws Exception {
        rtype = void.class;
        ptypes = new Class<?>[] { int.class, String.class };

        mt_viS = MethodType.methodType(void.class, int.class, String.class);
        mt_OO = MethodType.methodType(Object.class, Object.class);
        mt_OO2 = MethodType.methodType(Object.class, Object.class, Object.class);
        mt_vv = MethodType.methodType(void.class);
        mt_Vv = MethodType.methodType(Void.class);
        mt_Ov = MethodType.methodType(Object.class);
        mt_iSI = MethodType.methodType(int.class, String.class, Integer.class);
        mt_ISi = MethodType.methodType(Integer.class, String.class, int.class);
        mt_ISI = MethodType.methodType(Integer.class, String.class, Integer.class);
        mt_iSi = MethodType.methodType(int.class, String.class, int.class);

        compareTo = String.class.getDeclaredMethod("compareTo", String.class);

        mt_viO = MethodType.methodType(void.class, int.class, Object.class);
        mt_iO2 = MethodType.methodType(int.class, Object.class, Object.class);
        mt_OOi = MethodType.methodType(Object.class, Object.class, int.class);
        mt_iOi = MethodType.methodType(int.class, Object.class, int.class);

        mt_VIO = MethodType.methodType(Void.class, Integer.class, Object.class);
        mt_IO2 = MethodType.methodType(Integer.class, Object.class, Object.class);
        mt_OOI = MethodType.methodType(Object.class, Object.class, Integer.class);
        mt_IOI = MethodType.methodType(Integer.class, Object.class, Integer.class);
        mt_VIS = MethodType.methodType(Void.class, Integer.class, String.class);

        mt_vOiSzA = MethodType.methodType(void.class, Object.class, int.class, String.class, boolean.class, Object[].class);
        mt_OO99 = MethodType.genericMethodType(99);

        GALLERY = new MethodType[] {
            mt_viS, mt_OO, mt_OO2, mt_vv, mt_Vv, mt_Ov,
            mt_iSI, mt_ISi, mt_ISI, mt_iSi,
            mt_viO, mt_iO2, mt_OOi, mt_iOi,
            mt_VIO, mt_IO2, mt_OOI, mt_IOI,
            mt_VIS, mt_vOiSzA, mt_OO99
        };
    }

    @After
    public void tearDown() throws Exception {
    }

    /** Make sure the method types are all distinct. */
    @Test
    public void testDistinct() {
        List<MethodType> gallery2 = new ArrayList<>();
        for (MethodType mt : GALLERY) {
            assertFalse(mt.toString(), gallery2.contains(mt));
            gallery2.add(mt);
        }
        // check self-equality also:
        assertEquals(Arrays.asList(GALLERY), gallery2);
    }

    /**
     * Test of make method, of class MethodType.
     */
    @Test
    public void testMake_Class_ClassArr() {
        System.out.println("make (from type array)");
        MethodType result = MethodType.methodType(rtype, ptypes);
        assertSame(mt_viS, result);
    }

    /**
     * Test of make method, of class MethodType.
     */
    @Test
    public void testMake_Class_List() {
        System.out.println("make (from type list)");
        MethodType result = MethodType.methodType(rtype, Arrays.asList(ptypes));
        assertSame(mt_viS, result);
    }

    /**
     * Test of make method, of class MethodType.
     */
    @Test
    public void testMake_3args() {
        System.out.println("make (from type with varargs)");
        MethodType result = MethodType.methodType(rtype, ptypes[0], ptypes[1]);
        assertSame(mt_viS, result);
    }

    /**
     * Test of make method, of class MethodType.
     */
    @Test
    public void testMake_Class() {
        System.out.println("make (from single type)");
        Class<?> rt = Integer.class;
        MethodType expResult = MethodType.methodType(rt, new Class<?>[0]);
        MethodType result = MethodType.methodType(rt);
        assertSame(expResult, result);
    }

    @Test
    public void testMakeGeneric() {
        System.out.println("makeGeneric");
        int objectArgCount = 2;
        MethodType expResult = mt_OO2;
        MethodType result = MethodType.genericMethodType(objectArgCount);
        assertSame(expResult, result);
    }

    /**
     * Test of make method, of class MethodType.
     */
    @Test
    public void testMake_MethodType() {
        System.out.println("make (from rtype, MethodType)");
        MethodType expResult = mt_iO2;
        MethodType result = MethodType.methodType(int.class, mt_IO2);
        assertSame(expResult, result);
    }

    /**
     * Test of make method, of class MethodType.
     */
    @Test
    public void testMake_String_ClassLoader() {
        System.out.println("make (from bytecode signature)");
        ClassLoader loader = null;
        MethodType[] instances = {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSI, mt_ISi, mt_ISI, mt_iSi};
        String obj = "Ljava/lang/Object;";
        assertEquals(obj, concat(Object.class));
        String[] expResults = {
            "(ILjava/lang/String;)V",
            concat("(", obj, 2, ")", Object.class),
            "()V", "()"+obj,
            concat("(", String.class, Integer.class, ")I"),
            concat("(", String.class, "I)", Integer.class),
            concat("(", String.class, Integer.class, ")", Integer.class),
            concat("(", String.class, "I)I")
        };
        for (int i = 0; i < instances.length; i++) {
            MethodType instance = instances[i];
            String result = instance.toMethodDescriptorString();
            assertEquals("#"+i, expResults[i], result);
            MethodType parsed = MethodType.fromMethodDescriptorString(result, loader);
            assertSame("--#"+i, instance, parsed);
        }
    }
    private static String concat(Object... parts) {
        StringBuilder sb = new StringBuilder();
        Object prevPart = "";
        for (Object part : parts) {
            if (part instanceof Class) {
                part = "L"+((Class)part).getName()+";";
            }
            if (part instanceof Integer) {
                for (int n = (Integer) part; n > 1; n--)
                    sb.append(prevPart);
                part = "";
            }
            sb.append(part);
            prevPart = part;
        }
        return sb.toString().replace('.', '/');
    }

    @Test
    public void testHasPrimitives() {
        System.out.println("hasPrimitives");
        MethodType[] instances = {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSI, mt_ISi, mt_ISI, mt_iSi};
        boolean[] expResults =   {true,   false,  true,  false, true,   true,   false,  true};
        for (int i = 0; i < instances.length; i++) {
            boolean result = instances[i].hasPrimitives();
            assertEquals("#"+i, expResults[i], result);
        }
    }

    @Test
    public void testHasWrappers() {
        System.out.println("hasWrappers");
        MethodType[] instances = {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSI, mt_ISi, mt_ISI, mt_iSi};
        boolean[] expResults =   {false,  false,  false, false, true,   true,   true,   false};
        for (int i = 0; i < instances.length; i++) {
            System.out.println("  hasWrappers "+instances[i]);
            boolean result = instances[i].hasWrappers();
            assertEquals("#"+i, expResults[i], result);
        }
    }

    @Test
    public void testErase() {
        System.out.println("erase");
        MethodType[] instances  = {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSI, mt_ISi, mt_ISI, mt_iSi};
        MethodType[] expResults = {mt_viO, mt_OO2, mt_vv, mt_Ov, mt_iO2, mt_OOi, mt_OO2, mt_iOi};
        for (int i = 0; i < instances.length; i++) {
            MethodType result = instances[i].erase();
            assertSame("#"+i, expResults[i], result);
        }
    }

    @Test
    public void testGeneric() {
        System.out.println("generic");
        MethodType[] instances =  {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSI, mt_ISi, mt_ISI, mt_iSi};
        MethodType[] expResults = {mt_OO2, mt_OO2, mt_Ov, mt_Ov, mt_OO2, mt_OO2, mt_OO2, mt_OO2};
        for (int i = 0; i < instances.length; i++) {
            MethodType result = instances[i].generic();
            assertSame("#"+i, expResults[i], result);
        }
    }

    @Test
    public void testWrap() {
        System.out.println("wrap");
        MethodType[] instances =  {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSI, mt_ISi, mt_ISI, mt_iSi};
        MethodType[] expResults = {mt_VIS, mt_OO2, mt_Vv, mt_Ov, mt_ISI, mt_ISI, mt_ISI, mt_ISI};
        for (int i = 0; i < instances.length; i++) {
            MethodType result = instances[i].wrap();
            assertSame("#"+i, expResults[i], result);
        }
    }

    @Test
    public void testUnwrap() {
        System.out.println("unwrap");
        MethodType[] instances =  {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSI, mt_ISi, mt_ISI, mt_iSi};
        MethodType[] expResults = {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSi, mt_iSi, mt_iSi, mt_iSi};
        for (int i = 0; i < instances.length; i++) {
            MethodType result = instances[i].unwrap();
            assertSame("#"+i, expResults[i], result);
        }
    }

    /**
     * Test of parameterType method, of class MethodType.
     */
    @Test
    public void testParameterType() {
        System.out.println("parameterType");
        for (int num = 0; num < ptypes.length; num++) {
            MethodType instance = mt_viS;
            Class<?> expResult = ptypes[num];
            Class<?> result = instance.parameterType(num);
            assertSame(expResult, result);
        }
    }

    /**
     * Test of parameterCount method, of class MethodType.
     */
    @Test
    public void testParameterCount() {
        System.out.println("parameterCount");
        MethodType instance = mt_viS;
        int expResult = 2;
        int result = instance.parameterCount();
        assertEquals(expResult, result);
    }

    /**
     * Test of returnType method, of class MethodType.
     */
    @Test
    public void testReturnType() {
        System.out.println("returnType");
        MethodType instance = mt_viS;
        Class<?> expResult = void.class;
        Class<?> result = instance.returnType();
        assertSame(expResult, result);
    }

    /**
     * Test of parameterList method, of class MethodType.
     */
    @Test
    public void testParameterList() {
        System.out.println("parameterList");
        MethodType instance = mt_viS;
        List<Class<?>> expResult = Arrays.asList(ptypes);
        List<Class<?>> result = instance.parameterList();
        assertEquals(expResult, result);
    }

    /**
     * Test of parameterArray method, of class MethodType.
     */
    @Test
    public void testParameterArray() {
        System.out.println("parameterArray");
        MethodType instance = mt_viS;
        Class<?>[] expResult = ptypes;
        Class<?>[] result = instance.parameterArray();
        assertEquals(Arrays.asList(expResult), Arrays.asList(result));
    }

    /**
     * Test of equals method, of class MethodType.
     */
    @Test
    public void testEquals_Object() {
        System.out.println("equals");
        Object x = null;
        MethodType instance = mt_viS;
        boolean expResult = false;
        boolean result = instance.equals(x);
        assertEquals(expResult, result);
    }

    /**
     * Test of equals method, of class MethodType.
     */
    @Test
    public void testEquals_MethodType() {
        System.out.println("equals");
        MethodType that = mt_viS;
        MethodType instance = mt_viS;
        boolean expResult = true;
        boolean result = instance.equals(that);
        assertEquals(expResult, result);
    }

    /**
     * Test of hashCode method, of class MethodType.
     */
    @Test
    public void testHashCode() {
        System.out.println("hashCode");
        MethodType instance = mt_viS;
        ArrayList<Class<?>> types = new ArrayList<Class<?>>();
        types.add(instance.returnType());
        types.addAll(instance.parameterList());
        int expResult = types.hashCode();
        int result = instance.hashCode();
        assertEquals(expResult, result);
    }

    /**
     * Test of toString method, of class MethodType.
     */
    @Test
    public void testToString() {
        System.out.println("toString");
        MethodType[] instances = {mt_viS, mt_OO2, mt_vv, mt_Ov, mt_iSI, mt_ISi, mt_ISI, mt_iSi};
        //String expResult = "void[int, class java.lang.String]";
        String[] expResults = {
            "(int,String)void",
            "(Object,Object)Object",
            "()void",
            "()Object",
            "(String,Integer)int",
            "(String,int)Integer",
            "(String,Integer)Integer",
            "(String,int)int"
        };
        for (int i = 0; i < instances.length; i++) {
            MethodType instance = instances[i];
            String result = instance.toString();
            System.out.println("#"+i+":"+result);
            assertEquals("#"+i, expResults[i], result);
        }
    }

    private static byte[] writeSerial(Object x) throws java.io.IOException {
        try (java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();
             java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(bout)
             ) {
            out.writeObject(x);
            out.flush();
            return bout.toByteArray();
        }
    }
    private static Object readSerial(byte[] wire) throws java.io.IOException, ClassNotFoundException {
        try (java.io.ByteArrayInputStream bin = new java.io.ByteArrayInputStream(wire);
             java.io.ObjectInputStream in = new java.io.ObjectInputStream(bin)) {
            return in.readObject();
        }
    }
    private static void testSerializedEquality(Object x) throws java.io.IOException, ClassNotFoundException {
        if (x instanceof Object[])
            x = Arrays.asList((Object[]) x);  // has proper equals method
        byte[] wire = writeSerial(x);
        Object y = readSerial(wire);
        assertEquals(x, y);
    }

    /** Test (de-)serialization. */
    @Test
    public void testSerialization() throws Throwable {
        System.out.println("serialization");
        for (MethodType mt : GALLERY) {
            testSerializedEquality(mt);
        }
        testSerializedEquality(GALLERY);

        // Make a list of mixed objects:
        List<Object> stuff = new ArrayList<>();
        Collections.addAll(stuff, GALLERY);  // copy #1
        Object[] triples = Arrays.copyOfRange(GALLERY, 0, GALLERY.length/2);
        Collections.addAll(stuff, triples);  // copy #3 (partial)
        for (MethodType mt : GALLERY) {
            Collections.addAll(stuff, mt.parameterArray());
        }
        Collections.shuffle(stuff, new Random(292));
        Collections.addAll(stuff, GALLERY);  // copy #2
        testSerializedEquality(stuff);
    }

    /** Test serialization formats. */
    @Test
    public void testPortableSerialFormat() throws Throwable {
        System.out.println("portable serial format");
        boolean generateData = false;
        //generateData = true;  // set this true to generate the following input data:
        Object[][] cases = {
            { mt_vv, new byte[] {  // ()void
                    (byte)0xac, (byte)0xed, (byte)0x00, (byte)0x05, (byte)0x73, (byte)0x72, (byte)0x00, (byte)0x1b,
                    (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2e, (byte)0x6c, (byte)0x61, (byte)0x6e,
                    (byte)0x67, (byte)0x2e, (byte)0x69, (byte)0x6e, (byte)0x76, (byte)0x6f, (byte)0x6b, (byte)0x65,
                    (byte)0x2e, (byte)0x4d, (byte)0x65, (byte)0x74, (byte)0x68, (byte)0x6f, (byte)0x64, (byte)0x54,
                    (byte)0x79, (byte)0x70, (byte)0x65, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x01, (byte)0x24, (byte)0x03, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70,
                    (byte)0x76, (byte)0x72, (byte)0x00, (byte)0x04, (byte)0x76, (byte)0x6f, (byte)0x69, (byte)0x64,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70, (byte)0x75, (byte)0x72, (byte)0x00,
                    (byte)0x12, (byte)0x5b, (byte)0x4c, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2e,
                    (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2e, (byte)0x43, (byte)0x6c, (byte)0x61,
                    (byte)0x73, (byte)0x73, (byte)0x3b, (byte)0xab, (byte)0x16, (byte)0xd7, (byte)0xae, (byte)0xcb,
                    (byte)0xcd, (byte)0x5a, (byte)0x99, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x78,
                } },
            { mt_OO, new byte[] {  // (Object)Object
                    (byte)0xac, (byte)0xed, (byte)0x00, (byte)0x05, (byte)0x73, (byte)0x72, (byte)0x00, (byte)0x1b,
                    (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2e, (byte)0x6c, (byte)0x61, (byte)0x6e,
                    (byte)0x67, (byte)0x2e, (byte)0x69, (byte)0x6e, (byte)0x76, (byte)0x6f, (byte)0x6b, (byte)0x65,
                    (byte)0x2e, (byte)0x4d, (byte)0x65, (byte)0x74, (byte)0x68, (byte)0x6f, (byte)0x64, (byte)0x54,
                    (byte)0x79, (byte)0x70, (byte)0x65, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x01, (byte)0x24, (byte)0x03, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70,
                    (byte)0x76, (byte)0x72, (byte)0x00, (byte)0x10, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61,
                    (byte)0x2e, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2e, (byte)0x4f, (byte)0x62,
                    (byte)0x6a, (byte)0x65, (byte)0x63, (byte)0x74, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x78,
                    (byte)0x70, (byte)0x75, (byte)0x72, (byte)0x00, (byte)0x12, (byte)0x5b, (byte)0x4c, (byte)0x6a,
                    (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2e, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67,
                    (byte)0x2e, (byte)0x43, (byte)0x6c, (byte)0x61, (byte)0x73, (byte)0x73, (byte)0x3b, (byte)0xab,
                    (byte)0x16, (byte)0xd7, (byte)0xae, (byte)0xcb, (byte)0xcd, (byte)0x5a, (byte)0x99, (byte)0x02,
                    (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
                    (byte)0x71, (byte)0x00, (byte)0x7e, (byte)0x00, (byte)0x03, (byte)0x78,
                } },
            { mt_vOiSzA, new byte[] {  // (Object,int,String,boolean,Object[])void
                    (byte)0xac, (byte)0xed, (byte)0x00, (byte)0x05, (byte)0x73, (byte)0x72, (byte)0x00, (byte)0x1b,
                    (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2e, (byte)0x6c, (byte)0x61, (byte)0x6e,
                    (byte)0x67, (byte)0x2e, (byte)0x69, (byte)0x6e, (byte)0x76, (byte)0x6f, (byte)0x6b, (byte)0x65,
                    (byte)0x2e, (byte)0x4d, (byte)0x65, (byte)0x74, (byte)0x68, (byte)0x6f, (byte)0x64, (byte)0x54,
                    (byte)0x79, (byte)0x70, (byte)0x65, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x01, (byte)0x24, (byte)0x03, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70,
                    (byte)0x76, (byte)0x72, (byte)0x00, (byte)0x04, (byte)0x76, (byte)0x6f, (byte)0x69, (byte)0x64,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70, (byte)0x75, (byte)0x72, (byte)0x00,
                    (byte)0x12, (byte)0x5b, (byte)0x4c, (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2e,
                    (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2e, (byte)0x43, (byte)0x6c, (byte)0x61,
                    (byte)0x73, (byte)0x73, (byte)0x3b, (byte)0xab, (byte)0x16, (byte)0xd7, (byte)0xae, (byte)0xcb,
                    (byte)0xcd, (byte)0x5a, (byte)0x99, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x05, (byte)0x76, (byte)0x72, (byte)0x00, (byte)0x10,
                    (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2e, (byte)0x6c, (byte)0x61, (byte)0x6e,
                    (byte)0x67, (byte)0x2e, (byte)0x4f, (byte)0x62, (byte)0x6a, (byte)0x65, (byte)0x63, (byte)0x74,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70, (byte)0x76, (byte)0x72, (byte)0x00,
                    (byte)0x03, (byte)0x69, (byte)0x6e, (byte)0x74, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x78,
                    (byte)0x70, (byte)0x76, (byte)0x72, (byte)0x00, (byte)0x10, (byte)0x6a, (byte)0x61, (byte)0x76,
                    (byte)0x61, (byte)0x2e, (byte)0x6c, (byte)0x61, (byte)0x6e, (byte)0x67, (byte)0x2e, (byte)0x53,
                    (byte)0x74, (byte)0x72, (byte)0x69, (byte)0x6e, (byte)0x67, (byte)0xa0, (byte)0xf0, (byte)0xa4,
                    (byte)0x38, (byte)0x7a, (byte)0x3b, (byte)0xb3, (byte)0x42, (byte)0x02, (byte)0x00, (byte)0x00,
                    (byte)0x78, (byte)0x70, (byte)0x76, (byte)0x72, (byte)0x00, (byte)0x07, (byte)0x62, (byte)0x6f,
                    (byte)0x6f, (byte)0x6c, (byte)0x65, (byte)0x61, (byte)0x6e, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
                    (byte)0x78, (byte)0x70, (byte)0x76, (byte)0x72, (byte)0x00, (byte)0x13, (byte)0x5b, (byte)0x4c,
                    (byte)0x6a, (byte)0x61, (byte)0x76, (byte)0x61, (byte)0x2e, (byte)0x6c, (byte)0x61, (byte)0x6e,
                    (byte)0x67, (byte)0x2e, (byte)0x4f, (byte)0x62, (byte)0x6a, (byte)0x65, (byte)0x63, (byte)0x74,
                    (byte)0x3b, (byte)0x90, (byte)0xce, (byte)0x58, (byte)0x9f, (byte)0x10, (byte)0x73, (byte)0x29,
                    (byte)0x6c, (byte)0x02, (byte)0x00, (byte)0x00, (byte)0x78, (byte)0x70, (byte)0x78,
                } },
        };
        for (Object[] c : cases) {
            MethodType mt = (MethodType) c[0];
            System.out.println("deserialize "+mt);
            byte[] wire = (byte[]) c[1];
            if (generateData) {
                System.out.println("<generateData>");
                wire = writeSerial(mt);
                final String INDENT = "                ";
                System.out.print("{  // "+mt);
                for (int i = 0; i < wire.length; i++) {
                    if (i % 8 == 0) { System.out.println(); System.out.print(INDENT+"   "); }
                    String hex = Integer.toHexString(wire[i] & 0xFF);
                    if (hex.length() == 1)  hex = "0"+hex;
                    System.out.print(" (byte)0x"+hex+",");
                }
                System.out.println();
                System.out.println(INDENT+"}");
                System.out.println("</generateData>");
                System.out.flush();
            }
            Object decode;
            try {
                decode = readSerial(wire);
            } catch (Exception ex) {
                decode = ex;  // oops!
            }
            assertEquals(mt, decode);
        }
    }
}
