testHiliteNextPrevWithDisabledFirstRow_allowFreeSelect() {
    const ds = new MockDS();
    const rend = new TestRend();
    /** @suppress {checkTypes} suppression added to enable type checking */
    const select = new MockSelect();
    const ac = new AutoComplete(ds, rend, select);
    ac.setAllowFreeSelect(true);

    // make sure 'next' and 'prev' don't explode before any token is set
    ac.hiliteNext();
    ac.hilitePrev();
    ac.setMaxMatches(4);
    assertEquals(0, rend.getRenderedRows().length);

    // check a few times with disabled first row
    for (let i = 0; i < 3; ++i) {
      ac.setToken('');
      ac.setToken('edu');
      assertEquals(3, rend.getRenderedRows().length);
      // The first row is disabled, second should be highlighted.
      checkHilitedIndex(rend, 1);
      ac.hiliteNext();
      checkHilitedIndex(rend, 2);
      // Try going over the edge. Since allowFreeSelect is on, this will
      // deselect the last row.
      ac.hiliteNext();
      checkHilitedIndex(rend, -1);

      // go back down the list, first row is disabled
      ac.hiliteNext();
      checkHilitedIndex(rend, 1);
      ac.hiliteNext();
      checkHilitedIndex(rend, 2);

      // go back up the list.
      ac.hilitePrev();
      checkHilitedIndex(rend, 1);
      // first is disabled, so deselect the second.
      ac.hilitePrev();
      checkHilitedIndex(rend, -1);
    }
  }
Try using next and prev to navigate past the ends with wrap_ off and
allowFreeSelect_ on, and a disabled first row.