// 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 'package:lib.app.dart/logging.dart';
import 'package:sledge/src/document/values/last_one_wins_value.dart';
import 'package:test/test.dart';

import '../crdt_test_framework/crdt_test_framework.dart';

// Wraps the construction of Fleet of LastOneWinValues.
class LastOneWinsFleetFactory<T> {
  const LastOneWinsFleetFactory();

  Fleet<LastOneWinsValue<T>> newFleet(int count) {
    return Fleet<LastOneWinsValue<T>>(
        count, (index) => LastOneWinsValue<T>());
  }
}

const LastOneWinsFleetFactory<bool> boolLastOneWinsFleetFactory =
    LastOneWinsFleetFactory<bool>();

class FalseChecker extends Checker<LastOneWinsValue<bool>> {
  @override
  void check(LastOneWinsValue<bool> value) {
    expect(value.value, equals(false));
  }
}

void main() async {
  setupLogger();

  test('Checker passes.', () async {
    final fleet = boolLastOneWinsFleetFactory.newFleet(2)
      ..runInTransaction(0, (LastOneWinsValue<bool> b) async {
        b.value = false;
      })
      ..runInTransaction(1, (LastOneWinsValue<bool> b) async {
        b.value = false;
      })
      ..synchronize([0, 1])
      ..addChecker(() => FalseChecker());
    await fleet.testAllOrders();
  });

  test('Checker fails.', () async {
    final fleet = boolLastOneWinsFleetFactory.newFleet(1)
      ..runInTransaction(0, (LastOneWinsValue<bool> b) async {
        b.value = true;
      })
      ..addChecker(() => FalseChecker());
    expect(fleet.testAllOrders(), throwsA(TypeMatcher<TestFailure>()));
  });
}
