12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658 |
- // Copyright 2006 The Closure Library Authors. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS-IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- goog.provide('goog.ui.ac.AutoCompleteTest');
- goog.setTestOnly('goog.ui.ac.AutoCompleteTest');
- goog.require('goog.a11y.aria');
- goog.require('goog.a11y.aria.Role');
- goog.require('goog.dom');
- goog.require('goog.dom.InputType');
- goog.require('goog.dom.TagName');
- goog.require('goog.events.EventHandler');
- goog.require('goog.events.EventTarget');
- goog.require('goog.string');
- goog.require('goog.testing.MockControl');
- goog.require('goog.testing.events');
- goog.require('goog.testing.jsunit');
- goog.require('goog.testing.mockmatchers');
- goog.require('goog.ui.ac.AutoComplete');
- goog.require('goog.ui.ac.InputHandler');
- goog.require('goog.ui.ac.RenderOptions');
- goog.require('goog.ui.ac.Renderer');
- /**
- * Mock DataStore
- * @constructor
- */
- function MockDS(opt_autoHilite) {
- this.autoHilite_ = opt_autoHilite;
- var disabledRow = {
- match: function(str) { return this.text.match(str); },
- rowDisabled: true,
- text: 'hello@u.edu'
- };
- this.rows_ = [
- '"Slartibartfast Theadore" <fjordmaster@magrathea.com>',
- '"Zaphod Beeblebrox" <theprez@universe.gov>',
- '"Ford Prefect" <ford@theguide.com>',
- '"Arthur Dent" <has.no.tea@gmail.com>',
- '"Marvin The Paranoid Android" <marv@googlemail.com>',
- 'the.mice@magrathea.com', 'the.mice@myotherdomain.com', 'hello@a.com',
- disabledRow, 'row@u.edu', 'person@a.edu'
- ];
- this.isRowDisabled = function(row) { return !!row.rowDisabled; };
- }
- MockDS.prototype.requestMatchingRows = function(
- token, maxMatches, matchHandler) {
- var escapedToken = goog.string.regExpEscape(token);
- var matcher = new RegExp('(^|\\W+)' + escapedToken);
- var matches = [];
- for (var i = 0; i < this.rows_.length && matches.length < maxMatches; ++i) {
- var row = this.rows_[i];
- if (row.match(matcher)) {
- matches.push(row);
- }
- }
- if (this.autoHilite_ === undefined) {
- matchHandler(token, matches);
- } else {
- var options = new goog.ui.ac.RenderOptions();
- options.setAutoHilite(this.autoHilite_);
- matchHandler(token, matches, options);
- }
- };
- /**
- * Mock Selection Handler
- */
- function MockSelect() {}
- goog.inherits(MockSelect, goog.events.EventTarget);
- MockSelect.prototype.selectRow = function(row) {
- this.selectedRow = row;
- };
- /**
- * Renderer subclass that exposes additional private members for testing.
- * @constructor
- */
- function TestRend() {
- goog.ui.ac.Renderer.call(this, goog.dom.getElement('test-area'));
- }
- goog.inherits(TestRend, goog.ui.ac.Renderer);
- TestRend.prototype.getRenderedRows = function() {
- return this.rows_;
- };
- TestRend.prototype.getHilitedRowIndex = function() {
- return this.hilitedRow_;
- };
- TestRend.prototype.getHilitedRowDiv = function() {
- return this.rowDivs_[this.hilitedRow_];
- };
- TestRend.prototype.getRowDiv = function(index) {
- return this.rowDivs_[index];
- };
- var handler;
- var inputElement;
- var mockControl;
- function setUp() {
- inputElement = goog.dom.createDom(
- goog.dom.TagName.INPUT, {type: goog.dom.InputType.TEXT});
- handler = new goog.events.EventHandler();
- mockControl = new goog.testing.MockControl();
- }
- function tearDown() {
- handler.dispose();
- mockControl.$tearDown();
- goog.dom.removeChildren(goog.dom.getElement('test-area'));
- }
- /**
- * Make sure results are truncated (or not) by setMaxMatches.
- */
- function testMaxMatches() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setMaxMatches(2);
- ac.setToken('the');
- assertEquals(2, rend.getRenderedRows().length);
- ac.setToken('');
- ac.setMaxMatches(3);
- ac.setToken('the');
- assertEquals(3, rend.getRenderedRows().length);
- ac.setToken('');
- ac.setMaxMatches(1000);
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- ac.setToken('');
- }
- function testHiliteViaMouse() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var updates = 0;
- var row = null;
- var rowNode = null;
- handler.listen(
- rend, goog.ui.ac.AutoComplete.EventType.ROW_HILITE, function(evt) {
- updates++;
- rowNode = evt.rowNode;
- });
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setMaxMatches(4);
- ac.setToken('the');
- // Need to set the startRenderingRows_ time to something long ago, otherwise
- // the mouse event will not be fired. (The autocomplete logic waits for some
- // time to pass after rendering before firing mouseover events.)
- rend.startRenderingRows_ = -1;
- var hilitedRowDiv = rend.getRowDiv(3);
- goog.testing.events.fireMouseOverEvent(hilitedRowDiv);
- assertEquals(2, updates);
- assertTrue(goog.string.contains(rowNode.innerHTML, 'mice@myotherdomain.com'));
- }
- function testMouseClickBeforeHilite() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setMaxMatches(4);
- ac.setToken('the');
- // Need to set the startRenderingRows_ time to something long ago, otherwise
- // the mouse event will not be fired. (The autocomplete logic waits for some
- // time to pass after rendering before firing mouseover events.)
- rend.startRenderingRows_ = -1;
- // hilite row 3...
- var hilitedRowDiv = rend.getRowDiv(3);
- goog.testing.events.fireMouseOverEvent(hilitedRowDiv);
- // but click row 2, to simulate mouse getting ahead of focus.
- var targetRowDiv = rend.getRowDiv(2);
- goog.testing.events.fireClickEvent(targetRowDiv);
- assertEquals('the.mice@magrathea.com', select.selectedRow);
- }
- function testMouseClickOnFirstRowBeforeHilite() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setAutoHilite(false);
- ac.setMaxMatches(4);
- ac.setToken('the');
- // Click the first row before highlighting it, to simulate mouse getting ahead
- // of focus.
- var targetRowDiv = rend.getRowDiv(0);
- goog.testing.events.fireClickEvent(targetRowDiv);
- assertEquals(
- '"Zaphod Beeblebrox" <theprez@universe.gov>', select.selectedRow);
- }
- function testMouseClickOnRowAfterBlur() {
- var ds = new MockDS();
- var rend = new TestRend();
- var ih = new goog.ui.ac.InputHandler();
- ih.attachInput(inputElement);
- var ac = new goog.ui.ac.AutoComplete(ds, rend, ih);
- goog.testing.events.fireFocusEvent(inputElement);
- ac.setToken('the');
- var targetRowDiv = rend.getRowDiv(0);
- // Simulate the user clicking on an autocomplete row in the short time between
- // blur and autocomplete dismissal.
- goog.testing.events.fireBlurEvent(inputElement);
- assertNotThrows(function() {
- goog.testing.events.fireClickEvent(targetRowDiv);
- });
- }
- /*
- * Send AutoComplete a SELECT event with empty string for the row. We can't
- * simulate with a simple mouse click, so we dispatch the event directly.
- */
- function testSelectEventEmptyRow() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setMaxMatches(4);
- ac.setToken('the');
- rend.startRenderingRows_ = -1;
- // hilight row 2 ('the.mice@...')
- var hilitedRowDiv = rend.getRowDiv(2);
- goog.testing.events.fireMouseOverEvent(hilitedRowDiv);
- assertUndefined(select.selectedRow);
- // Dispatch an event that does not specify a row.
- rend.dispatchEvent({type: goog.ui.ac.AutoComplete.EventType.SELECT, row: ''});
- assertEquals('the.mice@magrathea.com', select.selectedRow);
- }
- function testSuggestionsUpdateEvent() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- var updates = 0;
- handler.listen(
- ac, goog.ui.ac.AutoComplete.EventType.SUGGESTIONS_UPDATE,
- function() { updates++; });
- ac.setToken('the');
- assertEquals(1, updates);
- ac.setToken('beeb');
- assertEquals(2, updates);
- ac.setToken('ford');
- assertEquals(3, updates);
- ac.dismiss();
- assertEquals(4, updates);
- ac.setToken('dent');
- assertEquals(5, updates);
- }
- function checkHilitedIndex(renderer, index) {
- assertEquals(index, renderer.getHilitedRowIndex());
- }
- function testGetRowCount() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- assertEquals(0, ac.getRowCount());
- ac.setToken('Zaphod');
- assertEquals(1, ac.getRowCount());
- ac.setMaxMatches(2);
- ac.setToken('the');
- assertEquals(2, ac.getRowCount());
- }
- /**
- * Try using next and prev to navigate past the ends with default behavior of
- * allowFreeSelect_ and wrap_.
- */
- function testHiliteNextPrev_default() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- var updates = 0;
- handler.listen(
- rend, goog.ui.ac.AutoComplete.EventType.ROW_HILITE,
- function() { updates++; });
- // 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
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- // check to see if we can select the last of the 4 items
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- ac.hiliteNext();
- checkHilitedIndex(rend, 3);
- // try going over the edge
- ac.hiliteNext();
- checkHilitedIndex(rend, 3);
- // go back down
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- ac.hilitePrev();
- checkHilitedIndex(rend, 1);
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- }
- // 21 changes in the loop above (3 * 7)
- assertEquals(21, updates);
- }
- /**
- * Try using next and prev to navigate past the ends with default behavior of
- * allowFreeSelect_ and wrap_ and with a disabled first row.
- */
- function testHiliteNextPrevWithDisabledFirstRow_default() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- var updates = 0;
- handler.listen(
- rend, goog.ui.ac.AutoComplete.EventType.ROW_HILITE,
- function() { updates++; });
- // make sure 'next' and 'prev' don't explode before any token is set
- ac.hiliteNext();
- ac.hilitePrev();
- ac.setMaxMatches(3);
- assertEquals(0, rend.getRenderedRows().length);
- // check a few times with disabled first row
- for (var 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
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- // go back down
- ac.hilitePrev();
- checkHilitedIndex(rend, 1);
- // First row is disabled, make sure we don't highlight it.
- ac.hilitePrev();
- checkHilitedIndex(rend, 1);
- }
- // 9 changes in the loop above (3 * 3)
- assertEquals(9, updates);
- }
- /**
- * Try using next and prev to navigate past the ends with default behavior of
- * allowFreeSelect_ and wrap_ and with a disabled middle row.
- */
- function testHiliteNextPrevWithDisabledMiddleRow_default() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- var updates = 0;
- handler.listen(
- rend, goog.ui.ac.AutoComplete.EventType.ROW_HILITE,
- function() { updates++; });
- // make sure 'next' and 'prev' don't explode before any token is set
- ac.hiliteNext();
- ac.hilitePrev();
- ac.setMaxMatches(3);
- assertEquals(0, rend.getRenderedRows().length);
- // check a few times with disabled middle row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('u');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- // Second row is disabled and should be skipped.
- checkHilitedIndex(rend, 2);
- // try going over the edge
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- // go back down
- ac.hilitePrev();
- // Second row is disabled, make sure we don't highlight it.
- checkHilitedIndex(rend, 0);
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- }
- // 9 changes in the loop above (3 * 3)
- assertEquals(9, updates);
- }
- /**
- * Try using next and prev to navigate past the ends with default behavior of
- * allowFreeSelect_ and wrap_ and with a disabled last row.
- */
- function testHiliteNextPrevWithDisabledLastRow_default() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- var updates = 0;
- handler.listen(
- rend, goog.ui.ac.AutoComplete.EventType.ROW_HILITE,
- function() { updates++; });
- // make sure 'next' and 'prev' don't explode before any token is set
- ac.hiliteNext();
- ac.hilitePrev();
- ac.setMaxMatches(3);
- assertEquals(0, rend.getRenderedRows().length);
- // check a few times with disabled last row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('h');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // try going over the edge since last row is disabled
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back down
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- }
- // 9 changes in the loop above (3 * 3)
- assertEquals(9, updates);
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ off and
- * allowFreeSelect_ on.
- */
- function testHiliteNextPrev_allowFreeSelect() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.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
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- // check to see if we can select the last of the 4 items
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- ac.hiliteNext();
- checkHilitedIndex(rend, 3);
- // 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
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, deselects first.
- 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.
- */
- function testHiliteNextPrevWithDisabledFirstRow_allowFreeSelect() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.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 (var 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 middle row.
- */
- function testHiliteNextPrevWithDisabledMiddleRow_allowFreeSelect() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.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 middle row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('u');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- // Second row is disabled and should be skipped.
- 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
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, deselects first.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ off and
- * allowFreeSelect_ on, and a disabled last row.
- */
- function testHiliteNextPrevWithDisabledLastRow_allowFreeSelect() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.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 last row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('h');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // try going over the edge since last row is disabled. Since allowFreeSelect
- // is on, this will deselect the last row.
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, deselects first.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ off.
- */
- function testHiliteNextPrev_wrap() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(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
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- // check to see if we can select the last of the 4 items
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- ac.hiliteNext();
- checkHilitedIndex(rend, 3);
- // try going over the edge. Since wrap is on, this will go back to 0.
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, selects last.
- ac.hilitePrev();
- checkHilitedIndex(rend, 3);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ off and a disabled first row.
- */
- function testHiliteNextPrevWithDisabledFirstRow_wrap() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(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 (var 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 wrap is on and first row is disabled,
- // this will go back to 1.
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 1);
- // first is disabled, so wrap and select the last.
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ off and a disabled middle row.
- */
- function testHiliteNextPrevWithDisabledMiddleRow_wrap() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(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 middle row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('u');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- // Second row is disabled and should be skipped.
- checkHilitedIndex(rend, 2);
- // try going over the edge. Since wrap is on, this will go back to 0.
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, selects last.
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ off and a disabled last row.
- */
- function testHiliteNextPrevWithDisabledLastRow_wrap() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(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 last row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('h');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // try going over the edge since last row is disabled. Since wrap is on,
- // this will go back to 0.
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, since wrap is on and last row is disabled, this
- // will select the second last.
- ac.hilitePrev();
- checkHilitedIndex(rend, 1);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ on.
- */
- function testHiliteNextPrev_wrapAndAllowFreeSelect() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- 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
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- // check to see if we can select the last of the 4 items
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- ac.hiliteNext();
- checkHilitedIndex(rend, 3);
- // try going over the edge. Since free select is on, this should go
- // to -1.
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, free select.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- // wrap to last
- ac.hilitePrev();
- checkHilitedIndex(rend, 3);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ on and a disabled first row.
- */
- function testHiliteNextPrevWithDisabledFirstRow_wrapAndAllowFreeSelect() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- 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 (var 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 free select is on, this should go to -1.
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- // go back down the list, fist row is disabled
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 1);
- // go back above the first, free select.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- // wrap to last
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ on and a disabled middle row.
- */
- function testHiliteNextPrevWithDisabledMiddleRow_wrapAndAllowFreeSelect() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- 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 middle row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('u');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- // Second row is disabled and should be skipped.
- checkHilitedIndex(rend, 2);
- // try going over the edge. Since free select is on, this should go to -1
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, free select.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- // wrap to last
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ on and a disabled last row.
- */
- function testHiliteNextPrevWithDisabledLastRow_wrapAndAllowFreeSelect() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- 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 last row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('h');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // try going over the edge since last row is disabled. Since free select is
- // on, this should go to -1
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, free select.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- // wrap to the second last, since last is disabled.
- ac.hilitePrev();
- checkHilitedIndex(rend, 1);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ on AND turn autoHilite_ off.
- */
- function testHiliteNextPrev_wrapAndAllowFreeSelectNoAutoHilite() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- ac.setAllowFreeSelect(true);
- ac.setAutoHilite(false);
- // 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
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- // check to see if we can select the last of the 4 items.
- // Initially nothing should be selected since autoHilite_ is off.
- checkHilitedIndex(rend, -1);
- ac.hilitePrev();
- checkHilitedIndex(rend, 3);
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- ac.hiliteNext();
- checkHilitedIndex(rend, 3);
- // try going over the edge. Since free select is on, this should go
- // to -1.
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, free select.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- // wrap to last
- ac.hilitePrev();
- checkHilitedIndex(rend, 3);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ on AND turn autoHilite_ off, and a disabled first row.
- */
- function
- testHiliteNextPrevWithDisabledFirstRow_wrapAndAllowFreeSelectNoAutoHilite() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- ac.setAllowFreeSelect(true);
- ac.setAutoHilite(false);
- // 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 (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('edu');
- assertEquals(3, rend.getRenderedRows().length);
- // Initially nothing should be selected since autoHilite_ is off.
- checkHilitedIndex(rend, -1);
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- ac.hiliteNext();
- // First row is disabled.
- checkHilitedIndex(rend, 1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 2);
- // try going over the edge. Since free select is on, this should go to -1
- 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);
- // go back above the first, free select.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- // wrap to last
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ on AND turn autoHilite_ off, and a disabled middle row.
- */
- function
- testHiliteNextPrevWithDisabledMiddleRow_wrapAndAllowFreeSelectNoAutoHilite() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- ac.setAllowFreeSelect(true);
- ac.setAutoHilite(false);
- // 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 middle row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('u');
- assertEquals(3, rend.getRenderedRows().length);
- // Initially nothing should be selected since autoHilite_ is off.
- checkHilitedIndex(rend, -1);
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- // Second row is disabled
- checkHilitedIndex(rend, 2);
- // try going over the edge. Since free select is on, this should go to -1.
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- // Second row is disabled.
- checkHilitedIndex(rend, 2);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, free select.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- // wrap to last
- ac.hilitePrev();
- checkHilitedIndex(rend, 2);
- }
- }
- /**
- * Try using next and prev to navigate past the ends with wrap_ on
- * allowFreeSelect_ on AND turn autoHilite_ off, and a disabled last row.
- */
- function
- testHiliteNextPrevWithDisabledLastRow_wrapAndAllowFreeSelectNoAutoHilite() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- ac.setAllowFreeSelect(true);
- ac.setAutoHilite(false);
- // 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 last row
- for (var i = 0; i < 3; ++i) {
- ac.setToken('');
- ac.setToken('h');
- assertEquals(3, rend.getRenderedRows().length);
- // Initially nothing should be selected since autoHilite_ is off.
- checkHilitedIndex(rend, -1);
- ac.hilitePrev();
- // Last row is disabled
- checkHilitedIndex(rend, 1);
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // try going over the edge. Since free select is on, this should go to -1.
- ac.hiliteNext();
- checkHilitedIndex(rend, -1);
- // go back down the list
- ac.hiliteNext();
- checkHilitedIndex(rend, 0);
- ac.hiliteNext();
- checkHilitedIndex(rend, 1);
- // go back up the list.
- ac.hilitePrev();
- checkHilitedIndex(rend, 0);
- // go back above the first, free select.
- ac.hilitePrev();
- checkHilitedIndex(rend, -1);
- // wrap to last
- ac.hilitePrev();
- checkHilitedIndex(rend, 1);
- }
- }
- function testHiliteWithChangingNumberOfRows() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setAutoHilite(true);
- ac.setMaxMatches(4);
- ac.setToken('m');
- assertEquals(4, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.setToken('ma');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- // Hilite the second element
- var id = rend.getRenderedRows()[1].id;
- ac.hiliteId(id);
- ac.setToken('mar');
- assertEquals(1, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- ac.setToken('ma');
- assertEquals(3, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- // Hilite the second element
- var id = rend.getRenderedRows()[1].id;
- ac.hiliteId(id);
- ac.setToken('m');
- assertEquals(4, rend.getRenderedRows().length);
- checkHilitedIndex(rend, 0);
- }
- /**
- * Checks that autohilite is disabled when there is no token; this allows the
- * user to tab out of an empty autocomplete.
- */
- function testNoAutoHiliteWhenTokenIsEmpty() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- ac.setAllowFreeSelect(true);
- ac.setAutoHilite(true);
- ac.setMaxMatches(4);
- ac.setToken('');
- assertEquals(4, rend.getRenderedRows().length);
- // No token; nothing should be hilited.
- checkHilitedIndex(rend, -1);
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- // Now there is a token, so the first row should be highlighted.
- checkHilitedIndex(rend, 0);
- }
- /**
- * Checks that opt_preserveHilited works.
- */
- function testPreserveHilitedWithoutAutoHilite() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- ac.setAllowFreeSelect(true);
- ac.setMaxMatches(4);
- ac.setAutoHilite(false);
- ac.setToken('m');
- assertEquals(4, rend.getRenderedRows().length);
- // No token; nothing should be hilited.
- checkHilitedIndex(rend, -1);
- // Hilite the second element
- var id = rend.getRenderedRows()[1].id;
- ac.hiliteId(id);
- checkHilitedIndex(rend, 1);
- // Re-render and check if the second element is still hilited
- ac.renderRows(rend.getRenderedRows(), true /* preserve hilite */);
- checkHilitedIndex(rend, 1);
- // Re-render without preservation
- ac.renderRows(rend.getRenderedRows());
- checkHilitedIndex(rend, -1);
- }
- /**
- * Checks that the autohilite argument "true" of the matcher is used.
- */
- function testAutoHiliteFromMatcherTrue() {
- var ds = new MockDS(true);
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- ac.setAllowFreeSelect(true);
- ac.setAutoHilite(false); // Will be overruled.
- ac.setMaxMatches(4);
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- // The first row should be highlighted.
- checkHilitedIndex(rend, 0);
- }
- /**
- * Checks that the autohilite argument "false" of the matcher is used.
- */
- function testAutoHiliteFromMatcherFalse() {
- var ds = new MockDS(false);
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setWrap(true);
- ac.setAllowFreeSelect(true);
- ac.setAutoHilite(true); // Will be overruled.
- ac.setMaxMatches(4);
- ac.setToken('the');
- assertEquals(4, rend.getRenderedRows().length);
- // The first row should not be highlighted.
- checkHilitedIndex(rend, -1);
- }
- /**
- * Hilite using ids, the way mouse-based hiliting would work.
- */
- function testHiliteId() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- // check a few times
- for (var i = 0; i < 3; ++i) {
- ac.setToken('m');
- assertEquals(4, rend.getRenderedRows().length);
- // try hiliting all 3
- for (var x = 0; x < 4; ++x) {
- var id = rend.getRenderedRows()[x].id;
- ac.hiliteId(id);
- assertEquals(ac.getIdOfIndex_(x), id);
- }
- }
- }
- /**
- * Test selecting the hilited row
- */
- function testSelection() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac;
- // try with default selection
- ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setToken('m');
- ac.selectHilited();
- assertEquals(
- '"Slartibartfast Theadore" <fjordmaster@magrathea.com>',
- select.selectedRow);
- // try second item
- ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setToken('the');
- ac.hiliteNext();
- ac.selectHilited();
- assertEquals('"Ford Prefect" <ford@theguide.com>', select.selectedRow);
- }
- /**
- * Dismiss when empty and non-empty
- */
- function testDismiss() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- // dismiss empty
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- var dismissed = 0;
- handler.listen(ac, goog.ui.ac.AutoComplete.EventType.DISMISS, function() {
- dismissed++;
- });
- ac.dismiss();
- assertEquals(1, dismissed);
- ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setToken('sir not seen in this picture');
- ac.dismiss();
- // dismiss with contents
- ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setToken('t');
- ac.dismiss();
- }
- function testTriggerSuggestionsOnUpdate() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- var dismissCalled = 0;
- rend.dismiss = function() { dismissCalled++; };
- var updateCalled = 0;
- select.update = function(opt_force) { updateCalled++; };
- // Normally, menu is dismissed after selecting row (without updating).
- ac.setToken('the');
- ac.selectHilited();
- assertEquals(1, dismissCalled);
- assertEquals(0, updateCalled);
- // But not if we re-trigger on update.
- ac.setTriggerSuggestionsOnUpdate(true);
- ac.setToken('the');
- ac.selectHilited();
- assertEquals(1, dismissCalled);
- assertEquals(1, updateCalled);
- }
- function testDispose() {
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setToken('the');
- ac.dispose();
- }
- /**
- * Ensure that activedescendant is updated properly.
- */
- function testRolesAndStates() {
- function checkActiveDescendant(activeDescendant) {
- assertNotNull(inputElement);
- assertEquals(
- goog.a11y.aria.getActiveDescendant(inputElement), activeDescendant);
- }
- function checkRole(el, role) {
- assertNotNull(el);
- assertEquals(goog.a11y.aria.getRole(el), role);
- }
- var ds = new MockDS();
- var rend = new TestRend();
- var select = new MockSelect();
- var ac = new goog.ui.ac.AutoComplete(ds, rend, select);
- ac.setTarget(inputElement);
- // initially activedescendant is not set
- checkActiveDescendant(null);
- // highlight the matching row and check that activedescendant updates
- ac.setToken('');
- ac.setToken('the');
- ac.hiliteNext();
- checkActiveDescendant(rend.getHilitedRowDiv());
- // highligted row should have a role of 'option'
- checkRole(rend.getHilitedRowDiv(), goog.a11y.aria.Role.OPTION);
- // closing the autocomplete should clear activedescendant
- ac.dismiss();
- checkActiveDescendant(null);
- }
- function testAttachInputWithAnchor() {
- var anchorElement =
- goog.dom.createDom(goog.dom.TagName.DIV, null, inputElement);
- var mockRenderer = mockControl.createLooseMock(goog.ui.ac.Renderer, true);
- mockRenderer.setAnchorElement(anchorElement);
- var ignore = goog.testing.mockmatchers.ignoreArgument;
- mockRenderer.renderRows(ignore, ignore, inputElement);
- var mockInputHandler =
- mockControl.createLooseMock(goog.ui.ac.InputHandler, true);
- mockInputHandler.attachInputs(inputElement);
- mockControl.$replayAll();
- var autoComplete =
- new goog.ui.ac.AutoComplete(null, mockRenderer, mockInputHandler);
- autoComplete.attachInputWithAnchor(inputElement, anchorElement);
- autoComplete.setTarget(inputElement);
- autoComplete.renderRows(['abc', 'def']);
- mockControl.$verifyAll();
- }
- function testDetachInputWithAnchor() {
- var mockRenderer = mockControl.createLooseMock(goog.ui.ac.Renderer, true);
- var mockInputHandler =
- mockControl.createLooseMock(goog.ui.ac.InputHandler, true);
- var anchorElement =
- goog.dom.createDom(goog.dom.TagName.DIV, null, inputElement);
- var inputElement2 = goog.dom.createDom(
- goog.dom.TagName.INPUT, {type: goog.dom.InputType.TEXT});
- var anchorElement2 =
- goog.dom.createDom(goog.dom.TagName.DIV, null, inputElement2);
- mockControl.$replayAll();
- var autoComplete =
- new goog.ui.ac.AutoComplete(null, mockRenderer, mockInputHandler);
- autoComplete.attachInputWithAnchor(inputElement, anchorElement);
- autoComplete.attachInputWithAnchor(inputElement2, anchorElement2);
- autoComplete.detachInputs(inputElement, inputElement2);
- assertFalse(goog.getUid(inputElement) in autoComplete.inputToAnchorMap_);
- assertFalse(goog.getUid(inputElement2) in autoComplete.inputToAnchorMap_);
- mockControl.$verifyAll();
- }
|