Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/tracker/test/rerank_helpers_test.py b/tracker/test/rerank_helpers_test.py
new file mode 100644
index 0000000..47ddd47
--- /dev/null
+++ b/tracker/test/rerank_helpers_test.py
@@ -0,0 +1,135 @@
+# 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 or at
+# https://developers.google.com/open-source/licenses/bsd
+
+"""Unittests for monorail.tracker.rerank_helpers."""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+
+import unittest
+
+from framework import exceptions
+from testing import fake
+from tracker import rerank_helpers
+
+
+rerank_helpers.MAX_RANKING = 10
+
+
+class Rerank_HelpersTest(unittest.TestCase):
+
+  def setUp(self):
+    self.PAST_TIME = 12345
+    hotlist_item_fields = [
+        (78904, 31, 111, self.PAST_TIME, 'note'),
+        (78903, 21, 222, self.PAST_TIME, 'note'),
+        (78902, 11, 111, self.PAST_TIME, 'note'),
+        (78901, 1, 222, self.PAST_TIME, 'note')]
+    self.hotlist = fake.Hotlist(
+        'hotlist_name', 1234, hotlist_item_fields=hotlist_item_fields)
+
+  # Tested in tests for RerankHotlistItems.
+  def testGetHotlistRerankChanges_FirstPosition(self):
+    moved_issue_ids = [78903, 78902]
+    target_position = 0
+    changed_ranks = rerank_helpers.GetHotlistRerankChanges(
+        self.hotlist.items, moved_issue_ids, target_position)
+    self.assertEqual(changed_ranks, [(78903, 5), (78902, 15), (78901, 25)])
+
+  def testGetHotlistRerankChanges_LastPosition(self):
+    moved_issue_ids = [78903, 78902]
+    target_position = 2
+    changed_ranks = rerank_helpers.GetHotlistRerankChanges(
+        self.hotlist.items, moved_issue_ids, target_position)
+    self.assertEqual(changed_ranks, [(78904, 3), (78903, 6), (78902, 9)])
+
+  def testGetHotlistRerankChanges_Middle(self):
+    moved_issue_ids = [78903]
+    target_position = 1
+    changed_ranks = rerank_helpers.GetHotlistRerankChanges(
+        self.hotlist.items, moved_issue_ids, target_position)
+    self.assertEqual(changed_ranks, [(78903, 6)])
+
+
+  def testGetHotlistRerankChanges_NewMoveIds(self):
+    "We can handle reranking for inserting new issues."
+    moved_issue_ids = [78909, 78910, 78903]
+    target_position = 0
+    changed_ranks = rerank_helpers.GetHotlistRerankChanges(
+        self.hotlist.items, moved_issue_ids, target_position)
+    self.assertEqual(
+        changed_ranks, [(78909, 1), (78910, 3), (78903, 5), (78901, 7)])
+
+  def testGetHotlistRerankChanges_InvalidMovedIds(self):
+    moved_issue_ids = [78903]
+    target_position = -1
+    with self.assertRaises(exceptions.InputException):
+      rerank_helpers.GetHotlistRerankChanges(
+          self.hotlist.items, moved_issue_ids, target_position)
+
+  def testGetHotlistRerankChanges_InvalidPosition(self):
+    moved_issue_ids = [78909]
+    target_position = 8
+    with self.assertRaises(exceptions.InputException):
+      rerank_helpers.GetHotlistRerankChanges(
+          self.hotlist.items, moved_issue_ids, target_position)
+
+  def testGetInsertRankings(self):
+    lower = [(1, 0)]
+    higher = [(2, 10)]
+    moved_ids = [3]
+    ret = rerank_helpers.GetInsertRankings(lower, higher, moved_ids)
+    self.assertEqual(ret, [(3, 5)])
+
+  def testGetInsertRankings_Below(self):
+    lower = []
+    higher = [(1, 2)]
+    moved_ids = [2]
+    ret = rerank_helpers.GetInsertRankings(lower, higher, moved_ids)
+    self.assertEqual(ret, [(2, 1)])
+
+  def testGetInsertRankings_Above(self):
+    lower = [(1, 0)]
+    higher = []
+    moved_ids = [2]
+    ret = rerank_helpers.GetInsertRankings(lower, higher, moved_ids)
+    self.assertEqual(ret, [(2, 5)])
+
+  def testGetInsertRankings_Multiple(self):
+    lower = [(1, 0)]
+    higher = [(2, 10)]
+    moved_ids = [3,4,5]
+    ret = rerank_helpers.GetInsertRankings(lower, higher, moved_ids)
+    self.assertEqual(ret, [(3, 2), (4, 5), (5, 8)])
+
+  def testGetInsertRankings_SplitLow(self):
+    lower = [(1, 0), (2, 5)]
+    higher = [(3, 6), (4, 10)]
+    moved_ids = [5]
+    ret = rerank_helpers.GetInsertRankings(lower, higher, moved_ids)
+    self.assertEqual(ret, [(2, 2), (5, 5)])
+
+  def testGetInsertRankings_SplitHigh(self):
+    lower = [(1, 0), (2, 4)]
+    higher = [(3, 5), (4, 10)]
+    moved_ids = [5]
+    ret = rerank_helpers.GetInsertRankings(lower, higher, moved_ids)
+    self.assertEqual(ret, [(5, 6), (3, 9)])
+
+  def testGetInsertRankings_NoLower(self):
+    lower = []
+    higher = [(1, 1)]
+    moved_ids = [2]
+    ret = rerank_helpers.GetInsertRankings(lower, higher, moved_ids)
+    self.assertEqual(ret, [(2, 3), (1, 8)])
+
+  def testGetInsertRankings_NoRoom(self):
+    max_ranking, rerank_helpers.MAX_RANKING = rerank_helpers.MAX_RANKING, 1
+    lower = [(1, 0)]
+    higher = [(2, 1)]
+    moved_ids = [3]
+    ret = rerank_helpers.GetInsertRankings(lower, higher, moved_ids)
+    self.assertIsNone(ret)
+    rerank_helpers.MAX_RANKING = max_ranking