// META: title=Headers have combined (and sorted) values
// META: global=window,worker

var headerSeqCombine = [["single", "singleValue"],
                        ["double", "doubleValue1"],
                        ["double", "doubleValue2"],
                        ["triple", "tripleValue1"],
                        ["triple", "tripleValue2"],
                        ["triple", "tripleValue3"]
];
var expectedDict = {"single": "singleValue",
                    "double": "doubleValue1, doubleValue2",
                    "triple": "tripleValue1, tripleValue2, tripleValue3"
};

test(function() {
  var headers = new Headers(headerSeqCombine);
  for (name in expectedDict)
    assert_equals(headers.get(name), expectedDict[name]);
}, "Create headers using same name for different values");

test(function() {
  var headers = new Headers(headerSeqCombine);
  for (name in expectedDict) {
    assert_true(headers.has(name), "name: " + name + " has value(s)");
    headers.delete(name);
    assert_false(headers.has(name), "name: " + name + " has no value(s) anymore");
  }
}, "Check delete and has methods when using same name for different values");

test(function() {
  var headers = new Headers(headerSeqCombine);
  for (name in expectedDict) {
    headers.set(name,"newSingleValue");
    assert_equals(headers.get(name), "newSingleValue", "name: " + name + " has value: newSingleValue");
  }
}, "Check set methods when called with already used name");

test(function() {
  var headers = new Headers(headerSeqCombine);
  for (name in expectedDict) {
    var value = headers.get(name);
    headers.append(name,"newSingleValue");
    assert_equals(headers.get(name), (value + ", " + "newSingleValue"));
  }
}, "Check append methods when called with already used name");

test(() => {
  const headers = new Headers([["1", "a"],["1", "b"]]);
  for(let header of headers) {
    assert_array_equals(header, ["1", "a, b"]);
  }
}, "Iterate combined values");

test(() => {
  const headers = new Headers([["2", "a"], ["1", "b"], ["2", "b"]]),
        expected = [["1", "b"], ["2", "a, b"]];
  let i = 0;
  for(let header of headers) {
    assert_array_equals(header, expected[i]);
    i++;
  }
  assert_equals(i, 2);
}, "Iterate combined values in sorted order")
