// Copyright 2019 The Fuchsia 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:io';
import 'dart:typed_data';

import 'package:mockito/mockito.dart';
import 'package:sl4f/sl4f.dart' as sl4f;
import 'package:test/test.dart';

const _timeout = Timeout(Duration(minutes: 1));

class MockFile extends Mock implements File {}

void main() {
  sl4f.Sl4f sl4fDriver;
  sl4f.Audio audio;

  setUp(() async {
    sl4fDriver = sl4f.Sl4f.fromEnvironment();
    await sl4fDriver.startServer();

    audio = sl4f.Audio(sl4fDriver);
  });

  tearDown(() async {
    await sl4fDriver.stopServer();
    sl4fDriver.close();
  });

  group(sl4f.Audio, () {
    test('injects audio', () async {
      final file = MockFile();
      when(file.readAsBytes()).thenAnswer((_) async => Uint8List.fromList([
            // Just for fun, here's what these mean:
            0x52, 0x49, 0x46, 0x46, // "RIFF"
            0x28, 0x00, 0x00, 0x00, // 40 bytes total
            0x57, 0x41, 0x56, 0x45, // "WAVE"
            0x66, 0x6D, 0x74, 0x20, // "fmt "
            0x10, 0x00, 0x00, 0x00, // header size
            0x01, 0x00, // PCM encoding
            0x02, 0x00, // channels
            0x80, 0xBB, 0x00, 0x00, // sample rate
            0x00, 0xEE, 0x02, 0x00, // byte rate
            0x04, 0x00, // block align
            0x10, 0x00, // bits per sample
            0x64, 0x61, 0x74, 0x61, // "DATA"
            0x04, 0x00, 0x00, 0x00, // data size
            0xFF, 0x7F, 0x00, 0x80, // a blip.
          ]));

      // If anything throws an exception then we've failed.
      await audio.putInputAudio(0, file);
      await audio.startInputInjection(0);

      // TODO(isma): Figure out why `audio record` cannot open the audio device
      // so we can use it to test injection.
    });

    test('saves audio playback', () async {
      // If anything throws an exception then we've failed.
      await audio.startOutputSave();
      await audio.stopOutputSave();
      expect(audio.getOutputAudio(), completion(isNotNull));
    });
  }, timeout: _timeout);
}
