| test(
  'browser.tinymce.themes.modern.test.ui.MenubarTest',
  [
    'ephox.agar.api.Assertions',
    'ephox.katamari.api.Arr',
    'ephox.katamari.api.Fun',
    'tinymce.core.Editor',
    'tinymce.core.EditorManager',
    'tinymce.themes.modern.ui.Menubar'
  ],
  function (Assertions, Arr, Fun, Editor, EditorManager, Menubar) {
    var menuItems = [
      'newdocument',
      'restoredraft',
      'preview',
      'print',
      'undo',
      'redo',
      'cut',
      'copy',
      'paste',
      'pastetext',
      'selectall',
      'code',
      'visualaid',
      'visualchars',
      'visualblocks',
      'spellchecker',
      'preview',
      'fullscreen',
      'image',
      'link',
      'media',
      'template',
      'codesample',
      'inserttable',
      'charmap',
      'hr',
      'pagebreak',
      'nonbreaking',
      'anchor',
      'toc',
      'insertdatetime',
      'bold',
      'italic',
      'underline',
      'strikethrough',
      'superscript',
      'subscript',
      'codeformat',
      'blockformats',
      'align',
      'removeformat',
      'spellcheckerlanguage',
      'a11ycheck'
    ];
    var testMenubarCustomItems = function (label, expectedStructure, settings, customItemsCallback) {
      var editor = new Editor('id', settings, EditorManager);
      Arr.each(menuItems, function (name) {
        editor.addMenuItem(name, { text: name });
      });
      customItemsCallback(editor);
      var menuButtons = Menubar.createMenuButtons(editor);
      Assertions.assertEq(label, expectedStructure, menuButtons);
    };
    var testMenubar = function (label, expectedStructure, settings) {
      testMenubarCustomItems(label, expectedStructure, settings, Fun.noop);
    };
    var menuItem = function (text) {
      return { text: text };
    };
    var menuSeparator = function () {
      return { text: '|' };
    };
    var menuCustomItem = function (item) {
      return item;
    };
    testMenubar(
      'Default config should match',
      [
        {
          text: 'File',
          menu: [
            menuItem('newdocument'),
            menuItem('restoredraft'),
            menuSeparator(),
            menuItem('preview'),
            menuSeparator(),
            menuItem('print')
          ]
        },
        {
          text: 'Edit',
          menu: [
            menuItem('undo'),
            menuItem('redo'),
            menuSeparator(),
            menuItem('cut'),
            menuItem('copy'),
            menuItem('paste'),
            menuItem('pastetext'),
            menuSeparator(),
            menuItem('selectall')
          ]
        },
        {
          text: 'View',
          menu: [
            menuItem('code'),
            menuSeparator(),
            menuItem('visualaid'),
            menuItem('visualchars'),
            menuItem('visualblocks'),
            menuSeparator(),
            menuItem('spellchecker'),
            menuSeparator(),
            menuItem('preview'),
            menuItem('fullscreen')
          ]
        },
        {
          text: 'Insert',
          menu: [
            menuItem('image'),
            menuItem('link'),
            menuItem('media'),
            menuItem('template'),
            menuItem('codesample'),
            menuItem('inserttable'),
            menuSeparator(),
            menuItem('charmap'),
            menuItem('hr'),
            menuSeparator(),
            menuItem('pagebreak'),
            menuItem('nonbreaking'),
            menuItem('anchor'),
            menuItem('toc'),
            menuSeparator(),
            menuItem('insertdatetime')
          ]
        },
        {
          text: 'Format',
          menu: [
            menuItem('bold'),
            menuItem('italic'),
            menuItem('underline'),
            menuItem('strikethrough'),
            menuItem('superscript'),
            menuItem('subscript'),
            menuItem('codeformat'),
            menuSeparator(),
            menuItem('blockformats'),
            menuItem('align'),
            menuSeparator(),
            menuItem('removeformat')
          ]
        },
        {
          text: 'Tools',
          menu: [
            menuItem('spellchecker'),
            menuItem('spellcheckerlanguage'),
            menuSeparator(),
            menuItem('a11ycheck')
          ]
        }
      ],
      {}
    );
    testMenubar(
      'Default config with some removed items',
      [
        {
          text: 'File',
          menu: [
            menuItem('newdocument'),
            menuItem('restoredraft'),
            menuSeparator(),
            menuItem('print')
          ]
        },
        {
          text: 'Edit',
          menu: [
            menuItem('undo'),
            menuItem('redo'),
            menuSeparator(),
            menuItem('cut'),
            menuItem('copy'),
            menuItem('paste'),
            menuItem('pastetext'),
            menuSeparator(),
            menuItem('selectall')
          ]
        },
        {
          text: 'View',
          menu: [
            menuItem('visualaid'),
            menuItem('visualchars'),
            menuItem('visualblocks'),
            menuSeparator(),
            menuItem('spellchecker'),
            menuSeparator(),
            menuItem('fullscreen')
          ]
        },
        {
          text: 'Insert',
          menu: [
            menuItem('image'),
            menuItem('link'),
            menuItem('media'),
            menuItem('template'),
            menuItem('codesample'),
            menuItem('inserttable'),
            menuSeparator(),
            menuItem('charmap'),
            menuItem('hr'),
            menuSeparator(),
            menuItem('pagebreak'),
            menuItem('nonbreaking'),
            menuItem('anchor'),
            menuItem('toc'),
            menuSeparator(),
            menuItem('insertdatetime')
          ]
        },
        {
          text: 'Format',
          menu: [
            menuItem('bold'),
            menuItem('italic'),
            menuItem('underline'),
            menuItem('strikethrough'),
            menuItem('superscript'),
            menuItem('subscript'),
            menuItem('codeformat'),
            menuSeparator(),
            menuItem('blockformats'),
            menuItem('align')
          ]
        },
        {
          text: 'Tools',
          menu: [
            menuItem('spellchecker'),
            menuItem('spellcheckerlanguage'),
            menuSeparator(),
            menuItem('a11ycheck')
          ]
        }
      ],
      {
        removed_menuitems: 'preview code removeformat'
      }
    );
    testMenubar(
      'Menubar config with only file menu button',
      [
        {
          text: 'File',
          menu: [
            menuItem('newdocument'),
            menuItem('restoredraft'),
            menuSeparator(),
            menuItem('preview'),
            menuSeparator(),
            menuItem('print')
          ]
        }
      ],
      {
        menubar: 'file'
      }
    );
    testMenubar(
      'Menu custom config',
      [
        {
          text: 'Custom file',
          menu: [
            menuItem('newdocument'),
            menuItem('preview')
          ]
        },
        {
          text: 'Custom view',
          menu: [
            menuItem('preview')
          ]
        }
      ],
      {
        menu: {
          'file': { title: 'Custom file', items: 'newdocument preview' },
          'view': { title: 'Custom view', items: 'preview' }
        }
      }
    );
    testMenubar(
      'Menu custom config cleanup separators',
      [
        {
          text: 'Custom file',
          menu: [
            menuItem('newdocument'),
            menuSeparator(),
            menuItem('preview')
          ]
        }
      ],
      {
        menu: {
          'file': { title: 'Custom file', items: '| newdocument | | | preview |' }
        }
      }
    );
    testMenubarCustomItems(
      'Adding custom menu items by context',
      [
        {
          text: 'File',
          menu: [
            menuCustomItem({
              text: 'custom3',
              context: 'file',
              prependToContext: true
            }),
            menuItem('newdocument'),
            menuItem('restoredraft'),
            menuSeparator(),
            menuItem('preview'),
            menuSeparator(),
            menuItem('print'),
            menuCustomItem({
              text: 'custom1',
              context: 'file'
            }),
            menuCustomItem({
              text: 'custom2',
              context: 'file'
            })
          ]
        }
      ],
      {
        menubar: 'file'
      },
      function (editor) {
        editor.addMenuItem('custom1', {
          text: 'custom1',
          context: 'file'
        });
        editor.addMenuItem('custom2', {
          text: 'custom2',
          context: 'file'
        });
        editor.addMenuItem('custom3', {
          text: 'custom3',
          context: 'file',
          prependToContext: true
        });
      }
    );
    testMenubarCustomItems(
      'Adding custom menu items',
      [
        {
          text: 'File',
          menu: [
            menuCustomItem({
              text: 'custom1'
            })
          ]
        }
      ],
      {
        menu: {
          'file': { title: 'File', items: 'custom1' }
        }
      },
      function (editor) {
        editor.addMenuItem('custom1', {
          text: 'custom1'
        });
        editor.addMenuItem('custom2', {
          text: 'custom2'
        });
      }
    );
  }
);
 |