@@ -563,24 +563,34 @@ void main() {
563
563
late Camera camera;
564
564
late VideoElement videoElement;
565
565
566
+ late StreamController <Event > errorStreamController, abortStreamController;
567
+ late StreamController <MediaStreamTrack > endedStreamController;
568
+
566
569
setUp (() {
567
570
camera = MockCamera ();
568
571
videoElement = MockVideoElement ();
569
572
570
- when (() => camera.videoElement).thenReturn (videoElement);
571
- when (() => videoElement.onError)
572
- .thenAnswer ((_) => FakeElementStream (Stream .empty ()));
573
- when (() => videoElement.onAbort)
574
- .thenAnswer ((_) => FakeElementStream (Stream .empty ()));
575
- });
573
+ errorStreamController = StreamController <Event >();
574
+ abortStreamController = StreamController <Event >();
575
+ endedStreamController = StreamController <MediaStreamTrack >();
576
576
577
- testWidgets ('initializes and plays the camera' , (tester) async {
578
577
when (camera.getVideoSize).thenAnswer (
579
578
(_) => Future .value (Size (10 , 10 )),
580
579
);
581
580
when (camera.initialize).thenAnswer ((_) => Future .value ());
582
581
when (camera.play).thenAnswer ((_) => Future .value ());
583
582
583
+ when (() => camera.videoElement).thenReturn (videoElement);
584
+ when (() => videoElement.onError)
585
+ .thenAnswer ((_) => FakeElementStream (errorStreamController.stream));
586
+ when (() => videoElement.onAbort)
587
+ .thenAnswer ((_) => FakeElementStream (abortStreamController.stream));
588
+
589
+ when (() => camera.onEnded)
590
+ .thenAnswer ((_) => endedStreamController.stream);
591
+ });
592
+
593
+ testWidgets ('initializes and plays the camera' , (tester) async {
584
594
// Save the camera in the camera plugin.
585
595
(CameraPlatform .instance as CameraPlugin ).cameras[cameraId] = camera;
586
596
@@ -590,6 +600,32 @@ void main() {
590
600
verify (camera.play).called (1 );
591
601
});
592
602
603
+ testWidgets ('starts listening to the camera video error and abort events' ,
604
+ (tester) async {
605
+ // Save the camera in the camera plugin.
606
+ (CameraPlatform .instance as CameraPlugin ).cameras[cameraId] = camera;
607
+
608
+ expect (errorStreamController.hasListener, isFalse);
609
+ expect (abortStreamController.hasListener, isFalse);
610
+
611
+ await CameraPlatform .instance.initializeCamera (cameraId);
612
+
613
+ expect (errorStreamController.hasListener, isTrue);
614
+ expect (abortStreamController.hasListener, isTrue);
615
+ });
616
+
617
+ testWidgets ('starts listening to the camera ended events' ,
618
+ (tester) async {
619
+ // Save the camera in the camera plugin.
620
+ (CameraPlatform .instance as CameraPlugin ).cameras[cameraId] = camera;
621
+
622
+ expect (endedStreamController.hasListener, isFalse);
623
+
624
+ await CameraPlatform .instance.initializeCamera (cameraId);
625
+
626
+ expect (endedStreamController.hasListener, isTrue);
627
+ });
628
+
593
629
group ('throws PlatformException' , () {
594
630
testWidgets (
595
631
'with notFound error '
@@ -1610,6 +1646,37 @@ void main() {
1610
1646
});
1611
1647
1612
1648
group ('dispose' , () {
1649
+ late Camera camera;
1650
+ late VideoElement videoElement;
1651
+
1652
+ late StreamController <Event > errorStreamController, abortStreamController;
1653
+ late StreamController <MediaStreamTrack > endedStreamController;
1654
+
1655
+ setUp (() {
1656
+ camera = MockCamera ();
1657
+ videoElement = MockVideoElement ();
1658
+
1659
+ errorStreamController = StreamController <Event >();
1660
+ abortStreamController = StreamController <Event >();
1661
+ endedStreamController = StreamController <MediaStreamTrack >();
1662
+
1663
+ when (camera.getVideoSize).thenAnswer (
1664
+ (_) => Future .value (Size (10 , 10 )),
1665
+ );
1666
+ when (camera.initialize).thenAnswer ((_) => Future .value ());
1667
+ when (camera.play).thenAnswer ((_) => Future .value ());
1668
+ when (camera.dispose).thenAnswer ((_) => Future .value ());
1669
+
1670
+ when (() => camera.videoElement).thenReturn (videoElement);
1671
+ when (() => videoElement.onError)
1672
+ .thenAnswer ((_) => FakeElementStream (errorStreamController.stream));
1673
+ when (() => videoElement.onAbort)
1674
+ .thenAnswer ((_) => FakeElementStream (abortStreamController.stream));
1675
+
1676
+ when (() => camera.onEnded)
1677
+ .thenAnswer ((_) => endedStreamController.stream);
1678
+ });
1679
+
1613
1680
testWidgets ('disposes the correct camera' , (tester) async {
1614
1681
const firstCameraId = 0 ;
1615
1682
const secondCameraId = 1 ;
@@ -1642,38 +1709,26 @@ void main() {
1642
1709
);
1643
1710
});
1644
1711
1645
- testWidgets ('cancels camera video and abort error subscriptions' ,
1712
+ testWidgets ('cancels the camera video error and abort subscriptions' ,
1646
1713
(tester) async {
1647
- final camera = MockCamera ();
1648
- final videoElement = MockVideoElement ();
1649
-
1650
- final errorStreamController = StreamController <Event >();
1651
- final abortStreamController = StreamController <Event >();
1714
+ // Save the camera in the camera plugin.
1715
+ (CameraPlatform .instance as CameraPlugin ).cameras[cameraId] = camera;
1652
1716
1653
- when (camera.getVideoSize).thenAnswer (
1654
- (_) => Future .value (Size (10 , 10 )),
1655
- );
1656
- when (camera.initialize).thenAnswer ((_) => Future .value ());
1657
- when (camera.play).thenAnswer ((_) => Future .value ());
1717
+ await CameraPlatform .instance.initializeCamera (cameraId);
1718
+ await CameraPlatform .instance.dispose (cameraId);
1658
1719
1659
- when (() => camera.videoElement).thenReturn (videoElement);
1660
- when (() => videoElement.onError)
1661
- .thenAnswer ((_) => FakeElementStream (errorStreamController.stream));
1662
- when (() => videoElement.onAbort)
1663
- .thenAnswer ((_) => FakeElementStream (abortStreamController.stream));
1720
+ expect (errorStreamController.hasListener, isFalse);
1721
+ expect (abortStreamController.hasListener, isFalse);
1722
+ });
1664
1723
1724
+ testWidgets ('cancels the camera ended subscriptions' , (tester) async {
1665
1725
// Save the camera in the camera plugin.
1666
1726
(CameraPlatform .instance as CameraPlugin ).cameras[cameraId] = camera;
1667
1727
1668
1728
await CameraPlatform .instance.initializeCamera (cameraId);
1669
-
1670
- expect (errorStreamController.hasListener, isTrue);
1671
- expect (abortStreamController.hasListener, isTrue);
1672
-
1673
1729
await CameraPlatform .instance.dispose (cameraId);
1674
1730
1675
- expect (errorStreamController.hasListener, isFalse);
1676
- expect (abortStreamController.hasListener, isFalse);
1731
+ expect (endedStreamController.hasListener, isFalse);
1677
1732
});
1678
1733
1679
1734
group ('throws PlatformException' , () {
@@ -1749,6 +1804,36 @@ void main() {
1749
1804
});
1750
1805
1751
1806
group ('events' , () {
1807
+ late Camera camera;
1808
+ late VideoElement videoElement;
1809
+
1810
+ late StreamController <Event > errorStreamController, abortStreamController;
1811
+ late StreamController <MediaStreamTrack > endedStreamController;
1812
+
1813
+ setUp (() {
1814
+ camera = MockCamera ();
1815
+ videoElement = MockVideoElement ();
1816
+
1817
+ errorStreamController = StreamController <Event >();
1818
+ abortStreamController = StreamController <Event >();
1819
+ endedStreamController = StreamController <MediaStreamTrack >();
1820
+
1821
+ when (camera.getVideoSize).thenAnswer (
1822
+ (_) => Future .value (Size (10 , 10 )),
1823
+ );
1824
+ when (camera.initialize).thenAnswer ((_) => Future .value ());
1825
+ when (camera.play).thenAnswer ((_) => Future .value ());
1826
+
1827
+ when (() => camera.videoElement).thenReturn (videoElement);
1828
+ when (() => videoElement.onError)
1829
+ .thenAnswer ((_) => FakeElementStream (errorStreamController.stream));
1830
+ when (() => videoElement.onAbort)
1831
+ .thenAnswer ((_) => FakeElementStream (abortStreamController.stream));
1832
+
1833
+ when (() => camera.onEnded)
1834
+ .thenAnswer ((_) => endedStreamController.stream);
1835
+ });
1836
+
1752
1837
testWidgets (
1753
1838
'onCameraInitialized emits a CameraInitializedEvent '
1754
1839
'on initializeCamera' , (tester) async {
@@ -1805,46 +1890,40 @@ void main() {
1805
1890
);
1806
1891
});
1807
1892
1808
- testWidgets ('onCameraClosing throws UnimplementedError' , (tester) async {
1809
- expect (
1810
- () => CameraPlatform .instance.onCameraClosing (cameraId),
1811
- throwsUnimplementedError,
1812
- );
1813
- });
1893
+ testWidgets (
1894
+ 'onCameraClosing emits a CameraClosingEvent '
1895
+ 'on the camera ended event' , (tester) async {
1896
+ // Save the camera in the camera plugin.
1897
+ (CameraPlatform .instance as CameraPlugin ).cameras[cameraId] = camera;
1814
1898
1815
- group ('onCameraError' , () {
1816
- late Camera camera;
1817
- late VideoElement videoElement;
1899
+ final Stream <CameraClosingEvent > eventStream =
1900
+ CameraPlatform .instance.onCameraClosing (cameraId);
1818
1901
1819
- late StreamController <Event > errorStreamController,
1820
- abortStreamController;
1902
+ final streamQueue = StreamQueue (eventStream);
1821
1903
1822
- setUp (() {
1823
- camera = MockCamera ();
1824
- videoElement = MockVideoElement ();
1904
+ await CameraPlatform .instance.initializeCamera (cameraId);
1825
1905
1826
- errorStreamController = StreamController <Event >();
1827
- abortStreamController = StreamController <Event >();
1906
+ endedStreamController.add (MockMediaStreamTrack ());
1828
1907
1829
- when (camera.getVideoSize).thenAnswer (
1830
- (_) => Future .value (Size (10 , 10 )),
1831
- );
1832
- when (camera.initialize).thenAnswer ((_) => Future .value ());
1833
- when (camera.play).thenAnswer ((_) => Future .value ());
1908
+ expect (
1909
+ await streamQueue.next,
1910
+ equals (
1911
+ CameraClosingEvent (cameraId),
1912
+ ),
1913
+ );
1834
1914
1835
- when (() => camera.videoElement).thenReturn (videoElement);
1836
- when (() => videoElement.onError).thenAnswer (
1837
- (_) => FakeElementStream (errorStreamController.stream));
1838
- when (() => videoElement.onAbort).thenAnswer (
1839
- (_) => FakeElementStream (abortStreamController.stream));
1915
+ await streamQueue.cancel ();
1916
+ });
1840
1917
1918
+ group ('onCameraError' , () {
1919
+ setUp (() {
1841
1920
// Save the camera in the camera plugin.
1842
1921
(CameraPlatform .instance as CameraPlugin ).cameras[cameraId] = camera;
1843
1922
});
1844
1923
1845
1924
testWidgets (
1846
1925
'emits a CameraErrorEvent '
1847
- 'on initialize video error '
1926
+ 'on the camera video error event '
1848
1927
'with a message' , (tester) async {
1849
1928
final Stream <CameraErrorEvent > eventStream =
1850
1929
CameraPlatform .instance.onCameraError (cameraId);
@@ -1879,7 +1958,7 @@ void main() {
1879
1958
1880
1959
testWidgets (
1881
1960
'emits a CameraErrorEvent '
1882
- 'on initialize video error '
1961
+ 'on the camera video error event '
1883
1962
'with no message' , (tester) async {
1884
1963
final Stream <CameraErrorEvent > eventStream =
1885
1964
CameraPlatform .instance.onCameraError (cameraId);
@@ -1910,7 +1989,7 @@ void main() {
1910
1989
1911
1990
testWidgets (
1912
1991
'emits a CameraErrorEvent '
1913
- 'on initialize abort error ' , (tester) async {
1992
+ 'on the camera video abort event ' , (tester) async {
1914
1993
final Stream <CameraErrorEvent > eventStream =
1915
1994
CameraPlatform .instance.onCameraError (cameraId);
1916
1995
0 commit comments