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

import "package:expect/expect.dart";
import 'dart:convert';

main() {
  testAll(["a", "b", "c"]);
  testAll([""]);
  testAll(["a"]);
  testAll(["", ""]);
  testAll(["baz"]);

  testParse("z&y&w&z", {
    "z": ["", ""],
    "y": [""],
    "w": [""]
  });
  testParse("x=42&y=42&x=37&y=37", {
    "x": ["42", "37"],
    "y": ["42", "37"]
  });
  testParse("x&x&x&x&x", {
    "x": ["", "", "", "", ""]
  });
  testParse("x=&&y", {
    "x": [""],
    "y": [""]
  });
}

testAll(List values) {
  var uri =
      new Uri(scheme: "foo", path: "bar", queryParameters: {"baz": values});
  var list = uri.queryParametersAll["baz"]!;
  Expect.listEquals(values, list);
}

testParse(query, results) {
  var uri = new Uri(scheme: "foo", path: "bar", query: query);
  var params = uri.queryParametersAll;
  for (var k in results.keys) {
    Expect.listEquals(results[k], params[k]!);
  }
  uri = new Uri(scheme: "foo", path: "bar", queryParameters: results);
  params = uri.queryParametersAll;
  for (var k in results.keys) {
    Expect.listEquals(results[k], params[k]!);
  }
}
