package com.github.jknack.antlr4ide.validation; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.diagnostics.Diagnostic; import org.eclipse.xtext.diagnostics.DiagnosticMessage; import org.eclipse.xtext.diagnostics.Severity; import org.eclipse.xtext.linking.ILinkingDiagnosticMessageProvider.ILinkingDiagnosticContext; import org.junit.Test; import com.github.jknack.antlr4ide.lang.Grammar; import com.github.jknack.antlr4ide.lang.Import; import com.github.jknack.antlr4ide.lang.LexerCommand; import com.github.jknack.antlr4ide.lang.LexerCommands; import com.github.jknack.antlr4ide.lang.LexerRule; import com.github.jknack.antlr4ide.lang.ParserRule; import com.github.jknack.antlr4ide.lang.RuleRef; public class Antlr4MissingReferenceMessageProviderTest { @Test public void defaultModesOK() { ILinkingDiagnosticContext diagnosticContext = createMock(ILinkingDiagnosticContext.class); LexerCommand command = createMock(LexerCommand.class); LexerCommands commands = createMock(LexerCommands.class); expect(diagnosticContext.getLinkText()).andReturn("HIDDEN"); expect(diagnosticContext.getContext()).andReturn(command); expect(command.eContainer()).andReturn(commands); Object[] mocks = {diagnosticContext, command, commands }; replay(mocks); DiagnosticMessage message = new Antlr4MissingReferenceMessageProvider() .getUnresolvedProxyMessage(diagnosticContext); assertNull(message); verify(mocks); } @Test public void undefinedMode() { ILinkingDiagnosticContext diagnosticContext = createMock(ILinkingDiagnosticContext.class); LexerCommand command = createMock(LexerCommand.class); LexerCommands commands = createMock(LexerCommands.class); expect(diagnosticContext.getLinkText()).andReturn("INSIDE"); expect(diagnosticContext.getContext()).andReturn(command); expect(command.eContainer()).andReturn(commands); Object[] mocks = {diagnosticContext, command, commands }; replay(mocks); DiagnosticMessage message = new Antlr4MissingReferenceMessageProvider() .getUnresolvedProxyMessage(diagnosticContext); assertNull(message); verify(mocks); } @Test public void badImport() { ILinkingDiagnosticContext diagnosticContext = createMock(ILinkingDiagnosticContext.class); Grammar grammar = createMock(Grammar.class); Import delegate = createMock(Import.class); Resource resource = createMock(Resource.class); URI uri = createMock(URI.class); String name = "G.g4"; expect(diagnosticContext.getLinkText()).andReturn("some"); expect(diagnosticContext.getContext()).andReturn(delegate); expect(delegate.eContainer()).andReturn(null).times(2); expect(delegate.eContainer()).andReturn(grammar); expect(grammar.eContainer()).andReturn(null); expect(grammar.eResource()).andReturn(resource); expect(resource.getURI()).andReturn(uri); expect(uri.lastSegment()).andReturn(name); Object[] mocks = {diagnosticContext, delegate, grammar, resource, uri }; replay(mocks); DiagnosticMessage message = new Antlr4MissingReferenceMessageProvider() .getUnresolvedProxyMessage(diagnosticContext); assertNotNull(message); assertEquals(Diagnostic.LINKING_DIAGNOSTIC, message.getIssueCode()); assertArrayEquals(new String[]{"some", "import" }, message.getIssueData()); assertEquals("can't find or load grammar 'some' from 'G.g4'", message.getMessage()); assertEquals(Severity.ERROR, message.getSeverity()); verify(mocks); } @Test public void undefinedParserRule() { ILinkingDiagnosticContext diagnosticContext = createMock(ILinkingDiagnosticContext.class); ParserRule rule = createMock(ParserRule.class); RuleRef ref = createMock(RuleRef.class); expect(diagnosticContext.getLinkText()).andReturn("some"); expect(diagnosticContext.getContext()).andReturn(ref); expect(ref.eContainer()).andReturn(null); expect(ref.eContainer()).andReturn(rule); Object[] mocks = {diagnosticContext, ref, rule }; replay(mocks); DiagnosticMessage message = new Antlr4MissingReferenceMessageProvider() .getUnresolvedProxyMessage(diagnosticContext); assertNotNull(message); assertEquals(Diagnostic.LINKING_DIAGNOSTIC, message.getIssueCode()); assertArrayEquals(new String[]{"some", "rule" }, message.getIssueData()); assertEquals("reference to undefined rule 'some'", message.getMessage()); assertEquals(Severity.ERROR, message.getSeverity()); verify(mocks); } @Test public void undefinedLexerRule() { ILinkingDiagnosticContext diagnosticContext = createMock(ILinkingDiagnosticContext.class); LexerRule rule = createMock(LexerRule.class); RuleRef ref = createMock(RuleRef.class); expect(diagnosticContext.getLinkText()).andReturn("ID"); expect(diagnosticContext.getContext()).andReturn(ref); expect(ref.eContainer()).andReturn(null); expect(ref.eContainer()).andReturn(rule); Object[] mocks = {diagnosticContext, ref, rule }; replay(mocks); DiagnosticMessage message = new Antlr4MissingReferenceMessageProvider() .getUnresolvedProxyMessage(diagnosticContext); assertNotNull(message); assertEquals(Diagnostic.LINKING_DIAGNOSTIC, message.getIssueCode()); assertArrayEquals(new String[]{"ID", "token" }, message.getIssueData()); assertEquals("reference to undefined rule 'ID'", message.getMessage()); assertEquals(Severity.ERROR, message.getSeverity()); verify(mocks); } @Test public void implicitTokenDefinition() { ILinkingDiagnosticContext diagnosticContext = createMock(ILinkingDiagnosticContext.class); ParserRule rule = createMock(ParserRule.class); RuleRef ref = createMock(RuleRef.class); expect(diagnosticContext.getLinkText()).andReturn("ID"); expect(diagnosticContext.getContext()).andReturn(ref); expect(ref.eContainer()).andReturn(null); expect(ref.eContainer()).andReturn(rule); Object[] mocks = {diagnosticContext, ref, rule }; replay(mocks); DiagnosticMessage message = new Antlr4MissingReferenceMessageProvider() .getUnresolvedProxyMessage(diagnosticContext); assertNotNull(message); assertEquals(Diagnostic.LINKING_DIAGNOSTIC, message.getIssueCode()); assertArrayEquals(new String[]{"ID", "token" }, message.getIssueData()); assertEquals("implicit token definition 'ID'", message.getMessage()); assertEquals(Severity.WARNING, message.getSeverity()); verify(mocks); } }