11d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov/* 21d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * Copyright (C) 2015 The Android Open Source Project 31d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 41d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * Licensed under the Apache License, Version 2.0 (the "License"); 51d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * you may not use this file except in compliance with the License. 61d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * You may obtain a copy of the License at 71d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 81d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * http://www.apache.org/licenses/LICENSE-2.0 91d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 101d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * Unless required by applicable law or agreed to in writing, software 111d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * distributed under the License is distributed on an "AS IS" BASIS, 121d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * See the License for the specific language governing permissions and 141d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * limitations under the License. 151d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov */ 161d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovpackage android.support.v7.app; 171d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 181d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.content.ContentValues; 191d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.content.Context; 201d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.content.DialogInterface; 211d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.database.Cursor; 221d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.database.sqlite.SQLiteCursor; 231d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.database.sqlite.SQLiteDatabase; 2480e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikovimport android.support.test.InstrumentationRegistry; 251d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.support.test.espresso.DataInteraction; 261d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.support.v7.appcompat.test.R; 271d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.support.v7.testutils.TestUtilsMatchers; 281d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.test.ActivityInstrumentationTestCase2; 291d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.test.suitebuilder.annotation.SmallTest; 301d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.view.View; 311d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.widget.Button; 321d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.widget.CheckedTextView; 331d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.widget.ListAdapter; 341d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport android.widget.ListView; 351d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport org.hamcrest.Matcher; 3680e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikovimport org.junit.After; 3780e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikovimport org.junit.Before; 3880e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikovimport org.junit.Test; 391d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 401d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport java.io.File; 411d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 421d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static android.support.test.espresso.Espresso.onData; 431d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static android.support.test.espresso.Espresso.onView; 441d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static android.support.test.espresso.action.ViewActions.click; 451d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static android.support.test.espresso.assertion.ViewAssertions.matches; 461d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static android.support.test.espresso.matcher.RootMatchers.isDialog; 471d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static android.support.test.espresso.matcher.ViewMatchers.*; 481d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static org.hamcrest.Matchers.instanceOf; 491d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static org.hamcrest.core.AllOf.allOf; 501d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovimport static org.hamcrest.core.Is.is; 5180e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikovimport static org.junit.Assert.assertEquals; 5280e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikovimport static org.junit.Assert.assertNotNull; 5331c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikovimport static org.mockito.Matchers.any; 5431c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikovimport static org.mockito.Mockito.*; 551d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 561d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikovpublic class AlertDialogCursorTest 5780e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov extends BaseInstrumentationTestCase<AlertDialogTestActivity> { 581d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 591d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private Button mButton; 601d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 611d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private static final String TEXT_COLUMN_NAME = "text"; 621d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private static final String CHECKED_COLUMN_NAME = "checked"; 631d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 641d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private String[] mTextContent; 651d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private boolean[] mCheckedContent; 661d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 671d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private String[] mProjectionWithChecked; 681d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private String[] mProjectionWithoutChecked; 691d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 701d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private SQLiteDatabase mDatabase; 711d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private File mDatabaseFile; 721d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private Cursor mCursor; 731d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 741d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private AlertDialog mAlertDialog; 751d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 761d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov public AlertDialogCursorTest() { 771d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov super(AlertDialogTestActivity.class); 781d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 791d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 8080e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov @Before 8180e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov public void setUp() { 821d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Ideally these constant arrays would be defined as final static fields on the 831d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // class level, but for some reason those get reset to null on v9- devices after 841d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // the first test method has been executed. 851d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mTextContent = new String[] { "Adele", "Beyonce", "Ciara", "Dido" }; 861d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mCheckedContent = new boolean[] { false, false, true, false }; 871d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 881d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mProjectionWithChecked = new String[] { 891d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov "_id", // 0 901d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TEXT_COLUMN_NAME, // 1 911d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov CHECKED_COLUMN_NAME // 2 921d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov }; 931d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mProjectionWithoutChecked = new String[] { 941d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov "_id", // 0 951d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TEXT_COLUMN_NAME // 1 961d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov }; 971d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 9880e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov final AlertDialogTestActivity activity = mActivityTestRule.getActivity(); 991d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mButton = (Button) activity.findViewById(R.id.test_button); 1001d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 10180e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov File dbDir = activity.getDir("tests", Context.MODE_PRIVATE); 1021d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mDatabaseFile = new File(dbDir, "database_alert_dialog_test.db"); 1031d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov if (mDatabaseFile.exists()) { 1041d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mDatabaseFile.delete(); 1051d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1061d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); 1071d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertNotNull(mDatabase); 1081d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Create and populate a test table 1091d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mDatabase.execSQL( 1101d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov "CREATE TABLE test (_id INTEGER PRIMARY KEY, " + TEXT_COLUMN_NAME + 1111d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov " TEXT, " + CHECKED_COLUMN_NAME + " INTEGER);"); 1121d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov for (int i = 0; i < mTextContent.length; i++) { 1131d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mDatabase.execSQL("INSERT INTO test (" + TEXT_COLUMN_NAME + ", " + 1141d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov CHECKED_COLUMN_NAME + ") VALUES ('" + mTextContent[i] + "', " + 1151d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov (mCheckedContent[i] ? "1" : "0") + ");"); 1161d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1171d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1181d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 11980e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov @After 12080e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov public void tearDown() { 1211d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov if (mCursor != null) { 12280e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov // Close the cursor on the UI thread as the list view in the alert dialog 12380e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov // will get notified of any change to the underlying cursor. 12480e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { 12580e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov @Override 12680e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov public void run() { 12780e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov mCursor.close(); 12880e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov mCursor = null; 12980e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov } 13080e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov }); 1311d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1321d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov if (mDatabase != null) { 1331d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mDatabase.close(); 1341d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1351d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov if (mDatabaseFile != null) { 1361d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mDatabaseFile.delete(); 1371d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1381d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1391d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 1401d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private void wireBuilder(final AlertDialog.Builder builder) { 1411d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mButton.setOnClickListener(new View.OnClickListener() { 1421d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov @Override 1431d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov public void onClick(View v) { 1441d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mAlertDialog = builder.show(); 1451d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1461d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov }); 1471d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1481d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 14931c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov private void verifySimpleItemsContent(String[] expectedContent, 15031c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov DialogInterface.OnClickListener onClickListener) { 1511d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final int expectedCount = expectedContent.length; 1521d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 1531d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov onView(withId(R.id.test_button)).perform(click()); 1541d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 1551d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final ListView listView = mAlertDialog.getListView(); 1561d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertNotNull("List view is shown", listView); 1571d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 1581d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final ListAdapter listAdapter = listView.getAdapter(); 1591d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertEquals("List has " + expectedCount + " entries", 1601d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedCount, listAdapter.getCount()); 1611d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 1621d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Test that all items are showing 1631d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov onView(withText("Dialog title")).inRoot(isDialog()).check(matches(isDisplayed())); 1641d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov for (int i = 0; i < expectedCount; i++) { 1651d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov DataInteraction rowInteraction = onData(allOf( 1661d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov is(instanceOf(SQLiteCursor.class)), 1671d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.withCursorItemContent(TEXT_COLUMN_NAME, expectedContent[i]))); 1681d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov rowInteraction.inRoot(isDialog()).check(matches(isDisplayed())); 1691d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1701d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 17131c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov // Verify that our click listener hasn't been called yet 17231c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov verify(onClickListener, never()).onClick(any(DialogInterface.class), any(int.class)); 1731d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Test that a click on an item invokes the registered listener 1741d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov int indexToClick = expectedCount - 2; 1751d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov DataInteraction interactionForClick = onData(allOf( 1761d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov is(instanceOf(SQLiteCursor.class)), 1771d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.withCursorItemContent( 1781d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TEXT_COLUMN_NAME, expectedContent[indexToClick]))); 1791d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick.inRoot(isDialog()).perform(click()); 18031c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov verify(onClickListener, times(1)).onClick(mAlertDialog, indexToClick); 1811d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1821d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 18380e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov @Test 1841d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov @SmallTest 1851d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov public void testSimpleItemsFromCursor() { 1861d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mCursor = mDatabase.query("test", mProjectionWithoutChecked, 1871d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov null, null, null, null, null); 1881d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertNotNull(mCursor); 1891d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 19031c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov final DialogInterface.OnClickListener mockClickListener = 19131c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov mock(DialogInterface.OnClickListener.class); 19280e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov AlertDialog.Builder builder = new AlertDialog.Builder(mActivityTestRule.getActivity()) 1931d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov .setTitle(R.string.alert_dialog_title) 19431c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov .setCursor(mCursor, mockClickListener, "text"); 1951d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov wireBuilder(builder); 1961d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 19731c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov verifySimpleItemsContent(mTextContent, mockClickListener); 1981d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 1991d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2001d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov /** 2011d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * Helper method to verify the state of the multi-choice items list. It gets the String 2021d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * array of content and verifies that: 2031d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 2041d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 1. The items in the array are rendered as CheckedTextViews inside a ListView 2051d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 2. Each item in the array is displayed 2061d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 3. Checked state of each row in the ListView corresponds to the matching entry in the 2071d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * passed boolean array 2081d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov */ 2091d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private void verifyMultiChoiceItemsState(String[] expectedContent, 2101d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov boolean[] checkedTracker) { 2111d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final int expectedCount = expectedContent.length; 2121d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2131d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final ListView listView = mAlertDialog.getListView(); 2141d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertNotNull("List view is shown", listView); 2151d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2161d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final ListAdapter listAdapter = listView.getAdapter(); 2171d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertEquals("List has " + expectedCount + " entries", 2181d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedCount, listAdapter.getCount()); 2191d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2201d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov for (int i = 0; i < expectedCount; i++) { 2211d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov Matcher checkedStateMatcher = checkedTracker[i] ? TestUtilsMatchers.isCheckedTextView() : 2221d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.isNonCheckedTextView(); 2231d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Check that the corresponding row is rendered as CheckedTextView with expected 2241d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // checked state. 2251d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov DataInteraction rowInteraction = onData(allOf( 2261d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov is(instanceOf(SQLiteCursor.class)), 2271d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.withCursorItemContent(TEXT_COLUMN_NAME, expectedContent[i]))); 2281d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov rowInteraction.inRoot(isDialog()). 2291d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov check(matches(allOf( 2301d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov isDisplayed(), 2311d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov isAssignableFrom(CheckedTextView.class), 2321d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov isDescendantOfA(isAssignableFrom(ListView.class)), 2331d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov checkedStateMatcher))); 2341d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 2351d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 2361d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2371d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private void verifyMultiChoiceItemsContent(String[] expectedContent, 2381d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final boolean[] checkedTracker) { 2391d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final int expectedCount = expectedContent.length; 2401d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2411d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov onView(withId(R.id.test_button)).perform(click()); 2421d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2431d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final ListView listView = mAlertDialog.getListView(); 2441d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertNotNull("List view is shown", listView); 2451d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2461d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final ListAdapter listAdapter = listView.getAdapter(); 2471d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertEquals("List has " + expectedCount + " entries", 2481d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedCount, listAdapter.getCount()); 2491d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2501d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Test that all items are showing 2511d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov onView(withText("Dialog title")).inRoot(isDialog()).check(matches(isDisplayed())); 2521d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifyMultiChoiceItemsState(expectedContent, checkedTracker); 2531d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2541d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // We're going to click item #1 and test that the click listener has been invoked to 2551d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // update the original state array 2561d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov boolean[] expectedAfterClick1 = checkedTracker.clone(); 2571d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedAfterClick1[1] = !expectedAfterClick1[1]; 2581d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov DataInteraction interactionForClick = onData(allOf( 2591d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov is(instanceOf(SQLiteCursor.class)), 2601d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.withCursorItemContent(TEXT_COLUMN_NAME, expectedContent[1]))); 2611d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick.inRoot(isDialog()).perform(click()); 2621d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifyMultiChoiceItemsState(expectedContent, expectedAfterClick1); 2631d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2641d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Now click item #1 again and test that the click listener has been invoked to update the 2651d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // original state array again 2661d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedAfterClick1[1] = !expectedAfterClick1[1]; 2671d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick.inRoot(isDialog()).perform(click()); 2681d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifyMultiChoiceItemsState(expectedContent, expectedAfterClick1); 2691d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2701d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Now we're going to click the last item and test that the click listener has been invoked 2711d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // to update the original state array 2721d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov boolean[] expectedAfterClickLast = checkedTracker.clone(); 2731d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedAfterClickLast[expectedCount - 1] = !expectedAfterClickLast[expectedCount - 1]; 2741d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick = onData(allOf( 2751d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov is(instanceOf(SQLiteCursor.class)), 2761d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.withCursorItemContent(TEXT_COLUMN_NAME, 2771d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedContent[expectedCount - 1]))); 2781d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick.inRoot(isDialog()).perform(click()); 2791d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifyMultiChoiceItemsState(expectedContent, expectedAfterClickLast); 2801d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 2811d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 28280e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov @Test 2831d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov @SmallTest 2841d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov public void testMultiChoiceItemsFromCursor() { 2851d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mCursor = mDatabase.query("test", mProjectionWithChecked, 2861d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov null, null, null, null, null); 2871d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertNotNull(mCursor); 2881d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 2891d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final boolean[] checkedTracker = mCheckedContent.clone(); 29080e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov AlertDialog.Builder builder = new AlertDialog.Builder(mActivityTestRule.getActivity()) 2911d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov .setTitle(R.string.alert_dialog_title) 2921d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov .setMultiChoiceItems(mCursor, CHECKED_COLUMN_NAME, TEXT_COLUMN_NAME, 2931d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov new DialogInterface.OnMultiChoiceClickListener() { 2941d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov @Override 2951d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov public void onClick(DialogInterface dialog, int which, 2961d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov boolean isChecked) { 2971d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Update the underlying database with the new checked 2981d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // state for the specific row 2991d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mCursor.moveToPosition(which); 3001d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov ContentValues valuesToUpdate = new ContentValues(); 3011d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov valuesToUpdate.put(CHECKED_COLUMN_NAME, isChecked ? 1 : 0); 3021d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mDatabase.update("test", valuesToUpdate, 3031d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TEXT_COLUMN_NAME + " = ?", 3041d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov new String[] { mCursor.getString(1) } ); 3051d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mCursor.requery(); 3061d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov checkedTracker[which] = isChecked; 3071d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 3081d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov }); 3091d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov wireBuilder(builder); 3101d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3111d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Pass the same boolean[] array as used for initialization since our click listener 3121d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // will be updating its content. 3131d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifyMultiChoiceItemsContent(mTextContent, checkedTracker); 3141d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 3151d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3161d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov /** 3171d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * Helper method to verify the state of the single-choice items list. It gets the String 3181d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * array of content and verifies that: 3191d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 3201d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 1. The items in the array are rendered as CheckedTextViews inside a ListView 3211d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 2. Each item in the array is displayed 3221d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * 3. Only one row in the ListView is checked, and that corresponds to the passed 3231d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov * integer index. 3241d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov */ 3251d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private void verifySingleChoiceItemsState(String[] expectedContent, 3261d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov int currentlyExpectedSelectionIndex) { 3271d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final int expectedCount = expectedContent.length; 3281d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3291d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final ListView listView = mAlertDialog.getListView(); 3301d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertNotNull("List view is shown", listView); 3311d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3321d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final ListAdapter listAdapter = listView.getAdapter(); 3331d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertEquals("List has " + expectedCount + " entries", 3341d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedCount, listAdapter.getCount()); 3351d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3361d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov for (int i = 0; i < expectedCount; i++) { 3371d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov Matcher checkedStateMatcher = (i == currentlyExpectedSelectionIndex) ? 3381d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.isCheckedTextView() : 3391d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.isNonCheckedTextView(); 3401d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Check that the corresponding row is rendered as CheckedTextView with expected 3411d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // checked state. 3421d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov DataInteraction rowInteraction = onData(allOf( 3431d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov is(instanceOf(SQLiteCursor.class)), 3441d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.withCursorItemContent(TEXT_COLUMN_NAME, expectedContent[i]))); 3451d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov rowInteraction.inRoot(isDialog()). 3461d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov check(matches(allOf( 3471d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov isDisplayed(), 3481d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov isAssignableFrom(CheckedTextView.class), 3491d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov isDescendantOfA(isAssignableFrom(ListView.class)), 3501d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov checkedStateMatcher))); 3511d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 3521d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 3531d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3541d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov private void verifySingleChoiceItemsContent(String[] expectedContent, 35531c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov int initialSelectionIndex, DialogInterface.OnClickListener onClickListener) { 3561d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov final int expectedCount = expectedContent.length; 3571d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov int currentlyExpectedSelectionIndex = initialSelectionIndex; 3581d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3591d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov onView(withId(R.id.test_button)).perform(click()); 3601d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3611d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Test that all items are showing 3621d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov onView(withText("Dialog title")).inRoot(isDialog()).check(matches(isDisplayed())); 3631d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifySingleChoiceItemsState(expectedContent, currentlyExpectedSelectionIndex); 3641d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3651d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // We're going to click the first unselected item and test that the click listener has 3661d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // been invoked. 3671d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov currentlyExpectedSelectionIndex = (currentlyExpectedSelectionIndex == 0) ? 1 : 0; 3681d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov DataInteraction interactionForClick = onData(allOf( 3691d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov is(instanceOf(SQLiteCursor.class)), 3701d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.withCursorItemContent(TEXT_COLUMN_NAME, 3711d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedContent[currentlyExpectedSelectionIndex]))); 3721d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick.inRoot(isDialog()).perform(click()); 37331c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov verify(onClickListener, times(1)).onClick(mAlertDialog, currentlyExpectedSelectionIndex); 3741d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifySingleChoiceItemsState(expectedContent, currentlyExpectedSelectionIndex); 3751d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3761d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Now click the same item again and test that the selection has not changed 3771d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick.inRoot(isDialog()).perform(click()); 37831c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov verify(onClickListener, times(2)).onClick(mAlertDialog, currentlyExpectedSelectionIndex); 3791d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifySingleChoiceItemsState(expectedContent, currentlyExpectedSelectionIndex); 3801d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 3811d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // Now we're going to click the last item and test that the click listener has been invoked 3821d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov // to update the original state array 3831d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov currentlyExpectedSelectionIndex = expectedCount - 1; 3841d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick = onData(allOf( 3851d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov is(instanceOf(SQLiteCursor.class)), 3861d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov TestUtilsMatchers.withCursorItemContent(TEXT_COLUMN_NAME, 3871d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov expectedContent[currentlyExpectedSelectionIndex]))); 3881d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov interactionForClick.inRoot(isDialog()).perform(click()); 38931c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov verify(onClickListener, times(1)).onClick(mAlertDialog, currentlyExpectedSelectionIndex); 3901d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov verifySingleChoiceItemsState(expectedContent, currentlyExpectedSelectionIndex); 3911d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 3921d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 39380e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov @Test 3941d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov @SmallTest 3951d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov public void testSingleChoiceItemsFromCursor() { 3961d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov mCursor = mDatabase.query("test", mProjectionWithoutChecked, 3971d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov null, null, null, null, null); 3981d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov assertNotNull(mCursor); 3991d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 40031c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov final DialogInterface.OnClickListener mockClickListener = 40131c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov mock(DialogInterface.OnClickListener.class); 40280e9962bebc88b43b59807f36b4e43fa2fc91c8aKirill Grouchnikov AlertDialog.Builder builder = new AlertDialog.Builder(mActivityTestRule.getActivity()) 4031d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov .setTitle(R.string.alert_dialog_title) 40431c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov .setSingleChoiceItems(mCursor, 2, TEXT_COLUMN_NAME, mockClickListener); 4051d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov wireBuilder(builder); 4061d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov 40731c1690d6ed7ebec75bd9f6c0c74ac29528bd2f8Kirill Grouchnikov verifySingleChoiceItemsContent(mTextContent, 2, mockClickListener); 4081d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov } 4091d8515a3b783e9b091bea2891606b466515b4fddKirill Grouchnikov} 410