11package com .stepstone .stepper ;
22
33import android .content .Context ;
4+ import android .os .Bundle ;
45import android .support .annotation .IntRange ;
56import android .support .annotation .NonNull ;
7+ import android .support .annotation .Nullable ;
68import android .support .v4 .app .Fragment ;
79import android .support .v4 .app .FragmentActivity ;
810import android .support .v4 .app .FragmentManager ;
911import android .util .AttributeSet ;
12+ import android .util .SparseArray ;
13+ import android .view .LayoutInflater ;
14+ import android .view .View ;
15+ import android .view .ViewGroup ;
1016import android .widget .LinearLayout ;
1117
1218import com .stepstone .stepper .adapter .AbstractFragmentStepAdapter ;
19+ import com .stepstone .stepper .test .assertion .StepperLayoutAssert ;
1320import com .stepstone .stepper .test .runner .StepperRobolectricTestRunner ;
1421import com .stepstone .stepper .viewmodel .StepViewModel ;
1522
16- import org .junit .Before ;
1723import org .junit .Test ;
1824import org .junit .runner .RunWith ;
1925import org .robolectric .Robolectric ;
26+ import org .robolectric .android .controller .ActivityController ;
2027
2128import static com .stepstone .stepper .test .assertion .StepperLayoutAssert .assertThat ;
22- import static org .junit .Assert .assertEquals ;
23- import static org .mockito .Mockito .mock ;
29+ import static org .junit .Assert .assertNotNull ;
30+ import static org .mockito .Mockito .spy ;
31+ import static org .mockito .Mockito .verify ;
2432
2533
2634/**
@@ -35,23 +43,20 @@ public class StepperLayoutSanityTest {
3543
3644 private static final String ORIENTATION_HORIZONTAL = "horizontal" ;
3745
38- FragmentActivity activity ;
46+ private StepperLayoutActivity activity ;
3947
40- @ Before
41- public void setUp () throws Exception {
42- activity = Robolectric .setupActivity (DummyActivity .class );
43- }
48+ private StepperLayout stepperLayout ;
4449
4550 @ Test
4651 public void stepper_with_progress_bar_without_adapter_should_have_all_type_specific_indicators_hidden () {
4752 //given
4853 AttributeSet attributeSet = createAttributeSetWithStepperType (TYPE_PROGRESS_BAR );
4954
5055 //when
51- StepperLayout stepperLayout = new StepperLayout ( activity , attributeSet );
56+ stepperLayout = createStepperLayoutInActivity ( attributeSet );
5257
5358 //then
54- assertThat ( stepperLayout )
59+ assertStepperLayout ( )
5560 .hasHorizontalProgressBarHidden ()
5661 .hasDottedProgressBarHidden ()
5762 .hasTabsHidden ();
@@ -63,10 +68,10 @@ public void stepper_with_dots_without_adapter_should_have_all_type_specific_indi
6368 AttributeSet attributeSet = createAttributeSetWithStepperType (TYPE_DOTS );
6469
6570 //when
66- StepperLayout stepperLayout = new StepperLayout ( activity , attributeSet );
71+ stepperLayout = createStepperLayoutInActivity ( attributeSet );
6772
6873 //then
69- assertThat ( stepperLayout )
74+ assertStepperLayout ( )
7075 .hasDottedProgressBarHidden ()
7176 .hasHorizontalProgressBarHidden ()
7277 .hasTabsHidden ();
@@ -78,10 +83,10 @@ public void stepper_with_tabs_without_adapter_should_have_all_type_specific_indi
7883 AttributeSet attributeSet = createAttributeSetWithStepperType (TYPE_TABS );
7984
8085 //when
81- StepperLayout stepperLayout = new StepperLayout ( activity , attributeSet );
86+ stepperLayout = createStepperLayoutInActivity ( attributeSet );
8287
8388 //then
84- assertThat ( stepperLayout )
89+ assertStepperLayout ( )
8590 .hasTabsHidden ()
8691 .hasHorizontalProgressBarHidden ()
8792 .hasDottedProgressBarHidden ();
@@ -91,48 +96,48 @@ public void stepper_with_tabs_without_adapter_should_have_all_type_specific_indi
9196 public void should_show_horizontal_progress_bar_when_adapter_is_set_for_progress_bar_type () {
9297 //given
9398 AttributeSet attributeSet = createAttributeSetWithStepperType (TYPE_PROGRESS_BAR );
94- StepperLayout stepperLayout = new StepperLayout (activity , attributeSet );
9599
96100 //when
97- whenAdapterIsSet ( stepperLayout );
101+ stepperLayout = createStepperLayoutWithAdapterSetInActivity ( attributeSet );
98102
99103 //then
100- assertThat ( stepperLayout )
104+ assertStepperLayout ( )
101105 .hasHorizontalProgressBarShown ()
102106 .hasDottedProgressBarHidden ()
103107 .hasTabsHidden ();
108+ assertFirstFragmentWasNotifiedAboutBeingSelected ();
104109 }
105110
106111 @ Test
107112 public void should_show_dotted_progress_bar_when_adapter_is_set_for_dots_type () {
108113 //given
109114 AttributeSet attributeSet = createAttributeSetWithStepperType (TYPE_DOTS );
110- StepperLayout stepperLayout = new StepperLayout (activity , attributeSet );
111115
112116 //when
113- whenAdapterIsSet ( stepperLayout );
117+ stepperLayout = createStepperLayoutWithAdapterSetInActivity ( attributeSet );
114118
115119 //then
116- assertThat ( stepperLayout )
120+ assertStepperLayout ( )
117121 .hasDottedProgressBarShown ()
118122 .hasHorizontalProgressBarHidden ()
119123 .hasTabsHidden ();
124+ assertFirstFragmentWasNotifiedAboutBeingSelected ();
120125 }
121126
122127 @ Test
123128 public void should_show_tabs_when_adapter_is_set_for_tabs_type () {
124129 //given
125130 AttributeSet attributeSet = createAttributeSetWithStepperType (TYPE_TABS );
126- StepperLayout stepperLayout = new StepperLayout (activity , attributeSet );
127131
128132 //when
129- whenAdapterIsSet ( stepperLayout );
133+ stepperLayout = createStepperLayoutWithAdapterSetInActivity ( attributeSet );
130134
131135 //then
132- assertThat ( stepperLayout )
136+ assertStepperLayout ( )
133137 .hasTabsShown ()
134138 .hasHorizontalProgressBarHidden ()
135139 .hasDottedProgressBarHidden ();
140+ assertFirstFragmentWasNotifiedAboutBeingSelected ();
136141 }
137142
138143 @ Test
@@ -144,44 +149,108 @@ public void should_ignore_horizontal_orientation_if_provided_from_attributes() {
144149 .build ();
145150
146151 //when
147- StepperLayout stepperLayout = new StepperLayout ( activity , attributeSet );
152+ stepperLayout = createStepperLayoutInActivity ( attributeSet );
148153
149154 //then
150- assertVerticalOrientationUsed ( stepperLayout );
155+ assertStepperLayout (). hasOrientation ( LinearLayout . VERTICAL );
151156 }
152157
153158 @ Test
154159 public void should_ignore_horizontal_orientation_if_provided_programmatically () {
155160 //given
156161 AttributeSet attributeSet = createAttributeSetWithStepperType (TYPE_DOTS );
157- StepperLayout stepperLayout = new StepperLayout ( activity , attributeSet );
162+ stepperLayout = createStepperLayoutInActivity ( attributeSet );
158163
159164 //when
160165 stepperLayout .setOrientation (LinearLayout .HORIZONTAL );
161166
162167 //then
163- assertVerticalOrientationUsed (stepperLayout );
164- }
165-
166- private void assertVerticalOrientationUsed (StepperLayout stepperLayout ) {
167- assertEquals ("Invalid orientation" , stepperLayout .getOrientation (), LinearLayout .VERTICAL );
168- }
169-
170- private void whenAdapterIsSet (StepperLayout stepperLayout ) {
171- stepperLayout .setAdapter (new DummyStepAdapter (activity .getSupportFragmentManager (), activity ));
168+ assertStepperLayout ().hasOrientation (LinearLayout .VERTICAL );
172169 }
173170
171+ @ NonNull
174172 private AttributeSet createAttributeSetWithStepperType (String stepperType ) {
175173 return Robolectric .buildAttributeSet ()
176174 .addAttribute (R .attr .ms_stepperType , stepperType )
177175 .build ();
178176 }
179177
180- public static class DummyActivity extends FragmentActivity {}
178+ @ NonNull
179+ private StepperLayout createStepperLayoutInActivity (@ NonNull AttributeSet attributeSet ) {
180+ activity = ActivityController .of (Robolectric .getShadowsAdapter (), new StepperLayoutActivity ().withStepperLayoutAttributes (attributeSet ))
181+ .setup ()
182+ .get ();
183+ return activity .stepperLayout ;
184+ }
185+
186+ @ NonNull
187+ private StepperLayout createStepperLayoutWithAdapterSetInActivity (@ NonNull AttributeSet attributeSet ) {
188+ activity = ActivityController .of (Robolectric .getShadowsAdapter (), new StepperLayoutWithAdapterActivity ().withStepperLayoutAttributes (attributeSet ))
189+ .setup ()
190+ .get ();
191+ return activity .stepperLayout ;
192+ }
193+
194+ @ NonNull
195+ private StepperLayoutAssert assertStepperLayout () {
196+ return assertThat (stepperLayout );
197+ }
198+
199+ private void assertFirstFragmentWasNotifiedAboutBeingSelected () {
200+ SpyStepAdapter stepAdapter = (SpyStepAdapter ) stepperLayout .getAdapter ();
201+ Step firstStep = stepAdapter .steps .get (0 );
202+ assertNotNull ("Step not found" , firstStep );
203+ verify (firstStep ).onSelected ();
204+ }
205+
206+ /**
207+ * A {@link StepperLayoutActivity} which also sets an adapter in {@link #onCreate(Bundle)}.
208+ */
209+ private static class StepperLayoutWithAdapterActivity extends StepperLayoutActivity {
210+
211+ @ Override
212+ protected void onCreate (@ Nullable Bundle savedInstanceState ) {
213+ super .onCreate (savedInstanceState );
214+
215+ SpyStepAdapter stepAdapter = new SpyStepAdapter (getSupportFragmentManager (), this );
216+ stepperLayout .setAdapter (stepAdapter );
217+ }
218+ }
219+
220+ /**
221+ * An Activity which created a StepperLayout in {@link #onCreate(Bundle)}.
222+ */
223+ private static class StepperLayoutActivity extends FragmentActivity {
224+
225+ AttributeSet stepperLayoutAttributeSet ;
226+
227+ StepperLayout stepperLayout ;
228+
229+ @ Override
230+ protected void onCreate (@ Nullable Bundle savedInstanceState ) {
231+ super .onCreate (savedInstanceState );
232+
233+ ViewGroup .LayoutParams layoutParams = new ViewGroup .LayoutParams (
234+ ViewGroup .LayoutParams .MATCH_PARENT , ViewGroup .LayoutParams .MATCH_PARENT );
235+ stepperLayout = new StepperLayout (this , stepperLayoutAttributeSet );
236+ stepperLayout .setLayoutParams (layoutParams );
237+ setContentView (stepperLayout );
238+ }
239+
240+ StepperLayoutActivity withStepperLayoutAttributes (AttributeSet attributeSet ) {
241+ this .stepperLayoutAttributeSet = attributeSet ;
242+ return this ;
243+ }
244+ }
245+
246+ /**
247+ * Creates Spy fragments which can be later verified.
248+ */
249+ private static class SpyStepAdapter extends AbstractFragmentStepAdapter {
181250
182- public static class DummyStepAdapter extends AbstractFragmentStepAdapter {
251+ SparseArray < Step > steps = new SparseArray <>();
183252
184- public DummyStepAdapter (@ NonNull FragmentManager fm , @ NonNull Context context ) {
253+ SpyStepAdapter (@ NonNull FragmentManager fm , @ NonNull Context context ) {
185254 super (fm , context );
186255 }
187256
@@ -195,7 +264,9 @@ public StepViewModel getViewModel(@IntRange(from = 0) int position) {
195264
196265 @ Override
197266 public Step createStep (int position ) {
198- return mock (DummyStepFragment .class );
267+ DummyStepFragment stepFragment = spy (new DummyStepFragment ());
268+ steps .put (position , stepFragment );
269+ return stepFragment ;
199270 }
200271
201272 @ Override
@@ -204,6 +275,9 @@ public int getCount() {
204275 }
205276 }
206277
278+ /**
279+ * A dummy fragment with no view.
280+ */
207281 public static class DummyStepFragment extends Fragment implements Step {
208282
209283 @ Override
@@ -215,6 +289,12 @@ public VerificationError verifyStep() {
215289 public void onSelected () {
216290 }
217291
292+ @ Nullable
293+ @ Override
294+ public View onCreateView (LayoutInflater inflater , @ Nullable ViewGroup container , @ Nullable Bundle savedInstanceState ) {
295+ return null ;
296+ }
297+
218298 @ Override
219299 public void onError (@ NonNull VerificationError error ) {
220300 }
0 commit comments