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

@TestOn("vm")

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

import "package:resource/resource.dart";
import "package:test/test.dart";

const content = "Rødgrød med fløde";

main() {
  var server;
  var uri;
  setUp(() async {
    var addr = (await InternetAddress.lookup("localhost"))[0];
    server = await HttpServer.bind(addr, 0);
    int port = server.port;
    uri = Uri.parse("http://localhost:$port/default.html");
    server.forEach((HttpRequest request) {
      if (request.uri.path.endsWith(".not")) {
        request.response
          ..statusCode = HttpStatus.notFound
          ..close();
        return;
      }
      var encodings = request.headers[HttpHeaders.acceptCharsetHeader];
      var encoding = parseAcceptCharset(encodings);
      request.response.headers.contentType =
          new ContentType("text", "plain", charset: encoding.name);
      if (request.uri.query.contains("length")) {
        request.response.headers.contentLength =
            encoding.encode(content).length;
      }
      request.response
        ..write(content)
        ..close();
    }).catchError((e, stack) {
      print(e);
      print(stack);
    });
  });

  test("Default encoding", () async {
    var loader = ResourceLoader.defaultLoader;
    String string = await loader.readAsString(uri);
    expect(string, content);
  });

  test("Latin-1 encoding", () async {
    var loader = ResourceLoader.defaultLoader;
    String string = await loader.readAsString(uri, encoding: latin1);
    expect(string, content);
  });

  test("Latin-1 encoding w/ length", () async {
    // Regression test for issue #21.
    var loader = ResourceLoader.defaultLoader;
    var newUri = uri.replace(query: "length"); // Request length set.
    String string = await loader.readAsString(newUri, encoding: latin1);
    expect(string, content);
  });

  test("UTF-8 encoding", () async {
    var loader = ResourceLoader.defaultLoader;
    var newUri = uri.replace(query: "length"); // Request length set.
    String string = await loader.readAsString(newUri, encoding: utf8);
    expect(string, content);
  });

  test("UTF-8 encoding w/ length", () async {
    var loader = ResourceLoader.defaultLoader;
    String string = await loader.readAsString(uri, encoding: utf8);
    expect(string, content);
  });

  test("bytes", () async {
    var loader = ResourceLoader.defaultLoader;
    List<int> bytes = await loader.readAsBytes(uri); // Sender uses Latin-1.
    expect(bytes, content.codeUnits);
  });

  test("bytes w/ length", () async {
    var loader = ResourceLoader.defaultLoader;
    var newUri = uri.replace(query: "length"); // Request length set.
    List<int> bytes = await loader.readAsBytes(newUri); // Sender uses Latin-1.
    expect(bytes, content.codeUnits);
  });

  test("byte stream", () async {
    var loader = ResourceLoader.defaultLoader;
    var bytes = loader.openRead(uri); // Sender uses Latin-1.
    var buffer = [];
    await bytes.forEach(buffer.addAll);
    expect(buffer, content.codeUnits);
  });

  test("not found - String", () async {
    var loader = ResourceLoader.defaultLoader;
    var badUri = uri.resolve("file.not"); // .not makes server fail.
    expect(loader.readAsString(badUri), throwsException);
  });

  test("not found - bytes", () async {
    var loader = ResourceLoader.defaultLoader;
    var badUri = uri.resolve("file.not"); // .not makes server fail.
    expect(loader.readAsBytes(badUri), throwsException);
  });

  test("not found - byte stream", () async {
    var loader = ResourceLoader.defaultLoader;
    var badUri = uri.resolve("file.not"); // .not makes server fail.
    expect(loader.openRead(badUri).length, throwsException);
  });

  tearDown(() {
    server.close();
    server = null;
  });
}

Encoding parseAcceptCharset(List<String> headers) {
  Encoding encoding = latin1;
  if (headers != null) {
    var weight = 0.0;
    var pattern = new RegExp(r"([\w-]+)(;\s*q=[\d.]+)?");
    for (var acceptCharset in headers) {
      for (var match in pattern.allMatches(acceptCharset)) {
        var e = Encoding.getByName(match[1]);
        if (e == null) continue;
        var w = 1.0;
        if (match[2] != null) {
          w = double.parse(match[2]);
        }
        if (w > weight) {
          weight = w;
          encoding = e;
        }
      }
    }
  }
  return encoding;
}
