175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm/**
275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * Copyright (c) 2008, Google Inc.
375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm *
475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * Licensed under the Apache License, Version 2.0 (the "License");
575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * you may not use this file except in compliance with the License.
675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * You may obtain a copy of the License at
775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm *
875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm *     http://www.apache.org/licenses/LICENSE-2.0
975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm *
1075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * Unless required by applicable law or agreed to in writing, software
1175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * distributed under the License is distributed on an "AS IS" BASIS,
1275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * See the License for the specific language governing permissions and
1475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * limitations under the License.
1575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm */
1675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
1775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmpackage com.android.calculator2;
1875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
1975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.app.Activity;
2075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.app.Instrumentation;
2175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.app.Instrumentation.ActivityMonitor;
2275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.content.Intent;
2375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.content.IntentFilter;
2475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.test.ActivityInstrumentationTestCase;
2575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.test.suitebuilder.annotation.LargeTest;
2675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.util.Log;
2775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.view.KeyEvent;
2875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.view.View;
2975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.widget.Button;
3075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.widget.LinearLayout;
314a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehmimport android.widget.TextView;
3275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.graphics.Rect;
3375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport android.test.TouchUtils;
3475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
3575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport com.android.calculator2.Calculator;
3675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport com.android.calculator2.R;
3775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmimport com.android.calculator2.CalculatorResult;
3875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
3975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm/**
4075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm * Instrumentation tests for poking some buttons
4175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm *
4275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm */
4375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
4475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehmpublic class CalculatorHitSomeButtons extends ActivityInstrumentationTestCase <Calculator>{
4575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    public boolean setup = false;
4675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    private static final String TAG = "CalculatorTests";
4775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    Calculator mActivity = null;
4875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    Instrumentation mInst = null;
4975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
5075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    public CalculatorHitSomeButtons() {
5175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        super("com.android.calculator2", Calculator.class);
5275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
5375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
5475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    @Override
5575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    protected void setUp() throws Exception {
5675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        super.setUp();
5775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
5875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        mActivity = getActivity();
5975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        mInst = getInstrumentation();
6075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
6175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
6275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    @Override
6375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    protected void tearDown() throws Exception {
6475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        super.tearDown();
6575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
6675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
674a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm
6875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    @LargeTest
6975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    public void testPressSomeKeys() {
7075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        Log.v(TAG, "Pressing some keys!");
7175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
7275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // Make sure that we clear the output
7375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        press(KeyEvent.KEYCODE_ENTER);
7475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        press(KeyEvent.KEYCODE_CLEAR);
7575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
7675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // 3 + 4 * 5 => 23
7775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        press(KeyEvent.KEYCODE_3);
7875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        press(KeyEvent.KEYCODE_PLUS);
7975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        press(KeyEvent.KEYCODE_4);
8075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        press(KeyEvent.KEYCODE_9 | KeyEvent.META_SHIFT_ON);
8175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        press(KeyEvent.KEYCODE_5);
8275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        press(KeyEvent.KEYCODE_ENTER);
8375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
8475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        checkDisplay("23");
8575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
864a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm
8775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
8875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    @LargeTest
8975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    public void testTapSomeButtons() {
9075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // TODO: This probably makes way too many hardcoded assumptions about locale.
9175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // The calculator will need a routine to internationalize the output.
9275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // We should use that here, too.
9375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        Log.v(TAG, "Tapping some buttons!");
9475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
9575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // Make sure that we clear the output
9675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.eq);
9775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.del);
9875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
9975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // 567 / 3 => 189
10075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.digit_5);
10175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.digit_6);
10275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.digit_7);
10375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.op_div);
10475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.digit_3);
1054a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.dec_point);
10675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.eq);
10775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
10875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        checkDisplay("189");
10975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
11075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // make sure we can continue calculations also
11175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // 189 - 789 => -600
11275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.op_sub);
11375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.digit_7);
11475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.digit_8);
11575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.digit_9);
11675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        tap(R.id.eq);
11775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
11875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        // Careful: the first digit in the expected value is \u2212, not "-" (a hyphen)
11975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        checkDisplay(mActivity.getString(R.string.op_sub) + "600");
1204a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm
1214a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.dec_point);
1224a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.digit_5);
1234a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.op_add);
1244a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.dec_point);
1254a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.digit_5);
1264a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.eq);
1274a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        checkDisplay("1");
1284a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm
1294a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.digit_5);
1304a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.op_div);
1314a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.digit_3);
1324a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.dec_point);
1334a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.digit_5);
1344a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.op_mul);
1354a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.digit_7);
1364a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        tap(R.id.eq);
1374a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        checkDisplay("10");
13875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
13975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
14075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    // helper functions
14175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    private void press(int keycode) {
14275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        mInst.sendKeyDownUpSync(keycode);
14375ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
14475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
1454a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm    private void tap(int id) {
14675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        View view = mActivity.findViewById(id);
1474a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        assertNotNull(view);
1484a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        TouchUtils.clickView(this, view);
14975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
15075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
15175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    private void checkDisplay(final String s) {
1524a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm    /*
1534a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        FIXME: This doesn't yet work.
1544a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        try {
1554a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm            Thread.sleep(20);
1564a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm            runTestOnUiThread(new Runnable () {
1574a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm                @Override
1584a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm                public void run() {
1594a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm                    Log.v(TAG, "Display:" + displayVal());
1604a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm                    assertEquals(s, displayVal());
16175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm                }
1624a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm            });
1634a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        } catch (Throwable e) {
1644a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm            fail("unexpected exception" + e);
1654a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        }
1664a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm    */
16775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
16875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
16975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    private String displayVal() {
17075ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        CalculatorResult display = (CalculatorResult) mActivity.findViewById(R.id.result);
17175ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        assertNotNull(display);
17275ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
1734a6b7cb235c305761af5d7f40e74d4704e5058c8Hans Boehm        TextView box = (TextView) display;
17475ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        assertNotNull(box);
17575ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
17675ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm        return box.getText().toString();
17775ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm    }
17875ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm}
17975ca21c698808b61238a3aff3e0a3dfd5ba95d0eHans Boehm
180