// Copyright (c) 2015, 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.

library test.runner.runner_suite;

import 'dart:async';

import 'package:async/async.dart';

import '../backend/operating_system.dart';
import '../backend/suite.dart';
import '../backend/group.dart';
import '../backend/test.dart';
import '../backend/test_platform.dart';
import '../utils.dart';
import 'environment.dart';

/// A suite produced and consumed by the test runner that has runner-specific
/// logic and lifecycle management.
///
/// This is separated from [Suite] because the backend library (which will
/// eventually become its own package) is primarily for test code itself to use,
/// for which the [RunnerSuite] APIs don't make sense.
class RunnerSuite extends Suite {
  final Environment environment;

  /// The memoizer for running [close] exactly once.
  final _closeMemo = new AsyncMemoizer();

  /// The function to call when the suite is closed.
  final AsyncFunction _onClose;

  RunnerSuite(this.environment, Group group, {String path,
          TestPlatform platform, OperatingSystem os, AsyncFunction onClose})
      : _onClose = onClose,
        super(group, path: path, platform: platform, os: os);

  RunnerSuite filter(bool callback(Test test)) {
    var filtered = group.filter(callback);
    filtered ??= new Group.root([], metadata: metadata);
    return new RunnerSuite(environment, filtered,
      platform: platform, os: os, path: path);
  }

  /// Closes the suite and releases any resources associated with it.
  Future close() {
    return _closeMemo.runOnce(() async {
      if (_onClose != null) await _onClose();
    });
  }
}
