/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

// This test checks row visibility during view updates when rows with suggested
// indexes are added and removed. Each task performs two searches: Search 1
// returns 5 results where the first result is a search suggestion and the
// remainder are URL results, and search 2 returns 5 results with search
// suggestions. This tests the view-update logic that allows search suggestions
// to replace other results once an existing suggestion row is encountered.

"use strict";

// Search 1:
//   5 results, no suggestedIndex
// Search 2:
//   5 results including suggestedIndex = 1
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 3, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      hidden: true,
    },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results, no suggestedIndex
// Search 2:
//   5 results including suggestedIndex = 2
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 3, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 2,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results, no suggestedIndex
// Search 2:
//   5 results including suggestedIndex = 9
// Expected visible rows during update:
//   Indexes 2 and 3 replaced with search suggestions, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 3, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 9,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results, no suggestedIndex
// Search 2:
//   5 results including suggestedIndex = -1
// Expected visible rows during update:
//   Indexes 2 and 3 replaced with search suggestions, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 3, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results, no suggestedIndex
// Search 2:
//   5 results including suggestedIndex = -2
// Expected visible rows during update:
//   Index 2 replaced with search suggestion, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 3, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
      hidden: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 1
// Search 2:
//   5 results including suggestedIndex = 1
// Expected visible rows during update:
//   All search-2 rows
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    {
      count: 2,
      type: UrlbarPrefs.get("resultMenu")
        ? UrlbarUtils.RESULT_TYPE.URL
        : UrlbarUtils.RESULT_TYPE.SEARCH,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 1
// Search 2:
//   5 results including suggestedIndex = 2
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 2,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 1
// Search 2:
//   5 results including suggestedIndex = 9
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 9,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 1
// Search 2:
//   5 results including suggestedIndex = -1
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 1
// Search 2:
//   5 results including suggestedIndex = -2
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
      hidden: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 1
// Search 2:
//   5 results including suggestedIndex = -3
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -3,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -3,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 9
// Search 2:
//   5 results including suggestedIndex = 1
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 9,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      hidden: true,
    },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 9
// Search 2:
//   5 results including suggestedIndex = 2
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 9,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 2,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 9
// Search 2:
//   5 results including suggestedIndex = 9
// Expected visible rows during update:
//   All search-2 rows
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 9,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 9,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    {
      count: 2,
      type: UrlbarPrefs.get("resultMenu")
        ? UrlbarUtils.RESULT_TYPE.URL
        : UrlbarUtils.RESULT_TYPE.SEARCH,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 9
// Search 2:
//   5 results including suggestedIndex = -1
// Expected visible rows during update:
//   Indexes 2 and 3 replaced with search suggestions, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 9,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 9
// Search 2:
//   5 results including suggestedIndex = -2
// Expected visible rows during update:
//   Index 2 replaced with search suggestion, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 9,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
      hidden: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 9
// Search 2:
//   5 results including suggestedIndex = -3
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 9,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -3,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -3,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -1
// Search 2:
//   5 results including suggestedIndex = 1
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      hidden: true,
    },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -1
// Search 2:
//   5 results including suggestedIndex = 2
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 2,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -1
// Search 2:
//   5 results including suggestedIndex = 9
// Expected visible rows during update:
//   Indexes 2 and 3 replaced with search suggestions, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 9,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -1
// Search 2:
//   5 results including suggestedIndex = -1
// Expected visible rows during update:
//   All search-2 rows
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    {
      count: 2,
      type: UrlbarPrefs.get("resultMenu")
        ? UrlbarUtils.RESULT_TYPE.URL
        : UrlbarUtils.RESULT_TYPE.SEARCH,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -1
// Search 2:
//   5 results including suggestedIndex = -2
// Expected visible rows during update:
//   Index 2 replaced with search suggestion, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -1,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
      hidden: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -2
// Search 2:
//   5 results including suggestedIndex = 1
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -2,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      hidden: true,
    },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -2
// Search 2:
//   5 results including suggestedIndex = 2
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -2,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 2,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -2
// Search 2:
//   5 results including suggestedIndex = 9
// Expected visible rows during update:
//   Index 2 replaced with search suggestion, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -2,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: 9,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 9,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -2
// Search 2:
//   5 results including suggestedIndex = -1
// Expected visible rows during update:
//   Index 2 replaced with search suggestion, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -2,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -1,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
      stale: true,
    },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -2
// Search 2:
//   5 results including suggestedIndex = -2
// Expected visible rows during update:
//   All search-2 rows
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -2,
    viewCount: 5,
  },
  search2: {
    otherCount: 3,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndex: -2,
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    {
      count: 1,
      type: UrlbarPrefs.get("resultMenu")
        ? UrlbarUtils.RESULT_TYPE.URL
        : UrlbarUtils.RESULT_TYPE.SEARCH,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -2,
    },
    {
      count: 1,
      type: UrlbarPrefs.get("resultMenu")
        ? UrlbarUtils.RESULT_TYPE.URL
        : UrlbarUtils.RESULT_TYPE.SEARCH,
    },
  ],
});

// Search 1:
//   5 results, no suggestedIndex
// Search 2:
//   5 results including suggestedIndex = 1 and suggestedIndex = -1
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 3, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    viewCount: 5,
  },
  search2: {
    otherCount: 2,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndexes: [1, -1],
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 3, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = 1
// Search 2:
//   5 results including suggestedIndex = 1 and suggestedIndex = -1
// Expected visible rows during update:
//   Index 3 replaced with search suggestion, no other changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: 1,
    viewCount: 5,
  },
  search2: {
    otherCount: 2,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndexes: [1, -1],
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      hidden: true,
    },
  ],
});

// Search 1:
//   5 results including suggestedIndex = -1
// Search 2:
//   5 results including suggestedIndex = 1 and suggestedIndex = -1
// Expected visible rows during update:
//   5 original rows with no changes
add_suggestedIndex_task({
  search1: {
    other: [
      { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH },
      { count: 2, type: UrlbarUtils.RESULT_TYPE.URL },
    ],
    suggestedIndex: -1,
    viewCount: 5,
  },
  search2: {
    otherCount: 2,
    otherType: UrlbarUtils.RESULT_TYPE.SEARCH,
    suggestedIndexes: [1, -1],
    viewCount: 5,
  },
  duringUpdate: [
    { count: 1 },
    { count: 1, type: UrlbarUtils.RESULT_TYPE.SEARCH, stale: true },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.URL, stale: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      stale: true,
    },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: 1,
      hidden: true,
    },
    { count: 2, type: UrlbarUtils.RESULT_TYPE.SEARCH, hidden: true },
    {
      count: 1,
      type: UrlbarUtils.RESULT_TYPE.URL,
      suggestedIndex: -1,
      hidden: true,
    },
  ],
});
