// Copyright 2016 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.

suite('<bookmarks-list>', function() {
  let list;
  let store;

  setup(function() {
    const nodes = testTree(createFolder('10', [
      createItem('1'),
      createFolder('3', []),
      createItem('5'),
      createItem('7'),
    ]));
    store = new bookmarks.TestStore({
      nodes: nodes,
      folderOpenState: getAllFoldersOpenState(nodes),
      selectedFolder: '10',
    });
    store.replaceSingleton();

    list = document.createElement('bookmarks-list');
    list.style.height = '100%';
    list.style.width = '100%';
    list.style.position= 'absolute';

    replaceBody(list);
    Polymer.dom.flush();
  });

  test('renders correct <bookmark-item> elements', function() {
    const items = list.root.querySelectorAll('bookmarks-item');
    const ids = Array.from(items).map((item) => item.itemId);

    assertDeepEquals(['1', '3', '5', '7'], ids);
  });

  test('shift-selects multiple items', function() {
    const items = list.root.querySelectorAll('bookmarks-item');

    customClick(items[0]);

    assertEquals('select-items', store.lastAction.name);
    assertTrue(store.lastAction.clear);
    assertEquals('1', store.lastAction.anchor);
    assertDeepEquals(['1'], store.lastAction.items);

    store.data.selection.anchor = '1';
    customClick(items[2], {shiftKey: true, ctrlKey: true});

    assertEquals('select-items', store.lastAction.name);
    assertFalse(store.lastAction.clear);
    assertEquals('1', store.lastAction.anchor);
    assertDeepEquals(['1', '3', '5'], store.lastAction.items);
  });

  test('deselects items on click outside of card', function() {
    customClick(list);
    assertEquals('deselect-items', store.lastAction.name);
  });

  test('adds, deletes, and moves update displayedList_', function() {
    list.displayedIds_ = ['1', '7', '3', '5'];
    assertDeepEquals(list.displayedIds_, list.displayedList_.map(n => n.id));

    list.displayedIds_ = ['1', '3', '5'];
    assertDeepEquals(list.displayedIds_, list.displayedList_.map(n => n.id));

    list.displayedIds_ = ['1', '3', '7', '5'];
    assertDeepEquals(list.displayedIds_, list.displayedList_.map(n => n.id));
  });

  test('selects all valid IDs on highlight-items', function() {
    list.fire('highlight-items', ['10', '1', '3', '9']);
    assertEquals('select-items', store.lastAction.name);
    assertEquals('1', store.lastAction.anchor);
    assertDeepEquals(['1', '3'], store.lastAction.items);
  });
});

suite('<bookmarks-list> integration test', function() {
  let list;
  let store;
  let items;

  setup(function() {
    store = new bookmarks.TestStore({
      nodes: testTree(createFolder(
          '10',
          [
            createItem('1'),
            createFolder('3', []),
            createItem('5'),
            createItem('7'),
            createItem('9'),
          ])),
      selectedFolder: '10',
    });
    store.replaceSingleton();
    store.setReducersEnabled(true);

    list = document.createElement('bookmarks-list');
    list.style.height = '100%';
    list.style.width = '100%';
    list.style.position = 'absolute';

    replaceBody(list);
    Polymer.dom.flush();

    items = list.root.querySelectorAll('bookmarks-item');
  });

  test('shift-selects multiple items', function() {
    customClick(items[1]);
    assertDeepEquals(['3'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('3', store.data.selection.anchor);

    customClick(items[3], {shiftKey: true});
    assertDeepEquals(
        ['3', '5', '7'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('3', store.data.selection.anchor);

    customClick(items[0], {shiftKey: true});
    assertDeepEquals(['1', '3'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('3', store.data.selection.anchor);
  });

  test('ctrl toggles multiple items', function() {
    customClick(items[1]);
    assertDeepEquals(['3'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('3', store.data.selection.anchor);

    customClick(items[3], {ctrlKey: true});
    assertDeepEquals(['3', '7'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('7', store.data.selection.anchor);

    customClick(items[1], {ctrlKey: true});
    assertDeepEquals(['7'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('3', store.data.selection.anchor);
  });

  test('ctrl+shift adds ranges to selection', function() {
    customClick(items[0]);
    assertDeepEquals(['1'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('1', store.data.selection.anchor);

    customClick(items[2], {ctrlKey: true});
    assertDeepEquals(['1', '5'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('5', store.data.selection.anchor);

    customClick(items[4], {ctrlKey: true, shiftKey: true});
    assertDeepEquals(
        ['1', '5', '7', '9'], normalizeIterable(store.data.selection.items));
    assertDeepEquals('5', store.data.selection.anchor);

    customClick(items[0], {ctrlKey: true, shiftKey: true});
    assertDeepEquals(
        ['1', '3', '5', '7', '9'],
        normalizeIterable(store.data.selection.items));
    assertDeepEquals('5', store.data.selection.anchor);
  });
});
