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 extends IdeContentProposalProvider> 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 extends IdeContentProposalProvider> 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