/*
 * Copyright (C) 2012 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.util.concurrent.Semaphore;
import java.util.Random;

import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript.RSMessageHandler;

public class SendToClient extends RSBaseCompute {
    private Allocation mInAllocation;
    private static final Semaphore mSync = new Semaphore(0);
    private static Random random = new Random();

    int outArray[] = new int[4];
    RSMessageHandler mRsMessage = new RSMessageHandler() {
        public void run() {
            switch (mID) {
                default:
                    outArray[0] = mID;
                    outArray[1] = mData[0];
                    outArray[2] = mData[1];
                    outArray[3] = mData[2];
                    try {
                        mSync.release();
                    } catch (Exception e) {
                        //TODO: handle exception
                    }
                    return;
            }
        }
    };

    /*
     * test rsSendToClient(int cmdID, const void* data, uint len);
     */
    public void testSendToClient() {
        int[] inArray = new int[4];
        for (int i=0; i<4; i++) {
             inArray[i] = random.nextInt(1000);
        }
        mInAllocation = Allocation.createSized(mRS, Element.I32_4(mRS), 1);
        mInAllocation.copyFrom(inArray);
        ScriptC_send_to_client mScript;
        mRS.setMessageHandler(mRsMessage);
        mScript = new ScriptC_send_to_client(mRS);
        mScript.forEach_root(mInAllocation);
        try {
            mSync.acquire();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (int i=0; i<inArray.length; i++) {
            assertEquals(createErrorMsgF(i, inArray[i], outArray[i]),
                    inArray[i], outArray[i]);
        }
    }

    /*
     * test rsSendToClient(int cmdID)
     */
    public void testSendToClient1(){
        outArray[0] = 0;
        int Id = random.nextInt(100);
        mRS.setMessageHandler(mRsMessage);
        ScriptC_send_to_client_1 mScript;
        mScript = new ScriptC_send_to_client_1(mRS);
        mScript.invoke_callback(Id);
        try {
            mSync.acquire();
        } catch (InterruptedException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }
        assertEquals(createErrorMsgF(1, Id, outArray[0]), Id, outArray[0]);
    }

    private String createErrorMsgF(int i, int in, int temp) {
        StringBuffer bf = new StringBuffer();
        bf.append("[Wrong value]");
        bf.append("; i = " + i);
        bf.append("; InValue = " + in);
        bf.append("; exceptValue = " + temp);
        return bf.toString();
    }
}
