// 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, avoid_catches_without_on_clauses

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

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

// Wraps construction of Fleet of MapValues.
class MapFleetFactory<K, V> {
  const MapFleetFactory();

  // Returns Fleet of [count] MapValues.
  Fleet<MapValue<K, V>> newFleet(int count) {
    return new Fleet<MapValue<K, V>>(count, (index) => new MapValue<K, V>());
  }
}

const MapFleetFactory<int, int> intMapFleetFactory =
    const MapFleetFactory<int, int>();

void main() async {
  setupLogger();

  test('Test with framework', () async {
    final fleet = intMapFleetFactory.newFleet(2)
      ..runInTransaction(0, (MapValue<int, int> m0) async {
        m0[1] = 2;
      })
      ..runInTransaction(1, (MapValue<int, int> m1) async {
        m1[1] = 4;
        m1[2] = 2;
      })
      ..runInTransaction(0, (MapValue<int, int> m0) async {
        m0[2] = 4;
      })
      ..synchronize([0, 1])
      ..runInTransaction(0, (MapValue<int, int> m0) async {
        expect(m0[1], equals(4));
        expect(m0[2], equals(4));
      });
    // TODO: enable manual node names, and replace names here
    await fleet.testFixedOrder(
        ['n-init', 'm-0-n1', 'm-1-n2', 'm-0-n3', 's-0_1-n4', 'm-0-n5']);
  });
}
