Skip to content

Commit a7280cd

Browse files
Piotr Zawadzkizawadz88
authored andcommitted
Added extra tests for calling onSelected on fragments if adapter set in Activity's onCreate()
1 parent 5d3f467 commit a7280cd

File tree

5 files changed

+122
-44
lines changed

5 files changed

+122
-44
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ compile 'com.stepstone.stepper:material-stepper:3.2.2'
6868
android:id="@+id/stepperLayout"
6969
android:layout_width="match_parent"
7070
android:layout_height="match_parent"
71-
android:orientation="vertical"
7271
app:ms_stepperType="progress_bar" />
7372
```
7473

material-stepper/src/main/java/com/stepstone/stepper/StepperLayout.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ public void setAdapter(@NonNull StepAdapter stepAdapter) {
320320
mPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
321321
@Override
322322
public void onGlobalLayout() {
323+
//noinspection deprecation
323324
mPager.getViewTreeObserver().removeGlobalOnLayoutListener(this);
324325
onUpdate(mCurrentStepPosition, false);
325326
}

material-stepper/src/test/java/com/stepstone/stepper/StepperLayoutSanityTest.java

Lines changed: 119 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,34 @@
11
package com.stepstone.stepper;
22

33
import android.content.Context;
4+
import android.os.Bundle;
45
import android.support.annotation.IntRange;
56
import android.support.annotation.NonNull;
7+
import android.support.annotation.Nullable;
68
import android.support.v4.app.Fragment;
79
import android.support.v4.app.FragmentActivity;
810
import android.support.v4.app.FragmentManager;
911
import android.util.AttributeSet;
12+
import android.util.SparseArray;
13+
import android.view.LayoutInflater;
14+
import android.view.View;
15+
import android.view.ViewGroup;
1016
import android.widget.LinearLayout;
1117

1218
import com.stepstone.stepper.adapter.AbstractFragmentStepAdapter;
19+
import com.stepstone.stepper.test.assertion.StepperLayoutAssert;
1320
import com.stepstone.stepper.test.runner.StepperRobolectricTestRunner;
1421
import com.stepstone.stepper.viewmodel.StepViewModel;
1522

16-
import org.junit.Before;
1723
import org.junit.Test;
1824
import org.junit.runner.RunWith;
1925
import org.robolectric.Robolectric;
26+
import org.robolectric.android.controller.ActivityController;
2027

2128
import 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
}

sample/src/main/java/com/stepstone/stepper/sample/step/fragment/ButterknifeFragment.kt renamed to sample/src/main/java/com/stepstone/stepper/sample/step/fragment/ButterKnifeFragment.kt

File renamed without changes.

sample/src/main/java/com/stepstone/stepper/sample/step/fragment/FormStepFragment.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,13 @@ import android.text.TextUtils
2121
import android.view.animation.AnimationUtils
2222
import android.view.inputmethod.EditorInfo
2323
import android.widget.EditText
24-
24+
import butterknife.BindView
25+
import butterknife.OnEditorAction
2526
import com.stepstone.stepper.Step
2627
import com.stepstone.stepper.VerificationError
2728
import com.stepstone.stepper.sample.OnProceedListener
2829
import com.stepstone.stepper.sample.R
2930

30-
import butterknife.BindView
31-
import butterknife.OnEditorAction
32-
3331
internal class FormStepFragment : ButterKnifeFragment(), Step {
3432

3533
companion object {

0 commit comments

Comments
 (0)