|
6 | 6 | * found in the LICENSE file at https://angular.dev/license |
7 | 7 | */ |
8 | 8 |
|
9 | | -import {signal, WritableSignalLike} from '../behaviors/signal-like/signal-like'; |
| 9 | +import {signal, SignalLike, WritableSignalLike} from '../behaviors/signal-like/signal-like'; |
10 | 10 | import {MenuPattern, MenuBarPattern, MenuItemPattern, MenuTriggerPattern} from './menu'; |
11 | 11 | import {createKeyboardEvent} from '@angular/cdk/testing/private'; |
12 | 12 | import {ModifierKeys} from '@angular/cdk/testing'; |
@@ -1011,4 +1011,98 @@ describe('Menu Bar Pattern', () => { |
1011 | 1011 | }); |
1012 | 1012 | }); |
1013 | 1013 | }); |
| 1014 | + |
| 1015 | + describe('MenuItemPattern with optional value', () => { |
| 1016 | + it('should default value to undefined when omitted', () => { |
| 1017 | + const item = new MenuItemPattern({ |
| 1018 | + id: signal('item-1'), |
| 1019 | + disabled: signal(false), |
| 1020 | + searchTerm: signal('Item'), |
| 1021 | + parent: signal(undefined), |
| 1022 | + element: signal(document.createElement('div')), |
| 1023 | + submenu: signal(undefined), |
| 1024 | + role: signal('menuitem'), |
| 1025 | + }); |
| 1026 | + |
| 1027 | + expect(item.value()).toBeUndefined(); |
| 1028 | + }); |
| 1029 | + |
| 1030 | + function createTestMenu(items: SignalLike<MenuItemPattern<any>[]>) { |
| 1031 | + return new MenuPattern({ |
| 1032 | + id: signal('menu-1'), |
| 1033 | + items, |
| 1034 | + parent: signal(undefined), |
| 1035 | + textDirection: signal('ltr'), |
| 1036 | + expansionDelay: signal(100), |
| 1037 | + disabled: signal(false), |
| 1038 | + activeItem: signal(undefined), |
| 1039 | + typeaheadDelay: signal(500), |
| 1040 | + wrap: signal(true), |
| 1041 | + softDisabled: signal(true), |
| 1042 | + multi: signal(false), |
| 1043 | + focusMode: signal('activedescendant'), |
| 1044 | + orientation: signal('vertical'), |
| 1045 | + selectionMode: signal('explicit'), |
| 1046 | + element: signal(document.createElement('div')), |
| 1047 | + }); |
| 1048 | + } |
| 1049 | + |
| 1050 | + it('should not report duplicate violations for items without a value', () => { |
| 1051 | + const items = signal<MenuItemPattern<any>[]>([]); |
| 1052 | + const menu = createTestMenu(items); |
| 1053 | + |
| 1054 | + items.set([ |
| 1055 | + new MenuItemPattern({ |
| 1056 | + id: signal('item-1'), |
| 1057 | + disabled: signal(false), |
| 1058 | + searchTerm: signal('Item 1'), |
| 1059 | + parent: signal(menu), |
| 1060 | + element: signal(document.createElement('div')), |
| 1061 | + submenu: signal(undefined), |
| 1062 | + role: signal('menuitem'), |
| 1063 | + }), |
| 1064 | + new MenuItemPattern({ |
| 1065 | + id: signal('item-2'), |
| 1066 | + disabled: signal(false), |
| 1067 | + searchTerm: signal('Item 2'), |
| 1068 | + parent: signal(menu), |
| 1069 | + element: signal(document.createElement('div')), |
| 1070 | + submenu: signal(undefined), |
| 1071 | + role: signal('menuitem'), |
| 1072 | + }), |
| 1073 | + ]); |
| 1074 | + |
| 1075 | + expect(menu.validate()).toEqual([]); |
| 1076 | + }); |
| 1077 | + |
| 1078 | + it('should report duplicate violations for items with the same defined value', () => { |
| 1079 | + const items = signal<MenuItemPattern<any>[]>([]); |
| 1080 | + const menu = createTestMenu(items); |
| 1081 | + |
| 1082 | + items.set([ |
| 1083 | + new MenuItemPattern({ |
| 1084 | + id: signal('item-1'), |
| 1085 | + value: signal('copy'), |
| 1086 | + disabled: signal(false), |
| 1087 | + searchTerm: signal('Copy'), |
| 1088 | + parent: signal(menu), |
| 1089 | + element: signal(document.createElement('div')), |
| 1090 | + submenu: signal(undefined), |
| 1091 | + role: signal('menuitem'), |
| 1092 | + }), |
| 1093 | + new MenuItemPattern({ |
| 1094 | + id: signal('item-2'), |
| 1095 | + value: signal('copy'), |
| 1096 | + disabled: signal(false), |
| 1097 | + searchTerm: signal('Copy Again'), |
| 1098 | + parent: signal(menu), |
| 1099 | + element: signal(document.createElement('div')), |
| 1100 | + submenu: signal(undefined), |
| 1101 | + role: signal('menuitem'), |
| 1102 | + }), |
| 1103 | + ]); |
| 1104 | + |
| 1105 | + expect(menu.validate()).toEqual(["Duplicate value 'copy' detected inside ngMenu."]); |
| 1106 | + }); |
| 1107 | + }); |
1014 | 1108 | }); |
0 commit comments