// Copyright (c) 2017, 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 status_files.log_parser;

import 'record.dart';

final RegExp _stackRE = new RegExp('#[0-9]* ');
final RegExp _assertionFileRE = new RegExp(r"'file:[^']*/sdk/pkg/");
final String _assertionFileReplacement = r"'file:*/pkg/";

/// Extracts test records from a test.py [log].
List<Record> parse(String log) {
  var records = <Record>[];
  var suite;
  var test;
  var config;
  var expected;
  var actual;
  var reason;
  var fullReason; // lines before stack, usually multiline reason.
  var stack = <String>[];
  var paragraph = []; // collector of lines for fullReason.
  bool reproIsNext = false;
  for (var line in log.split('\n')) {
    if (line.startsWith("FAILED: ")) {
      int lastSlash = line.lastIndexOf('/');
      // Some tests (particularly the html tests) have "group names" with spaces
      // in them. So we find the test name by the space just before the last
      // slash.
      int space = line.substring(0, lastSlash).lastIndexOf(' ');
      test = line.substring(space + 1).trim();
      suite = '';
      var slash = test.indexOf('/');
      if (slash > 0) {
        suite = test.substring(0, slash).trim();
        test = test.substring(slash + 1).trim();
      }
      config = line
          .substring("FAILED: ".length, space)
          .replaceAll('release_ia32', '')
          .replaceAll('release_x64', '');
    }
    if (line.startsWith("Expected: ")) {
      expected = line.substring("Expected: ".length).trim();
    }
    if (line.startsWith("Actual: ")) {
      actual = line.substring("Actual: ".length).trim();
    }
    if (line.startsWith("The compiler crashed:")) {
      reason = line.substring("The compiler crashed:".length).trim();
      reason = reason.replaceFirst(_assertionFileRE, _assertionFileReplacement);
      paragraph.clear();
    }

    if (line.startsWith(_stackRE)) {
      stack.add(line);
      fullReason ??= paragraph.take(5).join('\n');
      paragraph.clear();
    } else {
      paragraph.add(line);
    }

    if (reproIsNext) {
      records.add(new Record(suite, test, config, expected, actual, reason,
          line.trim(), fullReason, stack));
      suite = test = config = expected = actual = reason = null;
      stack = [];
      fullReason = null;
      paragraph.clear();
      reproIsNext = false;
    }
    if (line.startsWith("--- Re-run this test:")) {
      reproIsNext = true;
    }
  }
  return records;
}
