blob: 8d04217b2f630482348d550209acc4bcd930e342 [file] [log] [blame]
// 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();
}