// Copyright (C) 2025 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-iterator.zipkeyed
description: >
  Perform keys iteration on the "padding" option.
info: |
  Iterator.zipKeyed ( iterables [ , options ] )
    ...
    14. If mode is "longest", then
      ...
      b. Else,
        i. For each element key of keys, do
          1. Let value be Completion(Get(paddingOption, key)).
          ...
includes: [proxyTrapsHelper.js, compareArray.js]
features: [joint-iteration]
---*/

function makeKeys(k) {
  var str = "abcdefgh";
  assert(k <= str.length, "more than eight keys are unsupported");
  return str.slice(0, k).split("");
}

function fromKeys(keys, value) {
  return Object.fromEntries(keys.map(function(k) {
    return [k, value];
  }));
}

for (var n = 0; n <= 5; ++n) {
  // Create an object with |n| properties.
  var keys = makeKeys(n);
  var iterables = fromKeys(keys, []);

  for (var k = 0; k <= n + 2; ++k) {
    var log = [];

    // Create a padding object with |k| properties. Ensure only [[Get]] is
    // called.
    var padding = new Proxy(fromKeys(makeKeys(k), undefined), allowProxyTraps({
      get(target, propertyKey, receiver) {
        log.push(propertyKey);
        return Reflect.get(target, propertyKey, receiver);
      },
    }));

    Iterator.zipKeyed(iterables, {mode: "longest", padding});

    // [[Get]] happened for all keys from |keys|.
    assert.compareArray(log, keys);
  }
}

reportCompare(0, 0);
