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