/*
 * Copyright (C) 2009 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.
 */

/*
 * These are all tests of JNI, but where the JNI calls themselves are
 * represented as macro invocations. There are both C and C++ files which
 * include this file. A #if at the top of this file (immediately below)
 * detects which language is being used and defines macros accordingly.
 *
 * This file also defines a static method called runAllTests(), which
 * does what it says.
 */

#ifndef INCLUDED_FROM_WRAPPER
#error "This file should only be compiled by including it from a wrapper file."
#endif

#include "helper.h"
#include <inttypes.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>


/** reference to test class {@code InstanceFromNative} */
static jclass InstanceFromNative;

/** reference to test class {@code StaticFromNative} */
static jclass StaticFromNative;

/** reference to field {@code InstanceFromNative.theOne} */
static jfieldID InstanceFromNative_theOne;

/** reference to string {@code "biscuits"} */
static jstring biscuits;

/**
 * how to call a method: (virtual, direct, static) x (standard, array of
 * args, va_list) */
typedef enum {
    VIRTUAL_PLAIN, VIRTUAL_ARRAY, VIRTUAL_VA,
    DIRECT_PLAIN, DIRECT_ARRAY, DIRECT_VA,
    STATIC_PLAIN, STATIC_ARRAY, STATIC_VA,
} callType;

/*
 * CALL() calls the JNI function with the given name, using a JNIEnv
 * pointer named "env", and passing along any other arguments given.
 */
#ifdef __cplusplus
#define CALL(name, args...) env->name(args)
#else
/*
 * Note: The space before the comma below is significant with respect to
 * the processing of the ## operator.
 */
#define CALL(name, args...) (*env)->name(env , ## args)
#endif


/**
 * Simple assert-like macro which returns NULL if the two values are
 * equal, or an error message if they aren't.
 */
#define FAIL_IF_UNEQUAL(printfType, expected, actual)          \
    ((expected) == (actual)) ? NULL :                          \
        failure("expected " printfType " but got " printfType, \
                expected, actual);


/**
 * Initializes the static variables. Returns NULL on success or an
 * error string on failure.
 */
static char *initializeVariables(JNIEnv *env) {
    jclass clazz;
    jfieldID field;

    clazz = CALL(FindClass, "android/jni/cts/StaticFromNative");
    if (clazz == NULL) {
        return failure("could not find StaticFromNative");
    }

    StaticFromNative = (jclass) CALL(NewGlobalRef, clazz);

    clazz = CALL(FindClass, "android/jni/cts/InstanceFromNative");
    if (clazz == NULL) {
        return failure("could not find InstanceFromNative");
    }

    InstanceFromNative = (jclass) CALL(NewGlobalRef, clazz);

    field = CALL(GetStaticFieldID, InstanceFromNative, "theOne",
            "Landroid/jni/cts/InstanceFromNative;");
    if (field == NULL) {
        return failure("could not find InstanceFromNative.theOne");
    }

    InstanceFromNative_theOne = field;

    biscuits = CALL(NewStringUTF, "biscuits");
    if (biscuits == NULL) {
        return failure("could not construct string");
    }

    biscuits = (jstring) CALL(NewGlobalRef, biscuits);

    return NULL;
}

/**
 * Gets the standard instance of InstanceFromNative.
 */
static jobject getStandardInstance(JNIEnv *env) {
    return CALL(GetStaticObjectField, InstanceFromNative,
            InstanceFromNative_theOne);
}

/**
 * Looks up a static method on StaticFromNative.
 */
static jmethodID findStaticMethod(JNIEnv *env, char **errorMsg,
        const char *name, const char *sig) {
    jmethodID result = CALL(GetStaticMethodID, StaticFromNative,
            name, sig);

    if (result == NULL) {
        *errorMsg = failure("could not find static test method %s:%s",
                name, sig);
    }

    return result;
}

/**
 * Looks up an instance method on InstanceFromNative.
 */
static jmethodID findInstanceMethod(JNIEnv *env, char **errorMsg,
        const char *name, const char *sig) {
    jmethodID result = CALL(GetMethodID, InstanceFromNative, name, sig);

    if (result == NULL) {
        *errorMsg = failure("could not find instance test method %s:%s",
                name, sig);
    }

    return result;
}

