diff --git a/README.md b/README.md index b17fa12..ee41050 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,10 @@ You need a JetBrains IDE based on the IntelliJ Platform (for example, IntelliJ I ### Development Dependencies To build and test from source, use the project’s configured Gradle wrapper and a compatible JDK. +## Icon Assets + +The plugin logo asset `src/main/resources/META-INF/pluginIcon.svg` and the run-configuration icon asset `src/main/resources/icons/openfasttrace.svg` are derived from the OpenFastTrace logo artwork in this repository and use the same Apache 2.0 license as the project. + ## Development To understand product intent and implementation scope, start with: * [System Requirements](doc/system_requirements.md) diff --git a/build.gradle.kts b/build.gradle.kts index 694606c..1aacb0e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -138,6 +138,7 @@ tasks { options.encoding = "UTF-8" } + // [bld->dsn~packaged-plugin-logo-assets~1] named("buildPlugin") { archiveBaseName.set("OpenFastTrace") } diff --git a/doc/changes/changes_0.8.0.md b/doc/changes/changes_0.8.0.md index fcd76d3..b3d7cd9 100644 --- a/doc/changes/changes_0.8.0.md +++ b/doc/changes/changes_0.8.0.md @@ -14,9 +14,12 @@ This gives you a faster trace review workflow: The global `Tools | OpenFastTrace | Trace Project` action and new or previously unconfigured run configurations use the Test Runner UI. Run configurations can still opt into the existing plain text output when you want the raw OpenFastTrace report. +The plugin distribution also contains JetBrains-compliant OpenFastTrace icon assets so the plugin can be identified in JetBrains plugin surfaces, and OpenFastTrace run configurations now use a dedicated OpenFastTrace icon instead of the generic execute icon. + ## Features #40: Integrate OFT Trace into Test Runner UI +#52: Add JetBrains Marketplace plugin icon assets ## Documentation diff --git a/doc/changesets/52-add-jetbrains-marketplace-plugin-icon-assets.md b/doc/changesets/52-add-jetbrains-marketplace-plugin-icon-assets.md new file mode 100644 index 0000000..019d73e --- /dev/null +++ b/doc/changesets/52-add-jetbrains-marketplace-plugin-icon-assets.md @@ -0,0 +1,146 @@ +# GH-52 Add JetBrains Marketplace plugin icon assets + +## Goal + +Add JetBrains-compliant OpenFastTrace plugin icon assets and use a scaled +OpenFastTrace icon for IDE run configurations, so users can recognize the +plugin in JetBrains Plugin Manager, JetBrains Marketplace, and the run/debug +configuration UI. + +## Scope + +In scope: + +* Validate or rework the existing `src/main/resources/META-INF/pluginIcon.svg` + so it satisfies JetBrains plugin logo expectations for SVG format, 40x40 + display, transparent padding, recognizability, and light-background use. +* Add `src/main/resources/META-INF/pluginIcon_dark.svg` only if the default icon + is not sufficiently visible on dark backgrounds. +* Add a scaled OpenFastTrace icon resource for the `OpenFastTrace` run + configuration type and replace the current generic execute icon. Remove the + two white pointy brackets on the left side of the SVG before scaling to make + the image fit better to the small size. +* Document icon source, derivation, and usage rights when the assets derive from + existing OpenFastTrace branding. +* Prove that `buildPlugin` packages the icon assets under `META-INF` in the + plugin distribution. + +Out of scope: + +* Rebranding OpenFastTrace. +* Creating unrelated UI icons. +* Changing OpenFastTrace tracing behavior, run-configuration execution + behavior, filters, or result views. +* Publishing the plugin to JetBrains Marketplace. +* Adding a JetBrains Marketplace badge or Marketplace link before the plugin has + a stable public Marketplace page. + +## Design References + +* [System Requirements](../system_requirements.md) +* [Deployment View](../design/deployment_view.md) +* [Building Block View](../design/building_block_view.md) +* [Runtime View](../design/runtime_view.md) +* [Quality Requirements](../design/quality_requirements.md) +* [GH-37 Introduce Run Configurations](37-introduce-run-configurations.md) +* [JetBrains Plugin Logo Documentation](https://plugins.jetbrains.com/docs/intellij/plugin-icon-file.html) + +## Strategy + +Treat this as a user-visible presentation and packaging change, not a tracing +behavior change. Add requirements and scenarios for plugin identity assets and +the OpenFastTrace run-configuration icon before changing resources or Java code. + +The current `main` branch already contains +`src/main/resources/META-INF/pluginIcon.svg`, although GH-52 originally +describes that file as missing. The implementation should therefore validate and +revise the existing asset as needed instead of adding a duplicate. Follow the +JetBrains naming convention for the plugin logo files in `META-INF`, and use a +plugin-owned SVG loaded through IntelliJ icon infrastructure for the smaller +run-configuration icon. + +## Task List + +- [x] Create and checkout a new Git branch `feat/52-add-jetbrains-marketplace-plugin-icon-assets` + +### Requirements And Design + +- [x] Update `doc/system_requirements.md` with user-visible requirement and + scenario coverage for JetBrains plugin logo assets in plugin management + surfaces and for the OpenFastTrace run-configuration icon +- [x] Stop and ask user for a review of the system requirements +- [x] Update `doc/design/deployment_view.md` with the packaged plugin-logo + resource location, the default/dark icon decision, and the expectation + that the files end up in the plugin main JAR under `META-INF` +- [x] Update `doc/design/building_block_view.md` so the trace-configuration or + plugin-presentation building block owns the run-configuration icon + resource +- [x] Update `doc/design/runtime_view.md` with a focused design item for the + run-configuration type loading the plugin-owned icon resource +- [x] Keep runtime design coverage to one scenario per `dsn` item, or use OFT + forwarding where a layer adds no new information +- [x] Stop and ask user for a review of the design + +### Implementation + +- [x] Validate the existing `src/main/resources/META-INF/pluginIcon.svg` against + the JetBrains SVG, 40x40 sizing, transparent padding, visual-weight, and + light/dark visibility expectations +- [x] Rework or replace `pluginIcon.svg` if validation shows it is not + recognizable at 40x40 and 80x80 display sizes or lacks appropriate + transparent padding +- [x] Add `src/main/resources/META-INF/pluginIcon_dark.svg` only if the default + icon does not remain visible on dark backgrounds +- [x] Add a small IDE icon resource, for example + `src/main/resources/icons/openfasttrace.svg`, derived from the approved + plugin logo and optimized for run-configuration display +- [x] Add an icon holder class that loads the run-configuration icon through the + IntelliJ icon API +- [x] Replace `AllIcons.Actions.Execute` in + `OftRunConfigurationType` with the OpenFastTrace icon +- [x] Add or update OFT build and implementation coverage tags for the new design items +- [x] Avoid adding third-party runtime or build dependencies + +### Verification + +- [x] Add automated resource tests that load `META-INF/pluginIcon.svg` and, + when present, `META-INF/pluginIcon_dark.svg` from the plugin classpath and + assert that the SVG metadata matches the required 40x40 logo size +- [x] Add an automated run-configuration test proving the `OpenFastTrace` + configuration type supplies the plugin-owned icon instead of the generic + execute icon +- [x] Visually verify the plugin logo at 40x40 and 80x80 on light and dark + backgrounds +- [x] Run `./gradlew test` +- [x] Run `./gradlew traceRequirements` +- [x] Run `./gradlew check buildPlugin` +- [x] Inspect the built plugin distribution and its plugin main JAR to confirm + `META-INF/pluginIcon.svg`, optional `META-INF/pluginIcon_dark.svg`, and + the run-configuration icon resource are packaged +- [x] Run `./gradlew verifyPlugin` +- [x] Keep path coverage at or above the documented 80 percent threshold +- [x] Keep the OpenFastTrace trace clean for `feat`, `req`, `scn`, `dsn`, + `impl`, `utest`, `itest`, and build artifact types in scope +- [x] Keep the dependency policy unchanged +- [ ] Keep the SonarQube Cloud quality gate green after CI analysis + +### Update User Documentation + +- [x] Document the icon source, derivation, and usage rights in `README.md` or a + dedicated repository documentation section +- [x] Refresh user-guide or demo screenshots only if they visibly show the old + generic run-configuration icon and would otherwise become misleading + +## Version and Changelog Update + +- [x] Check if the current version mentioned in the build scripts and code + parameters is the same as the latest GitHub release. As of 2026-06-09, + `gradle.properties` contains `0.8.0` and the latest GitHub release is + `0.7.0`. +- [x] Keep the project version at `0.8.0` if that version is still unreleased + when GH-52 is implemented; otherwise raise the version to `0.9.0` because + this is a feature-level presentation enhancement +- [x] Write the changelog entry for the version that receives GH-52 +- [x] Update the release date to the actual release date +- [x] Ensure that the issue list contains `#52: Add JetBrains Marketplace plugin + icon assets` diff --git a/doc/design/building_block_view.md b/doc/design/building_block_view.md index b2d2ad4..bd7aabe 100644 --- a/doc/design/building_block_view.md +++ b/doc/design/building_block_view.md @@ -217,15 +217,26 @@ Covers: Needs: impl +### Plugin Distribution Resources +`dsn~packaged-plugin-logo-assets~1` + +The plugin distribution resources include JetBrains plugin logo SVG assets in the plugin main JAR under `META-INF`. The default logo resource is `META-INF/pluginIcon.svg`; if the default logo is not sufficiently visible on dark backgrounds, the distribution also includes `META-INF/pluginIcon_dark.svg`. The logo assets use a 40x40 SVG size, keep transparent padding around the visible OpenFastTrace branding, and remain recognizable at JetBrains Plugin Manager and Marketplace display sizes. + +Covers: +- `scn~show-plugin-logo-in-jetbrains-plugin-surfaces~1` + +Needs: bld, itest + ### Trace Configuration Integration `dsn~trace-configuration-integration~1` -The plugin provides a trace-configuration component that stores OpenFastTrace trace-scope settings per IntelliJ project and through dedicated run configurations. It exposes those settings through project configuration UI and the run configuration editor, resolves the selected-resource options and filters into a normalized OpenFastTrace input set and filter criteria, stores the run-configuration result-view selection, and treats the IntelliJ Test Runner UI as the result-view default when no selection is stored. +The plugin provides a trace-configuration component that stores OpenFastTrace trace-scope settings per IntelliJ project and through dedicated run configurations. It exposes those settings through project configuration UI and the run configuration editor, resolves the selected-resource options and filters into a normalized OpenFastTrace input set and filter criteria, stores the run-configuration result-view selection, treats the IntelliJ Test Runner UI as the result-view default when no selection is stored, and owns the plugin resource used as the OpenFastTrace run-configuration icon. Covers: - `scn~test-runner-as-default-run-configuration-result-view~1` - `scn~select-plain-text-trace-result-view~1` - `scn~select-test-runner-trace-result-view~1` +- `scn~show-openfasttrace-icon-for-run-configurations~1` Needs: impl, itest diff --git a/doc/design/deployment_view.md b/doc/design/deployment_view.md index bb677f2..fa74d41 100644 --- a/doc/design/deployment_view.md +++ b/doc/design/deployment_view.md @@ -38,3 +38,7 @@ Plugin --> Project : reads specification documents\nand coverage tag files The deployment model stays intentionally simple. All plugin logic runs locally in the host IDE, uses the IDE-provided caches and state stores, and works on files inside the active project. Network access is not part of the normal processing path. In the MVP, network access is only used when the user opens the OpenFastTrace user guide from GitHub. + +## Packaged Plugin Resources + +The plugin distribution includes JetBrains plugin logo SVG assets in the plugin main JAR under `META-INF`. The default logo resource is `META-INF/pluginIcon.svg`; if the default logo is not sufficiently visible on dark backgrounds, the distribution also includes `META-INF/pluginIcon_dark.svg`. diff --git a/doc/design/runtime_view.md b/doc/design/runtime_view.md index 0c46913..3e2321e 100644 --- a/doc/design/runtime_view.md +++ b/doc/design/runtime_view.md @@ -495,6 +495,18 @@ Covers: Needs: impl, itest +### OpenFastTrace Run Configuration Icon +`dsn~openfasttrace-run-configuration-icon~1` + +**Given** the IDE renders the `OpenFastTrace` run configuration type in the run/debug UI +**When** the IntelliJ Run Configuration API requests the configuration type icon +**Then** the plugin returns an OpenFastTrace-specific icon loaded from a plugin-owned SVG resource instead of the generic execute icon. + +Covers: +- `scn~show-openfasttrace-icon-for-run-configurations~1` + +Needs: impl, itest + ### Filter Trace by Artifact Types and Tags `dsn~filter-trace-by-artifact-types-and-tags~1` diff --git a/doc/system_requirements.md b/doc/system_requirements.md index f0edfcc..bac51ca 100644 --- a/doc/system_requirements.md +++ b/doc/system_requirements.md @@ -505,6 +505,35 @@ Covers: Needs: scn +### Plugin Distribution + +The following requirements refine how the plugin distribution appears in JetBrains plugin management surfaces. + +### Plugin Logo for JetBrains Plugin Surfaces +`req~plugin-logo-for-jetbrains-plugin-surfaces~1` + +The plugin distribution includes JetBrains-compliant OpenFastTrace plugin logo assets that IntelliJ Platform IDEs and JetBrains Marketplace can display for the plugin. Users can recognize the plugin in plugin-management surfaces. + +Rationale: + +JetBrains plugin surfaces use packaged plugin logo resources to distinguish plugins in lists and detail views. Providing suitable OpenFastTrace logo assets improves recognition without changing plugin behavior. + +Needs: scn + +### Run Configuration Presentation + +The following requirements refine how OpenFastTrace run configurations appear in the IDE run/debug UI. + +### OpenFastTrace Run Configuration Icon +`req~openfasttrace-run-configuration-icon~1` + +The plugin shows an OpenFastTrace-specific icon for the `OpenFastTrace` run configuration type. Users can distinguish OpenFastTrace trace configurations from generic run actions in the run/debug UI. + +Covers: +- `feat~oft-run-configurations~1` + +Needs: scn + ### Show Trace Source Files as Test Runner Suites `req~show-trace-source-files-as-test-runner-suites~1` @@ -1397,6 +1426,30 @@ Covers: Needs: dsn +### Show Plugin Logo in JetBrains Plugin Surfaces +`scn~show-plugin-logo-in-jetbrains-plugin-surfaces~1` + +**Given** a user installs the OpenFastTrace plugin distribution in an IntelliJ Platform IDE +**When** the IDE displays the plugin in `Settings | Plugins`, or JetBrains Marketplace displays the plugin after publication +**Then** the surface can load an OpenFastTrace plugin logo from packaged `META-INF` SVG assets that are designed for JetBrains plugin-logo sizes and light/dark backgrounds + +Covers: +- `req~plugin-logo-for-jetbrains-plugin-surfaces~1` + +Needs: dsn + +### Show OpenFastTrace Icon for Run Configurations +`scn~show-openfasttrace-icon-for-run-configurations~1` + +**Given** an IntelliJ project is open +**When** a user creates or views an `OpenFastTrace` run configuration in the run/debug UI +**Then** the IDE shows an OpenFastTrace-specific icon for that configuration type instead of the generic execute icon + +Covers: +- `req~openfasttrace-run-configuration-icon~1` + +Needs: dsn + ### Show Trace Source Files as Test Runner Suites `scn~show-trace-source-files-as-test-runner-suites~1` diff --git a/doc/user_guide/images/run-configurations.png b/doc/user_guide/images/run-configurations.png index 0cf2a91..4497cbe 100644 Binary files a/doc/user_guide/images/run-configurations.png and b/doc/user_guide/images/run-configurations.png differ diff --git a/src/main/java/org/itsallcode/openfasttrace/intellijplugin/OftIcons.java b/src/main/java/org/itsallcode/openfasttrace/intellijplugin/OftIcons.java new file mode 100644 index 0000000..b05347c --- /dev/null +++ b/src/main/java/org/itsallcode/openfasttrace/intellijplugin/OftIcons.java @@ -0,0 +1,24 @@ +package org.itsallcode.openfasttrace.intellijplugin; + +import com.intellij.openapi.util.IconLoader; + +import javax.swing.Icon; + +/** + * Shared constants for OpenFastTrace plugin icon resources. + */ +public final class OftIcons { + public static final String PLUGIN_ICON_RESOURCE_PATH = "META-INF/pluginIcon.svg"; + public static final String PLUGIN_DARK_ICON_RESOURCE_PATH = "META-INF/pluginIcon_dark.svg"; + public static final String RUN_CONFIGURATION_ICON_RESOURCE_PATH = "icons/openfasttrace.svg"; + + // [impl->dsn~openfasttrace-run-configuration-icon~1] + public static final Icon OPEN_FAST_TRACE = IconLoader.getIcon( + "/" + RUN_CONFIGURATION_ICON_RESOURCE_PATH, + OftIcons.class + ); + + private OftIcons() { + // Utility class. + } +} diff --git a/src/main/java/org/itsallcode/openfasttrace/intellijplugin/trace/runconfig/OftRunConfigurationType.java b/src/main/java/org/itsallcode/openfasttrace/intellijplugin/trace/runconfig/OftRunConfigurationType.java index a00c1a4..40bc1d1 100644 --- a/src/main/java/org/itsallcode/openfasttrace/intellijplugin/trace/runconfig/OftRunConfigurationType.java +++ b/src/main/java/org/itsallcode/openfasttrace/intellijplugin/trace/runconfig/OftRunConfigurationType.java @@ -1,8 +1,8 @@ package org.itsallcode.openfasttrace.intellijplugin.trace.runconfig; import com.intellij.execution.configurations.ConfigurationTypeBase; -import com.intellij.icons.AllIcons; import com.intellij.openapi.util.NotNullLazyValue; +import org.itsallcode.openfasttrace.intellijplugin.OftIcons; // [impl->dsn~openfasttrace-run-configuration~1] public final class OftRunConfigurationType extends ConfigurationTypeBase { @@ -10,7 +10,7 @@ public final class OftRunConfigurationType extends ConfigurationTypeBase { public OftRunConfigurationType() { super(ID, "OpenFastTrace", "OpenFastTrace run configuration", - NotNullLazyValue.createValue(() -> AllIcons.Actions.Execute)); + NotNullLazyValue.createValue(() -> OftIcons.OPEN_FAST_TRACE)); addFactory(new OftRunConfigurationFactory(this)); } } diff --git a/src/main/resources/META-INF/pluginIcon.svg b/src/main/resources/META-INF/pluginIcon.svg index c4cccfc..ccfd401 100644 --- a/src/main/resources/META-INF/pluginIcon.svg +++ b/src/main/resources/META-INF/pluginIcon.svg @@ -1,51 +1,54 @@ - - - - - - - + + OpenFastTrace plugin icon + + + + + + + + diff --git a/src/main/resources/icons/openfasttrace.svg b/src/main/resources/icons/openfasttrace.svg new file mode 100644 index 0000000..23d29d6 --- /dev/null +++ b/src/main/resources/icons/openfasttrace.svg @@ -0,0 +1,14 @@ + + + + diff --git a/src/test/java/org/itsallcode/openfasttrace/intellijplugin/OftIconResourcesTest.java b/src/test/java/org/itsallcode/openfasttrace/intellijplugin/OftIconResourcesTest.java new file mode 100644 index 0000000..aaf1094 --- /dev/null +++ b/src/test/java/org/itsallcode/openfasttrace/intellijplugin/OftIconResourcesTest.java @@ -0,0 +1,85 @@ +package org.itsallcode.openfasttrace.intellijplugin; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.InputStream; +import java.net.URL; +import java.util.stream.Stream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; + +class OftIconResourcesTest { + // [itest->dsn~packaged-plugin-logo-assets~1] + // [itest->dsn~openfasttrace-run-configuration-icon~1] + @ParameterizedTest + @MethodSource("requiredSvgResources") + void givenRequiredIconResourceWhenLoadingFromClasspathThenSvgHasExpectedSize( + final String resourcePath, + final String expectedSize + ) throws Exception { + final Element svg = loadSvg(resourcePath); + + assertSvgSize(svg, expectedSize); + } + + // [itest->dsn~packaged-plugin-logo-assets~1] + @Test + void givenOptionalDarkPluginIconWhenLoadingFromClasspathThenItIsAbsentOrHasExpectedSize() throws Exception { + final URL darkIcon = resource(OftIcons.PLUGIN_DARK_ICON_RESOURCE_PATH); + + if (darkIcon == null) { + assertThat(darkIcon, nullValue()); + } else { + assertSvgSize(loadSvg(OftIcons.PLUGIN_DARK_ICON_RESOURCE_PATH), "40"); + } + } + + private static Stream requiredSvgResources() { + return Stream.of( + Arguments.of(OftIcons.PLUGIN_ICON_RESOURCE_PATH, "40"), + Arguments.of(OftIcons.RUN_CONFIGURATION_ICON_RESOURCE_PATH, "16") + ); + } + + private static Element loadSvg(final String resourcePath) throws Exception { + final URL resource = resource(resourcePath); + assertThat(resource, notNullValue()); + try (InputStream input = resource.openStream()) { + final Document document = documentBuilderFactory().newDocumentBuilder().parse(input); + return document.getDocumentElement(); + } + } + + private static URL resource(final String resourcePath) { + return OftIconResourcesTest.class.getClassLoader().getResource(resourcePath); + } + + private static DocumentBuilderFactory documentBuilderFactory() throws Exception { + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); + factory.setFeature("http://xml.org/sax/features/external-general-entities", false); + factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false); + factory.setNamespaceAware(true); + factory.setExpandEntityReferences(false); + return factory; + } + + private static void assertSvgSize(final Element svg, final String expectedSize) { + Assertions.assertAll( + () -> assertThat(svg.getTagName(), is("svg")), + () -> assertThat(svg.getAttribute("width"), is(expectedSize)), + () -> assertThat(svg.getAttribute("height"), is(expectedSize)), + () -> assertThat(svg.getAttribute("viewBox"), is("0 0 " + expectedSize + " " + expectedSize)) + ); + } +} diff --git a/src/test/java/org/itsallcode/openfasttrace/intellijplugin/trace/runconfig/OftRunConfigurationTest.java b/src/test/java/org/itsallcode/openfasttrace/intellijplugin/trace/runconfig/OftRunConfigurationTest.java index 0fd9fc2..3004afe 100644 --- a/src/test/java/org/itsallcode/openfasttrace/intellijplugin/trace/runconfig/OftRunConfigurationTest.java +++ b/src/test/java/org/itsallcode/openfasttrace/intellijplugin/trace/runconfig/OftRunConfigurationTest.java @@ -1,8 +1,10 @@ package org.itsallcode.openfasttrace.intellijplugin.trace.runconfig; +import com.intellij.icons.AllIcons; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import org.itsallcode.openfasttrace.intellijplugin.AbstractOftPlatformTestCase; +import org.itsallcode.openfasttrace.intellijplugin.OftIcons; import org.itsallcode.openfasttrace.intellijplugin.trace.OftTraceResultView; import org.itsallcode.openfasttrace.intellijplugin.trace.OftTraceScopeMode; import org.itsallcode.openfasttrace.intellijplugin.trace.OftTraceSettingsSnapshot; @@ -11,6 +13,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.sameInstance; // [itest->dsn~openfasttrace-run-configuration~1] public class OftRunConfigurationTest extends AbstractOftPlatformTestCase { @@ -110,6 +114,16 @@ public void testGivenRunConfigurationWithInvalidStoredResultViewWhenReadingExter assertThat(configuration.snapshot().resultView(), is(OftTraceResultView.TEST_RUNNER)); } + // [itest->dsn~openfasttrace-run-configuration-icon~1] + public void testGivenRunConfigurationTypeWhenReadingIconThenItUsesTheOpenFastTraceIcon() { + final OftRunConfigurationType type = new OftRunConfigurationType(); + + Assertions.assertAll( + () -> assertThat(type.getIcon(), sameInstance(OftIcons.OPEN_FAST_TRACE)), + () -> assertThat(type.getIcon(), is(not(sameInstance(AllIcons.Actions.Execute)))) + ); + } + private OftRunConfiguration createConfiguration(final String name) { final OftRunConfigurationType type = new OftRunConfigurationType(); final OftRunConfigurationFactory factory = (OftRunConfigurationFactory) type.getConfigurationFactories()[0];