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

/**
 * Classes and methods for running HTML tests.
 *
 * HTML tests are valid HTML files whose names end in _htmltest.html, and that
 * contain annotations specifying the scripts in the test and the
 * messages the test should post to its window, in order to pass.
 */
library html_test;

import "dart:convert";
import "dart:io";

import "path.dart";
import "test_suite.dart";
import "utils.dart";

RegExp htmlAnnotation =
    new RegExp("START_HTML_DART_TEST([\\s\\S]*?)END_HTML_DART_TEST");

HtmlTestInformation getInformation(String filename) {
  if (!filename.endsWith("_htmltest.html")) {
    DebugLogger.warning("File $filename is not an HTML test."
        " Should end in _htmltest.html.");
    return null;
  }

  var contents = new File(filename).readAsStringSync();
  var match = htmlAnnotation.firstMatch(contents);
  if (match == null) return null;

  var annotation = jsonDecode(match[1]);
  if (annotation is! Map ||
      annotation['expectedMessages'] is! List ||
      annotation['scripts'] is! List) {
    DebugLogger.warning("File $filename does not have expected annotation."
        " Should have {'scripts':[...], 'expectedMessages':[...]}");
    return null;
  }

  return new HtmlTestInformation(
      new Path(filename),
      new List<String>.from(annotation['expectedMessages'] as List),
      new List<String>.from(annotation['scripts'] as List));
}

String getContents(HtmlTestInformation info, bool compileToJS) {
  String contents = new File(info.filePath.toNativePath()).readAsStringSync();
  contents = contents.replaceFirst(htmlAnnotation, '');
  if (compileToJS) {
    for (String script in info.scripts) {
      if (dartExtension.hasMatch(script)) {
        String jsScript = script.replaceFirst(dartExtension, '.js');
        String tag = '<script src="$script" type="application/dart">';
        String jsTag = '<script src="$jsScript">';
        contents = contents.replaceAll(tag, jsTag);
      }
    }
  }
  return contents;
}

String makeFailingHtmlFile(String message) {
  return '''
<!DOCTYPE html>
<html>
<head>
  <script>window.parent.dispatchEvent(new Event('detect_errors'));</script>
  <title>Failing HTML test</title>
</head><body>
  <h1>Failing HTML test</h1>
  $message
  <script>
    throw "HTML test failed: $message";
  </script>
</body>
</html>
''';
}
