Skip to content

Commit

Permalink
feat: markers
Browse files Browse the repository at this point in the history
  • Loading branch information
alkoleft committed Dec 20, 2024
1 parent 49ad347 commit bdcaff1
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 19 deletions.
32 changes: 28 additions & 4 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import './styles/style.css'
import './styles/glyphs.css'

// import {Registry} from 'monaco-editor/esm/vs/platform/registry/common/platform.js'
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
Expand Down Expand Up @@ -68,10 +67,35 @@ bslEditor.tests.updateTestsStatus([{
method: 'ТестОшибка',
status: TestStatus.failed,
duration: 10,
message: 'Ожидали что-то там'
}, {
message: 'Ожидали, что проверяемое значение `1` равно `2`, но это не так.',
trace: `[Failed] <Ожидали, что проверяемое значение \`1\` равно \`2\`, но это не так.>
{YAXUNIT ОбщийМодуль.ЮТУтверждения.Модуль(2239)}:ВызватьИсключение ТекстИсключения;
{YAXUNIT ОбщийМодуль.ЮТУтверждения.Модуль(2225)}:ОбработатьРезультатПроверкиПредиката(Результат);
{YAXUNIT ОбщийМодуль.ЮТУтверждения.Модуль(2200)}:ПроверитьПредикат(Контекст, Предикат, ОписаниеПроверки, ПараметрыСравнения);
{YAXUNIT ОбщийМодуль.ЮТУтверждения.Модуль(266)}:ПроверитьПредикатУтверждения(ЮТПредикаты.Выражения().Равно, ОжидаемоеЗначение, ОписаниеПроверки, ПараметрыСравнения);
{ВнешняяОбработка.ЗапускТестовогоМодуля.МодульОбъекта(17)}:ЮТест.ОжидаетЧто(1).Равно(2);
{(1)}:Объект.ТестОшибка()
{YAXUNIT ОбщийМодуль.ЮТМетодыСлужебный.Модуль(228)}:Выполнить(Выражение);
{YAXUNIT ОбщийМодуль.ЮТМетодыСлужебный.Модуль(110)}:Возврат ВыполнитьВыражениеСПерехватомОшибки(Выражение, Параметры, Объект, Ложь);
{YAXUNIT ОбщийМодуль.ЮТИсполнительСлужебныйКлиентСервер.Модуль(321)}:Ошибка = ЮТМетодыСлужебный.ВыполнитьМетодОбъектаСПерехватомОшибки(ТестовыйМодуль, Тест.Метод, Тест.Параметры);
{YAXUNIT ОбщийМодуль.ЮТИсполнительСлужебныйКлиентСервер.Модуль(219)}:ВыполнитьТестовыйМетод(ТестовыйМодуль, Тест);
{YAXUNIT ОбщийМодуль.ЮТИсполнительСлужебныйКлиентСервер.Модуль(133)}:Результат = ВыполнитьНаборТестов(ТестовыйМодуль, Набор, ОписаниеТестовогоОбъекта);
{YAXUNIT ОбщийМодуль.ЮТИсполнительСлужебныйВызовСервера.Модуль(41)}:Возврат ЮТИсполнительСлужебныйКлиентСервер.ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль);
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ИсключениеВызванноеИзВстроенногоЯзыка]'`}, {
method: 'ТестСломан',
status: TestStatus.broken,
duration: 10,
message: 'Объект не содержит метод'
message: "Исполнения: Метод объекта не обнаружен (ОтсутствующийМетод)",
trace: `Метод объекта не обнаружен (ОтсутствующийМетод)
{ВнешняяОбработка.ЗапускТестовогоМодуля.МодульОбъекта(21)}:ЮТест.ОжидаетЧто(1).ОтсутствующийМетод(2);
{(1)}:Объект.ТестСломан()
{YAXUNIT ОбщийМодуль.ЮТМетодыСлужебный.Модуль(228)}:Выполнить(Выражение);
{YAXUNIT ОбщийМодуль.ЮТМетодыСлужебный.Модуль(110)}:Возврат ВыполнитьВыражениеСПерехватомОшибки(Выражение, Параметры, Объект, Ложь);
{YAXUNIT ОбщийМодуль.ЮТИсполнительСлужебныйКлиентСервер.Модуль(321)}:Ошибка = ЮТМетодыСлужебный.ВыполнитьМетодОбъектаСПерехватомОшибки(ТестовыйМодуль, Тест.Метод, Тест.Параметры);
{YAXUNIT ОбщийМодуль.ЮТИсполнительСлужебныйКлиентСервер.Модуль(219)}:ВыполнитьТестовыйМетод(ТестовыйМодуль, Тест);
{YAXUNIT ОбщийМодуль.ЮТИсполнительСлужебныйКлиентСервер.Модуль(133)}:Результат = ВыполнитьНаборТестов(ТестовыйМодуль, Набор, ОписаниеТестовогоОбъекта);
{YAXUNIT ОбщийМодуль.ЮТИсполнительСлужебныйВызовСервера.Модуль(41)}:Возврат ЮТИсполнительСлужебныйКлиентСервер.ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль);
[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]`
}])
3 changes: 0 additions & 3 deletions src/styles/glyphs.css

This file was deleted.

19 changes: 10 additions & 9 deletions src/yaxunit/editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,24 @@ import { createEditorScope } from '../scope/scopeStore'
import LocalScope from '../scope/localScope'
import { registerCommands } from './features/runner'
import { TestsModel } from './TestDefinition'
import { TestStatusDecorator } from './features/TestStatusDecorator'
import { TestStatusDecorator } from './features/decorator'
import { TestMessageMarkersProvider } from './features/markers'
import { TestModelRender } from './features/interfaces'

