<!doctype html>
<meta charset=utf-8>
<title></title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
var log = [];
function clearLog() {
  log = [];
}
function addLogEntry(name, args) {
  log.push([ name, ...args ]);
}

var loggingHandler = {
};

setup(function() {
  for (let prop of Object.getOwnPropertyNames(Reflect)) {
    loggingHandler[prop] = function(...args) {
      addLogEntry(prop, args);
      return Reflect[prop](...args);
    }
  }
});

test(function() {
  var h = new Headers();
  assert_equals([...h].length, 0);
}, "Passing nothing to Headers constructor");

test(function() {
  var h = new Headers(undefined);
  assert_equals([...h].length, 0);
}, "Passing undefined to Headers constructor");

test(function() {
  assert_throws(new TypeError, function() {
    var h = new Headers(null);
  });
}, "Passing null to Headers constructor");

test(function() {
  this.add_cleanup(clearLog);
  var record = { a: "b" };
  var proxy = new Proxy(record, loggingHandler);
  var h = new Headers(proxy);

  assert_equals(log.length, 4);
  // The first thing is the [[Get]] of Symbol.iterator to figure out whether
  // we're a sequence, during overload resolution.
  assert_array_equals(log[0], ["get", record, Symbol.iterator, proxy]);
  // Then we have the [[OwnPropertyKeys]] from
  // https://heycam.github.io/webidl/#es-to-record step 4.
  assert_array_equals(log[1], ["ownKeys", record]);
  // Then the [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[2], ["getOwnPropertyDescriptor", record, "a"]);
  // Then the [[Get]] from step 5.2.
  assert_array_equals(log[3], ["get", record, "a", proxy]);

  // Check the results.
  assert_equals([...h].length, 1);
  assert_array_equals([...h.keys()], ["a"]);
  assert_true(h.has("a"));
  assert_equals(h.get("a"), "b");
}, "Basic operation with one property");

test(function() {
  this.add_cleanup(clearLog);
  var recordProto = { c: "d" };
  var record = Object.create(recordProto, { a: { value: "b", enumerable: true } });
  var proxy = new Proxy(record, loggingHandler);
  var h = new Headers(proxy);

  assert_equals(log.length, 4);
  // The first thing is the [[Get]] of Symbol.iterator to figure out whether
  // we're a sequence, during overload resolution.
  assert_array_equals(log[0], ["get", record, Symbol.iterator, proxy]);
  // Then we have the [[OwnPropertyKeys]] from
  // https://heycam.github.io/webidl/#es-to-record step 4.
  assert_array_equals(log[1], ["ownKeys", record]);
  // Then the [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[2], ["getOwnPropertyDescriptor", record, "a"]);
  // Then the [[Get]] from step 5.2.
  assert_array_equals(log[3], ["get", record, "a", proxy]);

  // Check the results.
  assert_equals([...h].length, 1);
  assert_array_equals([...h.keys()], ["a"]);
  assert_true(h.has("a"));
  assert_equals(h.get("a"), "b");
}, "Basic operation with one property and a proto");

test(function() {
  this.add_cleanup(clearLog);
  var record = { a: "b", c: "d" };
  var proxy = new Proxy(record, loggingHandler);
  var h = new Headers(proxy);

  assert_equals(log.length, 6);
  // The first thing is the [[Get]] of Symbol.iterator to figure out whether
  // we're a sequence, during overload resolution.
  assert_array_equals(log[0], ["get", record, Symbol.iterator, proxy]);
  // Then we have the [[OwnPropertyKeys]] from
  // https://heycam.github.io/webidl/#es-to-record step 4.
  assert_array_equals(log[1], ["ownKeys", record]);
  // Then the [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[2], ["getOwnPropertyDescriptor", record, "a"]);
  // Then the [[Get]] from step 5.2.
  assert_array_equals(log[3], ["get", record, "a", proxy]);
  // Then the second [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[4], ["getOwnPropertyDescriptor", record, "c"]);
  // Then the second [[Get]] from step 5.2.
  assert_array_equals(log[5], ["get", record, "c", proxy]);

  // Check the results.
  assert_equals([...h].length, 2);
  assert_array_equals([...h.keys()], ["a", "c"]);
  assert_true(h.has("a"));
  assert_equals(h.get("a"), "b");
  assert_true(h.has("c"));
  assert_equals(h.get("c"), "d");
}, "Correct operation ordering with two properties");