/**
 * Looks up either an instance method on InstanceFromNative or a
 * static method on StaticFromNative, depending on the given
 * call type.
 */
static jmethodID findAppropriateMethod(JNIEnv *env, char **errorMsg,
        callType ct, const char *name, const char *sig) {
    if ((ct == STATIC_PLAIN) || (ct == STATIC_ARRAY) ||
            (ct == STATIC_VA)) {
        return findStaticMethod(env, errorMsg, name, sig);
    } else {
        return findInstanceMethod(env, errorMsg, name, sig);
    }
}


/*
 * The tests.
 */

// TODO: Missing functions:
//   AllocObject

static char *help_CallBooleanMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnBoolean", "()Z");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jboolean result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallBooleanMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallBooleanMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallBooleanMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticBooleanMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%d", true, result);
}

TEST_DECLARATION(CallBooleanMethod) {
    return help_CallBooleanMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallBooleanMethodA) {
    return help_CallBooleanMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallBooleanMethodV) {
    return help_CallBooleanMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualBooleanMethod) {
    return help_CallBooleanMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualBooleanMethodA) {
    return help_CallBooleanMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualBooleanMethodV) {
    return help_CallBooleanMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticBooleanMethod) {
    return help_CallBooleanMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticBooleanMethodA) {
    return help_CallBooleanMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticBooleanMethodV) {
    return help_CallBooleanMethod(env, STATIC_VA);
}

static char *help_CallByteMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnByte", "()B");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jbyte result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallByteMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallByteMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallByteMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualByteMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualByteMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualByteMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticByteMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticByteMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticByteMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%d", 14, result);
}

TEST_DECLARATION(CallByteMethod) {
    return help_CallByteMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallByteMethodA) {
    return help_CallByteMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallByteMethodV) {
    return help_CallByteMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualByteMethod) {
    return help_CallByteMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualByteMethodA) {
    return help_CallByteMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualByteMethodV) {
    return help_CallByteMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticByteMethod) {
    return help_CallByteMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticByteMethodA) {
    return help_CallByteMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticByteMethodV) {
    return help_CallByteMethod(env, STATIC_VA);
}

static char *help_CallShortMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnShort", "()S");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jshort result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallShortMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallShortMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallShortMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualShortMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualShortMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualShortMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticShortMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticShortMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticShortMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%d", -608, result);
}

TEST_DECLARATION(CallShortMethod) {
    return help_CallShortMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallShortMethodA) {
    return help_CallShortMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallShortMethodV) {
    return help_CallShortMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualShortMethod) {
    return help_CallShortMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualShortMethodA) {
    return help_CallShortMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualShortMethodV) {
    return help_CallShortMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticShortMethod) {
    return help_CallShortMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticShortMethodA) {
    return help_CallShortMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticShortMethodV) {
    return help_CallShortMethod(env, STATIC_VA);
}

static char *help_CallCharMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnChar", "()C");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jchar result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallCharMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallCharMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallCharMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualCharMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualCharMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualCharMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticCharMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticCharMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticCharMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%d", 9000, result);
}

TEST_DECLARATION(CallCharMethod) {
    return help_CallCharMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallCharMethodA) {
    return help_CallCharMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallCharMethodV) {
    return help_CallCharMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualCharMethod) {
    return help_CallCharMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualCharMethodA) {
    return help_CallCharMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualCharMethodV) {
    return help_CallCharMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticCharMethod) {
    return help_CallCharMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticCharMethodA) {
    return help_CallCharMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticCharMethodV) {
    return help_CallCharMethod(env, STATIC_VA);
}

static char *help_CallIntMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnInt", "()I");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jint result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallIntMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallIntMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallIntMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualIntMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualIntMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualIntMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticIntMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticIntMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticIntMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%d", 4004004, result);
}

TEST_DECLARATION(CallIntMethod) {
    return help_CallIntMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallIntMethodA) {
    return help_CallIntMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallIntMethodV) {
    return help_CallIntMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualIntMethod) {
    return help_CallIntMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualIntMethodA) {
    return help_CallIntMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualIntMethodV) {
    return help_CallIntMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticIntMethod) {
    return help_CallIntMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticIntMethodA) {
    return help_CallIntMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticIntMethodV) {
    return help_CallIntMethod(env, STATIC_VA);
}

