1package org.robolectric.shadows;
2
3import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
4import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
5import static android.os.Build.VERSION_CODES.M;
6import static org.assertj.core.api.Assertions.assertThat;
7import static org.robolectric.Shadows.shadowOf;
8
9import android.app.Notification;
10import android.app.PendingIntent;
11import android.graphics.Bitmap;
12import android.graphics.BitmapFactory;
13import android.graphics.drawable.Icon;
14import org.junit.Test;
15import org.junit.runner.RunWith;
16import org.robolectric.R;
17import org.robolectric.RobolectricTestRunner;
18import org.robolectric.RuntimeEnvironment;
19import org.robolectric.annotation.Config;
20
21@RunWith(RobolectricTestRunner.class)
22public class ShadowNotificationBuilderTest {
23  private final Notification.Builder builder = new Notification.Builder(RuntimeEnvironment.application);
24
25  @Test
26  public void build_setsContentTitleOnNotification() throws Exception {
27    Notification notification = builder.setContentTitle("Hello").build();
28    assertThat(shadowOf(notification).getContentTitle().toString()).isEqualTo("Hello");
29  }
30
31  @Test
32  public void build_whenSetOngoingNotSet_leavesSetOngoingAsFalse() {
33    Notification notification = builder.build();
34    assertThat(shadowOf(notification).isOngoing()).isFalse();
35  }
36
37  @Test
38  public void build_whenSetOngoing_setsOngoingToTrue() {
39    Notification notification = builder.setOngoing(true).build();
40    assertThat(shadowOf(notification).isOngoing()).isTrue();
41  }
42
43  @Test
44  @Config(minSdk = JELLY_BEAN_MR1)
45  public void build_whenShowWhenNotSet_setsShowWhenOnNotificationToTrue() {
46    Notification notification = builder.setWhen(100).setShowWhen(true).build();
47
48    assertThat(shadowOf(notification).isWhenShown()).isTrue();
49  }
50
51  @Test
52  @Config(minSdk = JELLY_BEAN_MR1)
53  public void build_setShowWhenOnNotification() {
54    Notification notification = builder.setShowWhen(false).build();
55
56    assertThat(shadowOf(notification).isWhenShown()).isFalse();
57  }
58
59  @Test
60  public void build_setsContentTextOnNotification() throws Exception {
61    Notification notification = builder.setContentText("Hello Text").build();
62
63    assertThat(shadowOf(notification).getContentText().toString()).isEqualTo("Hello Text");
64  }
65
66  @Test
67  public void build_setsTickerOnNotification() throws Exception {
68    Notification notification = builder.setTicker("My ticker").build();
69
70    assertThat(notification.tickerText).isEqualTo("My ticker");
71  }
72
73  @Test
74  public void build_setsContentInfoOnNotification() throws Exception {
75    builder.setContentInfo("11");
76    Notification notification = builder.build();
77    assertThat(shadowOf(notification).getContentInfo().toString()).isEqualTo("11");
78  }
79
80  @Test
81  @Config(minSdk = M)
82  public void build_setsIconOnNotification() throws Exception {
83    Notification notification = builder.setSmallIcon(R.drawable.an_image).build();
84
85    assertThat(notification.getSmallIcon().getResId()).isEqualTo(R.drawable.an_image);
86  }
87
88  @Test
89  public void build_setsWhenOnNotification() throws Exception {
90    Notification notification = builder.setWhen(11L).build();
91
92    assertThat(notification.when).isEqualTo(11L);
93  }
94
95  @Test
96  public void build_setsProgressOnNotification_true() throws Exception {
97    Notification notification = builder.setProgress(36, 57, true).build();
98    // If indeterminate then max and progress values are ignored.
99    assertThat(shadowOf(notification).isIndeterminate()).isTrue();
100  }
101
102  @Test
103  public void build_setsProgressOnNotification_false() throws Exception {
104    Notification notification = builder.setProgress(50, 10, false).build();
105
106    assertThat(shadowOf(notification).getMax()).isEqualTo(50);
107    assertThat(shadowOf(notification).getProgress()).isEqualTo(10);
108    assertThat(shadowOf(notification).isIndeterminate()).isFalse();
109  }
110
111  @Test
112  @Config(minSdk = JELLY_BEAN_MR1)
113  public void build_setsUsesChronometerOnNotification_true() throws Exception {
114    Notification notification = builder.setUsesChronometer(true).setWhen(10).setShowWhen(true).build();
115
116    assertThat(shadowOf(notification).usesChronometer()).isTrue();
117  }
118
119  @Test
120  @Config(minSdk = JELLY_BEAN_MR1)
121  public void build_setsUsesChronometerOnNotification_false() throws Exception {
122    Notification notification = builder.setUsesChronometer(false).setWhen(10).setShowWhen(true).build();
123
124    assertThat(shadowOf(notification).usesChronometer()).isFalse();
125  }
126
127  @Test
128  public void build_handlesNullContentTitle() {
129    Notification notification = builder.setContentTitle(null).build();
130
131    assertThat(shadowOf(notification).getContentTitle()).isNullOrEmpty();
132  }
133
134  @Test
135  public void build_handlesNullContentText() {
136    Notification notification = builder.setContentText(null).build();
137
138    assertThat(shadowOf(notification).getContentText()).isNullOrEmpty();
139  }
140
141  @Test
142  public void build_handlesNullTicker() {
143    Notification notification = builder.setTicker(null).build();
144
145    assertThat(notification.tickerText).isNull();
146  }
147
148  @Test
149  public void build_handlesNullContentInfo() {
150    Notification notification = builder.setContentInfo(null).build();
151
152    assertThat(shadowOf(notification).getContentInfo()).isNullOrEmpty();
153  }
154
155  @Test
156  @Config(minSdk = JELLY_BEAN_MR2)
157  public void build_addsActionToNotification() throws Exception {
158    PendingIntent action = PendingIntent.getBroadcast(RuntimeEnvironment.application, 0, null, 0);
159    Notification notification = builder.addAction(0, "Action", action).build();
160
161    assertThat(notification.actions[0].actionIntent).isEqualToComparingFieldByField(action);
162  }
163
164  @Test
165  public void withBigTextStyle() {
166    Notification notification = builder.setStyle(new Notification.BigTextStyle(builder)
167        .bigText("BigText")
168        .setBigContentTitle("Title")
169        .setSummaryText("Summary"))
170        .build();
171
172    assertThat(shadowOf(notification).getBigText()).isEqualTo("BigText");
173    assertThat(shadowOf(notification).getBigContentTitle()).isEqualTo("Title");
174    assertThat(shadowOf(notification).getBigContentText()).isEqualTo("Summary");
175    assertThat(shadowOf(notification).getBigPicture()).isNull();
176  }
177
178  @Test
179  @Config(minSdk = M)
180  public void withBigPictureStyle() {
181    Bitmap bigPicture = BitmapFactory.decodeResource(RuntimeEnvironment.application.getResources(), R.drawable.an_image);
182
183    Icon bigLargeIcon = Icon.createWithBitmap(bigPicture);
184    Notification notification = builder.setStyle(new Notification.BigPictureStyle(builder)
185        .bigPicture(bigPicture)
186        .bigLargeIcon(bigLargeIcon))
187        .build();
188
189    assertThat(shadowOf(notification).getBigPicture()).isEqualTo(bigPicture);
190  }
191}
192