test(function() {
  this.add_cleanup(clearLog);
  var record = { a: "b", "\uFFFF": "d" };
  var proxy = new Proxy(record, loggingHandler);
  assert_throws(new TypeError, function() {
    var h = new Headers(proxy);
  });

  assert_equals(log.length, 5);
  // The first thing is the [[Get]] of Symbol.iterator to figure out whether
  // we're a sequence, during overload resolution.
  assert_array_equals(log[0], ["get", record, Symbol.iterator, proxy]);
  // Then we have the [[OwnPropertyKeys]] from
  // https://heycam.github.io/webidl/#es-to-record step 4.
  assert_array_equals(log[1], ["ownKeys", record]);
  // Then the [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[2], ["getOwnPropertyDescriptor", record, "a"]);
  // Then the [[Get]] from step 5.2.
  assert_array_equals(log[3], ["get", record, "a", proxy]);
  // Then the second [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[4], ["getOwnPropertyDescriptor", record, "\uFFFF"]);
  // The second [[Get]] never happens, because we convert the invalid name to a
  // ByteString first and throw.
}, "Correct operation ordering with two properties one of which has an invalid name");

test(function() {
  this.add_cleanup(clearLog);
  var record = { a: "\uFFFF", c: "d" }
  var proxy = new Proxy(record, loggingHandler);
  assert_throws(new TypeError, function() {
    var h = new Headers(proxy);
  });

  assert_equals(log.length, 4);
  // The first thing is the [[Get]] of Symbol.iterator to figure out whether
  // we're a sequence, during overload resolution.
  assert_array_equals(log[0], ["get", record, Symbol.iterator, proxy]);
  // Then we have the [[OwnPropertyKeys]] from
  // https://heycam.github.io/webidl/#es-to-record step 4.
  assert_array_equals(log[1], ["ownKeys", record]);
  // Then the [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[2], ["getOwnPropertyDescriptor", record, "a"]);
  // Then the [[Get]] from step 5.2.
  assert_array_equals(log[3], ["get", record, "a", proxy]);
  // Nothing else after this, because converting the result of that [[Get]] to a
  // ByteString throws.
}, "Correct operation ordering with two properties one of which has an invalid value");

test(function() {
  this.add_cleanup(clearLog);
  var record = {};
  Object.defineProperty(record, "a", { value: "b", enumerable: false });
  Object.defineProperty(record, "c", { value: "d", enumerable: true });
  Object.defineProperty(record, "e", { value: "f", enumerable: false });
  var proxy = new Proxy(record, loggingHandler);
  var h = new Headers(proxy);

  assert_equals(log.length, 6);
  // The first thing is the [[Get]] of Symbol.iterator to figure out whether
  // we're a sequence, during overload resolution.
  assert_array_equals(log[0], ["get", record, Symbol.iterator, proxy]);
  // Then we have the [[OwnPropertyKeys]] from
  // https://heycam.github.io/webidl/#es-to-record step 4.
  assert_array_equals(log[1], ["ownKeys", record]);
  // Then the [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[2], ["getOwnPropertyDescriptor", record, "a"]);
  // No [[Get]] because not enumerable
  // Then the second [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[3], ["getOwnPropertyDescriptor", record, "c"]);
  // Then the [[Get]] from step 5.2.
  assert_array_equals(log[4], ["get", record, "c", proxy]);
  // Then the third [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[5], ["getOwnPropertyDescriptor", record, "e"]);
  // No [[Get]] because not enumerable

  // Check the results.
  assert_equals([...h].length, 1);
  assert_array_equals([...h.keys()], ["c"]);
  assert_true(h.has("c"));
  assert_equals(h.get("c"), "d");
}, "Correct operation ordering with non-enumerable properties");