let activeEditor: YAxUnitEditor | undefined

export class YAxUnitEditor {
editor: editor.IStandaloneCodeEditor
module: LocalScope
tests: TestsModel = new TestsModel()
decorator: TestStatusDecorator
renders: TestModelRender[] = []

commands: {
runTest?: string
} = {}
constructor(
content: string) {
activeEditor = this
const container = document.getElementById('container')
if (container === null) {
throw 'Error!';
Expand All @@ -34,18 +37,16 @@ export class YAxUnitEditor {
});
this.module = createEditorScope(this.editor).localScope
this.commands.runTest = registerCommands(this) ?? undefined
activeEditor = this
this.decorator = new TestStatusDecorator(this.editor)
this.tests.onDidChangeContent(_=>{
this.decorator.updateDecorations(this.tests)
})

this.renders.push(new TestStatusDecorator(this.editor), new TestMessageMarkersProvider(this.editor))
this.tests.onDidChangeContent(_ => this.renders.forEach(r => r.update(this.tests)))

this.updateTestsModel()

this.editor.getModel()?.onDidChangeContent(() => {
this.module.updateMembers()
this.tests.updateTests(this.module.module.methods)
})

}

getText(): string {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { TestDefinition, TestsModel, TestStatus } from '../TestDefinition'
import { editor, Range } from 'monaco-editor'
import { TestModelRender } from './interfaces'


export class TestStatusDecorator {
export class TestStatusDecorator implements TestModelRender{
editor: editor.IStandaloneCodeEditor
decorationsIds: editor.IEditorDecorationsCollection | undefined
constructor(editor: editor.IStandaloneCodeEditor) {
this.editor = editor
}
updateDecorations(model: TestsModel): void {
update(model: TestsModel): void {
const decorations = model.getTests().map(t => {
return {
range: new Range(t.lineNumber, 1, t.lineNumber, 1),
Expand Down
5 changes: 5 additions & 0 deletions src/yaxunit/features/interfaces.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { TestsModel } from "../TestDefinition";

export interface TestModelRender{
update(model: TestsModel): void
}
File renamed without changes.
87 changes: 87 additions & 0 deletions src/yaxunit/features/markers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
import { TestDefinition, TestsModel } from '../TestDefinition'
import { editor, MarkerSeverity } from 'monaco-editor'
import { TestModelRender } from './interfaces'


export class TestMessageMarkersProvider implements TestModelRender{
editor: editor.IStandaloneCodeEditor
decorationsIds: editor.IEditorDecorationsCollection | undefined
constructor(editor: editor.IStandaloneCodeEditor) {
this.editor = editor
}

update(model: TestsModel): void {
const editorModel = this.editor.getModel()
if (!editorModel) {
return
}
const markers: editor.IMarkerData[] = this.getTestsMarkers(model, editorModel)
const errorsMarkers: editor.IMarkerData[] = this.getErrorsMarkers(model, editorModel)
markers.push(...errorsMarkers)
editor.setModelMarkers(editorModel, "owner", markers);
}

private getTestsMarkers(testsModel: TestsModel, editorModel: editor.ITextModel): editor.IMarkerData[] {
return testsModel.getTests().filter(t => t.message).map(t => {
return {
message: t.message ?? '',
severity: MarkerSeverity.Warning,
startLineNumber: t.lineNumber,
startColumn: editorModel.getLineFirstNonWhitespaceColumn(t.lineNumber),
endLineNumber: t.lineNumber,
endColumn: editorModel.getLineLastNonWhitespaceColumn(t.lineNumber)
}
})
}
private getErrorsMarkers(testsModel: TestsModel, editorModel: editor.ITextModel): editor.IMarkerData[] {
return testsModel.getTests().filter(t => t.trace).map(t => getErrorMarker(t, editorModel))
}
}

function getErrorMarker(test: TestDefinition, editorModel: editor.ITextModel): editor.IMarkerData {
const trace = parseTrace(test.trace ?? '', editorModel.getEOL())
if (trace) {
return {
message: trace.message,
severity: MarkerSeverity.Error,
startLineNumber: trace.line,
startColumn: editorModel.getLineFirstNonWhitespaceColumn(trace.line),
endLineNumber: trace.line,
endColumn: editorModel.getLineLength(trace.line)
}
} else {
return {
message: test.trace??'',
severity: MarkerSeverity.Error,
startLineNumber: test.lineNumber,
startColumn: editorModel.getLineFirstNonWhitespaceColumn(test.lineNumber),
endLineNumber: test.lineNumber,
endColumn: editorModel.getLineLength(test.lineNumber)
}
}
}

function parseTrace(traceMessage: string, EOL:string) {
const lines = traceMessage.split(EOL)

let endLine = 0
for (let index = lines.length - 1; index >= 0; index--) {
const line = lines[index];
if (line.startsWith('{ВнешняяОбработка.')) {
endLine = index
break
}
}

if (endLine) {
const match = /\((\d+)\)\}/.exec(lines[endLine])
if (match) {
lines.length = endLine + 1
return {
line: parseInt(match[1]),
message: lines.join('\n')
}
}
}
return undefined
}
2 changes: 1 addition & 1 deletion src/yaxunit/features/runner.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { YAxUnitEditor } from '../index'
import V8Proxy from '../../onec/V8Proxy'
import './codeLensProvider'
import './lensProvider'
import { TestResult } from '../TestDefinition'

(window as any).V8Proxy = V8Proxy
Expand Down

0 comments on commit bdcaff1

Please sign in to comment.