1// Copyright 2010 Google Inc. All Rights Reserved.
2
3package com.xtremelabs.robolectric.shadows;
4
5import static org.junit.Assert.assertEquals;
6import static org.mockito.Mockito.mock;
7import static org.mockito.Mockito.verify;
8import static org.mockito.Mockito.verifyNoMoreInteractions;
9
10import android.database.DataSetObserver;
11import android.view.View;
12import android.widget.ArrayAdapter;
13import android.widget.ListView;
14import android.widget.TextView;
15
16import com.xtremelabs.robolectric.R;
17import com.xtremelabs.robolectric.Robolectric;
18import com.xtremelabs.robolectric.WithTestDefaultsRunner;
19
20import org.junit.Assert;
21import org.junit.Before;
22import org.junit.Test;
23import org.junit.runner.RunWith;
24
25import java.util.ArrayList;
26import java.util.Arrays;
27import java.util.List;
28
29@RunWith(WithTestDefaultsRunner.class)
30public class ArrayAdapterTest {
31    private ArrayAdapter<Integer> arrayAdapter;
32
33    @Before public void setUp() throws Exception {
34        List<Integer> list = new ArrayList<Integer>();
35        list.add(1);
36        list.add(2);
37        list.add(3);
38
39        arrayAdapter = new ArrayAdapter<Integer>(Robolectric.application, 0, list);
40    }
41
42    @Test
43    public void verifyContext() {
44        assertEquals(Robolectric.application, arrayAdapter.getContext());
45    }
46
47    @Test
48    public void verifyListContent() {
49        assertEquals(3, arrayAdapter.getCount());
50        assertEquals(new Integer(1), arrayAdapter.getItem(0));
51        assertEquals(new Integer(2), arrayAdapter.getItem(1));
52        assertEquals(new Integer(3), arrayAdapter.getItem(2));
53    }
54
55    @Test
56    public void usesTextViewResourceIdToSetTextWithinListItemView() throws Exception {
57        ListView parent = new ListView(Robolectric.application);
58        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(Robolectric.application, R.layout.main, R.id.title, new String[] { "first value" });
59        View listItemView = arrayAdapter.getView(0, null, parent);
60        TextView titleTextView = (TextView) listItemView.findViewById(R.id.title);
61        assertEquals("first value", titleTextView.getText().toString());
62    }
63
64    @Test
65    public void hasTheCorrectConstructorResourceIDs() {
66        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(Robolectric.application, R.id.title, new String[] { "first value" });
67
68        //this assertion may look a little backwards since R.id.title is labeled
69        //textViewResourceId in the constructor parameter list, but the output is correct.
70        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter).getResourceId()==R.id.title);
71        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter).getTextViewResourceId()!=R.id.title);
72        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter).getTextViewResourceId()==0);
73
74        ArrayAdapter<String> arrayAdapter2 = new ArrayAdapter<String>(Robolectric.application, R.id.title);
75
76        //this assertion may look a little backwards since R.id.title is labeled
77        //textViewResourceId in the constructor parameter list, but the output is correct.
78        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter2).getResourceId()==R.id.title);
79        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter2).getTextViewResourceId()!=R.id.title);
80        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter2).getTextViewResourceId()==0);
81
82        ArrayAdapter<String> arrayAdapter3 = new ArrayAdapter<String>(Robolectric.application, R.id.title, Arrays.asList(new String[] { "first value" }));
83
84        //this assertion may look a little backwards since R.id.title is labeled
85        //textViewResourceId in the constructor parameter list, but the output is correct.
86        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter3).getResourceId()==R.id.title);
87        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter3).getTextViewResourceId()!=R.id.title);
88        Assert.assertTrue(Robolectric.shadowOf(arrayAdapter3).getTextViewResourceId()==0);
89    }
90
91    @Test
92    public void shouldClear() throws Exception {
93        arrayAdapter.clear();
94        assertEquals(0, arrayAdapter.getCount());
95    }
96
97    @Test
98    public void test_remove() throws Exception {
99        Integer firstItem = arrayAdapter.getItem(0);
100        assertEquals(3, arrayAdapter.getCount());
101        assertEquals(new Integer(1), firstItem);
102
103        arrayAdapter.remove(firstItem);
104
105        assertEquals(2, arrayAdapter.getCount());
106        assertEquals(new Integer(2), arrayAdapter.getItem(0));
107        assertEquals(new Integer(3), arrayAdapter.getItem(1));
108    }
109
110    @Test
111    public void testRemoveNotifiesDataSetObservers() {
112        DataSetObserver observer = mock(DataSetObserver.class);
113        arrayAdapter.registerDataSetObserver(observer);
114        Integer firstItem = arrayAdapter.getItem(0);
115
116        arrayAdapter.remove(firstItem);
117
118        verify(observer).onChanged();
119    }
120
121    @Test
122    public void testClearNotifiesDataSetObservers() {
123        DataSetObserver observer = mock(DataSetObserver.class);
124        arrayAdapter.registerDataSetObserver(observer);
125
126        arrayAdapter.clear();
127
128        verify(observer).onChanged();
129    }
130
131    @Test
132    public void testAddNotifiesDataSetObservers() {
133        DataSetObserver observer = mock(DataSetObserver.class);
134        arrayAdapter.registerDataSetObserver(observer);
135
136        arrayAdapter.add(27);
137
138        verify(observer).onChanged();
139    }
140
141    @Test
142    public void testInsertNotifiesDataSetObservers() {
143        DataSetObserver observer = mock(DataSetObserver.class);
144        arrayAdapter.registerDataSetObserver(observer);
145
146        arrayAdapter.insert(27, 1);
147
148        verify(observer).onChanged();
149    }
150
151    @Test
152    public void testInsertDoesNotNotifyDataSetObserversWhenDisabled() {
153        DataSetObserver observer = mock(DataSetObserver.class);
154        arrayAdapter.registerDataSetObserver(observer);
155
156        arrayAdapter.setNotifyOnChange(false);
157        arrayAdapter.insert(27, 1);
158
159        verifyNoMoreInteractions(observer);
160    }
161}
162