@@ -10,88 +10,142 @@ import {Component} from '@angular/core';
1010import { TestBed } from '@angular/core/testing' ;
1111import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed' ;
1212import { Menu } from '../menu' ;
13+ import { MenuContent } from '../menu-content' ;
1314import { MenuItem } from '../menu-item' ;
1415import { MenuTrigger } from '../menu-trigger' ;
15- import { MenuItemHarness , MenuTriggerHarness } from './menu-harness' ;
16+ import { MenuBar } from '../menu-bar' ;
17+ import { MenuItemHarness , MenuHarness } from './menu-harness' ;
1618
1719describe ( 'Aria Menu Harness' , ( ) => {
1820 let fixture : any ;
1921 let loader : any ;
2022
2123 beforeEach ( ( ) => {
2224 TestBed . configureTestingModule ( {
23- imports : [ Menu , MenuItem , MenuTrigger , MenuTestApp ] ,
25+ imports : [ Menu , MenuItem , MenuTrigger , MenuBar , MenuContent , MenuTestApp ] ,
2426 } ) ;
2527
2628 fixture = TestBed . createComponent ( MenuTestApp ) ;
2729 fixture . detectChanges ( ) ;
2830 loader = TestbedHarnessEnvironment . loader ( fixture ) ;
2931 } ) ;
3032
31- it ( 'should locate the menu trigger harness' , async ( ) => {
32- const trigger = await loader . getHarness ( MenuTriggerHarness . with ( { text : 'Open Menu' } ) ) ;
33- expect ( trigger ) . toBeTruthy ( ) ;
34- expect ( await trigger . getText ( ) ) . toBe ( 'Open Menu' ) ;
33+ it ( 'should locate the menu harness' , async ( ) => {
34+ const menu = await loader . getHarness ( MenuHarness . with ( { triggerText : 'Open Menu' } ) ) ;
35+ expect ( menu ) . toBeTruthy ( ) ;
36+ } ) ;
37+
38+ it ( 'should verify that the menu is initially closed' , async ( ) => {
39+ const menu = await loader . getHarness ( MenuHarness . with ( { triggerText : 'Open Menu' } ) ) ;
40+ expect ( await menu . isOpen ( ) ) . toBe ( false ) ;
3541 } ) ;
3642
37- it ( 'should open the menu and locate items ' , async ( ) => {
38- const trigger = await loader . getHarness ( MenuTriggerHarness ) ;
39- await trigger . click ( ) ;
43+ it ( 'should open the menu' , async ( ) => {
44+ const menu = await loader . getHarness ( MenuHarness . with ( { triggerText : 'Open Menu' } ) ) ;
45+ await menu . open ( ) ;
4046 fixture . detectChanges ( ) ;
4147
42- const menu = await trigger . getMenu ( ) ;
43- expect ( menu ) . toBeTruthy ( ) ;
48+ expect ( await menu . isOpen ( ) ) . toBe ( true ) ;
49+ } ) ;
50+
51+ it ( 'should close the menu' , async ( ) => {
52+ const menu = await loader . getHarness ( MenuHarness . with ( { triggerText : 'Open Menu' } ) ) ;
53+ await menu . open ( ) ;
54+ fixture . detectChanges ( ) ;
55+
56+ await menu . close ( ) ;
57+ fixture . detectChanges ( ) ;
58+ expect ( await menu . isOpen ( ) ) . toBe ( false ) ;
59+ } ) ;
60+
61+ it ( 'should get all items inside an open menu' , async ( ) => {
62+ const menu = await loader . getHarness ( MenuHarness . with ( { triggerText : 'Open Menu' } ) ) ;
63+ await menu . open ( ) ;
64+ fixture . detectChanges ( ) ;
4465
4566 const items = await menu . getItems ( ) ;
46- expect ( items . length ) . toBe ( 4 ) ;
67+ expect ( items . length ) . toBe ( 3 ) ;
4768 expect ( await items [ 0 ] . getText ( ) ) . toBe ( 'Item 1' ) ;
48- expect ( await items [ 1 ] . getText ( ) ) . toBe ( 'Item 2' ) ;
49- expect ( await items [ 2 ] . getText ( ) ) . toBe ( 'Submenu' ) ;
50- expect ( await items [ 3 ] . getText ( ) ) . toBe ( 'Nested Item' ) ;
5169 } ) ;
5270
53- it ( 'should filter menu items by state' , async ( ) => {
54- const trigger = await loader . getHarness ( MenuTriggerHarness ) ;
55- await trigger . click ( ) ;
71+ it ( 'should filter menu items by their disabled state' , async ( ) => {
72+ const menu = await loader . getHarness ( MenuHarness . with ( { triggerText : 'Open Menu' } ) ) ;
73+ await menu . open ( ) ;
5674 fixture . detectChanges ( ) ;
5775
5876 const disabledItems = await loader . getAllHarnesses ( MenuItemHarness . with ( { disabled : true } ) ) ;
5977 expect ( disabledItems . length ) . toBe ( 1 ) ;
6078 expect ( await disabledItems [ 0 ] . getText ( ) ) . toBe ( 'Item 2' ) ;
6179 } ) ;
6280
63- it ( 'should locate and open a nested submenu ' , async ( ) => {
64- const mainTrigger = await loader . getHarness ( MenuTriggerHarness . with ( { text : 'Open Menu' } ) ) ;
65- await mainTrigger . click ( ) ;
81+ it ( 'should locate and interact with nested submenus ' , async ( ) => {
82+ const main = await loader . getHarness ( MenuHarness . with ( { triggerText : 'Open Menu' } ) ) ;
83+ await main . open ( ) ;
6684 fixture . detectChanges ( ) ;
6785
6886 const subItem = await loader . getHarness ( MenuItemHarness . with ( { text : 'Submenu' } ) ) ;
69- expect ( await subItem . hasSubmenu ( ) ) . toBe ( true ) ;
7087 await subItem . click ( ) ;
7188 fixture . detectChanges ( ) ;
7289
7390 const submenu = await subItem . getSubmenu ( ) ;
7491 expect ( submenu ) . toBeTruthy ( ) ;
92+ expect ( await submenu ! . isOpen ( ) ) . toBe ( true ) ;
93+ } ) ;
94+
95+ it ( 'should read items within a nested submenu' , async ( ) => {
96+ const main = await loader . getHarness ( MenuHarness . with ( { triggerText : 'Open Menu' } ) ) ;
97+ await main . open ( ) ;
98+ fixture . detectChanges ( ) ;
99+
100+ const subItem = await loader . getHarness ( MenuItemHarness . with ( { text : 'Submenu' } ) ) ;
101+ await subItem . click ( ) ;
102+ fixture . detectChanges ( ) ;
103+
104+ const submenu = await subItem . getSubmenu ( ) ;
75105 const subItems = await submenu ! . getItems ( ) ;
76106 expect ( subItems . length ) . toBe ( 1 ) ;
77107 expect ( await subItems [ 0 ] . getText ( ) ) . toBe ( 'Nested Item' ) ;
78108 } ) ;
109+
110+ it ( 'should confirm persistent horizontal menu bars are always open' , async ( ) => {
111+ const menubar = await loader . getHarness ( MenuHarness . with ( { selector : '[ngMenuBar]' } ) ) ;
112+ expect ( menubar ) . toBeTruthy ( ) ;
113+ expect ( await menubar . isOpen ( ) ) . toBe ( true ) ;
114+ } ) ;
115+
116+ it ( 'should read items from a persistent horizontal menu bar' , async ( ) => {
117+ const menubar = await loader . getHarness ( MenuHarness . with ( { selector : '[ngMenuBar]' } ) ) ;
118+ const items = await menubar . getItems ( ) ;
119+
120+ expect ( items . length ) . toBe ( 2 ) ;
121+ expect ( await items [ 0 ] . getText ( ) ) . toBe ( 'File' ) ;
122+ expect ( await items [ 1 ] . getText ( ) ) . toBe ( 'Edit' ) ;
123+ } ) ;
79124} ) ;
80125
81126@Component ( {
82127 template : `
83128 <button ngMenuTrigger [menu]="testMenu">Open Menu</button>
84129
85130 <div ngMenu #testMenu="ngMenu">
86- <div ngMenuItem value="Item 1">Item 1</div>
87- <div ngMenuItem value="Item 2" [disabled]="true">Item 2</div>
88- <div ngMenuItem value="Submenu" [submenu]="nestedMenu">Submenu</div>
131+ <ng-template ngMenuContent>
132+ <div ngMenuItem value="Item 1">Item 1</div>
133+ <div ngMenuItem value="Item 2" [disabled]="true">Item 2</div>
134+ <div ngMenuItem value="Submenu" [submenu]="nestedMenu">Submenu</div>
135+ </ng-template>
136+ </div>
89137
90- <div ngMenu #nestedMenu="ngMenu">
138+ <div ngMenu #nestedMenu="ngMenu">
139+ <ng-template ngMenuContent>
91140 <div ngMenuItem value="Nested Item">Nested Item</div>
92- </div>
141+ </ng-template>
142+ </div>
143+
144+ <div ngMenuBar>
145+ <div ngMenuItem value="File">File</div>
146+ <div ngMenuItem value="Edit">Edit</div>
93147 </div>
94148 ` ,
95- imports : [ Menu , MenuItem , MenuTrigger ] ,
149+ imports : [ Menu , MenuItem , MenuTrigger , MenuBar , MenuContent ] ,
96150} )
97151class MenuTestApp { }
0 commit comments