// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of mocks;

class NotificationChangeEventMock implements M.NotificationChangeEvent {
  final NotificationRepositoryMock repository;
  const NotificationChangeEventMock({this.repository});
}

typedef void NotificationRepositoryMockCallback(M.Notification notification);

class NotificationRepositoryMock implements M.NotificationRepository {
  final StreamController<M.NotificationChangeEvent> _onChange =
      new StreamController<M.NotificationChangeEvent>.broadcast();
  Stream<M.NotificationChangeEvent> get onChange => _onChange.stream;

  bool get hasListeners => _onChange.hasListener;

  final Iterable<M.Notification> _list;
  final NotificationRepositoryMockCallback _add;
  final NotificationRepositoryMockCallback _delete;

  bool addInvoked = false;
  bool listInvoked = false;
  bool deleteInvoked = false;
  bool deleteAllInvoked = false;

  void add(M.Notification notification) {
    addInvoked = true;
    if (_add != null) _add(notification);
  }

  Iterable<M.Notification> list() {
    listInvoked = true;
    return _list;
  }

  void delete(M.Notification notification) {
    deleteInvoked = true;
    if (_add != null) _delete(notification);
  }

  void deleteAll() {
    deleteAllInvoked = true;
  }

  void triggerChangeEvent() {
    _onChange.add(new NotificationChangeEventMock(repository: this));
  }

  NotificationRepositoryMock(
      {Iterable<M.Notification> list: const [],
      NotificationRepositoryMockCallback add,
      NotificationRepositoryMockCallback delete})
      : _list = list,
        _add = add,
        _delete = delete;
}
