// Copyright (c) 2012, 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;

import "dart:io";

import 'expectation.dart' show Expectation, ExpectationSet;

TestExpectations readTestExpectations(
  List<String> statusFilePaths,
  ExpectationSet expectationSet,
) {
  TestExpectations testExpectations = TestExpectations(expectationSet);
  for (String path in statusFilePaths) {
    readTestExpectationsInto(testExpectations, path);
  }
  return testExpectations;
}

void readTestExpectationsInto(
  TestExpectations expectations,
  String statusFilePath,
) {
  File file = File(statusFilePath);
  for (String line in file.readAsLinesSync()) {
    // Remove comments if any.
    int index = line.indexOf("#");
    if (index >= 0) {
      line = line.substring(0, index);
    }
    line = line.trim();
    if (line.isEmpty) continue;

    // Line should look lie "testName: status1, status2, etc".
    List<String> lineSplit = line.split(":");
    if (lineSplit.length != 2) {
      throw "Unsupported line: '$line'";
    }

    String name = lineSplit[0];
    List<String> allowedStatus = lineSplit[1].trim().split(",");
    for (int i = 0; i < allowedStatus.length; i++) {
      allowedStatus[i] = allowedStatus[i].trim();
    }
    expectations.add(name, allowedStatus);
  }
}

class TestExpectations {
  final ExpectationSet expectationSet;
  final Map<String, Set<Expectation>> _map = {};

  new(this.expectationSet);

  void add(String name, List<String> allowedStatus) {
    Set<Expectation> expectations = (_map[name] ??= {});
    for (String status in allowedStatus) {
      expectations.add(expectationSet[status]);
    }
  }

  Set<Expectation> expectations(String filename) {
    Set<Expectation> result = _map[filename] ?? {};
    // If no expectations were found the expectation is that the test
    // passes.
    if (result.isEmpty) {
      result.add(Expectation.pass);
    }
    return result;
  }
}
