|  | // Copyright 2019 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | import 'package:camera/new/camera.dart'; | 
|  | import 'package:flutter/services.dart'; | 
|  | import 'package:flutter_test/flutter_test.dart'; | 
|  | import 'package:camera/new/src/camera_testing.dart'; | 
|  | import 'package:camera/new/src/common/native_texture.dart'; | 
|  |  | 
|  | void main() { | 
|  | group('Camera', () { | 
|  | final List<MethodCall> log = <MethodCall>[]; | 
|  |  | 
|  | setUpAll(() { | 
|  | CameraTesting.channel | 
|  | .setMockMethodCallHandler((MethodCall methodCall) async { | 
|  | log.add(methodCall); | 
|  | switch (methodCall.method) { | 
|  | case 'NativeTexture#allocate': | 
|  | return 15; | 
|  | } | 
|  |  | 
|  | throw ArgumentError.value( | 
|  | methodCall.method, | 
|  | 'methodCall.method', | 
|  | 'No method found for', | 
|  | ); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | setUp(() { | 
|  | log.clear(); | 
|  | CameraTesting.nextHandle = 0; | 
|  | }); | 
|  |  | 
|  | group('$CameraController', () { | 
|  | test('Initializing a second controller closes the first', () { | 
|  | final MockCameraDescription description = MockCameraDescription(); | 
|  | final MockCameraConfigurator configurator = MockCameraConfigurator(); | 
|  |  | 
|  | final CameraController controller1 = | 
|  | CameraController.customConfigurator( | 
|  | description: description, | 
|  | configurator: configurator, | 
|  | ); | 
|  |  | 
|  | controller1.initialize(); | 
|  |  | 
|  | final CameraController controller2 = | 
|  | CameraController.customConfigurator( | 
|  | description: description, | 
|  | configurator: configurator, | 
|  | ); | 
|  |  | 
|  | controller2.initialize(); | 
|  |  | 
|  | expect( | 
|  | () => controller1.start(), | 
|  | throwsA(isInstanceOf<AssertionError>()), | 
|  | ); | 
|  |  | 
|  | expect( | 
|  | () => controller1.stop(), | 
|  | throwsA(isInstanceOf<AssertionError>()), | 
|  | ); | 
|  |  | 
|  | expect(controller1.isDisposed, isTrue); | 
|  | }); | 
|  | }); | 
|  |  | 
|  | group('$NativeTexture', () { | 
|  | test('allocate', () async { | 
|  | final NativeTexture texture = await NativeTexture.allocate(); | 
|  |  | 
|  | expect(texture.textureId, 15); | 
|  | expect(log, <Matcher>[ | 
|  | isMethodCall( | 
|  | '$NativeTexture#allocate', | 
|  | arguments: <String, dynamic>{'textureHandle': 0}, | 
|  | ) | 
|  | ]); | 
|  | }); | 
|  | }); | 
|  | }); | 
|  | } | 
|  |  | 
|  | class MockCameraDescription extends CameraDescription { | 
|  | @override | 
|  | LensDirection get direction => LensDirection.unknown; | 
|  |  | 
|  | @override | 
|  | String get name => 'none'; | 
|  | } | 
|  |  | 
|  | class MockCameraConfigurator extends CameraConfigurator { | 
|  | @override | 
|  | Future<int> addPreviewTexture() => Future<int>.value(7); | 
|  |  | 
|  | @override | 
|  | Future<void> dispose() => Future<void>.value(); | 
|  |  | 
|  | @override | 
|  | Future<void> initialize() => Future<void>.value(); | 
|  |  | 
|  | @override | 
|  | int get previewTextureId => 7; | 
|  |  | 
|  | @override | 
|  | Future<void> start() => Future<void>.value(); | 
|  |  | 
|  | @override | 
|  | Future<void> stop() => Future<void>.value(); | 
|  | } |