static char *help_CallLongMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnLong", "()J");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jlong result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallLongMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallLongMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallLongMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualLongMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualLongMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualLongMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticLongMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticLongMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticLongMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%" PRId64, -80080080087LL, result);
}

TEST_DECLARATION(CallLongMethod) {
    return help_CallLongMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallLongMethodA) {
    return help_CallLongMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallLongMethodV) {
    return help_CallLongMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualLongMethod) {
    return help_CallLongMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualLongMethodA) {
    return help_CallLongMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualLongMethodV) {
    return help_CallLongMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticLongMethod) {
    return help_CallLongMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticLongMethodA) {
    return help_CallLongMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticLongMethodV) {
    return help_CallLongMethod(env, STATIC_VA);
}

static char *help_CallFloatMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnFloat", "()F");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jfloat result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallFloatMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallFloatMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallFloatMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualFloatMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualFloatMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualFloatMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticFloatMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticFloatMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticFloatMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%g", 2.5e22f, result);
}

TEST_DECLARATION(CallFloatMethod) {
    return help_CallFloatMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallFloatMethodA) {
    return help_CallFloatMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallFloatMethodV) {
    return help_CallFloatMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualFloatMethod) {
    return help_CallFloatMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualFloatMethodA) {
    return help_CallFloatMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualFloatMethodV) {
    return help_CallFloatMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticFloatMethod) {
    return help_CallFloatMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticFloatMethodA) {
    return help_CallFloatMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticFloatMethodV) {
    return help_CallFloatMethod(env, STATIC_VA);
}

static char *help_CallDoubleMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnDouble", "()D");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jdouble result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallDoubleMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallDoubleMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallDoubleMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualDoubleMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualDoubleMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualDoubleMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticDoubleMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticDoubleMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticDoubleMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%g", 7.503e100, result);
}

TEST_DECLARATION(CallDoubleMethod) {
    return help_CallDoubleMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallDoubleMethodA) {
    return help_CallDoubleMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallDoubleMethodV) {
    return help_CallDoubleMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualDoubleMethod) {
    return help_CallDoubleMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualDoubleMethodA) {
    return help_CallDoubleMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualDoubleMethodV) {
    return help_CallDoubleMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticDoubleMethod) {
    return help_CallDoubleMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticDoubleMethodA) {
    return help_CallDoubleMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticDoubleMethodV) {
    return help_CallDoubleMethod(env, STATIC_VA);
}

