diff --git a/app.hypermedia.testing.dsl.ide/.classpath b/app.hypermedia.testing.dsl.ide/.classpath index 91b64b1..3cd24f4 100644 --- a/app.hypermedia.testing.dsl.ide/.classpath +++ b/app.hypermedia.testing.dsl.ide/.classpath @@ -4,7 +4,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app.hypermedia.testing.dsl.ide/pom.xml b/app.hypermedia.testing.dsl.ide/pom.xml index 78f0eac..79bb96a 100644 --- a/app.hypermedia.testing.dsl.ide/pom.xml +++ b/app.hypermedia.testing.dsl.ide/pom.xml @@ -42,6 +42,27 @@ + + add-test-source + initialize + + add-test-source + add-test-resource + + + + src/test/xtext-gen + + + + src/test/xtext-gen + + **/*.java + + + + + @@ -101,6 +122,23 @@ + + org.junit.jupiter + junit-jupiter-api + test + 5.3.2 + + + org.junit.jupiter + junit-jupiter-engine + test + + + org.eclipse.xtext + org.eclipse.xtext.testing + ${xtextVersion} + test + ${project.groupId} app.hypermedia.testing.dsl diff --git a/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/CoreIdeModule.xtend b/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/CoreIdeModule.xtend index c0e02b6..4eae152 100644 --- a/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/CoreIdeModule.xtend +++ b/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/CoreIdeModule.xtend @@ -3,9 +3,14 @@ */ package app.hypermedia.testing.dsl.ide +import app.hypermedia.testing.dsl.ide.editor.contentassist.CoreContentAssist +import org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider /** * Use this class to register ide components. */ class CoreIdeModule extends AbstractCoreIdeModule { + def Class bindIdeContentProposalProvider() { + return CoreContentAssist + } } diff --git a/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/HydraIdeModule.xtend b/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/HydraIdeModule.xtend index 5f68731..1b5476b 100644 --- a/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/HydraIdeModule.xtend +++ b/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/HydraIdeModule.xtend @@ -3,9 +3,14 @@ */ package app.hypermedia.testing.dsl.ide +import org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider +import app.hypermedia.testing.dsl.ide.editor.contentassist.HydraContentAssist /** * Use this class to register ide components. */ class HydraIdeModule extends AbstractHydraIdeModule { + def Class bindIdeContentProposalProvider() { + return HydraContentAssist + } } diff --git a/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/editor/contentassist/CoreContentAssist.xtend b/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/editor/contentassist/CoreContentAssist.xtend new file mode 100644 index 0000000..cac21e4 --- /dev/null +++ b/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/editor/contentassist/CoreContentAssist.xtend @@ -0,0 +1,31 @@ +package app.hypermedia.testing.dsl.ide.editor.contentassist + +import org.eclipse.xtext.ide.editor.contentassist.IdeContentProposalProvider +import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext +import org.eclipse.xtext.ide.editor.contentassist.IIdeContentProposalAcceptor +import org.eclipse.xtext.RuleCall +import org.eclipse.xtext.Keyword + +class CoreContentAssist extends IdeContentProposalProvider { + override dispatch void createProposals(RuleCall ruleCall, ContentAssistContext context, IIdeContentProposalAcceptor acceptor) { + switch (ruleCall.rule.name) { + case "ClassBlock": { + val entry = proposalCreator.createProposal('With Class', context) + acceptor.accept(entry, proposalPriorities.getDefaultPriority(entry)) + } + case "FollowStatement": { + val entry = proposalCreator.createProposal('Follow [uri]', context) + acceptor.accept(entry, proposalPriorities.getDefaultPriority(entry)) + } + } + } + + override protected filterKeyword(Keyword keyword, ContentAssistContext context) { + if (keyword.value == "Follow") { + return false + } + + super.filterKeyword(keyword, context) + } + +} \ No newline at end of file diff --git a/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/editor/contentassist/HydraContentAssist.xtend b/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/editor/contentassist/HydraContentAssist.xtend new file mode 100644 index 0000000..1210d03 --- /dev/null +++ b/app.hypermedia.testing.dsl.ide/src/main/java/app/hypermedia/testing/dsl/ide/editor/contentassist/HydraContentAssist.xtend @@ -0,0 +1,25 @@ +package app.hypermedia.testing.dsl.ide.editor.contentassist + +import org.eclipse.xtext.ide.editor.contentassist.IIdeContentProposalAcceptor +import org.eclipse.xtext.ide.editor.contentassist.ContentAssistContext +import org.eclipse.xtext.RuleCall + +class HydraContentAssist extends CoreContentAssist { + override dispatch void createProposals(RuleCall ruleCall, ContentAssistContext context, IIdeContentProposalAcceptor acceptor) { + switch (ruleCall.rule.name) { + case "RelaxedOperationBlock": { + val entry = proposalCreator.createProposal('With Operation', context) + acceptor.accept(entry, proposalPriorities.getDefaultPriority(entry)) + } + case "OperationBlock": { + var entry = proposalCreator.createProposal('With Operation', context) + acceptor.accept(entry, proposalPriorities.getDefaultPriority(entry)) + entry = proposalCreator.createProposal('Expect Operation', context) + acceptor.accept(entry, proposalPriorities.getDefaultPriority(entry)) + } + default: { + super._createProposals(ruleCall, context, acceptor) + } + } + } +} \ No newline at end of file diff --git a/app.hypermedia.testing.dsl.ide/src/test/java/app/hypermedia/testing/dsl/ide/tests/editor/contentassist/CoreCompletionTest.xtend b/app.hypermedia.testing.dsl.ide/src/test/java/app/hypermedia/testing/dsl/ide/tests/editor/contentassist/CoreCompletionTest.xtend new file mode 100644 index 0000000..2a8c0ad --- /dev/null +++ b/app.hypermedia.testing.dsl.ide/src/test/java/app/hypermedia/testing/dsl/ide/tests/editor/contentassist/CoreCompletionTest.xtend @@ -0,0 +1,21 @@ +package app.hypermedia.testing.dsl.ide.tests.editor.contentassist + +import org.junit.jupiter.api.Test +import org.eclipse.xtext.testing.AbstractLanguageServerTest + +class CoreCompletionTest extends AbstractLanguageServerTest { + + new() { + super("api") + } + + @Test + def void testCompletion_01() { + testCompletion [ + model = '' + expectedCompletionItems = ''' + With Class -> With Class [[0, 0] .. [0, 0]] + ''' + ] + } +} diff --git a/app.hypermedia.testing.dsl.ide/src/test/java/app/hypermedia/testing/dsl/ide/tests/editor/contentassist/HydraCompletionTest.xtend b/app.hypermedia.testing.dsl.ide/src/test/java/app/hypermedia/testing/dsl/ide/tests/editor/contentassist/HydraCompletionTest.xtend new file mode 100644 index 0000000..f3e484a --- /dev/null +++ b/app.hypermedia.testing.dsl.ide/src/test/java/app/hypermedia/testing/dsl/ide/tests/editor/contentassist/HydraCompletionTest.xtend @@ -0,0 +1,22 @@ +package app.hypermedia.testing.dsl.ide.tests.editor.contentassist + +import org.junit.jupiter.api.Test +import org.eclipse.xtext.testing.AbstractLanguageServerTest + +class HydraCompletionTest extends AbstractLanguageServerTest { + + new() { + super("hydra") + } + + @Test + def void testCompletion_01() { + testCompletion [ + model = '' + expectedCompletionItems = ''' + With Class -> With Class [[0, 0] .. [0, 0]] + With Operation -> With Operation [[0, 0] .. [0, 0]] + ''' + ] + } +} diff --git a/app.hypermedia.testing.dsl.web/src/main/webapp/index.html b/app.hypermedia.testing.dsl.web/src/main/webapp/index.html index e5ed1ac..07a3586 100644 --- a/app.hypermedia.testing.dsl.web/src/main/webapp/index.html +++ b/app.hypermedia.testing.dsl.web/src/main/webapp/index.html @@ -14,7 +14,7 @@

Example Hypertest DSL Web Editor