Skip to content

Commit 818cc0d

Browse files
authored
Merge pull request flutter#2 from bottlepay/android-rework-picture-request-state-tests
Android rework picture request state tests
2 parents 358a790 + e552379 commit 818cc0d

File tree

2 files changed

+62
-13
lines changed

2 files changed

+62
-13
lines changed

packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/PictureCaptureRequest.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class PictureCaptureRequest {
2727
* This is the output file for the curent capture. The file is created in Camera and passed here
2828
* as reference to it.
2929
*/
30-
final File mFile;
30+
final File file;
3131

3232
/** Dart method chanel result. */
3333
private final MethodChannel.Result result;
@@ -54,25 +54,29 @@ class PictureCaptureRequest {
5454
* Constructor to create a picture capture request.
5555
*
5656
* @param result
57-
* @param mFile
57+
* @param file
5858
*/
5959
public PictureCaptureRequest(
60-
MethodChannel.Result result, File mFile, DartMessenger dartMessenger) {
61-
this.result = result;
62-
this.timeoutHandler = new TimeoutHandler();
63-
this.mFile = mFile;
64-
this.dartMessenger = dartMessenger;
60+
MethodChannel.Result result,
61+
File file,
62+
DartMessenger dartMessenger) {
63+
this(
64+
result,
65+
file,
66+
dartMessenger,
67+
new TimeoutHandler()
68+
);
6569
}
6670

6771
/** Constructor for unit tests where we can mock the timeout handler */
6872
public PictureCaptureRequest(
6973
MethodChannel.Result result,
70-
File mFile,
74+
File file,
7175
DartMessenger dartMessenger,
7276
TimeoutHandler timeoutHandler) {
7377
this.result = result;
7478
this.timeoutHandler = timeoutHandler;
75-
this.mFile = mFile;
79+
this.file = file;
7680
this.dartMessenger = dartMessenger;
7781
}
7882

@@ -99,9 +103,8 @@ public void setState(PictureCaptureRequestState newState) {
99103
return;
100104
}
101105

102-
final PictureCaptureRequestState oldState = state;
103106
state = newState;
104-
onStateChange(oldState);
107+
onStateChange(newState);
105108
}
106109

107110
public boolean isFinished() {
@@ -152,8 +155,8 @@ public void setPreCaptureStartTime() {
152155
}
153156

154157
/** Handle new state changes. */
155-
private void onStateChange(PictureCaptureRequestState oldState) {
156-
switch (state) {
158+
private void onStateChange(PictureCaptureRequestState newState) {
159+
switch (newState) {
157160
case STATE_CAPTURING:
158161
case STATE_WAITING_FOCUS:
159162
case STATE_WAITING_PRECAPTURE_START:

packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/PictureCaptureRequestTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515

1616
import io.flutter.plugin.common.MethodChannel;
1717
import org.junit.Test;
18+
import org.junit.runner.RunWith;
19+
import org.robolectric.RobolectricTestRunner;
1820

21+
@RunWith(RobolectricTestRunner.class)
1922
public class PictureCaptureRequestTest {
2023

2124
@Test
@@ -45,6 +48,21 @@ public void setState_sets_state() {
4548
"State is awaitingPreCapture", req.getState(), PictureCaptureRequestState.STATE_CAPTURING);
4649
}
4750

51+
@Test
52+
public void setState_sends_camera_error_event_When_already_finished() {
53+
DartMessenger mockMessenger = mock(DartMessenger.class);
54+
PictureCaptureRequest req = new PictureCaptureRequest(null, null, mockMessenger);
55+
56+
// Make sure state is set to finished
57+
req.setState(PictureCaptureRequestState.STATE_FINISHED);
58+
59+
// Try to update state
60+
req.setState(PictureCaptureRequestState.STATE_CAPTURING);
61+
62+
verify(mockMessenger, times(1)).sendCameraErrorEvent("Request has already been finished");
63+
assertEquals("State is finished", req.getState(), PictureCaptureRequestState.STATE_FINISHED);
64+
}
65+
4866
@Test
4967
public void setState_resets_timeout() {
5068
PictureCaptureRequest.TimeoutHandler mockTimeoutHandler =
@@ -114,6 +132,20 @@ public void isFinished_is_true_When_state_is_finished_or_error() {
114132
assertTrue(req.isFinished());
115133
}
116134

135+
@Test
136+
public void finish_returns_When_in_error_state() {
137+
MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
138+
PictureCaptureRequest req = new PictureCaptureRequest(mockResult, null, null);
139+
140+
// Make sure state is set to error
141+
req.setState(PictureCaptureRequestState.STATE_ERROR);
142+
143+
req.finish("/test/path");
144+
145+
assertEquals("State is error", req.getState(), PictureCaptureRequestState.STATE_ERROR);
146+
verify(mockResult, never()).success(any());
147+
}
148+
117149
@Test(expected = IllegalStateException.class)
118150
public void finish_throws_When_already_finished() {
119151
// Setup
@@ -147,6 +179,20 @@ public void error_clears_timeout() {
147179
verify(mockTimeoutHandler).clearTimeout(any());
148180
}
149181

182+
@Test
183+
public void error_returns_When_in_error_state() {
184+
MethodChannel.Result mockResult = mock(MethodChannel.Result.class);
185+
PictureCaptureRequest req = new PictureCaptureRequest(mockResult, null, null);
186+
187+
// Make sure state is set to error
188+
req.setState(PictureCaptureRequestState.STATE_ERROR);
189+
190+
req.error("ERROR_CODE", "Error Message", null);
191+
192+
assertEquals("State is error", req.getState(), PictureCaptureRequestState.STATE_ERROR);
193+
verify(mockResult, never()).error(any(), any(), any());
194+
}
195+
150196
@Test(expected = IllegalStateException.class)
151197
public void error_throws_When_already_finished() {
152198
// Setup

0 commit comments

Comments
 (0)