static char *help_CallVoidMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "nop", "()V");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    // For these, we simply consider "success" to be "didn't crash."

    switch (ct) {
        case VIRTUAL_PLAIN: {
            CALL(CallVoidMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            CALL(CallVoidMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            CALL(CallVoidMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            CALL(CallNonvirtualVoidMethod, o, InstanceFromNative,
                    method);
            break;
        }
        case DIRECT_ARRAY: {
            CALL(CallNonvirtualVoidMethodA, o, InstanceFromNative,
                    method, NULL);
            break;
        }
        case DIRECT_VA: {
            CALL(CallNonvirtualVoidMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            CALL(CallStaticVoidMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            CALL(CallStaticVoidMethodA, StaticFromNative, method,
                    NULL);
            break;
        }
        case STATIC_VA: {
            CALL(CallStaticVoidMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return NULL;
}

TEST_DECLARATION(CallVoidMethod) {
    return help_CallVoidMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallVoidMethodA) {
    return help_CallVoidMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallVoidMethodV) {
    return help_CallVoidMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualVoidMethod) {
    return help_CallVoidMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualVoidMethodA) {
    return help_CallVoidMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualVoidMethodV) {
    return help_CallVoidMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticVoidMethod) {
    return help_CallVoidMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticVoidMethodA) {
    return help_CallVoidMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticVoidMethodV) {
    return help_CallVoidMethod(env, STATIC_VA);
}

static char *help_CallObjectMethod(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "returnString", "()Ljava/lang/String;");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jstring result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = (jstring) CALL(CallObjectMethod, o, method);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = (jstring) CALL(CallObjectMethodA, o, method, NULL);
            break;
        }
        case VIRTUAL_VA: {
            result = (jstring) CALL(CallObjectMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = (jstring)
                CALL(CallNonvirtualObjectMethod, o, InstanceFromNative,
                        method);
            break;
        }
        case DIRECT_ARRAY: {
            result = (jstring)
                CALL(CallNonvirtualObjectMethodA, o, InstanceFromNative,
                        method, NULL);
            break;
        }
        case DIRECT_VA: {
            result = (jstring)
                CALL(CallNonvirtualObjectMethodV, o, InstanceFromNative,
                        method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = (jstring)
                CALL(CallStaticObjectMethod, StaticFromNative, method);
            break;
        }
        case STATIC_ARRAY: {
            result = (jstring)
                CALL(CallStaticObjectMethodA, StaticFromNative, method, NULL);
            break;
        }
        case STATIC_VA: {
            result = (jstring)
                CALL(CallStaticObjectMethodV, StaticFromNative, method, args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    if (result == NULL) {
        return failure("got null from call");
    }

    const char *utf = CALL(GetStringUTFChars, result, NULL);

    if (strcmp(utf, "muffins") == 0) {
        msg = NULL;
    } else {
        msg = failure("unexpected string: %s", utf);
    }

    CALL(ReleaseStringUTFChars, result, utf);

    return msg;
}

TEST_DECLARATION(CallObjectMethod) {
    return help_CallObjectMethod(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(CallObjectMethodA) {
    return help_CallObjectMethod(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(CallObjectMethodV) {
    return help_CallObjectMethod(env, VIRTUAL_VA);
}

TEST_DECLARATION(CallNonvirtualObjectMethod) {
    return help_CallObjectMethod(env, DIRECT_PLAIN);
}

TEST_DECLARATION(CallNonvirtualObjectMethodA) {
    return help_CallObjectMethod(env, DIRECT_ARRAY);
}

TEST_DECLARATION(CallNonvirtualObjectMethodV) {
    return help_CallObjectMethod(env, DIRECT_VA);
}

TEST_DECLARATION(CallStaticObjectMethod) {
    return help_CallObjectMethod(env, STATIC_PLAIN);
}

TEST_DECLARATION(CallStaticObjectMethodA) {
    return help_CallObjectMethod(env, STATIC_ARRAY);
}

TEST_DECLARATION(CallStaticObjectMethodV) {
    return help_CallObjectMethod(env, STATIC_VA);
}

static char *help_TakeOneOfEach(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "takeOneOfEach", "(DFJICSBZLjava/lang/String;)Z");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jvalue jargs[] = {
        {.d = 0.0}, {.f = 1.0f}, {.j = 2LL}, {.i = 3}, {.c = 4}, {.s = 5},
        {.b = 6}, {.z = true}, {.l = biscuits}
    };

    jboolean result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallBooleanMethod, o, method,
                    0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
                    (jboolean) true, biscuits);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallBooleanMethodA, o, method, jargs);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallBooleanMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
                    method,
                    0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
                    (jboolean) true, biscuits);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
                    method, jargs);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticBooleanMethod, StaticFromNative, method,
                    0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
                    (jboolean) true, biscuits);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
                    jargs);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%d", true, result);
}

TEST_DECLARATION(TakeOneOfEach) {
    return help_TakeOneOfEach(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(TakeOneOfEachA) {
    return help_TakeOneOfEach(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(TakeOneOfEachV) {
    return help_TakeOneOfEach(env, VIRTUAL_VA,
            0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
            (jboolean) true, biscuits);
}

TEST_DECLARATION(NonvirtualTakeOneOfEach) {
    return help_TakeOneOfEach(env, DIRECT_PLAIN);
}

TEST_DECLARATION(NonvirtualTakeOneOfEachA) {
    return help_TakeOneOfEach(env, DIRECT_ARRAY);
}

TEST_DECLARATION(NonvirtualTakeOneOfEachV) {
    return help_TakeOneOfEach(env, DIRECT_VA,
            0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
            (jboolean) true, biscuits);
}

TEST_DECLARATION(StaticTakeOneOfEach) {
    return help_TakeOneOfEach(env, STATIC_PLAIN);
}

TEST_DECLARATION(StaticTakeOneOfEachA) {
    return help_TakeOneOfEach(env, STATIC_ARRAY);
}

TEST_DECLARATION(StaticTakeOneOfEachV) {
    return help_TakeOneOfEach(env, STATIC_VA,
            0.0, 1.0f, 2LL, 3, (jchar) 4, (jshort) 5, (jbyte) 6,
            (jboolean) true, biscuits);
}

static char *help_TakeCoolHandLuke(JNIEnv *env, int ct, ...) {
    va_list args;
    va_start(args, ct);

    char *msg;
    jobject o = getStandardInstance(env);
    jmethodID method = findAppropriateMethod(env, &msg, (callType)ct,
            "takeCoolHandLuke",
            "(IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII)Z");

    if (method == NULL) {
        va_end(args);
        return msg;
    }

    jvalue jargs[] = {
        {.i = 1}, {.i = 2}, {.i = 3}, {.i = 4},
        {.i = 5}, {.i = 6}, {.i = 7}, {.i = 8}, {.i = 9}, 
        {.i = 10}, {.i = 11}, {.i = 12}, {.i = 13}, {.i = 14},
        {.i = 15}, {.i = 16}, {.i = 17}, {.i = 18}, {.i = 19}, 
        {.i = 20}, {.i = 21}, {.i = 22}, {.i = 23}, {.i = 24},
        {.i = 25}, {.i = 26}, {.i = 27}, {.i = 28}, {.i = 29}, 
        {.i = 30}, {.i = 31}, {.i = 32}, {.i = 33}, {.i = 34},
        {.i = 35}, {.i = 36}, {.i = 37}, {.i = 38}, {.i = 39}, 
        {.i = 40}, {.i = 41}, {.i = 42}, {.i = 43}, {.i = 44},
        {.i = 45}, {.i = 46}, {.i = 47}, {.i = 48}, {.i = 49},
        {.i = 50}
    };

    jboolean result;

    switch (ct) {
        case VIRTUAL_PLAIN: {
            result = CALL(CallBooleanMethod, o, method,
                    1, 2, 3, 4, 5, 6, 7, 8, 9,
                    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
                    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
                    30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
                    40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
                    50);
            break;
        }
        case VIRTUAL_ARRAY: {
            result = CALL(CallBooleanMethodA, o, method, jargs);
            break;
        }
        case VIRTUAL_VA: {
            result = CALL(CallBooleanMethodV, o, method, args);
            break;
        }
        case DIRECT_PLAIN: {
            result = CALL(CallNonvirtualBooleanMethod, o, InstanceFromNative,
                    method,
                    1, 2, 3, 4, 5, 6, 7, 8, 9,
                    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
                    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
                    30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
                    40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
                    50);
            break;
        }
        case DIRECT_ARRAY: {
            result = CALL(CallNonvirtualBooleanMethodA, o, InstanceFromNative,
                    method, jargs);
            break;
        }
        case DIRECT_VA: {
            result = CALL(CallNonvirtualBooleanMethodV, o, InstanceFromNative,
                    method, args);
            break;
        }
        case STATIC_PLAIN: {
            result = CALL(CallStaticBooleanMethod, StaticFromNative, method,
                    1, 2, 3, 4, 5, 6, 7, 8, 9,
                    10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
                    20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
                    30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
                    40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
                    50);
            break;
        }
        case STATIC_ARRAY: {
            result = CALL(CallStaticBooleanMethodA, StaticFromNative, method,
                    jargs);
            break;
        }
        case STATIC_VA: {
            result = CALL(CallStaticBooleanMethodV, StaticFromNative, method,
                    args);
            break;
        }
        default: {
            va_end(args);
            return failure("shouldn't happen");
        }
    }

    va_end(args);

    return FAIL_IF_UNEQUAL("%d", true, result);
}

TEST_DECLARATION(TakeCoolHandLuke) {
    return help_TakeCoolHandLuke(env, VIRTUAL_PLAIN);
}

TEST_DECLARATION(TakeCoolHandLukeA) {
    return help_TakeCoolHandLuke(env, VIRTUAL_ARRAY);
}

TEST_DECLARATION(TakeCoolHandLukeV) {
    return help_TakeCoolHandLuke(env, VIRTUAL_VA,
            1, 2, 3, 4, 5, 6, 7, 8, 9,
            10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
            20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
            30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
            40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
            50);
}

TEST_DECLARATION(NonvirtualTakeCoolHandLuke) {
    return help_TakeCoolHandLuke(env, DIRECT_PLAIN);
}

TEST_DECLARATION(NonvirtualTakeCoolHandLukeA) {
    return help_TakeCoolHandLuke(env, DIRECT_ARRAY);
}

TEST_DECLARATION(NonvirtualTakeCoolHandLukeV) {
    return help_TakeCoolHandLuke(env, DIRECT_VA,
            1, 2, 3, 4, 5, 6, 7, 8, 9,
            10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
            20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
            30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
            40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
            50);
}

TEST_DECLARATION(StaticTakeCoolHandLuke) {
    return help_TakeCoolHandLuke(env, STATIC_PLAIN);
}

TEST_DECLARATION(StaticTakeCoolHandLukeA) {
    return help_TakeCoolHandLuke(env, STATIC_ARRAY);
}

TEST_DECLARATION(StaticTakeCoolHandLukeV) {
    return help_TakeCoolHandLuke(env, STATIC_VA,
            1, 2, 3, 4, 5, 6, 7, 8, 9,
            10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
            20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
            30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
            40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
            50);
}

TEST_DECLARATION(DefineClass) {
    // Android implementations should always return NULL.
    jclass clazz = CALL(DefineClass, "foo", NULL, NULL, 0);

    if (clazz != NULL) {
        return failure("Expected NULL but got %p", clazz);
    }

    return NULL;
}

// TODO: Missing functions:
//   DeleteLocalRef
//   DeleteWeakGlobalRef
//   EnsureLocalCapacity
//   ExceptionCheck
//   ExceptionClear
//   ExceptionDescribe
//   ExceptionOccurred
//   FatalError (Note: impossible to test in this framework)
//   FindClass
//   FromReflectedField
//   FromReflectedMethod
//   GetArrayLength
//   GetBooleanArrayElements
//   GetBooleanArrayRegion
//   GetBooleanField
//   GetByteArrayElements
//   GetByteArrayRegion
//   GetByteField
//   GetCharArrayElements
//   GetCharArrayRegion
//   GetCharField
//   GetDirectBufferAddress
//   GetDirectBufferCapacity
//   GetDoubleArrayElements
//   GetDoubleArrayRegion
//   GetDoubleField
//   GetFieldID
//   GetFloatArrayElements
//   GetFloatArrayRegion
//   GetFloatField
//   GetIntArrayElements
//   GetIntArrayRegion
//   GetIntField
//   GetJavaVM
//   GetLongArrayElements
//   GetLongArrayRegion
//   GetLongField
//   GetMethodID
//   GetObjectArrayElement
//   GetObjectClass
//   GetObjectField
//   GetObjectRefType (since 1.6)
//   GetPrimitiveArrayCritical
//   GetShortArrayElements
//   GetShortArrayRegion
//   GetShortField
//   GetStaticBooleanField
//   GetStaticByteField
//   GetStaticCharField
//   GetStaticDoubleField
//   GetStaticFieldID
//   GetStaticFloatField
//   GetStaticIntField
//   GetStaticLongField
//   GetStaticMethodID
//   GetStaticObjectField
//   GetStaticShortField
//   GetStringChars
//   GetStringCritical
//   GetStringLength
//   GetStringRegion
//   GetStringUTFChars
//   GetStringUTFLength
//   GetStringUTFRegion
//   GetSuperclass

TEST_DECLARATION(GetVersion) {
    // Android implementations should all be at version 1.6.
    jint version = CALL(GetVersion);

    if (version != JNI_VERSION_1_6) {
        return failure("Expected JNI_VERSION_1_6 but got 0x%x", version);
    }

    return NULL;
}

// TODO: Missing functions:
//   IsAssignableFrom
//   IsInstanceOf
//   IsSameObject
//   MonitorEnter
//   MonitorExit
//   NewBooleanArray
//   NewByteArray
//   NewCharArray
//   NewDirectByteBuffer
//   NewDoubleArray
//   NewFloatArray
//   NewGlobalRef
//   NewIntArray
//   NewLocalRef
//   NewLongArray
//   NewObject
//   NewObjectA
//   NewObjectArray
//   NewObjectV
//   NewShortArray
//   NewString
//   NewStringUTF
//   NewWeakGlobalRef
//   PopLocalFrame
//   PushLocalFrame
//   RegisterNatives
//   ReleaseBooleanArrayElements
//   ReleaseByteArrayElements
//   ReleaseCharArrayElements
//   ReleaseDoubleArrayElements
//   ReleaseFloatArrayElements
//   ReleaseIntArrayElements
//   ReleaseLongArrayElements
//   ReleasePrimitiveArrayCritical
//   ReleaseShortArrayElements
//   ReleaseStringChars
//   ReleaseStringCritical
//   ReleaseStringUTFChars
//   SetBooleanArrayRegion
//   SetBooleanField
//   SetByteArrayRegion
//   SetByteField
//   SetCharArrayRegion
//   SetCharField
//   SetDoubleArrayRegion
//   SetDoubleField
//   SetFloatArrayRegion
//   SetFloatField
//   SetIntArrayRegion
//   SetIntField
//   SetLongArrayRegion
//   SetLongField
//   SetObjectArrayElement
//   SetObjectField
//   SetShortArrayRegion
//   SetShortField
//   SetStaticBooleanField
//   SetStaticByteField
//   SetStaticCharField
//   SetStaticDoubleField
//   SetStaticFloatField
//   SetStaticIntField
//   SetStaticLongField
//   SetStaticObjectField
//   SetStaticShortField
//   Throw
//   ThrowNew
//   ToReflectedField
//   ToReflectedMethod
//   UnregisterNatives



/**
 * Runs all the tests, returning NULL if they all succeeded, or
 * a string listing information about all the failures.
 */
static jstring runAllTests(JNIEnv *env) {
    char *result = initializeVariables(env);

    if (CALL(ExceptionOccurred)) {
        CALL(ExceptionDescribe);
        CALL(ExceptionClear);
    }

    if (result == NULL) {
        result = runJniTests(env,
                RUN_TEST(CallBooleanMethod),
                RUN_TEST(CallBooleanMethodA),
                RUN_TEST(CallBooleanMethodV),
                RUN_TEST(CallNonvirtualBooleanMethod),
                RUN_TEST(CallNonvirtualBooleanMethodA),
                RUN_TEST(CallNonvirtualBooleanMethodV),
                RUN_TEST(CallStaticBooleanMethod),
                RUN_TEST(CallStaticBooleanMethodA),
                RUN_TEST(CallStaticBooleanMethodV),

                RUN_TEST(CallByteMethod),
                RUN_TEST(CallByteMethodA),
                RUN_TEST(CallByteMethodV),
                RUN_TEST(CallNonvirtualByteMethod),
                RUN_TEST(CallNonvirtualByteMethodA),
                RUN_TEST(CallNonvirtualByteMethodV),
                RUN_TEST(CallStaticByteMethod),
                RUN_TEST(CallStaticByteMethodA),
                RUN_TEST(CallStaticByteMethodV),

                RUN_TEST(CallShortMethod),
                RUN_TEST(CallShortMethodA),
                RUN_TEST(CallShortMethodV),
                RUN_TEST(CallNonvirtualShortMethod),
                RUN_TEST(CallNonvirtualShortMethodA),
                RUN_TEST(CallNonvirtualShortMethodV),
                RUN_TEST(CallStaticShortMethod),
                RUN_TEST(CallStaticShortMethodA),
                RUN_TEST(CallStaticShortMethodV),

                RUN_TEST(CallCharMethod),
                RUN_TEST(CallCharMethodA),
                RUN_TEST(CallCharMethodV),
                RUN_TEST(CallNonvirtualCharMethod),
                RUN_TEST(CallNonvirtualCharMethodA),
                RUN_TEST(CallNonvirtualCharMethodV),
                RUN_TEST(CallStaticCharMethod),
                RUN_TEST(CallStaticCharMethodA),
                RUN_TEST(CallStaticCharMethodV),

                RUN_TEST(CallIntMethod),
                RUN_TEST(CallIntMethodA),
                RUN_TEST(CallIntMethodV),
                RUN_TEST(CallNonvirtualIntMethod),
                RUN_TEST(CallNonvirtualIntMethodA),
                RUN_TEST(CallNonvirtualIntMethodV),
                RUN_TEST(CallStaticIntMethod),
                RUN_TEST(CallStaticIntMethodA),
                RUN_TEST(CallStaticIntMethodV),

                RUN_TEST(CallLongMethod),
                RUN_TEST(CallLongMethodA),
                RUN_TEST(CallLongMethodV),
                RUN_TEST(CallNonvirtualLongMethod),
                RUN_TEST(CallNonvirtualLongMethodA),
                RUN_TEST(CallNonvirtualLongMethodV),
                RUN_TEST(CallStaticLongMethod),
                RUN_TEST(CallStaticLongMethodA),
                RUN_TEST(CallStaticLongMethodV),

                RUN_TEST(CallFloatMethod),
                RUN_TEST(CallFloatMethodA),
                RUN_TEST(CallFloatMethodV),
                RUN_TEST(CallNonvirtualFloatMethod),
                RUN_TEST(CallNonvirtualFloatMethodA),
                RUN_TEST(CallNonvirtualFloatMethodV),
                RUN_TEST(CallStaticFloatMethod),
                RUN_TEST(CallStaticFloatMethodA),
                RUN_TEST(CallStaticFloatMethodV),

                RUN_TEST(CallDoubleMethod),
                RUN_TEST(CallDoubleMethodA),
                RUN_TEST(CallDoubleMethodV),
                RUN_TEST(CallNonvirtualDoubleMethod),
                RUN_TEST(CallNonvirtualDoubleMethodA),
                RUN_TEST(CallNonvirtualDoubleMethodV),
                RUN_TEST(CallStaticDoubleMethod),
                RUN_TEST(CallStaticDoubleMethodA),
                RUN_TEST(CallStaticDoubleMethodV),

                RUN_TEST(CallVoidMethod),
                RUN_TEST(CallVoidMethodA),
                RUN_TEST(CallVoidMethodV),
                RUN_TEST(CallNonvirtualVoidMethod),
                RUN_TEST(CallNonvirtualVoidMethodA),
                RUN_TEST(CallNonvirtualVoidMethodV),
                RUN_TEST(CallStaticVoidMethod),
                RUN_TEST(CallStaticVoidMethodA),
                RUN_TEST(CallStaticVoidMethodV),

                RUN_TEST(CallObjectMethod),
                RUN_TEST(CallObjectMethodA),
                RUN_TEST(CallObjectMethodV),
                RUN_TEST(CallNonvirtualObjectMethod),
                RUN_TEST(CallNonvirtualObjectMethodA),
                RUN_TEST(CallNonvirtualObjectMethodV),
                RUN_TEST(CallStaticObjectMethod),
                RUN_TEST(CallStaticObjectMethodA),
                RUN_TEST(CallStaticObjectMethodV),

                RUN_TEST(TakeOneOfEach),
                RUN_TEST(TakeOneOfEachA),
                RUN_TEST(TakeOneOfEachV),
                RUN_TEST(NonvirtualTakeOneOfEach),
                RUN_TEST(NonvirtualTakeOneOfEachA),
                RUN_TEST(NonvirtualTakeOneOfEachV),
                RUN_TEST(StaticTakeOneOfEach),
                RUN_TEST(StaticTakeOneOfEachA),
                RUN_TEST(StaticTakeOneOfEachV),

                RUN_TEST(TakeCoolHandLuke),
                RUN_TEST(TakeCoolHandLukeA),
                RUN_TEST(TakeCoolHandLukeV),
                RUN_TEST(NonvirtualTakeCoolHandLuke),
                RUN_TEST(NonvirtualTakeCoolHandLukeA),
                RUN_TEST(NonvirtualTakeCoolHandLukeV),
                RUN_TEST(StaticTakeCoolHandLuke),
                RUN_TEST(StaticTakeCoolHandLukeA),
                RUN_TEST(StaticTakeCoolHandLukeV),

                RUN_TEST(DefineClass),
                RUN_TEST(GetVersion),
                NULL);

        // TODO: Add more tests, above.
    }

    if (result != NULL) {
        jstring s = CALL(NewStringUTF, result);
        free(result);
        return s;
    }

    return NULL;
}
