// Copyright 2019 The Flutter 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 'package:cocoon_service/src/model/appengine/stage.dart';
import 'package:cocoon_service/src/model/appengine/task.dart';
import 'package:test/test.dart';

import '../src/utilities/entity_generators.dart';

Stage buildStage({
  String name = 'stage',
  List<String> statuses = const <String>[Task.statusNew],
}) {
  final Iterable<Task> tasks = statuses.map<Task>((String status) => generateTask(1, status: status));
  final StageBuilder builder = StageBuilder()
    ..name = name
    ..commit = generateCommit(1)
    ..tasks.addAll(tasks);
  return builder.build();
}

void main() {
  group('Stage', () {
    test('ordering', () {
      final List<Stage> stages = <Stage>[
        buildStage(name: 'devicelab'),
        buildStage(name: 'unknown'),
        buildStage(name: 'cirrus'),
      ];
      stages.sort();
      expect(stages.map<String?>((Stage stage) => stage.name), <String>['cirrus', 'devicelab', 'unknown']);
    });

    test('isManagedByDeviceLab', () {
      expect(buildStage(name: 'cirrus').isManagedByDeviceLab, isFalse);
      expect(buildStage(name: 'devicelab').isManagedByDeviceLab, isTrue);
      expect(buildStage(name: 'unknown').isManagedByDeviceLab, isFalse);
    });

    test('taskStatus', () {
      expect(
        buildStage(statuses: <String>[
          Task.statusSucceeded,
        ]).taskStatus,
        Task.statusSucceeded,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusSucceeded,
          Task.statusSucceeded,
          Task.statusFailed,
        ]).taskStatus,
        Task.statusFailed,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusNew,
          Task.statusFailed,
          Task.statusNew,
        ]).taskStatus,
        Task.statusFailed,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusInProgress,
          Task.statusFailed,
          Task.statusInProgress,
        ]).taskStatus,
        Task.statusFailed,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusSucceeded,
          Task.statusFailed,
          Task.statusSucceeded,
        ]).taskStatus,
        Task.statusFailed,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusNew,
          Task.statusFailed,
          Task.statusInProgress,
          Task.statusSucceeded,
        ]).taskStatus,
        Task.statusFailed,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusNew,
          Task.statusInProgress,
          Task.statusNew,
        ]).taskStatus,
        Task.statusInProgress,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusNew,
          Task.statusSucceeded,
          Task.statusNew,
        ]).taskStatus,
        Task.statusInProgress,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusSucceeded,
          Task.statusSucceeded,
          Task.statusInProgress,
        ]).taskStatus,
        Task.statusInProgress,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusNew,
          Task.statusNew,
        ]).taskStatus,
        Task.statusNew,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusInProgress,
          Task.statusInProgress,
        ]).taskStatus,
        Task.statusInProgress,
      );
      expect(
        buildStage(statuses: <String>[
          Task.statusSucceeded,
          Task.statusSucceeded,
        ]).taskStatus,
        Task.statusSucceeded,
      );
    });
  });

  group('StatusBuilder', () {
    test('validates state of the stage', () {
      expect(() => StageBuilder().build(), throwsStateError);
      expect(() => (StageBuilder()..name = 'name').build(), throwsStateError);
      expect(() => (StageBuilder()..commit = generateCommit(1)).build(), throwsStateError);
      expect(
          () => (StageBuilder()
                ..name = 'name'
                ..commit = generateCommit(1))
              .build(),
          throwsStateError);
    });
  });
}
