text: /* Any copyright is dedicated to the Public Domain.
   * http://creativecommons.org/licenses/publicdomain/ */
  
  // for-in loops skip properties with symbol keys, even enumerable properties.
  var obj = {};
  obj[Symbol.for("moon")] = "sun";
  obj[Symbol("asleep")] = "awake";
  obj[Symbol.iterator] = "List";
  for (var x in obj)
      throw "FAIL: " + uneval(x);
  
  // This includes inherited properties.
  var obj2 = Object.create(obj);
  for (var x in obj2)
      throw "FAIL: " + uneval(x);
  
  // The same goes for proxies.
  var p = new Proxy(obj, {});
  for (var x in p)
      throw "FAIL: " + uneval(x);
  var p2 = new Proxy(obj2, {});
  for (var x in p2)
      throw "FAIL: " + uneval(x);
  
  // Object.keys() and .getOwnPropertyNames() also skip symbols.
  assertEq(Object.keys(obj).length, 0);
  assertEq(Object.keys(p).length, 0);
  assertEq(Object.keys(obj2).length, 0);
  assertEq(Object.keys(p2).length, 0);
  assertEq(Object.getOwnPropertyNames(obj).length, 0);
  assertEq(Object.getOwnPropertyNames(p).length, 0);
  assertEq(Object.getOwnPropertyNames(obj2).length, 0);
  assertEq(Object.getOwnPropertyNames(p2).length, 0);
  
  // Test interaction of Object.keys(), proxies, and symbol property keys.
  var log = [];
  var h = {
      ownKeys: (t) => {
          log.push("ownKeys");
          return ["a", "0", Symbol.for("moon"), Symbol("asleep"), Symbol.iterator];
      },
      getOwnPropertyDescriptor: (t, key) => {
          log.push("gopd", key);
          return {configurable: true, enumerable: true, value: 0, writable: true};
      }
  };
  p = new Proxy({}, h);
  assertDeepEq(Object.keys(p), ["a", "0"]);
  assertDeepEq(log, ["ownKeys", "gopd", "a", "gopd", "0"]);
  
  if (typeof reportCompare === "function")
      reportCompare(0, 0);
  