diff --git a/packages/grammar-selector/spec/grammar-selector-spec.js b/packages/grammar-selector/spec/grammar-selector-spec.js index aaea64b42..460994053 100644 --- a/packages/grammar-selector/spec/grammar-selector-spec.js +++ b/packages/grammar-selector/spec/grammar-selector-spec.js @@ -27,25 +27,21 @@ describe('GrammarSelector', () => { describe('when grammar-selector:show is triggered', () => it('displays a list of all the available grammars', async () => { - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show') - await SelectListView.getScheduler().getNextUpdatePromise() - - const grammarView = atom.workspace.getModalPanels()[0].getItem().element + const grammarView = (await getGrammarView(editor)).element // -1 for removing nullGrammar, +1 for adding "Auto Detect" + // Tree-sitter names the regex and JSDoc grammars expect(grammarView.querySelectorAll('li').length).toBe(atom.grammars.grammars.filter(g => g.name).length) expect(grammarView.querySelectorAll('li')[0].textContent).toBe('Auto Detect') expect(grammarView.textContent.includes('source.a')).toBe(false) grammarView.querySelectorAll('li').forEach(li => expect(li.textContent).not.toBe(atom.grammars.nullGrammar.name)) + expect(grammarView.textContent.includes("Tree-sitter")).toBe(true) // check we are showing and labelling Tree-sitter grammars }) ) describe('when a grammar is selected', () => it('sets the new grammar on the editor', async () => { - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show') - await SelectListView.getScheduler().getNextUpdatePromise() - - const grammarView = atom.workspace.getModalPanels()[0].getItem() + const grammarView = await getGrammarView(editor) grammarView.props.didConfirmSelection(textGrammar) expect(editor.getGrammar()).toBe(textGrammar) }) @@ -53,17 +49,11 @@ describe('GrammarSelector', () => { describe('when auto-detect is selected', () => it('restores the auto-detected grammar on the editor', async () => { - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show') - await SelectListView.getScheduler().getNextUpdatePromise() - - let grammarView = atom.workspace.getModalPanels()[0].getItem() + let grammarView = await getGrammarView(editor) grammarView.props.didConfirmSelection(textGrammar) expect(editor.getGrammar()).toBe(textGrammar) - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show') - await SelectListView.getScheduler().getNextUpdatePromise() - - grammarView = atom.workspace.getModalPanels()[0].getItem() + grammarView = await getGrammarView(editor) grammarView.props.didConfirmSelection(grammarView.items[0]) expect(editor.getGrammar()).toBe(jsGrammar) }) @@ -72,10 +62,7 @@ describe('GrammarSelector', () => { describe("when the editor's current grammar is the null grammar", () => it('displays Auto Detect as the selected grammar', async () => { editor.setGrammar(atom.grammars.nullGrammar) - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show') - await SelectListView.getScheduler().getNextUpdatePromise() - - const grammarView = atom.workspace.getModalPanels()[0].getItem().element + const grammarView = (await getGrammarView(editor)).element expect(grammarView.querySelector('li.active').textContent).toBe('Auto Detect') }) ) @@ -85,10 +72,7 @@ describe('GrammarSelector', () => { editor = await atom.workspace.open() expect(editor.getGrammar()).not.toBe(jsGrammar) - atom.commands.dispatch(editor.getElement(), 'grammar-selector:show') - await SelectListView.getScheduler().getNextUpdatePromise() - - const grammarView = atom.workspace.getModalPanels()[0].getItem() + const grammarView = await getGrammarView(editor) grammarView.props.didConfirmSelection(jsGrammar) expect(editor.getGrammar()).toBe(jsGrammar) }) @@ -170,6 +154,52 @@ describe('GrammarSelector', () => { }) ) + describe('when toggling hideDuplicateTextMateGrammars', () => { + it('shows only the Tree-sitter if true and both exist', async () => { + // the main JS grammar has both a TextMate and Tree-sitter implementation + atom.config.set('grammar-selector.hideDuplicateTextMateGrammars', true) + const grammarView = await getGrammarView(editor) + const observedNames = new Set() + grammarView.element.querySelectorAll('li').forEach(li => { + const name = li.getAttribute('data-grammar') + expect(observedNames.has(name)).toBe(false) + observedNames.add(name) + }) + + // check the seen JS is actually the Tree-sitter one + const list = atom.workspace.getModalPanels()[0].item + for (const item of list.items) { + if (item.name === "JavaScript") { + expect(item.constructor.name === "TreeSitterGrammar") + } + } + }) + + it('shows both if false', async () => { + atom.config.set('grammar-selector.hideDuplicateTextMateGrammars', false) + const grammarView = await getGrammarView(editor) + let jsCount = 0 + grammarView.element.querySelectorAll('li').forEach(li => { + const name = li.getAttribute('data-grammar') + if (name === "JavaScript") jsCount++ + }) + expect(jsCount).toBe(2) + }) + }) + + describe('for every Tree-sitter grammar', () => { + it('adds a label to identify it as Tree-sitter', async () => { + const grammarView = await getGrammarView(editor) + const elements = grammarView.element.querySelectorAll('li') + const listItems = atom.workspace.getModalPanels()[0].item.items + for (let i = 0; i < listItems.length; i++) { + if (listItems[i].constructor.name === "TreeSitterGrammar") { + expect(elements[i].childNodes[1].childNodes[0].className.startsWith('grammar-selector-parser')).toBe(true) + } + } + }) + }) + describe('when clicked', () => it('shows the grammar selector modal', () => { const eventHandler = jasmine.createSpy('eventHandler') @@ -193,3 +223,9 @@ function getTooltipText (element) { const [tooltip] = atom.tooltips.findTooltips(element) return tooltip.getTitle() } + +async function getGrammarView (editor) { + atom.commands.dispatch(editor.getElement(), 'grammar-selector:show') + await SelectListView.getScheduler().getNextUpdatePromise() + return atom.workspace.getModalPanels()[0].getItem() +}