// Copyright 2018 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.

// ignore_for_file: implementation_imports
import 'dart:async';
import 'dart:typed_data';

import 'package:lib.app.dart/logging.dart';
import 'package:sledge/src/document/values/converted_change.dart';
import 'package:sledge/src/document/values/converter.dart';
import 'package:sledge/src/document/values/last_one_wins_value.dart';
import 'package:test/test.dart';

import '../dummies/dummy_value_observer.dart';

void main() {
  setupLogger();

  test('Integer', () {
    final cnt = new LastOneWinsValue<int>();
    expect(cnt.value, equals(0));
    cnt.value = 3;
    expect(cnt.value, equals(3));
    cnt.value = -5;
    expect(cnt.value, equals(-5));
  });

  test('Double', () {
    final cnt = new LastOneWinsValue<double>();
    expect(cnt.value, equals(0.0));
    cnt.value = 3.5;
    expect(cnt.value, equals(3.5));
    cnt.value = -5.25;
    expect(cnt.value, equals(-5.25));
  });

  test('Boolean', () {
    final cnt = new LastOneWinsValue<bool>();
    expect(cnt.value, equals(false));
    cnt.value = true;
    expect(cnt.value, equals(true));
    cnt.value = false;
    expect(cnt.value, equals(false));
  });

  test('String', () {
    final cnt = new LastOneWinsValue<String>();
    expect(cnt.value, equals(''));
    cnt.value = 'aba';
    expect(cnt.value, equals('aba'));
    cnt.value = 'foo';
    expect(cnt.value, equals('foo'));
  });

  test('Uint8List', () {
    final cnt = new LastOneWinsValue<Uint8List>();
    expect(cnt.value, equals(new Uint8List(0)));
    cnt.value = new Uint8List.fromList([1, 2, 3]);
    expect(cnt.value, equals(new Uint8List.fromList([1, 2, 3])));
    cnt.value = new Uint8List.fromList([2, 5, 3]);
    expect(cnt.value, equals(new Uint8List.fromList([2, 5, 3])));
  });

  test('Integer oprations', () {
    final conv = new MapToKVListConverter<int, int>();
    final x = new LastOneWinsValue<int>(
        conv.serialize(new ConvertedChange<int, int>({0: -3})));
    expect(x.value, equals(-3));
    x.applyChange(conv.serialize(new ConvertedChange<int, int>({0: 5})));
    expect(x.value, equals(5));
    x.value = 2;
    expect(x.value, equals(2));
    x.value = -1;
    expect(x.value, equals(-1));
    x.getChange();
    expect(x.value, equals(-1));
    x.applyChange(conv.serialize(new ConvertedChange<int, int>({0: 4})));
    expect(x.value, equals(4));
  });

  test('Double operations', () {
    final conv = new MapToKVListConverter<int, double>();
    final x = new LastOneWinsValue<double>(
        conv.serialize(new ConvertedChange<int, double>({0: -3.5})));
    expect(x.value, equals(-3.5));
    x.applyChange(conv.serialize(new ConvertedChange<int, double>({0: 4.2})));
    expect(x.value, equals(4.2));
    x.value = 0.5;
    expect(x.value, equals(0.5));
    x.value = -1.0;
    expect(x.value, equals(-1.0));
    x.getChange();
    expect(x.value, equals(-1.0));
    x.applyChange(conv.serialize(new ConvertedChange<int, double>({0: 4.25})));
    expect(x.value, equals(4.25));
  });

  test('String operations', () {
    final conv = new MapToKVListConverter<int, String>();
    final x = new LastOneWinsValue<String>(
        conv.serialize(new ConvertedChange<int, String>({0: 'bar'})));
    expect(x.value, equals('bar'));
    x.applyChange(conv.serialize(new ConvertedChange<int, String>({0: 'foo'})));
    expect(x.value, equals('foo'));
    x.value = 'bar';
    expect(x.value, equals('bar'));
    x.value = 'tor';
    expect(x.value, equals('tor'));
    x.getChange();
    expect(x.value, equals('tor'));
    x.applyChange(conv.serialize(new ConvertedChange<int, String>({0: 'cir'})));
    expect(x.value, equals('cir'));
  });

  test('Boolean operations', () {
    final conv = new MapToKVListConverter<int, bool>();
    final x = new LastOneWinsValue<bool>(
        conv.serialize(new ConvertedChange<int, bool>({0: true})));
    expect(x.value, equals(true));
    x.applyChange(conv.serialize(new ConvertedChange<int, bool>({0: false})));
    expect(x.value, equals(false));
    x.value = true;
    expect(x.value, equals(true));
    x.getChange();
    expect(x.value, equals(true));
    x.applyChange(conv.serialize(new ConvertedChange<int, bool>({0: false})));
    expect(x.value, equals(false));
  });

  test('onChange stream', () {
    final conv = new MapToKVListConverter<int, String>();
    final x = new LastOneWinsValue<String>(
        conv.serialize(new ConvertedChange<int, String>({0: 'aba'})));
    Stream<String> changeStream = x.onChange;
    expect(changeStream, emitsInOrder(['bar', 'foo', 'a']));
    x
      ..applyChange(
          conv.serialize(new ConvertedChange<int, String>({0: 'bar'})))
      ..applyChange(
          conv.serialize(new ConvertedChange<int, String>({0: 'foo'})))
      ..applyChange(conv.serialize(new ConvertedChange<int, String>({0: 'a'})));
  });

  test('Observer calls', () {
    final x = new LastOneWinsValue<String>();
    final observer = new DummyValueObserver();
    x.observer = observer;
    expect(x.value, equals(''));
    observer.expectNotChanged();
    x.value = 'foo';
    observer
      ..expectChanged()
      ..reset();
  });
}