test(function() {
  this.add_cleanup(clearLog);
  var record = {a: "b", c: "d", e: "f"};
  var lyingHandler = {
    getOwnPropertyDescriptor: function(target, name) {
      if (name == "a" || name == "e") {
        return undefined;
      }
      return Reflect.getOwnPropertyDescriptor(target, name);
    }
  };
  var lyingProxy = new Proxy(record, lyingHandler);
  var proxy = new Proxy(lyingProxy, loggingHandler);
  var h = new Headers(proxy);

  assert_equals(log.length, 6);
  // The first thing is the [[Get]] of Symbol.iterator to figure out whether
  // we're a sequence, during overload resolution.
  assert_array_equals(log[0], ["get", lyingProxy, Symbol.iterator, proxy]);
  // Then we have the [[OwnPropertyKeys]] from
  // https://heycam.github.io/webidl/#es-to-record step 4.
  assert_array_equals(log[1], ["ownKeys", lyingProxy]);
  // Then the [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[2], ["getOwnPropertyDescriptor", lyingProxy, "a"]);
  // No [[Get]] because no descriptor
  // Then the second [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[3], ["getOwnPropertyDescriptor", lyingProxy, "c"]);
  // Then the [[Get]] from step 5.2.
  assert_array_equals(log[4], ["get", lyingProxy, "c", proxy]);
  // Then the third [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[5], ["getOwnPropertyDescriptor", lyingProxy, "e"]);
  // No [[Get]] because no descriptor

  // Check the results.
  assert_equals([...h].length, 1);
  assert_array_equals([...h.keys()], ["c"]);
  assert_true(h.has("c"));
  assert_equals(h.get("c"), "d");
}, "Correct operation ordering with undefined descriptors");

test(function() {
  this.add_cleanup(clearLog);
  var record = {a: "b", c: "d"};
  var lyingHandler = {
    ownKeys: function() {
      return [ "a", "c", "a", "c" ];
    },
    getCalls: 0,
    gotCOnce: false,
    get: function(target, name, receiver) {
      if (name == "c") {
        this.gotCOnce = true;
      }
      if (typeof name == "string") {
        return ++this.getCalls;
      }
      return Reflect.get(target, name, receiver);
    },
    getOwnPropertyDescriptor: function(target, name) {
      var desc = Reflect.getOwnPropertyDescriptor(target, name);
      if (name == "c" && this.gotCOnce) {
        desc.enumerable = false;
      }
      return desc;
    }
  };
  var lyingProxy = new Proxy(record, lyingHandler);
  var proxy = new Proxy(lyingProxy, loggingHandler);
  var h = new Headers(proxy);

  assert_equals(log.length, 9);
  // The first thing is the [[Get]] of Symbol.iterator to figure out whether
  // we're a sequence, during overload resolution.
  assert_array_equals(log[0], ["get", lyingProxy, Symbol.iterator, proxy]);
  // Then we have the [[OwnPropertyKeys]] from
  // https://heycam.github.io/webidl/#es-to-record step 4.
  assert_array_equals(log[1], ["ownKeys", lyingProxy]);
  // Then the [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[2], ["getOwnPropertyDescriptor", lyingProxy, "a"]);
  // Then the [[Get]] from step 5.2.
  assert_array_equals(log[3], ["get", lyingProxy, "a", proxy]);
  // Then the second [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[4], ["getOwnPropertyDescriptor", lyingProxy, "c"]);
  // Then the second [[Get]] from step 5.2.
  assert_array_equals(log[5], ["get", lyingProxy, "c", proxy]);
  // Then the third [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[6], ["getOwnPropertyDescriptor", lyingProxy, "a"]);
  // Then the third [[Get]] from step 5.2.
  assert_array_equals(log[7], ["get", lyingProxy, "a", proxy]);
  // Then the fourth [[GetOwnProperty]] from step 5.1.
  assert_array_equals(log[8], ["getOwnPropertyDescriptor", lyingProxy, "c"]);
  // No [[Get]] because not enumerable.

  // Check the results.
  assert_equals([...h].length, 2);
  assert_array_equals([...h.keys()], ["a", "c"]);
  assert_true(h.has("a"));
  assert_equals(h.get("a"), "3");
  assert_true(h.has("c"));
  assert_equals(h.get("c"), "2");
}, "Correct operation ordering with repeated keys");

// Need to add symbol tests, but those are pending
// https://github.com/heycam/webidl/issues/294 being resolved.
</script>
