// 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 'dart:convert';
import 'dart:typed_data';

import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  ByteData _makeByteData(String str) {
    final List<int> list = utf8.encode(str);
    final ByteBuffer buffer =
        list is Uint8List ? list.buffer : Uint8List.fromList(list).buffer;
    return ByteData.view(buffer);
  }

  test('default binary messenger calls callback once', () async {
    int countInbound = 0;
    int countOutbound = 0;
    const String channel = 'foo';
    final ByteData bar = _makeByteData('bar');
    final Completer<void> done = Completer<void>();
    ServicesBinding.instance!.channelBuffers.push(
      channel,
      bar,
      (ByteData? message) async {
        expect(message, isNull);
        countOutbound += 1;
        done.complete();
      },
    );
    expect(countInbound, equals(0));
    expect(countOutbound, equals(0));
    ServicesBinding.instance!.defaultBinaryMessenger.setMessageHandler(
      channel,
      (ByteData? message) async {
        expect(message, bar);
        countInbound += 1;
      },
    );
    expect(countInbound, equals(0));
    expect(countOutbound, equals(0));
    await done.future;
    expect(countInbound, equals(1));
    expect(countOutbound, equals(1));
  });

  test('can check the mock handler', () {
    Future<ByteData?> handler(ByteData? call) => Future<ByteData?>.value();
    final TestDefaultBinaryMessenger messenger = TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger;

    expect(messenger.checkMockMessageHandler('test_channel', null), true);
    expect(messenger.checkMockMessageHandler('test_channel', handler), false);
    messenger.setMockMessageHandler('test_channel', handler);
    expect(messenger.checkMockMessageHandler('test_channel', handler), true);
    messenger.setMockMessageHandler('test_channel', null);
  });
}
