@@ -2345,6 +2345,212 @@ describe('MDC-based MatAutocomplete', () => {
23452345
23462346  } ) ; 
23472347
2348+   describe ( 'automatically selecting the active option' ,  ( )  =>  { 
2349+     let  fixture : ComponentFixture < SimpleAutocomplete > ; 
2350+ 
2351+     beforeEach ( ( )  =>  { 
2352+       fixture  =  createComponent ( SimpleAutocomplete ) ; 
2353+       fixture . detectChanges ( ) ; 
2354+       fixture . componentInstance . trigger . autocomplete . autoSelectActiveOption  =  true ; 
2355+     } ) ; 
2356+ 
2357+     it ( 'should update the input value as the user is navigating, without changing the model '  + 
2358+       'value or closing the panel' ,  fakeAsync ( ( )  =>  { 
2359+         const  { trigger,  stateCtrl,  closedSpy}  =  fixture . componentInstance ; 
2360+         const  input : HTMLInputElement  =  fixture . nativeElement . querySelector ( 'input' ) ; 
2361+ 
2362+         trigger . openPanel ( ) ; 
2363+         fixture . detectChanges ( ) ; 
2364+         zone . simulateZoneExit ( ) ; 
2365+         fixture . detectChanges ( ) ; 
2366+ 
2367+         expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2368+         expect ( input . value ) . toBeFalsy ( ) ; 
2369+         expect ( trigger . panelOpen ) . toBe ( true ) ; 
2370+         expect ( closedSpy ) . not . toHaveBeenCalled ( ) ; 
2371+ 
2372+         dispatchKeyboardEvent ( input ,  'keydown' ,  DOWN_ARROW ) ; 
2373+         fixture . detectChanges ( ) ; 
2374+ 
2375+         expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2376+         expect ( input . value ) . toBe ( 'Alabama' ) ; 
2377+         expect ( trigger . panelOpen ) . toBe ( true ) ; 
2378+         expect ( closedSpy ) . not . toHaveBeenCalled ( ) ; 
2379+ 
2380+         dispatchKeyboardEvent ( input ,  'keydown' ,  DOWN_ARROW ) ; 
2381+         fixture . detectChanges ( ) ; 
2382+ 
2383+         expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2384+         expect ( input . value ) . toBe ( 'California' ) ; 
2385+         expect ( trigger . panelOpen ) . toBe ( true ) ; 
2386+         expect ( closedSpy ) . not . toHaveBeenCalled ( ) ; 
2387+       } ) ) ; 
2388+ 
2389+     it ( 'should revert back to the last typed value if the user presses escape' ,  fakeAsync ( ( )  =>  { 
2390+       const  { trigger,  stateCtrl,  closedSpy}  =  fixture . componentInstance ; 
2391+       const  input : HTMLInputElement  =  fixture . nativeElement . querySelector ( 'input' ) ; 
2392+ 
2393+       trigger . openPanel ( ) ; 
2394+       fixture . detectChanges ( ) ; 
2395+       zone . simulateZoneExit ( ) ; 
2396+       fixture . detectChanges ( ) ; 
2397+       typeInElement ( input ,  'al' ) ; 
2398+       fixture . detectChanges ( ) ; 
2399+       tick ( ) ; 
2400+ 
2401+       expect ( stateCtrl . value ) . toBe ( 'al' ) ; 
2402+       expect ( input . value ) . toBe ( 'al' ) ; 
2403+       expect ( trigger . panelOpen ) . toBe ( true ) ; 
2404+       expect ( closedSpy ) . not . toHaveBeenCalled ( ) ; 
2405+ 
2406+       dispatchKeyboardEvent ( input ,  'keydown' ,  DOWN_ARROW ) ; 
2407+       fixture . detectChanges ( ) ; 
2408+ 
2409+       expect ( stateCtrl . value ) . toBe ( 'al' ) ; 
2410+       expect ( input . value ) . toBe ( 'Alabama' ) ; 
2411+       expect ( trigger . panelOpen ) . toBe ( true ) ; 
2412+       expect ( closedSpy ) . not . toHaveBeenCalled ( ) ; 
2413+ 
2414+       dispatchKeyboardEvent ( document . body ,  'keydown' ,  ESCAPE ) ; 
2415+       fixture . detectChanges ( ) ; 
2416+ 
2417+       expect ( stateCtrl . value ) . toBe ( 'al' ) ; 
2418+       expect ( input . value ) . toBe ( 'al' ) ; 
2419+       expect ( trigger . panelOpen ) . toBe ( false ) ; 
2420+       expect ( closedSpy ) . toHaveBeenCalledTimes ( 1 ) ; 
2421+     } ) ) ; 
2422+ 
2423+     it ( 'should clear the input if the user presses escape while there was a pending '  + 
2424+       'auto selection and there is no previous value' ,  fakeAsync ( ( )  =>  { 
2425+         const  { trigger,  stateCtrl}  =  fixture . componentInstance ; 
2426+         const  input : HTMLInputElement  =  fixture . nativeElement . querySelector ( 'input' ) ; 
2427+ 
2428+         trigger . openPanel ( ) ; 
2429+         fixture . detectChanges ( ) ; 
2430+         zone . simulateZoneExit ( ) ; 
2431+         fixture . detectChanges ( ) ; 
2432+ 
2433+         expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2434+         expect ( input . value ) . toBeFalsy ( ) ; 
2435+ 
2436+         dispatchKeyboardEvent ( input ,  'keydown' ,  DOWN_ARROW ) ; 
2437+         fixture . detectChanges ( ) ; 
2438+ 
2439+         expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2440+         expect ( input . value ) . toBe ( 'Alabama' ) ; 
2441+ 
2442+         dispatchKeyboardEvent ( document . body ,  'keydown' ,  ESCAPE ) ; 
2443+         fixture . detectChanges ( ) ; 
2444+ 
2445+         expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2446+         expect ( input . value ) . toBeFalsy ( ) ; 
2447+       } ) ) ; 
2448+ 
2449+     it ( 'should propagate the auto-selected value if the user clicks away' ,  fakeAsync ( ( )  =>  { 
2450+       const  { trigger,  stateCtrl}  =  fixture . componentInstance ; 
2451+       const  input : HTMLInputElement  =  fixture . nativeElement . querySelector ( 'input' ) ; 
2452+ 
2453+       trigger . openPanel ( ) ; 
2454+       fixture . detectChanges ( ) ; 
2455+       zone . simulateZoneExit ( ) ; 
2456+       fixture . detectChanges ( ) ; 
2457+ 
2458+       expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2459+       expect ( input . value ) . toBeFalsy ( ) ; 
2460+ 
2461+       dispatchKeyboardEvent ( input ,  'keydown' ,  DOWN_ARROW ) ; 
2462+       fixture . detectChanges ( ) ; 
2463+ 
2464+       expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2465+       expect ( input . value ) . toBe ( 'Alabama' ) ; 
2466+ 
2467+       dispatchFakeEvent ( document ,  'click' ) ; 
2468+       fixture . detectChanges ( ) ; 
2469+ 
2470+       expect ( stateCtrl . value ) . toEqual ( { code : 'AL' ,  name : 'Alabama' } ) ; 
2471+       expect ( input . value ) . toBe ( 'Alabama' ) ; 
2472+     } ) ) ; 
2473+ 
2474+     it ( 'should propagate the auto-selected value if the user tabs away' ,  fakeAsync ( ( )  =>  { 
2475+       const  { trigger,  stateCtrl}  =  fixture . componentInstance ; 
2476+       const  input : HTMLInputElement  =  fixture . nativeElement . querySelector ( 'input' ) ; 
2477+ 
2478+       trigger . openPanel ( ) ; 
2479+       fixture . detectChanges ( ) ; 
2480+       zone . simulateZoneExit ( ) ; 
2481+       fixture . detectChanges ( ) ; 
2482+ 
2483+       expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2484+       expect ( input . value ) . toBeFalsy ( ) ; 
2485+ 
2486+       dispatchKeyboardEvent ( input ,  'keydown' ,  DOWN_ARROW ) ; 
2487+       fixture . detectChanges ( ) ; 
2488+ 
2489+       expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2490+       expect ( input . value ) . toBe ( 'Alabama' ) ; 
2491+ 
2492+       dispatchKeyboardEvent ( input ,  'keydown' ,  TAB ) ; 
2493+       fixture . detectChanges ( ) ; 
2494+ 
2495+       expect ( stateCtrl . value ) . toEqual ( { code : 'AL' ,  name : 'Alabama' } ) ; 
2496+       expect ( input . value ) . toBe ( 'Alabama' ) ; 
2497+     } ) ) ; 
2498+ 
2499+     it ( 'should propagate the auto-selected value if the user presses enter on it' ,  fakeAsync ( ( )  =>  { 
2500+       const  { trigger,  stateCtrl}  =  fixture . componentInstance ; 
2501+       const  input : HTMLInputElement  =  fixture . nativeElement . querySelector ( 'input' ) ; 
2502+ 
2503+       trigger . openPanel ( ) ; 
2504+       fixture . detectChanges ( ) ; 
2505+       zone . simulateZoneExit ( ) ; 
2506+       fixture . detectChanges ( ) ; 
2507+ 
2508+       expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2509+       expect ( input . value ) . toBeFalsy ( ) ; 
2510+ 
2511+       dispatchKeyboardEvent ( input ,  'keydown' ,  DOWN_ARROW ) ; 
2512+       fixture . detectChanges ( ) ; 
2513+ 
2514+       expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2515+       expect ( input . value ) . toBe ( 'Alabama' ) ; 
2516+ 
2517+       dispatchKeyboardEvent ( input ,  'keydown' ,  ENTER ) ; 
2518+       fixture . detectChanges ( ) ; 
2519+ 
2520+       expect ( stateCtrl . value ) . toEqual ( { code : 'AL' ,  name : 'Alabama' } ) ; 
2521+       expect ( input . value ) . toBe ( 'Alabama' ) ; 
2522+     } ) ) ; 
2523+ 
2524+     it ( 'should allow the user to click on an option different from the auto-selected one' , 
2525+       fakeAsync ( ( )  =>  { 
2526+         const  { trigger,  stateCtrl}  =  fixture . componentInstance ; 
2527+         const  input : HTMLInputElement  =  fixture . nativeElement . querySelector ( 'input' ) ; 
2528+ 
2529+         trigger . openPanel ( ) ; 
2530+         fixture . detectChanges ( ) ; 
2531+         zone . simulateZoneExit ( ) ; 
2532+         fixture . detectChanges ( ) ; 
2533+ 
2534+         expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2535+         expect ( input . value ) . toBeFalsy ( ) ; 
2536+ 
2537+         dispatchKeyboardEvent ( input ,  'keydown' ,  DOWN_ARROW ) ; 
2538+         fixture . detectChanges ( ) ; 
2539+ 
2540+         expect ( stateCtrl . value ) . toBeFalsy ( ) ; 
2541+         expect ( input . value ) . toBe ( 'Alabama' ) ; 
2542+ 
2543+         const  options  = 
2544+             overlayContainerElement . querySelectorAll ( 'mat-option' )  as  NodeListOf < HTMLElement > ; 
2545+         options [ 2 ] . click ( ) ; 
2546+         fixture . detectChanges ( ) ; 
2547+ 
2548+         expect ( stateCtrl . value ) . toEqual ( { code : 'FL' ,  name : 'Florida' } ) ; 
2549+         expect ( input . value ) . toBe ( 'Florida' ) ; 
2550+       } ) ) ; 
2551+ 
2552+   } ) ; 
2553+ 
23482554  it ( 'should have correct width when opened' ,  ( )  =>  { 
23492555    const  widthFixture  =  createComponent ( SimpleAutocomplete ) ; 
23502556    widthFixture . componentInstance . width  =  300 ; 
0 commit comments