/*
 * Copyright (C) 2015 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 android.renderscript.cts;


import java.lang.reflect.Field;
import java.lang.reflect.Method;

import android.content.Context;
import android.renderscript.RSRuntimeException;

public class ThunkerCreateTest extends RSBase {

    public void testCreateReflection() {
        int sdkVersion = mCtx.getApplicationInfo().targetSdkVersion;

        try {
            Class<?> javaRS = Class.forName("android.renderscript.RenderScript");
            Class[] signature = {Context.class, Integer.TYPE};
            Object[] args = {mCtx, new Integer(sdkVersion)};
            Method create = javaRS.getDeclaredMethod("create", signature);

            assertTrue (create.invoke(null, args) != null);
        }
        catch (Exception e) {
            throw new RSRuntimeException("Failure to create platform RenderScript context");
        }

    }
}


