141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines/*
241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * Copyright (C) 2008 The Android Open Source Project
341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines *
441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * you may not use this file except in compliance with the License.
641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * You may obtain a copy of the License at
741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines *
841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines *      http://www.apache.org/licenses/LICENSE-2.0
941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines *
1041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * Unless required by applicable law or agreed to in writing, software
1141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
1241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * See the License for the specific language governing permissions and
1441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines * limitations under the License.
1541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines */
1641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
1741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinespackage com.android.rs.test_v11;
1841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
1941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.content.Context;
2041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.content.res.Resources;
2141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.renderscript.*;
2241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport android.util.Log;
2341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport java.util.ArrayList;
2441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport java.util.ListIterator;
2541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport java.util.Timer;
2641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinesimport java.util.TimerTask;
2741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
2841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
2941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hinespublic class RSTestCore {
3041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    int mWidth;
3141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    int mHeight;
3241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    Context mCtx;
3341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
3441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public RSTestCore(Context ctx) {
3541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mCtx = ctx;
3641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    }
3741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
3841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private Resources mRes;
3941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private RenderScriptGL mRS;
4041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
4141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private Font mFont;
4241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    ScriptField_ListAllocs_s mListAllocs;
4341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    int mLastX;
4441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    int mLastY;
4541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private ScriptC_rslist mScript;
4641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
4741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private ArrayList<UnitTest> unitTests;
4841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private ListIterator<UnitTest> test_iter;
4941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private UnitTest activeTest;
5041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private boolean stopTesting;
5141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
5241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    /* Periodic timer for ensuring future tests get scheduled */
5341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    private Timer mTimer;
5441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public static final int RS_TIMER_PERIOD = 100;
5541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
5641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public void init(RenderScriptGL rs, Resources res, int width, int height) {
5741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mRS = rs;
5841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mRes = res;
5941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mWidth = width;
6041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mHeight = height;
6141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        stopTesting = false;
6241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
6341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mScript = new ScriptC_rslist(mRS, mRes, R.raw.rslist);
6441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
6541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests = new ArrayList<UnitTest>();
6641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
6741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UT_primitives(this, mRes, mCtx));
6841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UT_rsdebug(this, mRes, mCtx));
6941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UT_rstime(this, mRes, mCtx));
7041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UT_rstypes(this, mRes, mCtx));
7141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UT_math(this, mRes, mCtx));
7241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UT_fp_mad(this, mRes, mCtx));
7341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        /*
7441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UnitTest(null, "<Pass>", 1));
7541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UnitTest());
7641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        unitTests.add(new UnitTest(null, "<Fail>", -1));
7741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
7841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        for (int i = 0; i < 20; i++) {
7941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            unitTests.add(new UnitTest(null, "<Pass>", 1));
8041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        }
8141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        */
8241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
8341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        UnitTest [] uta = new UnitTest[unitTests.size()];
8441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        uta = unitTests.toArray(uta);
8541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
8641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mListAllocs = new ScriptField_ListAllocs_s(mRS, uta.length);
8741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        for (int i = 0; i < uta.length; i++) {
8841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            ScriptField_ListAllocs_s.Item listElem = new ScriptField_ListAllocs_s.Item();
8941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            listElem.text = Allocation.createFromString(mRS, uta[i].name, Allocation.USAGE_SCRIPT);
9041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            listElem.result = uta[i].result;
9141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            mListAllocs.set(listElem, i, false);
9241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            uta[i].setItem(listElem);
9341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        }
9441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
9541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mListAllocs.copyAll();
9641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
9741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mScript.bind_gList(mListAllocs);
9841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
9941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mFont = Font.create(mRS, mRes, "serif", Font.Style.BOLD, 8);
10041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mScript.set_gFont(mFont);
10141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
10241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mRS.bindRootScript(mScript);
10341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
10441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        test_iter = unitTests.listIterator();
10541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        refreshTestResults(); /* Kick off the first test */
10641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
10741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        TimerTask pTask = new TimerTask() {
10841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            public void run() {
10941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                refreshTestResults();
11041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            }
11141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        };
11241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
11341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mTimer = new Timer();
11441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mTimer.schedule(pTask, RS_TIMER_PERIOD, RS_TIMER_PERIOD);
11541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    }
11641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
11741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public void checkAndRunNextTest() {
11841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        if (activeTest != null) {
11941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            if (!activeTest.isAlive()) {
12041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                /* Properly clean up on our last test */
12141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                try {
12241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                    activeTest.join();
12341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                }
12441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                catch (InterruptedException e) {
12541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                }
12641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                activeTest = null;
12741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            }
12841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        }
12941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
13041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        if (!stopTesting && activeTest == null) {
13141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            if (test_iter.hasNext()) {
13241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                activeTest = test_iter.next();
13341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                activeTest.start();
13441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                /* This routine will only get called once when a new test
13541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                 * should start running. The message handler in UnitTest.java
13641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                 * ensures this. */
13741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            }
13841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            else {
13941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                if (mTimer != null) {
14041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                    mTimer.cancel();
14141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                    mTimer.purge();
14241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                    mTimer = null;
14341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                }
14441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            }
14541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        }
14641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    }
14741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
14841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public void refreshTestResults() {
14941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        checkAndRunNextTest();
15041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
15141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        if (mListAllocs != null && mScript != null && mRS != null) {
15241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            mListAllocs.copyAll();
15341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
15441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            mScript.bind_gList(mListAllocs);
15541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            mRS.bindRootScript(mScript);
15641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        }
15741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    }
15841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
15941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public void cleanup() {
16041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        stopTesting = true;
16141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        UnitTest t = activeTest;
16241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
16341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        /* Stop periodic refresh of testing */
16441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        if (mTimer != null) {
16541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            mTimer.cancel();
16641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            mTimer.purge();
16741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            mTimer = null;
16841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        }
16941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
17041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        /* Wait to exit until we finish the current test */
17141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        if (t != null) {
17241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            try {
17341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines                t.join();
17441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            }
17541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            catch (InterruptedException e) {
17641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            }
17741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            t = null;
17841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        }
17941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
18041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    }
18141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
18241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public void newTouchPosition(float x, float y, float pressure, int id) {
18341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    }
18441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
18541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public void onActionDown(int x, int y) {
18641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mScript.set_gDY(0.0f);
18741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mLastX = x;
18841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mLastY = y;
18941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        refreshTestResults();
19041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    }
19141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
19241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    public void onActionMove(int x, int y) {
19341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        int dx = mLastX - x;
19441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        int dy = mLastY - y;
19541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
19641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        if (Math.abs(dy) <= 2) {
19741f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines            dy = 0;
19841f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        }
19941f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
20041f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mScript.set_gDY(dy);
20141f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines
20241f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mLastX = x;
20341f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        mLastY = y;
20441f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines        refreshTestResults();
20541f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines    }
20641f1e5edee2d2663ae46b64528894896ff96fa3dStephen Hines}
207