Fix issue where patch range was not being preserved on nav in diff view

Change-Id: I28d92486714448161f8bf3a9c37c7f4a6eb58a93
diff --git a/polygerrit-ui/app/test/gr-diff-view-test.html b/polygerrit-ui/app/test/gr-diff-view-test.html
index 5e9e355..99fae59b 100644
--- a/polygerrit-ui/app/test/gr-diff-view-test.html
+++ b/polygerrit-ui/app/test/gr-diff-view-test.html
@@ -45,6 +45,37 @@
       element.$.diff.auto = false;
     });
 
+    // https://github.com/PolymerElements/iron-test-helpers/issues/33
+    function keyboardEventFor(type, keyIdentifier) {
+      var event = new CustomEvent(type, {
+        bubbles: true,
+        cancelable: true
+      });
+
+      event.keyIdentifier = keyIdentifier;
+
+      return event;
+    }
+
+    function keyEventOn(target, type, keyIdentifier) {
+      target.dispatchEvent(keyboardEventFor(type, keyIdentifier));
+    }
+
+    function keyDownOn(target, keyIdentifier) {
+      keyEventOn(target, 'keydown', keyIdentifier);
+    }
+
+    function keyUpOn(target, keyIdentifier) {
+      keyEventOn(target, 'keyup', keyIdentifier);
+    }
+
+    function pressAndReleaseKeyIdentifierOn(target, keyIdentifier) {
+      keyDownOn(target, keyIdentifier);
+      Polymer.Base.async(function() {
+        keyUpOn(target, keyIdentifier);
+      }, 1);
+    }
+
     test('keyboard shortcuts', function() {
       element._changeNum = '42';
       element._patchRange = {
@@ -78,37 +109,41 @@
           'Should navigate to /c/42');
 
       showStub.restore();
+    });
 
-      // https://github.com/PolymerElements/iron-test-helpers/issues/33
-      function keyboardEventFor(type, keyIdentifier) {
-        var event = new CustomEvent(type, {
-          bubbles: true,
-          cancelable: true
-        });
+    test('keyboard shortcuts with patch range', function() {
+      element._changeNum = '42';
+      element._patchRange = {
+        basePatchNum: '5',
+        patchNum: '10',
+      };
+      element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
+      element._path = 'glados.txt';
 
-        event.keyIdentifier = keyIdentifier;
+      var showStub = sinon.stub(page, 'show');
 
-        return event;
-      }
+      MockInteractions.pressAndReleaseKeyOn(element, 85);  // 'u'
+      assert(showStub.lastCall.calledWithExactly('/c/42'),
+          'Should navigate to /c/42');
 
-      function keyEventOn(target, type, keyIdentifier) {
-        target.dispatchEvent(keyboardEventFor(type, keyIdentifier));
-      }
+      pressAndReleaseKeyIdentifierOn(element, '\U+005D');  // ']'
+      assert(showStub.lastCall.calledWithExactly('/c/42/5..10/wheatley.md'),
+          'Should navigate to /c/42/5..10/wheatley.md');
+      element._path = 'wheatley.md';
 
-      function keyDownOn(target, keyIdentifier) {
-        keyEventOn(target, 'keydown', keyIdentifier);
-      }
+      pressAndReleaseKeyIdentifierOn(element, '\U+005B');  // '['
+      assert(showStub.lastCall.calledWithExactly('/c/42/5..10/glados.txt'),
+          'Should navigate to /c/42/5..10/glados.txt');
+      element._path = 'glados.txt';
 
-      function keyUpOn(target, keyIdentifier) {
-        keyEventOn(target, 'keyup', keyIdentifier);
-      }
+      pressAndReleaseKeyIdentifierOn(element, '\U+005B');  // '['
+      assert(showStub.lastCall.calledWithExactly('/c/42/5..10/chell.go'),
+          'Should navigate to /c/42/5..10/chell.go');
+      element._path = 'chell.go';
 
-      function pressAndReleaseKeyIdentifierOn(target, keyIdentifier) {
-        keyDownOn(target, keyIdentifier);
-        Polymer.Base.async(function() {
-          keyUpOn(target, keyIdentifier);
-        }, 1);
-      }
+      pressAndReleaseKeyIdentifierOn(element, '\U+005B');  // '['
+      assert(showStub.lastCall.calledWithExactly('/c/42'),
+          'Should navigate to /c/42');
     });
 
     test('jump to file dropdown', function() {
@@ -128,7 +163,32 @@
       assert.equal(linkEls[0].getAttribute('data-key-nav'), '[');
       assert.equal(linkEls[1].getAttribute('data-key-nav'), '');
       assert.equal(linkEls[2].getAttribute('data-key-nav'), ']');
+      assert.equal(linkEls[0].getAttribute('href'), '/c/42/10/chell.go');
+      assert.equal(linkEls[1].getAttribute('href'), '/c/42/10/glados.txt');
+      assert.equal(linkEls[2].getAttribute('href'), '/c/42/10/wheatley.md');
     });
 
+    test('jump to file dropdown with patch range', function() {
+      element._changeNum = '42';
+      element._patchRange = {
+        basePatchNum: '5',
+        patchNum: '10',
+      };
+      element._fileList = ['chell.go', 'glados.txt', 'wheatley.md'];
+      element._path = 'glados.txt';
+      flushAsynchronousOperations();
+      var linkEls =
+          Polymer.dom(element.root).querySelectorAll('.dropdown-content > a');
+      assert.equal(linkEls.length, 3);
+      assert.isFalse(linkEls[0].hasAttribute('selected'));
+      assert.isTrue(linkEls[1].hasAttribute('selected'));
+      assert.isFalse(linkEls[2].hasAttribute('selected'));
+      assert.equal(linkEls[0].getAttribute('data-key-nav'), '[');
+      assert.equal(linkEls[1].getAttribute('data-key-nav'), '');
+      assert.equal(linkEls[2].getAttribute('data-key-nav'), ']');
+      assert.equal(linkEls[0].getAttribute('href'), '/c/42/5..10/chell.go');
+      assert.equal(linkEls[1].getAttribute('href'), '/c/42/5..10/glados.txt');
+      assert.equal(linkEls[2].getAttribute('href'), '/c/42/5..10/wheatley.md');
+    });
   });
 </script>