forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtestBuilder.js
More file actions
1 lines (1 loc) · 4.92 KB
/
Copy pathtestBuilder.js
File metadata and controls
1 lines (1 loc) · 4.92 KB
1
define(function(require,exports,module){const AppInit=brackets.getModule("utils/AppInit"),DocumentManager=brackets.getModule("document/DocumentManager"),EditorManager=brackets.getModule("editor/EditorManager"),FileSystem=brackets.getModule("filesystem/FileSystem"),Editor=brackets.getModule("editor/Editor"),Dialogs=brackets.getModule("widgets/Dialogs"),CommandManager=brackets.getModule("command/CommandManager"),Commands=brackets.getModule("command/Commands"),WorkspaceManager=brackets.getModule("view/WorkspaceManager"),MacroRunner=require("./MacroRunner"),BUILD_SCRATCH_FILE=path.join(brackets.app.getApplicationSupportDirectory(),"testBuilder.js");let builderPanel,$panel,builderEditor;function toggleTestBuilder(){if(!$panel)return $panel=$(panelHTML),(builderPanel=WorkspaceManager.createBottomPanel("phcode-test-builder-panel",$panel,100,"Test Builder")).hide(),void _setupPanel().then(()=>{builderPanel.setVisible(!builderPanel.isVisible())});builderPanel.setVisible(!builderPanel.isVisible())}const panelHTML='\n<div id="test-builder-panel-phcode" class="bottom-panel vert-resizable top-resizer">\n <div class="toolbar" style="display: flex; justify-content: space-between; align-items: center; padding: 5px 8px;">\n <div style="display: flex; gap: 4px;">\n <button class="btn btn-mini no-focus save-test-builder">Save</button>\n <button class="btn btn-mini primary no-focus run-test-builder">Run</button>\n <button class="btn btn-mini no-focus run-selected">Run Selected</button>\n </div>\n <div style="display: flex; gap: 4px;">\n <button class="btn btn-mini no-focus mark-validate" title="Validate marks at cursor">Marks</button>\n <button class="btn btn-mini no-focus cursor-locate">cursor</button>\n <button class="btn btn-mini no-focus text-validate" title="validate text">Text</button>\n </div>\n </div>\n <div style="display: flex; height: 100%; overflow: scroll;">\n <div class="test_builder-editor" style="width: 100%; height: 100%;"></div>\n </div>\n</div>';function saveFile(){return new Promise((resolve,reject)=>{CommandManager.execute(Commands.FILE_SAVE,{doc:builderEditor.document}).done(resolve).fail(function(openErr){console.error("error saving test builder file: ",BUILD_SCRATCH_FILE,openErr),reject()})})}async function runTests(macroText){saveFile();const errors=await MacroRunner.runMacro(macroText||builderEditor.document.getText());if(errors.length){let errorHTML="";for(let error of errors)errorHTML+=`${error.errorText}<br>`;Dialogs.showErrorDialog("Error running macro: ",errorHTML)}}function runSelection(){return runTests(builderEditor.getSelectedText())}function _locateCursor(){const editor=EditorManager.getActiveEditor();if(!editor)return;const formattedSelections=MacroRunner.computeCursors(editor,!0);builderEditor.replaceRange(`\n__PR.setCursors([${formattedSelections.join(", ")}]);`,builderEditor.getCursorPos()),editor.focus()}function _validateText(){const editor=EditorManager.getActiveEditor();if(!editor)return;const selection=editor.getSelection(),start=selection.start,end=selection.end,selectionText=`${start.line+1}:${start.ch+1}-${end.line+1}:${end.ch+1}`;let quotedString=editor.getSelectedText().replaceAll("\n","\\n");builderEditor.replaceRange(`\n__PR.validateText(\`${quotedString}\`, "${selectionText}");`,builderEditor.getCursorPos()),editor.focus()}function _validateMarks(){const editor=EditorManager.getActiveEditor();if(!editor)return;const marks=editor.findMarksAt(editor.getCursorPos()).filter(mark=>mark.markType),markTypeMap={};for(let mark of marks){markTypeMap[mark.markType]||(markTypeMap[mark.markType]=[]);const loc=mark.find();markTypeMap[mark.markType].push(`"${loc.from.line+1}:${loc.from.ch+1}-${loc.to.line+1}:${loc.to.ch+1}"`)}for(let markType of Object.keys(markTypeMap)){const selections=markTypeMap[markType];builderEditor.replaceRange(`\n__PR.validateMarks("${markType}", [${selections.join(", ")}]);`,builderEditor.getCursorPos())}}async function _setupPanel(){let file=FileSystem.getFileForPath(BUILD_SCRATCH_FILE),isExists;await file.existsAsync()||await new Promise(resolve=>{file.write("",{blind:!0},resolve)}),DocumentManager.getDocumentForPath(BUILD_SCRATCH_FILE).done(function(doc){const _$editor=$panel.find(".test_builder-editor");(builderEditor=new Editor.Editor(doc,!1,_$editor,null,{})).updateLayout()}),new ResizeObserver(()=>{builderEditor&&builderEditor.updateLayout()}).observe($panel[0]),$panel.find(".save-test-builder").click(saveFile),$panel.find(".run-test-builder").click(()=>{runTests()}),$panel.find(".run-selected").click(runSelection),$panel.find(".cursor-locate").click(_locateCursor),$panel.find(".text-validate").click(_validateText),$panel.find(".mark-validate").click(_validateMarks)}AppInit.appReady(function(){Phoenix.isTestWindow||($panel=$(panelHTML),(builderPanel=WorkspaceManager.createBottomPanel("phcode-test-builder-panel",$panel,100,"Test Builder")).hide(),_setupPanel())}),exports.toggleTestBuilder=toggleTestBuilder});