// 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.

// @dart = 2.9

library fasta.test.incremental_expectations;

import "dart:convert" show JsonDecoder, JsonEncoder;

const JsonEncoder json = const JsonEncoder.withIndent("  ");

List<IncrementalExpectation> extractJsonExpectations(String source) {
  return new List<IncrementalExpectation>.from(source
      .split("\n")
      .where((l) => l.startsWith("<<<< ") || l.startsWith("==== "))
      .map((l) => l.substring("<<<< ".length))
      .map((l) => new IncrementalExpectation.fromJson(l)));
}

class IncrementalExpectation {
  final List<String> messages;

  final bool commitChangesShouldFail;

  final bool hasCompileTimeError;

  const IncrementalExpectation(this.messages,
      {this.commitChangesShouldFail: false, this.hasCompileTimeError: false});

  factory IncrementalExpectation.fromJson(String json) {
    var data = const JsonDecoder().convert(json);
    if (data is String) {
      data = <String>[data];
    }
    if (data is List) {
      return new IncrementalExpectation(data.cast<String>());
    }
    return new IncrementalExpectation(extractMessages(data),
        commitChangesShouldFail: extractCommitChangesShouldFail(data),
        hasCompileTimeError: extractHasCompileTimeError(data));
  }

  dynamic toJson() {
    if (!commitChangesShouldFail && !hasCompileTimeError) {
      return messages.length == 1 ? messages.first : messages;
    }
    Map<String, dynamic> result = <String, dynamic>{
      "messages": messages,
    };
    if (commitChangesShouldFail) {
      result['commitChangesShouldFail'] = 1;
    }
    if (hasCompileTimeError) {
      result['hasCompileTimeError'] = 1;
    }
    return result;
  }

  @override
  String toString() {
    return """
IncrementalExpectation(
    ${json.convert(messages)},
    commitChangesShouldFail: $commitChangesShouldFail,
    hasCompileTimeError: $hasCompileTimeError)""";
  }

  static List<String> extractMessages(Map<String, dynamic> json) {
    return new List<String>.from(json["messages"]);
  }

  static bool extractCommitChangesShouldFail(Map<String, dynamic> json) {
    return json["commitChangesShouldFail"] == 1;
  }

  static bool extractHasCompileTimeError(Map<String, dynamic> json) {
    return json["hasCompileTimeError"] == 1;
  }
}
