| // 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:async'; |
| |
| import 'package:flutter/services.dart'; |
| |
| /// A mock stream handler for an [EventChannel] that mimics the native |
| /// StreamHandler API. |
| /// |
| /// The [onListen] callback is provided a [MockStreamHandlerEventSink] with |
| /// the following API: |
| /// - [MockStreamHandlerEventSink.success] sends a success event. |
| /// - [MockStreamHandlerEventSink.error] sends an error event. |
| /// - [MockStreamHandlerEventSink.endOfStream] sends an end of stream event. |
| abstract class MockStreamHandler { |
| /// Create a new [MockStreamHandler]. |
| const MockStreamHandler(); |
| |
| /// Create a new inline [MockStreamHandler] with the given [onListen] and |
| /// [onCancel] handlers. |
| const factory MockStreamHandler.inline({ |
| required MockStreamHandlerOnListenCallback onListen, |
| MockStreamHandlerOnCancelCallback? onCancel, |
| }) = _InlineMockStreamHandler; |
| |
| /// Handler for the listen event. |
| void onListen(Object? arguments, MockStreamHandlerEventSink events); |
| |
| /// Handler for the cancel event. |
| void onCancel(Object? arguments); |
| } |
| |
| /// Typedef for the inline onListen callback. |
| typedef MockStreamHandlerOnListenCallback = void Function(Object? arguments, MockStreamHandlerEventSink events); |
| |
| /// Typedef for the inline onCancel callback. |
| typedef MockStreamHandlerOnCancelCallback = void Function(Object? arguments); |
| |
| class _InlineMockStreamHandler extends MockStreamHandler { |
| const _InlineMockStreamHandler({ |
| required MockStreamHandlerOnListenCallback onListen, |
| MockStreamHandlerOnCancelCallback? onCancel, |
| }) : _onListenInline = onListen, |
| _onCancelInline = onCancel; |
| |
| final MockStreamHandlerOnListenCallback _onListenInline; |
| final MockStreamHandlerOnCancelCallback? _onCancelInline; |
| |
| @override |
| void onListen(Object? arguments, MockStreamHandlerEventSink events) => _onListenInline(arguments, events); |
| |
| @override |
| void onCancel(Object? arguments) => _onCancelInline?.call(arguments); |
| } |
| |
| /// A mock event sink for a [MockStreamHandler] that mimics the native |
| /// [EventSink](https://api.flutter.dev/javadoc/io/flutter/plugin/common/EventChannel.EventSink.html) |
| /// API. |
| class MockStreamHandlerEventSink { |
| /// Create a new [MockStreamHandlerEventSink] with the given [sink]. |
| MockStreamHandlerEventSink(EventSink<Object?> sink) : _sink = sink; |
| |
| final EventSink<Object?> _sink; |
| |
| /// Send a success event. |
| void success(Object? event) => _sink.add(event); |
| |
| /// Send an error event. |
| void error({ |
| required String code, |
| String? message, |
| Object? details, |
| }) => _sink.addError(PlatformException(code: code, message: message, details: details)); |
| |
| /// Send an end of stream event. |
| void endOfStream() => _sink.close(); |
| } |