// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

let {session, contextGroup, Protocol} = InspectorTest.start("Check internal properties reported in object preview.");

Protocol.Debugger.enable();
Protocol.Runtime.enable();
Protocol.Runtime.onConsoleAPICalled(dumpInternalPropertiesAndEntries);

contextGroup.setupInjectedScriptEnvironment();

InspectorTest.runTestSuite([
  function boxedObjects(next)
  {
    checkExpression("new Number(239)")
      .then(() => checkExpression("new Boolean(false)"))
      .then(() => checkExpression("new String(\"abc\")"))
      .then(() => checkExpression("Object(Symbol(42))"))
      .then(next);
  },

  function promise(next)
  {
    checkExpression("Promise.resolve(42)")
      .then(() => checkExpression("new Promise(() => undefined)"))
      .then(next);
  },

  function generatorObject(next)
  {
    checkExpression("(function* foo() { yield 1 })()")
      .then(next);
  },

  function entriesInMapAndSet(next)
  {
    checkExpression("new Map([[1,2]])")
      .then(() => checkExpression("new Set([1])"))
      .then(() => checkExpression("new WeakMap([[{}, 42]])"))
      .then(() => checkExpression("new WeakSet([{}])"))
      .then(next);
  },

  function iteratorObject(next)
  {
    checkExpression("(new Map([[1,2]])).entries()")
      .then(() => checkExpression("(new Set([[1,2]])).entries()"))
      .then(next);
  },

  function noPreviewForFunctionObject(next)
  {
    var expression = "(function foo(){})";
    InspectorTest.log(expression);
    Protocol.Runtime.evaluate({ expression: expression, generatePreview: true})
      .then(message => InspectorTest.logMessage(message))
      .then(next);
  },

  function otherObjects(next)
  {
    checkExpression("[1,2,3]")
      .then(() => checkExpression("/123/"))
      .then(() => checkExpression("({})"))
      .then(next);
  },

  function overridenArrayGetter(next)
  {
    Protocol.Runtime.evaluate({ expression: "Array.prototype.__defineGetter__(\"0\",() => { throw new Error() }) "})
      .then(() => checkExpression("Promise.resolve(42)"))
      .then(next);
  }
]);

function checkExpression(expression)
{
  InspectorTest.log(`expression: ${expression}`);
  // console.table has higher limits for internal properties amount in preview.
  return Protocol.Runtime.evaluate({ expression: `console.table(${expression})`, generatePreview: true });
}

function dumpInternalPropertiesAndEntries(message)
{
  var properties;
  var entries;
  try {
    var preview = message.params.args[0].preview;
    properties = preview.properties;
    entries = preview.entries;
  } catch (e) {
    InspectorTest.logMessage(message);
    return;
  }
  if (!properties) {
    InspectorTest.logMessage(message);
    return;
  }
  for (var property of properties)
    InspectorTest.logMessage(property);
  if (entries) {
    InspectorTest.log("[[Entries]]:");
    InspectorTest.logMessage(entries);
  }
  InspectorTest.log("");
}
