// Copyright 2014 The Flutter 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 'dart:ui' as ui; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; class RecognizableTestException implements Exception { const RecognizableTestException(); } class TestDelegate extends BinaryMessenger { @override Future<ByteData?>? send(String channel, ByteData? message) async { expect(channel, ''); expect(message, isNull); throw const RecognizableTestException(); } // Rest of the API isn't needed for this test. @override Future<void> handlePlatformMessage(String channel, ByteData? data, ui.PlatformMessageResponseCallback? callback) => throw UnimplementedError(); @override void setMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError(); } class WorkingTestDelegate extends BinaryMessenger { @override Future<ByteData?>? send(String channel, ByteData? message) async { return ByteData.sublistView(Uint8List.fromList(<int>[1, 2, 3])); } // Rest of the API isn't needed for this test. @override Future<void> handlePlatformMessage(String channel, ByteData? data, ui.PlatformMessageResponseCallback? callback) => throw UnimplementedError(); @override void setMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError(); } void main() { testWidgets('Caught exceptions are caught by the test framework', (WidgetTester tester) async { final BinaryMessenger delegate = TestDelegate(); final Future<ByteData?>? future = delegate.send('', null); expect(future, isNotNull); // TODO(srawlins): Fix this static issue, // https://github.com/flutter/flutter/issues/105750. // ignore: body_might_complete_normally_catch_error await future!.catchError((Object error) { }); try { await TestDefaultBinaryMessenger(delegate).send('', null); expect(true, isFalse); // should not reach here } catch (error) { expect(error, const RecognizableTestException()); } }); testWidgets('Mock MessageHandler is set correctly', (WidgetTester tester) async { final TestDefaultBinaryMessenger binaryMessenger = TestDefaultBinaryMessenger(WorkingTestDelegate()); binaryMessenger.setMockMessageHandler( '', (ByteData? message) async => ByteData.sublistView(Uint8List.fromList(<int>[2, 3, 4]))); final ByteData? result = await binaryMessenger.send('', null); expect(result?.buffer.asUint8List(), Uint8List.fromList(<int>[2, 3, 4])); }); test('Mock StreamHandler is set correctly', () async { const EventChannel channel = EventChannel(''); TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger.setMockStreamHandler( channel, MockStreamHandler.inline(onListen: (Object? arguments, MockStreamHandlerEventSink events) { events.success(arguments); events.error(code: 'code', message: 'message', details: 'details'); events.endOfStream(); }) ); expect( channel.receiveBroadcastStream('argument'), emitsInOrder(<Object?>[ 'argument', emitsError( isA<PlatformException>() .having((PlatformException e) => e.code, 'code', 'code') .having((PlatformException e) => e.message, 'message', 'message') .having((PlatformException e) => e.details, 'details', 'details'), ), emitsDone, ]), ); }); testWidgets('Mock AllMessagesHandler is set correctly', (WidgetTester tester) async { final TestDefaultBinaryMessenger binaryMessenger = TestDefaultBinaryMessenger(WorkingTestDelegate()); binaryMessenger.allMessagesHandler = (String channel, MessageHandler? handler, ByteData? message) async => ByteData.sublistView(Uint8List.fromList(<int>[2, 3, 4])); final ByteData? result = await binaryMessenger.send('', null); expect(result?.buffer.asUint8List(), Uint8List.fromList(<int>[2, 3, 4])); }); }