// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview using private properties isn't a Closure violation in tests.
 * @suppress {accessControls}
 */

DataGridTestRunner.dumpDataGrid = function(root, descentIntoCollapsed, prefix) {
  if (!prefix)
    prefix = '';
  const suffix = root.selected ? ' <- selected' : '';
  const columnKeys = root.dataGrid._columnsArray.map(column => column.id);
  const outputColumns = [];
  for (const key of columnKeys) {
    if (key in root.data)
      outputColumns.push(root.data[key]);
  }
  if (outputColumns.length)
    TestRunner.addResult(prefix + outputColumns.join(' | ') + suffix);

  if (!descentIntoCollapsed && !root.expanded)
    return;
  for (const child of root.children)
    DataGridTestRunner.dumpDataGrid(child, descentIntoCollapsed, prefix + ' ');
};

DataGridTestRunner.validateDataGrid = function(root) {
  const children = root.children;

  for (let i = 0; i < children.length; ++i) {
    const child = children[i];

    if (child.parent !== root)
      throw 'Wrong parent for child ' + child.data.id + ' of ' + root.data.id;

    if (child.nextSibling !== ((i + 1 === children.length ? null : children[i + 1])))
      throw 'Wrong child.nextSibling for ' + child.data.id + ' (' + i + ' of ' + children.length + ') ';

    if (child.previousSibling !== ((i ? children[i - 1] : null)))
      throw 'Wrong child.previousSibling for ' + child.data.id + ' (' + i + ' of ' + children.length + ') ';

    if (child.parent && !child.parent._isRoot && child.depth !== root.depth + 1)
      throw 'Wrong depth for ' + child.data.id + ' expected ' + (root.depth + 1) + ' but got ' + child.depth;

    DataGridTestRunner.validateDataGrid(child);
  }

  const selectedNode = root.dataGrid.selectedNode;

  if (!root.parent && selectedNode) {
    if (!selectedNode.selectable)
      throw 'Selected node is not selectable';
    let node = selectedNode;
    for (; node && node !== root; node = node.parent) {
    }

    if (!node)
      throw 'Selected node (' + selectedNode.data.id + ') is not within the DataGrid';
  }
};

DataGridTestRunner.dumpAndValidateDataGrid = function(root) {
  DataGridTestRunner.dumpDataGrid(root);
  DataGridTestRunner.validateDataGrid(root);
};
