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