Skip to content

Commit 5b7a635

Browse files
makepanicTurbo87
authored andcommitted
feat(Configuration): add support for ember test run configuration
1 parent 4f1ba18 commit 5b7a635

20 files changed

+911
-35
lines changed

doc/features.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,14 @@ A new `Ember Serve` run configuration can be created through
144144
To configure advanced settings like the server host, proxy or ssl, expand the
145145
`Advanced settings` panel.
146146

147+
### Running ember tests
148+
149+
This plugin also adds a `Ember Test` run configuration that will run your projects tests.
150+
A new `Ember Test` run configuration can be created through
151+
`Run → Edit Configurations...`.
152+
153+
To configure advanced settings like the server host, test filter or config file, expand the
154+
`Advanced settings` panel.
147155

148156
Live Templates
149157
-------------------------------------------------------------------------------

src/main/kotlin/com/emberjs/configuration/BooleanOptionsField.kt

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.emberjs.configuration
33
import com.emberjs.configuration.utils.ElementUtils
44
import org.jdom.Element
55
import javax.swing.JCheckBox
6-
import javax.swing.JComponent
76

87
class BooleanOptionsField(
98
default: Boolean,
@@ -12,23 +11,17 @@ class BooleanOptionsField(
1211
) : OptionsField<Boolean>(default, field, cmdlineOptionName) {
1312
override var value: Boolean = default
1413

15-
override fun writeToElement(element: Element) {
16-
ElementUtils.writeBool(element, this.field, this.value)
17-
}
18-
19-
override fun readFromElement(element: Element) {
20-
this.value = ElementUtils.readBool(element, this.field) ?: this.default
21-
}
22-
23-
override fun writeToComponent(component: JComponent) {
14+
override fun writeTo(component: Any) {
2415
when (component) {
2516
is JCheckBox -> component.isSelected = value
17+
is Element -> ElementUtils.writeBool(component, this.field, this.value)
2618
}
2719
}
2820

29-
override fun readFromComponent(component: JComponent) {
21+
override fun readFrom(component: Any) {
3022
when (component) {
3123
is JCheckBox -> value = component.isSelected
24+
is Element -> this.value = ElementUtils.readBool(component, this.field) ?: this.default
3225
}
3326
}
3427
}

src/main/kotlin/com/emberjs/configuration/EmberCommandLineState.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
package com.emberjs.configuration
22

33
import com.emberjs.cli.EmberCli
4+
import com.emberjs.utils.emberRoot
45
import com.intellij.execution.configurations.CommandLineState
56
import com.intellij.execution.process.KillableColoredProcessHandler
67
import com.intellij.execution.process.ProcessHandler
78
import com.intellij.execution.process.ProcessTerminatedListener
89
import com.intellij.execution.runners.ExecutionEnvironment
10+
import com.intellij.openapi.actionSystem.LangDataKeys
911

10-
class EmberCommandLineState(environment: ExecutionEnvironment) : CommandLineState(environment) {
12+
open class EmberCommandLineState(environment: ExecutionEnvironment) : CommandLineState(environment) {
1113
override fun startProcess(): ProcessHandler {
1214
val configuration = (environment.runProfile as EmberConfiguration)
1315
val argList = configuration.options.toCommandLineOptions()
1416

17+
val workingDirectory = environment.dataContext?.getData(LangDataKeys.MODULE)?.emberRoot?.path ?:
18+
environment.project.basePath
19+
1520
val cmd = EmberCli(environment.project, configuration.command, *argList)
16-
.apply { workDirectory = environment.project.basePath }
21+
.apply { workDirectory = workingDirectory }
1722
.commandLine()
1823
.apply {
1924
// taken from intellij-rust

src/main/kotlin/com/emberjs/configuration/OptionsField.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ abstract class OptionsField<T>(
99
val cmdlineOptionName: String
1010
) {
1111
abstract var value : T
12-
abstract fun writeToElement(element: Element)
13-
abstract fun readFromElement(element: Element)
1412

15-
abstract fun writeToComponent(component: JComponent)
16-
abstract fun readFromComponent(component: JComponent)
13+
abstract fun writeTo(component: Any)
14+
abstract fun readFrom(component: Any)
1715
}
Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package com.emberjs.configuration
22

33
import com.emberjs.configuration.utils.ElementUtils
4+
import com.emberjs.configuration.utils.PublicStringAddEditDeleteListPanel
45
import com.intellij.ui.EditorTextField
56
import org.jdom.Element
7+
import javax.swing.ButtonGroup
68
import javax.swing.JComboBox
7-
import javax.swing.JComponent
89

910
class StringOptionsField(
1011
default: String,
@@ -14,28 +15,33 @@ class StringOptionsField(
1415

1516
override var value: String = ""
1617

17-
override fun writeToElement(element: Element) {
18-
ElementUtils.writeString(element, this.field, this.value)
19-
}
20-
21-
override fun readFromElement(element: Element) {
22-
this.value = ElementUtils.readString(element, this.field) ?: this.default
23-
}
24-
25-
override fun writeToComponent(component: JComponent) {
18+
override fun writeTo(component: Any) {
2619
when (component) {
27-
is EditorTextField -> {
28-
component.text = value
29-
component.setPlaceholder(default)
20+
is Element -> ElementUtils.writeString(component, this.field, this.value)
21+
is EditorTextField -> component.apply {
22+
text = value
23+
setPlaceholder(default)
3024
}
3125
is JComboBox<*> -> component.selectedItem = if (value.isEmpty()) default else value
26+
is PublicStringAddEditDeleteListPanel -> component.replaceItems(value.split(",").filter { it.isNotEmpty() })
27+
is ButtonGroup -> {
28+
component.elements.toList()
29+
.find { it.actionCommand == value }
30+
?.let {
31+
it.isSelected = true
32+
component.setSelected(it.model, true)
33+
}
34+
}
3235
}
3336
}
3437

35-
override fun readFromComponent(component: JComponent) {
38+
override fun readFrom(component: Any) {
3639
when (component) {
40+
is Element -> value = ElementUtils.readString(component, this.field) ?: this.default
3741
is EditorTextField -> value = component.text
3842
is JComboBox<*> -> value = component.selectedItem.toString()
43+
is PublicStringAddEditDeleteListPanel -> value = component.listItems.joinToString(",")
44+
is ButtonGroup -> component.selection?.let { value = it.actionCommand }
3945
}
4046
}
4147
}

src/main/kotlin/com/emberjs/configuration/serve/EmberServeConfiguration.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ class EmberServeConfiguration(project: Project, factory: ConfigurationFactory, n
3636
override fun writeExternal(element: Element) {
3737
super.writeExternal(element)
3838
element.let {
39-
options.fields().forEach { optionsField -> optionsField.writeToElement(element)}
39+
options.fields().forEach { optionsField -> optionsField.writeTo(element)}
4040
}
4141
}
4242

4343
override fun readExternal(element: Element) {
4444
super.readExternal(element)
4545
element.let {
46-
options.fields().forEach { optionsField -> optionsField.readFromElement(element) }
46+
options.fields().forEach { optionsField -> optionsField.readFrom(element) }
4747
}
4848
}
4949
}

src/main/kotlin/com/emberjs/configuration/serve/ui/EmberServeSettingsEditor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,14 @@ class EmberServeSettingsEditor : SettingsEditor<EmberServeConfiguration>() {
5959

6060
override fun resetEditorFrom(serveConfiguration: EmberServeConfiguration) {
6161
mappings.forEach { (first, second) ->
62-
second.get(serveConfiguration.options).writeToComponent(first as JComponent)
62+
first?.let { second.get(serveConfiguration.options).writeTo(it) }
6363
}
6464
}
6565

6666
@Throws(ConfigurationException::class)
6767
override fun applyEditorTo(serveConfiguration: EmberServeConfiguration) {
6868
mappings.forEach { (first, second) ->
69-
second.get(serveConfiguration.options).readFromComponent(first as JComponent)
69+
first?.let { second.get(serveConfiguration.options).readFrom(it) }
7070
}
7171
}
7272

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.emberjs.configuration.test
2+
3+
import com.emberjs.configuration.EmberCommandLineState
4+
import com.emberjs.configuration.EmberConfiguration
5+
import com.intellij.execution.DefaultExecutionResult
6+
import com.intellij.execution.ExecutionResult
7+
import com.intellij.execution.Executor
8+
import com.intellij.execution.configurations.RunConfiguration
9+
import com.intellij.execution.process.ProcessHandler
10+
import com.intellij.execution.runners.ExecutionEnvironment
11+
import com.intellij.execution.runners.ProgramRunner
12+
import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil
13+
import com.intellij.execution.testframework.autotest.ToggleAutoTestAction
14+
import com.intellij.execution.testframework.sm.SMTestRunnerConnectionUtil.createAndAttachConsole
15+
16+
class EmberTestCommandLineState(environment: ExecutionEnvironment) : EmberCommandLineState(environment) {
17+
private val TEST_FRAMEWORK_NAME = "ember-qunit"
18+
19+
override fun execute(executor: Executor, runner: ProgramRunner<*>): ExecutionResult {
20+
val configuration = (environment.runProfile as EmberConfiguration)
21+
22+
// enforce teamcity reporter because converter requires it
23+
(configuration.options as EmberTestOptions).reporter.value = "teamcity"
24+
25+
val processHandler: ProcessHandler = startProcess()
26+
27+
val properties = EmberTestConsoleProperties(configuration as RunConfiguration, TEST_FRAMEWORK_NAME, executor)
28+
val console = createAndAttachConsole(TEST_FRAMEWORK_NAME, processHandler, properties)
29+
30+
SMTestRunnerConnectionUtil.createAndAttachConsole(TEST_FRAMEWORK_NAME, processHandler, properties)
31+
32+
val executionResult = DefaultExecutionResult(console, processHandler, *createActions(console, processHandler))
33+
executionResult.setRestartActions(ToggleAutoTestAction())
34+
return executionResult
35+
}
36+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.emberjs.configuration.test
2+
3+
import com.emberjs.configuration.EmberConfiguration
4+
import com.emberjs.configuration.test.ui.EmberTestSettingsEditor
5+
import com.intellij.execution.ExecutionException
6+
import com.intellij.execution.Executor
7+
import com.intellij.execution.configurations.*
8+
import com.intellij.execution.runners.ExecutionEnvironment
9+
import com.intellij.openapi.options.SettingsEditor
10+
import com.intellij.openapi.project.Project
11+
import org.jdom.Element
12+
import org.jetbrains.annotations.NotNull
13+
import org.jetbrains.annotations.Nullable
14+
15+
class EmberTestConfiguration(project: Project, factory: ConfigurationFactory, name: String) : RunConfigurationBase(project, factory, name), EmberConfiguration {
16+
override val options = EmberTestOptions()
17+
override val command: String = "test"
18+
19+
@NotNull
20+
override fun getConfigurationEditor(): SettingsEditor<out RunConfiguration> {
21+
return EmberTestSettingsEditor()
22+
}
23+
24+
@Throws(RuntimeConfigurationException::class)
25+
override fun checkConfiguration() {
26+
27+
}
28+
29+
@Nullable
30+
@Throws(ExecutionException::class)
31+
override fun getState(@NotNull executor: Executor, @NotNull executionEnvironment: ExecutionEnvironment): RunProfileState? {
32+
return EmberTestCommandLineState(executionEnvironment)
33+
}
34+
35+
override fun writeExternal(element: Element) {
36+
super.writeExternal(element)
37+
element.let {
38+
options.fields().forEach { optionsField -> optionsField.writeTo(element)}
39+
}
40+
}
41+
42+
override fun readExternal(element: Element) {
43+
super.readExternal(element)
44+
element.let {
45+
options.fields().forEach { optionsField -> optionsField.readFrom(element) }
46+
}
47+
}
48+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.emberjs.configuration.test
2+
3+
import com.intellij.execution.configurations.ConfigurationFactory
4+
import com.intellij.execution.configurations.ConfigurationType
5+
import com.intellij.execution.configurations.RunConfiguration
6+
import com.intellij.openapi.project.Project
7+
8+
class EmberTestConfigurationFactory(type: ConfigurationType) : ConfigurationFactory(type) {
9+
10+
override fun createTemplateConfiguration(project: Project): RunConfiguration {
11+
return EmberTestConfiguration(project, this, "Ember test")
12+
}
13+
14+
override fun getName(): String {
15+
return FACTORY_NAME;
16+
}
17+
18+
companion object {
19+
private val FACTORY_NAME = "Ember test configuration factory"
20+
}
21+
}

0 commit comments

Comments
 (0)