Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,12 @@ public static void closeIntro() {
public static void enableLogging() {
ScopedPreferenceStore prefs = new ScopedPreferenceStore(InstanceScope.INSTANCE, "org.eclipse.lsp4e");
prefs.putValue("org.eclipse.wildwebdeveloper.angular.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.astro.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.jsts.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.css.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.html.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.json.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.markdown.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.xml.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.yaml.file.logging.enabled", Boolean.toString(true));
prefs.putValue("org.eclipse.wildwebdeveloper.eslint.file.logging.enabled", Boolean.toString(true));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
/*******************************************************************************
* Copyright (c) 2025 Vegard IT GmbH and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sebastian Thomschke (Vegard IT GmbH) - initial implementation
*******************************************************************************/
package org.eclipse.wildwebdeveloper.tests;

import static org.eclipse.core.resources.IMarker.*;
import static org.eclipse.wildwebdeveloper.markdown.MarkdownDiagnosticsManager.MARKDOWN_MARKER_TYPE;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.lsp4e.LSPEclipseUtils;
import org.eclipse.lsp4e.LanguageServerWrapper;
import org.eclipse.lsp4e.LanguageServiceAccessor;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.tests.harness.util.DisplayHelper;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

record MarkdownTest(String markdown, String messagePattern, int severity) {
}

@ExtendWith(AllCleanRule.class)
class TestMarkdown {

@Test
void diagnosticsCoverTypicalMarkdownIssues() throws Exception {
var project = ResourcesPlugin.getWorkspace().getRoot().getProject(getClass().getName() + System.nanoTime());
project.create(null);
project.open(null);

final var markerTests = Collections.synchronizedCollection(new ArrayList<MarkdownTest>());
markerTests
.add(new MarkdownTest("Reference link to [an undefined reference][missing-ref]", "No link definition found: 'missing-ref'",
SEVERITY_WARNING));
markerTests.add(
new MarkdownTest("Relative file link: [data](./nonexistent-folder/data.csv)", "File does not exist at path: .*data\\.csv",
SEVERITY_WARNING));
markerTests.add(new MarkdownTest("Broken image: ![logo](../assets/logo.png)", "File does not exist at path: .*logo\\.png",
SEVERITY_WARNING));
markerTests.add(new MarkdownTest("Link to missing header in this file: [Jump to Setup](#setup)", "No header found: 'setup'",
SEVERITY_WARNING));
markerTests.add(new MarkdownTest("Link to missing header in another file: [See Guide](./GUIDE.md#installing)",
"Header does not exist in file: installing",
SEVERITY_WARNING));
markerTests.add(new MarkdownTest("Undefined footnote here [^missing-footnote]", "No link definition found: '\\^missing-footnote'",
SEVERITY_WARNING));
markerTests.add(new MarkdownTest("This is a paragraph with an [undefined link][undefined-link].",
"No link definition found: 'undefined-link'",
SEVERITY_WARNING));
markerTests.add(new MarkdownTest("[unused-link]: https://unused-link.com", "Link definition is unused",
SEVERITY_WARNING));
markerTests.add(new MarkdownTest("""
This is a paragraph with a [duplicate link][duplicate-link].
[duplicate-link]: https://duplicate-link.com
[duplicate-link]: https://duplicate-link.com
""", "Link definition for 'duplicate-link' already exists", SEVERITY_ERROR));

final IFile referencedFile = project.getFile("GUIDE.md");
referencedFile.create("".getBytes(), true, false, null);

final IFile file = project.getFile("broken.md");
file.create(markerTests.stream().map(MarkdownTest::markdown).collect(Collectors.joining("\n")).getBytes(StandardCharsets.UTF_8),
true,
false, null);

final var editor = (TextEditor) IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(), file);
final var display = editor.getSite().getShell().getDisplay();
final var doc = editor.getDocumentProvider().getDocument(editor.getEditorInput());

/*
* ensure Markdown Language Server is started and connected
*/
final var markdownLS = new AtomicReference<LanguageServerWrapper>();
DisplayHelper.waitForCondition(display, 10_000, () -> {
markdownLS.set(LanguageServiceAccessor.getStartedWrappers(doc, null, false).stream() //
.filter(w -> "org.eclipse.wildwebdeveloper.markdown".equals(w.serverDefinition.id)) //
.findFirst().orElse(null));
return markdownLS.get() != null //
&& markdownLS.get().isActive() //
&& markdownLS.get().isConnectedTo(LSPEclipseUtils.toUri(doc));
});

// Wait until all expected diagnostics are present (by message fragments)
DisplayHelper.waitForCondition(PlatformUI.getWorkbench().getDisplay(), 15_000, () -> {
try {
final var markers = file.findMarkers(MARKDOWN_MARKER_TYPE, true, IResource.DEPTH_ZERO);
if (markers.length == 0)
return false;

for (final IMarker m : markers) {
final Object msgObj = m.getAttribute(IMarker.MESSAGE);
if (!(msgObj instanceof final String msg))
continue;
markerTests.removeIf(t -> t.severity() == m.getAttribute(IMarker.SEVERITY, -1) &&
msg.matches(t.messagePattern()));
}
return markerTests.isEmpty();
} catch (CoreException e) {
return false;
}
});

assertTrue(markerTests.isEmpty(), "The following markers were not found: " + markerTests);
}
}
3 changes: 2 additions & 1 deletion org.eclipse.wildwebdeveloper/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,5 @@ Bundle-ActivationPolicy: lazy
Eclipse-BundleShape: dir
Export-Package: org.eclipse.wildwebdeveloper.debug;x-internal:=true,
org.eclipse.wildwebdeveloper.debug.node;x-internal:=true,
org.eclipse.wildwebdeveloper.debug.npm;x-internal:=true
org.eclipse.wildwebdeveloper.debug.npm;x-internal:=true,
org.eclipse.wildwebdeveloper.markdown;x-friends:="org.eclipse.wildwebdeveloper.tests"
12 changes: 8 additions & 4 deletions org.eclipse.wildwebdeveloper/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"dependencies": {
"@angular/language-server": "20.3.0",
"astro-vscode" : "2.16.0",
"astro-vscode": "2.16.0",
"firefox-debugadapter": "2.15.0",
"typescript": "5.9.3",
"typescript-language-server": "5.0.1",
Expand All @@ -11,14 +11,18 @@
"vscode-css-languageservice": "6.3.8",
"vscode-html-languageservice": "5.6.0",
"vscode-json-languageservice": "5.6.2",
"@vue/language-server" : "3.1.2",
"@vue/typescript-plugin" : "3.1.2",
"fsevents" : "2.3.3",
"vscode-markdown-languageserver": "^0.5.0-alpha.12",
"markdown-it": "14.1.0",
"@vue/language-server": "3.1.2",
"@vue/typescript-plugin": "3.1.2",
"vscode-css-languageserver": "file:target/vscode-css-languageserver-1.0.0.tgz",
"vscode-html-languageserver": "file:target/vscode-html-languageserver-1.0.0.tgz",
"vscode-json-languageserver": "file:target/vscode-json-languageserver-1.3.4.tgz",
"eslint-server": "file:target/eslint-server-2.4.1.tgz"
},
"optionalDependencies": {
"fsevents": "2.3.3"
},
"overrides": {
"vscode-languageserver-types": "3.17.6-next.6"
}
Expand Down
7 changes: 6 additions & 1 deletion org.eclipse.wildwebdeveloper/plugin.properties
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ TypeScriptInlayHintPreferencePage.name=Inlay Hint
JavaScriptPreferencePage.name=JavaScript
JavaScriptInlayHintPreferencePage.name=Inlay Hint

# Markdown
MarkdownPreferencePage.name=Markdown (Wild Web Developer)
MarkdownProblem=Markdown Problem

# YAML
YAMLPreferencePage.name=YAML (Wild Web Developer)
YAMLCompletionPreferencePage.name=Completion
Expand All @@ -62,4 +66,5 @@ preferenceKeywords.css=css
preferenceKeywords.less=less
preferenceKeywords.scss=scss
preferenceKeywords.sass=sass
preferenceKeywords.html=html
preferenceKeywords.html=html
preferenceKeywords.markdown=markdown
67 changes: 49 additions & 18 deletions org.eclipse.wildwebdeveloper/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@
priority="low">
</content-type>
</extension>

<extension
point="org.eclipse.lsp4e.languageServer">
<server
Expand All @@ -131,8 +131,39 @@
</contentTypeMapping>
</extension>

<!-- Markdown Language -->
<extension point="org.eclipse.lsp4e.languageServer">
<server id="org.eclipse.wildwebdeveloper.markdown"
class="org.eclipse.wildwebdeveloper.markdown.MarkdownLanguageServer"
clientImpl="org.eclipse.wildwebdeveloper.markdown.MarkdownLanguageClient"
serverInterface="org.eclipse.wildwebdeveloper.markdown.MarkdownLanguageServerAPI"
label="Markdown Language Server" />
<contentTypeMapping
contentType="org.eclipse.tm4e.language_pack.markdown"
id="org.eclipse.wildwebdeveloper.markdown"
languageId="markdown" />
</extension>

<extension point="org.eclipse.ui.preferencePages">
<page id="org.eclipse.wildwebdeveloper.markdown.ui.preferences.MarkdownPreferencePage"
class="org.eclipse.wildwebdeveloper.markdown.ui.preferences.MarkdownPreferencePage"
name="%MarkdownPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.markdown" />
</page>
</extension>
<extension point="org.eclipse.core.runtime.preferences"
id="MarkdownPreferenceInitializer"
name="MarkdownPreferenceInitializer">
<initializer class="org.eclipse.wildwebdeveloper.markdown.ui.preferences.MarkdownPreferenceInitializer" />
</extension>

<extension id="org.eclipse.wildwebdeveloper.markdown.problem" name="%MarkdownProblem" point="org.eclipse.core.resources.markers">
<!-- Markdown problem marker type -->
<super type="org.eclipse.core.resources.problemmarker"/>
<persistent value="true"/>
</extension>

<!-- CSS Language -->

<extension
point="org.eclipse.lsp4e.languageServer">
<server
Expand All @@ -158,7 +189,7 @@
languageId="less">
</contentTypeMapping>
</extension>

<extension point="org.eclipse.ui.genericeditor.icons">
<icon contentType="org.eclipse.tm4e.language_pack.css" icon="icons/cssEditorIcon.png"/>
</extension>
Expand All @@ -178,7 +209,7 @@
name="%CSSCompletionPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.css" />
</page>
<!-- Once https://github.com/microsoft/vscode/issues/164772 will be fixed, please uncomment this CSS format preference page to benefit with CSS formatting
<!-- Once https://github.com/microsoft/vscode/issues/164772 will be fixed, please uncomment this CSS format preference page to benefit with CSS formatting
<page
category="org.eclipse.wildwebdeveloper.css.ui.preferences.CSSPreferencePage"
class="org.eclipse.wildwebdeveloper.css.ui.preferences.CSSFormatPreferencePage"
Expand All @@ -192,7 +223,7 @@
id="org.eclipse.wildwebdeveloper.css.ui.preferences.CSSHoverPreferencePage"
name="%CSSHoverPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.css" />
</page>
</page>
<page
category="org.eclipse.wildwebdeveloper.css.ui.preferences.CSSPreferencePage"
class="org.eclipse.wildwebdeveloper.css.ui.preferences.CSSValidationPreferencePage"
Expand All @@ -218,7 +249,7 @@
name="%LESSCompletionPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.less" />
</page>
<!-- Once https://github.com/microsoft/vscode/issues/164772 will be fixed, please uncomment this LESS format preference page to benefit with LESS formatting
<!-- Once https://github.com/microsoft/vscode/issues/164772 will be fixed, please uncomment this LESS format preference page to benefit with LESS formatting
<page
category="org.eclipse.wildwebdeveloper.css.ui.preferences.less.LESSPreferencePage"
class="org.eclipse.wildwebdeveloper.css.ui.preferences.less.LESSFormatPreferencePage"
Expand All @@ -232,7 +263,7 @@
id="org.eclipse.wildwebdeveloper.css.ui.preferences.less.LESSHoverPreferencePage"
name="%LESSHoverPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.less" />
</page>
</page>
<page
category="org.eclipse.wildwebdeveloper.css.ui.preferences.less.LESSPreferencePage"
class="org.eclipse.wildwebdeveloper.css.ui.preferences.less.LESSValidationPreferencePage"
Expand Down Expand Up @@ -260,7 +291,7 @@
<keywordReference id="org.eclipse.wildwebdeveloper.scss" />
<keywordReference id="org.eclipse.wildwebdeveloper.sass" />
</page>
<!-- Once https://github.com/microsoft/vscode/issues/164772 will be fixed, please uncomment this SCSS format preference page to benefit with SCSS formatting
<!-- Once https://github.com/microsoft/vscode/issues/164772 will be fixed, please uncomment this SCSS format preference page to benefit with SCSS formatting
<page
category="org.eclipse.wildwebdeveloper.css.ui.preferences.scss.SCSSPreferencePage"
class="org.eclipse.wildwebdeveloper.css.ui.preferences.scss.SCSSFormatPreferencePage"
Expand All @@ -275,7 +306,7 @@
name="%SCSSHoverPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.scss" />
<keywordReference id="org.eclipse.wildwebdeveloper.sass" />
</page>
</page>
<page
category="org.eclipse.wildwebdeveloper.css.ui.preferences.scss.SCSSPreferencePage"
class="org.eclipse.wildwebdeveloper.css.ui.preferences.scss.SCSSValidationPreferencePage"
Expand All @@ -295,7 +326,7 @@
</initializer>
</extension>

<!-- HTML Language -->
<!-- HTML Language -->
<extension
point="org.eclipse.lsp4e.languageServer">
<server
Expand Down Expand Up @@ -352,7 +383,7 @@
id="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLHoverPreferencePage"
name="%HTMLHoverPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.html" />
</page>
</page>
<page
category="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLPreferencePage"
class="org.eclipse.wildwebdeveloper.html.ui.preferences.HTMLValidationPreferencePage"
Expand All @@ -371,7 +402,7 @@
</initializer>
</extension>

<!-- JavaScript/TypeScript Language -->
<!-- JavaScript/TypeScript Language -->
<extension
point="org.eclipse.lsp4e.languageServer">
<server
Expand Down Expand Up @@ -428,7 +459,7 @@
contentType="org.eclipse.tm4e.language_pack.typescriptreact"
id="org.eclipse.wildwebdeveloper.eslint"/>
</extension>

<extension point="org.eclipse.ui.genericeditor.icons">
<icon contentType="org.eclipse.tm4e.language_pack.javascript" icon="icons/jsEditorIcon.png"/>
<icon contentType="org.eclipse.tm4e.language_pack.javascriptreact" icon="icons/jsEditorIcon.png"/>
Expand Down Expand Up @@ -490,7 +521,7 @@
name="%JavaScriptInlayHintPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.js" />
<keywordReference id="org.eclipse.wildwebdeveloper.javascript" />
</page>
</page>
<!-- TypeScript -->
<page
category="org.eclipse.wildwebdeveloper.jsts.ui.preferences.JSTSPreferencePage"
Expand Down Expand Up @@ -572,6 +603,7 @@
label="VUE Language Server"/>
<contentTypeMapping contentType="org.eclipse.wildwebdeveloper.vue" languageId="vue" id="org.eclipse.wildwebdeveloper.vue"/>
</extension>

<extension point="org.eclipse.tm4e.registry.grammars">
<grammar path="grammars/vue/vue.tmLanguage.json" scopeName="source.vue" />
<scopeNameContentTypeBinding contentTypeId="org.eclipse.wildwebdeveloper.vue" scopeName="source.vue" />
Expand Down Expand Up @@ -604,9 +636,8 @@
contentTypeId="org.eclipse.wildwebdeveloper.vue"
path="language-configurations/vue/vue-language-configuration.json">
</languageConfiguration>

</extension>

<extension
point="org.eclipse.ui.genericeditor.reconcilers">
<reconciler
Expand All @@ -615,7 +646,7 @@
</reconciler>
</extension>

<!-- YAML Language -->
<!-- YAML Language -->
<extension
point="org.eclipse.lsp4e.languageServer">
<server
Expand Down Expand Up @@ -663,7 +694,7 @@
id="org.eclipse.wildwebdeveloper.yaml.ui.preferences.YAMLHoverPreferencePage"
name="%YAMLHoverPreferencePage.name">
<keywordReference id="org.eclipse.wildwebdeveloper.yaml" />
</page>
</page>
<page
category="org.eclipse.wildwebdeveloper.yaml.ui.preferences.YAMLPreferencePage"
class="org.eclipse.wildwebdeveloper.yaml.ui.preferences.YAMLValidationPreferencePage"
Expand Down
Loading