From 45eb98a48208056c40a052f21f758da97b9b0a89 Mon Sep 17 00:00:00 2001 From: Release Action <> Date: Wed, 30 Jun 2021 20:37:07 +0000 Subject: [PATCH] Build for baabcbc --- dist/bin/license.txt | 27 +++ dist/bin/run_matlab_command.bat | 92 +++++++++ dist/bin/run_matlab_command.sh | 72 +++++++ dist/index.js | 1 + ...eateCoberturaCodePluginExpressionBuilder.m | 21 +++ ...ateCoberturaModelPluginExpressionBuilder.m | 15 ++ .../CreateHTMLCodePluginExpressionBuilder.m | 20 ++ .../CreateHTMLModelPluginExpressionBuilder.m | 14 ++ ...ateHTMLTestReportPluginExpressionBuilder.m | 14 ++ ...teHasBaseFolderSelectorExpressionBuilder.m | 14 ++ .../CreateHasTagSelectorExpressionBuilder.m | 15 ++ .../CreateJUnitPluginExpressionBuilder.m | 15 ++ .../+test/CreatePDFPluginExpressionBuilder.m | 15 ++ ...reateSimulinkTestPluginExpressionBuilder.m | 4 + ...mulinkTestResultsPluginExpressionBuilder.m | 15 ++ .../+test/CreateTAPPluginExpressionBuilder.m | 15 ++ ...eateCoberturaCodePluginExpressionBuilder.m | 24 +++ ...ateCoberturaModelPluginExpressionBuilder.m | 25 +++ .../CreateHTMLCodePluginExpressionBuilder.m | 24 +++ .../CreateHTMLModelPluginExpressionBuilder.m | 34 ++++ ...ateHTMLTestReportPluginExpressionBuilder.m | 20 ++ ...teHasBaseFolderSelectorExpressionBuilder.m | 36 ++++ .../CreateHasTagSelectorExpressionBuilder.m | 23 +++ .../CreateJUnitPluginExpressionBuilder.m | 21 +++ .../+test/CreatePDFPluginExpressionBuilder.m | 23 +++ ...reateSimulinkTestPluginExpressionBuilder.m | 23 +++ ...mulinkTestResultsPluginExpressionBuilder.m | 23 +++ ...ProducingOriginalFormatExpressionBuilder.m | 32 ++++ ...UsingProducingVersion13ExpressionBuilder.m | 23 +++ .../+internal/+mixin/EnvironmentDependent.m | 41 ++++ .../+internal/+mixin/PathDependent.m | 24 +++ .../+internal/+mixin/PlatformDependent.m | 25 +++ .../+scriptgen/+internal/+mixin/Preferable.m | 75 ++++++++ .../+scriptgen/+internal/+mixin/SetGet.m | 19 ++ .../+internal/+mixin/VersionDependent.m | 41 ++++ .../+internal/+scripts/TestScriptBuilder.m | 178 ++++++++++++++++++ .../+test/AssertNoFailuresSequenceBuilder.m | 19 ++ .../+test/CreateTestRunnerSequenceBuilder.m | 113 +++++++++++ .../+test/CreateTestSuiteSequenceBuilder.m | 61 ++++++ ...singWithTextOutputDetailStatementBuilder.m | 23 +++ ...unnerUsingWithTextOutputStatementBuilder.m | 21 +++ ...gWithTextOutputVerbosityStatementBuilder.m | 23 +++ ...TestSuiteUsingFromFolderStatementBuilder.m | 21 +++ ...eTestSuiteUsingTestsuiteStatementBuilder.m | 19 ++ .../+scriptgen/+internal/CodeBuilderFactory.m | 40 ++++ .../+scriptgen/+internal/CodeBuilderLocator.m | 55 ++++++ .../+scriptgen/+internal/MissingCode.m | 10 + .../+scriptgen/+internal/MissingCodeBuilder.m | 10 + .../+internal/PrunedStackException.m | 49 +++++ dist/scriptgen/+scriptgen/+internal/Version.m | 113 +++++++++++ .../+scriptgen/+internal/isAbsolutePath.m | 8 + .../+scriptgen/+internal/unquoteText.m | 11 ++ .../+scriptgen/+internal/validateText.m | 9 + .../+scriptgen/+internal/validateTextArray.m | 7 + .../+scriptgen/+internal/validateTextScalar.m | 8 + .../+scriptgen/+scripts/TestScriptBuilder.m | 93 +++++++++ .../+test/AssertNoFailuresSequenceBuilder.m | 20 ++ .../+test/CreateTestRunnerSequenceBuilder.m | 80 ++++++++ .../+test/CreateTestSuiteSequenceBuilder.m | 33 ++++ .../+test/CreateTestRunnerStatementBuilder.m | 15 ++ .../+test/CreateTestSuiteStatementBuilder.m | 15 ++ dist/scriptgen/+scriptgen/Code.m | 38 ++++ dist/scriptgen/+scriptgen/CodeBuilder.m | 18 ++ dist/scriptgen/+scriptgen/CodeProvider.m | 128 +++++++++++++ dist/scriptgen/+scriptgen/CodeWriter.m | 64 +++++++ dist/scriptgen/+scriptgen/Expression.m | 42 +++++ dist/scriptgen/+scriptgen/FileOutput.m | 22 +++ dist/scriptgen/+scriptgen/OutputStream.m | 14 ++ dist/scriptgen/+scriptgen/Script.m | 83 ++++++++ dist/scriptgen/+scriptgen/Sequence.m | 43 +++++ dist/scriptgen/+scriptgen/Statement.m | 55 ++++++ dist/scriptgen/+scriptgen/TextOutput.m | 14 ++ dist/scriptgen/genscript.m | 26 +++ dist/scriptgen/license.txt | 27 +++ lib/index.d.ts | 1 + lib/index.js | 67 +++++++ lib/index.js.map | 1 + lib/scriptgen.d.ts | 20 ++ lib/scriptgen.js | 53 ++++++ lib/scriptgen.js.map | 1 + 80 files changed, 2696 insertions(+) create mode 100644 dist/bin/license.txt create mode 100755 dist/bin/run_matlab_command.bat create mode 100755 dist/bin/run_matlab_command.sh create mode 100644 dist/index.js create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateCoberturaCodePluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateCoberturaModelPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLCodePluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLModelPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLTestReportPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateHasBaseFolderSelectorExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateHasTagSelectorExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateJUnitPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreatePDFPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateSimulinkTestPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateSimulinkTestResultsPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+expressions/+test/CreateTAPPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateCoberturaCodePluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateCoberturaModelPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLCodePluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLModelPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLTestReportPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHasBaseFolderSelectorExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHasTagSelectorExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateJUnitPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreatePDFPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateSimulinkTestPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateSimulinkTestResultsPluginExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateTAPPluginUsingProducingOriginalFormatExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateTAPPluginUsingProducingVersion13ExpressionBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+mixin/EnvironmentDependent.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+mixin/PathDependent.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+mixin/PlatformDependent.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+mixin/Preferable.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+mixin/SetGet.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+mixin/VersionDependent.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+scripts/TestScriptBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+sequences/+test/AssertNoFailuresSequenceBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+sequences/+test/CreateTestRunnerSequenceBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+sequences/+test/CreateTestSuiteSequenceBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputDetailStatementBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputStatementBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputVerbosityStatementBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestSuiteUsingFromFolderStatementBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestSuiteUsingTestsuiteStatementBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/CodeBuilderFactory.m create mode 100644 dist/scriptgen/+scriptgen/+internal/CodeBuilderLocator.m create mode 100644 dist/scriptgen/+scriptgen/+internal/MissingCode.m create mode 100644 dist/scriptgen/+scriptgen/+internal/MissingCodeBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+internal/PrunedStackException.m create mode 100644 dist/scriptgen/+scriptgen/+internal/Version.m create mode 100644 dist/scriptgen/+scriptgen/+internal/isAbsolutePath.m create mode 100644 dist/scriptgen/+scriptgen/+internal/unquoteText.m create mode 100644 dist/scriptgen/+scriptgen/+internal/validateText.m create mode 100644 dist/scriptgen/+scriptgen/+internal/validateTextArray.m create mode 100644 dist/scriptgen/+scriptgen/+internal/validateTextScalar.m create mode 100644 dist/scriptgen/+scriptgen/+scripts/TestScriptBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+sequences/+test/AssertNoFailuresSequenceBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+sequences/+test/CreateTestRunnerSequenceBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+sequences/+test/CreateTestSuiteSequenceBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+statements/+test/CreateTestRunnerStatementBuilder.m create mode 100644 dist/scriptgen/+scriptgen/+statements/+test/CreateTestSuiteStatementBuilder.m create mode 100644 dist/scriptgen/+scriptgen/Code.m create mode 100644 dist/scriptgen/+scriptgen/CodeBuilder.m create mode 100644 dist/scriptgen/+scriptgen/CodeProvider.m create mode 100644 dist/scriptgen/+scriptgen/CodeWriter.m create mode 100644 dist/scriptgen/+scriptgen/Expression.m create mode 100644 dist/scriptgen/+scriptgen/FileOutput.m create mode 100644 dist/scriptgen/+scriptgen/OutputStream.m create mode 100644 dist/scriptgen/+scriptgen/Script.m create mode 100644 dist/scriptgen/+scriptgen/Sequence.m create mode 100644 dist/scriptgen/+scriptgen/Statement.m create mode 100644 dist/scriptgen/+scriptgen/TextOutput.m create mode 100644 dist/scriptgen/genscript.m create mode 100644 dist/scriptgen/license.txt create mode 100644 lib/index.d.ts create mode 100644 lib/index.js create mode 100644 lib/index.js.map create mode 100644 lib/scriptgen.d.ts create mode 100644 lib/scriptgen.js create mode 100644 lib/scriptgen.js.map diff --git a/dist/bin/license.txt b/dist/bin/license.txt new file mode 100644 index 0000000..853135c --- /dev/null +++ b/dist/bin/license.txt @@ -0,0 +1,27 @@ +Copyright (c) 2020, The MathWorks, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. In all cases, the software is, and all modifications and derivatives of the + software shall be, licensed to you solely for use in conjunction with + MathWorks products and service offerings. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/dist/bin/run_matlab_command.bat b/dist/bin/run_matlab_command.bat new file mode 100755 index 0000000..21092a6 --- /dev/null +++ b/dist/bin/run_matlab_command.bat @@ -0,0 +1,92 @@ +@echo off +rem Executes a specified MATLAB command in batch mode. With MATLAB R2018b+, +rem running this script is equivalent to executing "matlab -batch command" from +rem the system prompt. +rem +rem Copyright 2020 The MathWorks, Inc. + +setlocal enableextensions enabledelayedexpansion + +set command=%~1 +if "%command%" == "" ( + call :usage + exit /b 1 +) + +for %%a in (matlab.exe) do set matlab_path=%%~$PATH:a + +if "%matlab_path%" == "" ( + echo 'matlab.exe' command not found. Please make sure MATLAB_ROOT\bin is on + echo the system path, where MATLAB_ROOT is the full path to your MATLAB + echo installation directory. + exit /b 1 +) + +for %%a in ("%matlab_path%\..\..") do set matlab_root=%%~fa + +rem try to discover the MATLAB version +if exist "%matlab_root%\VersionInfo.xml" ( + rem get version tag contents + for /f %%a in ('findstr ".*" "%matlab_root%\VersionInfo.xml"') do ( + set ver_line=%%a + set ver_line=!ver_line:*^=! + for /f "tokens=1 delims=<" %%b in ("!ver_line!") do set matlab_ver=%%b + ) +) else if exist "%matlab_root%\toolbox\matlab\general\Contents.m" ( + rem get version printed after "MATLAB Version" + for /f "delims=" %%a in ('findstr /r /c:"MATLAB Version .*" "%matlab_root%\toolbox\matlab\general\Contents.m"') do ( + set ver_line=%%a + set ver_line=!ver_line:*MATLAB Version =! + for /f "tokens=1" %%b in ("!ver_line!") do set matlab_ver=%%b + ) +) + +rem if version not discovered, assume worst-case version of 0 +if not defined matlab_ver set matlab_ver=0 + +rem use -r to launch MATLAB versions below R2018b (i.e. 9.5), otherwise use -batch +call :ver_less_than %matlab_ver% 9.5 +if %errorlevel% == 0 ( + rem define start-up options + set opts=-nosplash -nodesktop -wait -log + call :ver_less_than %matlab_ver% 8.5 + if not !errorlevel! == 0 set opts=!opts! -noDisplayDesktop + + rem escape single quotes in command + set exp=!command:'=''! + + matlab.exe !opts! -r "try,eval('!exp!'),catch e,disp(getReport(e,'extended')),exit(1),end,exit" > NUL +) else ( + matlab.exe -batch "%command%" +) +exit /b %errorlevel% + +:usage +echo Usage: run_matlab_command.sh command +echo. +echo command - MATLAB script, statement, or function to execute. +echo. +goto :eof + +:ver_less_than +setlocal +call :ver_str %~1 v1 +call :ver_str %~2 v2 +if "%v1%" lss "%v2%" ( exit /b 0 ) else ( exit /b 1 ) + +:ver_str +setlocal +set ver=%~1 +for /f "tokens=1-4 delims=." %%a in ("%ver%") do ( + set major=%%a + set minor=000%%b + set minor=!minor:~-3! + set patch=000%%c + set patch=!patch:~-3! + set build=000000000%%d + set build=!build:~-9! +) +( endlocal & rem return values + set %~2=%major%%minor%%patch%%build% +) +goto :eof diff --git a/dist/bin/run_matlab_command.sh b/dist/bin/run_matlab_command.sh new file mode 100755 index 0000000..ae31dc5 --- /dev/null +++ b/dist/bin/run_matlab_command.sh @@ -0,0 +1,72 @@ +#!/bin/sh +# Executes a specified MATLAB command in batch mode. With MATLAB R2018b+, +# running this script is equivalent to executing "matlab -batch command" from +# the system prompt. +# +# Copyright 2020 The MathWorks, Inc. + +usage() { + echo '' + echo ' Usage: run_matlab_command.sh command' + echo '' + echo ' command - MATLAB script, statement, or function to execute.' + echo '' +} + +ver_less_than() { + [ "$(ver_str "$1")" -lt "$(ver_str "$2")" ] +} + +ver_str() { + echo "$@" | awk -F. '{ printf("%d%03d%03d%09d\n", $1,$2,$3,$4); }'; +} + +command=$1 +if [ -z "$command" ]; then + usage + exit 1 +fi + +if ! matlab_path="$(command -v matlab)" || [ -z "$matlab_path" ]; then + echo "'matlab'"' command not found. Please make sure MATLAB_ROOT/bin is on' + echo 'the system path, where MATLAB_ROOT is the full path to your MATLAB' + echo 'installation directory.' + exit 1 +fi + +# resolve symlink to target +while [ -h "$matlab_path" ]; do + dir=$(dirname -- "$matlab_path") + target=$(readlink "$matlab_path") + matlab_path=$(cd "$dir" && cd "$(dirname -- "$target")" && pwd)/$(basename -- "$target") +done + +matlab_root=$(dirname -- "$(dirname -- "$matlab_path")") + +# try to discover the MATLAB version +if [ -f "$matlab_root"/VersionInfo.xml ]; then + # get version tag contents + matlab_ver=$(sed -n 's:.*\(.*\).*:\1:p' < "$matlab_root"/VersionInfo.xml) +elif [ -f "$matlab_root"/toolbox/matlab/general/Contents.m ]; then + # get version printed after "MATLAB Version" + matlab_ver=$(grep -o 'MATLAB Version .*' < "$matlab_root"/toolbox/matlab/general/Contents.m | awk -v N=3 '{print $N}') +fi + +# if version not discovered, assume worst-case version of 0 +matlab_ver=${matlab_ver:-0} + +# use -r to launch MATLAB versions below R2018b (i.e. 9.5), otherwise use -batch +if ver_less_than "$matlab_ver" '9.5'; then + # define start-up options + opts='-nosplash -nodesktop' + if ! ver_less_than "$matlab_ver" '8.6'; then + opts="$opts -noAppIcon" + fi + + # escape single quotes in command + exp=$(echo "$command" | sed "s/'/''/g") + + matlab "$opts" -r "try,eval('$exp'),catch e,disp(getReport(e,'extended')),exit(1),end,exit" +else + matlab -batch "$command" +fi diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..61a4795 --- /dev/null +++ b/dist/index.js @@ -0,0 +1 @@ +(()=>{"use strict";var e={822:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.prototype.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};var s=this&&this.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r((function(t){t(e)}))}return new(r||(r=Promise))((function(r,i){function fulfilled(e){try{step(n.next(e))}catch(e){i(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){i(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:true});const u=o(r(186));const a=o(r(514));const c=r(84);const l=o(r(210));function run(){return s(this,void 0,void 0,(function*(){const e=process.platform;const t=process.cwd();const r={JUnitTestResults:u.getInput("test-results-junit"),CoberturaCodeCoverage:u.getInput("code-coverage-cobertura"),SourceFolder:u.getInput("source-folder"),PDFTestReport:u.getInput("test-results-pdf"),SimulinkTestResults:u.getInput("test-results-simulink-test"),CoberturaModelCoverage:u.getInput("model-coverage-cobertura"),SelectByTag:u.getInput("select-by-tag"),SelectByFolder:u.getInput("select-by-folder")};const n=l.generateCommand(r);const i=yield u.group("Generate script",(()=>s(this,void 0,void 0,(function*(){const e=yield c.matlab.generateScript(t,n);u.info("Successfully generated script");return e}))));yield u.group("Run command",(()=>s(this,void 0,void 0,(function*(){yield c.matlab.runCommand(i,e,a.exec)}))))}))}run().catch((e=>{u.setFailed(e)}))},210:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.prototype.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};Object.defineProperty(t,"__esModule",{value:true});t.generateCommand=void 0;const s=o(r(622));function generateCommand(e){const t=`\n addpath('${s.join(__dirname,"scriptgen")}');\n testScript = genscript('Test',\n 'JUnitTestResults','${e.JUnitTestResults||""}',\n 'CoberturaCodeCoverage','${e.CoberturaCodeCoverage||""}',\n 'SourceFolder','${e.SourceFolder||""}',\n 'PDFTestReport','${e.PDFTestReport||""}',\n 'SimulinkTestResults','${e.SimulinkTestResults||""}',\n 'CoberturaModelCoverage','${e.CoberturaModelCoverage||""}',\n 'SelectByTag','${e.SelectByTag||""}',\n 'SelectByFolder','${e.SelectByFolder||""}'\n );\n disp('Running MATLAB script with contents:');\n disp(testScript.Contents);\n fprintf('__________\\n\\n');\n run(testScript);\n `.replace(/$\n^\s*/gm," ").trim();return t}t.generateCommand=generateCommand},351:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};Object.defineProperty(t,"__esModule",{value:true});t.issue=t.issueCommand=void 0;const s=o(r(87));const u=r(278);function issueCommand(e,t,r){const n=new Command(e,t,r);process.stdout.write(n.toString()+s.EOL)}t.issueCommand=issueCommand;function issue(e,t=""){issueCommand(e,{},t)}t.issue=issue;const a="::";class Command{constructor(e,t,r){if(!e){e="missing.command"}this.command=e;this.properties=t;this.message=r}toString(){let e=a+this.command;if(this.properties&&Object.keys(this.properties).length>0){e+=" ";let t=true;for(const r in this.properties){if(this.properties.hasOwnProperty(r)){const n=this.properties[r];if(n){if(t){t=false}else{e+=","}e+=`${r}=${escapeProperty(n)}`}}}}e+=`${a}${escapeData(this.message)}`;return e}}function escapeData(e){return u.toCommandValue(e).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A")}function escapeProperty(e){return u.toCommandValue(e).replace(/%/g,"%25").replace(/\r/g,"%0D").replace(/\n/g,"%0A").replace(/:/g,"%3A").replace(/,/g,"%2C")}},186:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};var s=this&&this.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r((function(t){t(e)}))}return new(r||(r=Promise))((function(r,i){function fulfilled(e){try{step(n.next(e))}catch(e){i(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){i(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:true});t.getState=t.saveState=t.group=t.endGroup=t.startGroup=t.info=t.warning=t.error=t.debug=t.isDebug=t.setFailed=t.setCommandEcho=t.setOutput=t.getBooleanInput=t.getMultilineInput=t.getInput=t.addPath=t.setSecret=t.exportVariable=t.ExitCode=void 0;const u=r(351);const a=r(717);const c=r(278);const l=o(r(87));const d=o(r(622));var f;(function(e){e[e["Success"]=0]="Success";e[e["Failure"]=1]="Failure"})(f=t.ExitCode||(t.ExitCode={}));function exportVariable(e,t){const r=c.toCommandValue(t);process.env[e]=r;const n=process.env["GITHUB_ENV"]||"";if(n){const t="_GitHubActionsFileCommandDelimeter_";const n=`${e}<<${t}${l.EOL}${r}${l.EOL}${t}`;a.issueCommand("ENV",n)}else{u.issueCommand("set-env",{name:e},r)}}t.exportVariable=exportVariable;function setSecret(e){u.issueCommand("add-mask",{},e)}t.setSecret=setSecret;function addPath(e){const t=process.env["GITHUB_PATH"]||"";if(t){a.issueCommand("PATH",e)}else{u.issueCommand("add-path",{},e)}process.env["PATH"]=`${e}${d.delimiter}${process.env["PATH"]}`}t.addPath=addPath;function getInput(e,t){const r=process.env[`INPUT_${e.replace(/ /g,"_").toUpperCase()}`]||"";if(t&&t.required&&!r){throw new Error(`Input required and not supplied: ${e}`)}if(t&&t.trimWhitespace===false){return r}return r.trim()}t.getInput=getInput;function getMultilineInput(e,t){const r=getInput(e,t).split("\n").filter((e=>e!==""));return r}t.getMultilineInput=getMultilineInput;function getBooleanInput(e,t){const r=["true","True","TRUE"];const n=["false","False","FALSE"];const i=getInput(e,t);if(r.includes(i))return true;if(n.includes(i))return false;throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${e}\n`+`Support boolean input list: \`true | True | TRUE | false | False | FALSE\``)}t.getBooleanInput=getBooleanInput;function setOutput(e,t){process.stdout.write(l.EOL);u.issueCommand("set-output",{name:e},t)}t.setOutput=setOutput;function setCommandEcho(e){u.issue("echo",e?"on":"off")}t.setCommandEcho=setCommandEcho;function setFailed(e){process.exitCode=f.Failure;error(e)}t.setFailed=setFailed;function isDebug(){return process.env["RUNNER_DEBUG"]==="1"}t.isDebug=isDebug;function debug(e){u.issueCommand("debug",{},e)}t.debug=debug;function error(e){u.issue("error",e instanceof Error?e.toString():e)}t.error=error;function warning(e){u.issue("warning",e instanceof Error?e.toString():e)}t.warning=warning;function info(e){process.stdout.write(e+l.EOL)}t.info=info;function startGroup(e){u.issue("group",e)}t.startGroup=startGroup;function endGroup(){u.issue("endgroup")}t.endGroup=endGroup;function group(e,t){return s(this,void 0,void 0,(function*(){startGroup(e);let r;try{r=yield t()}finally{endGroup()}return r}))}t.group=group;function saveState(e,t){u.issueCommand("save-state",{name:e},t)}t.saveState=saveState;function getState(e){return process.env[`STATE_${e}`]||""}t.getState=getState},717:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};Object.defineProperty(t,"__esModule",{value:true});t.issueCommand=void 0;const s=o(r(747));const u=o(r(87));const a=r(278);function issueCommand(e,t){const r=process.env[`GITHUB_${e}`];if(!r){throw new Error(`Unable to find environment variable for file command ${e}`)}if(!s.existsSync(r)){throw new Error(`Missing file at path: ${r}`)}s.appendFileSync(r,`${a.toCommandValue(t)}${u.EOL}`,{encoding:"utf8"})}t.issueCommand=issueCommand},278:(e,t)=>{Object.defineProperty(t,"__esModule",{value:true});t.toCommandValue=void 0;function toCommandValue(e){if(e===null||e===undefined){return""}else if(typeof e==="string"||e instanceof String){return e}return JSON.stringify(e)}t.toCommandValue=toCommandValue},514:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};var s=this&&this.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r((function(t){t(e)}))}return new(r||(r=Promise))((function(r,i){function fulfilled(e){try{step(n.next(e))}catch(e){i(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){i(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:true});t.getExecOutput=t.exec=void 0;const u=r(304);const a=o(r(159));function exec(e,t,r){return s(this,void 0,void 0,(function*(){const n=a.argStringToArray(e);if(n.length===0){throw new Error(`Parameter 'commandLine' cannot be null or empty.`)}const i=n[0];t=n.slice(1).concat(t||[]);const o=new a.ToolRunner(i,t,r);return o.exec()}))}t.exec=exec;function getExecOutput(e,t,r){var n,i;return s(this,void 0,void 0,(function*(){let o="";let s="";const a=new u.StringDecoder("utf8");const c=new u.StringDecoder("utf8");const l=(n=r===null||r===void 0?void 0:r.listeners)===null||n===void 0?void 0:n.stdout;const d=(i=r===null||r===void 0?void 0:r.listeners)===null||i===void 0?void 0:i.stderr;const stdErrListener=e=>{s+=c.write(e);if(d){d(e)}};const stdOutListener=e=>{o+=a.write(e);if(l){l(e)}};const f=Object.assign(Object.assign({},r===null||r===void 0?void 0:r.listeners),{stdout:stdOutListener,stderr:stdErrListener});const p=yield exec(e,t,Object.assign(Object.assign({},r),{listeners:f}));o+=a.end();s+=c.end();return{exitCode:p,stdout:o,stderr:s}}))}t.getExecOutput=getExecOutput},159:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};var s=this&&this.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r((function(t){t(e)}))}return new(r||(r=Promise))((function(r,i){function fulfilled(e){try{step(n.next(e))}catch(e){i(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){i(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:true});t.argStringToArray=t.ToolRunner=void 0;const u=o(r(87));const a=o(r(614));const c=o(r(129));const l=o(r(622));const d=o(r(436));const f=o(r(962));const p=r(213);const h=process.platform==="win32";class ToolRunner extends a.EventEmitter{constructor(e,t,r){super();if(!e){throw new Error("Parameter 'toolPath' cannot be null or empty.")}this.toolPath=e;this.args=t||[];this.options=r||{}}_debug(e){if(this.options.listeners&&this.options.listeners.debug){this.options.listeners.debug(e)}}_getCommandString(e,t){const r=this._getSpawnFileName();const n=this._getSpawnArgs(e);let i=t?"":"[command]";if(h){if(this._isCmdFile()){i+=r;for(const e of n){i+=` ${e}`}}else if(e.windowsVerbatimArguments){i+=`"${r}"`;for(const e of n){i+=` ${e}`}}else{i+=this._windowsQuoteCmdArg(r);for(const e of n){i+=` ${this._windowsQuoteCmdArg(e)}`}}}else{i+=r;for(const e of n){i+=` ${e}`}}return i}_processLineBuffer(e,t,r){try{let n=t+e.toString();let i=n.indexOf(u.EOL);while(i>-1){const e=n.substring(0,i);r(e);n=n.substring(i+u.EOL.length);i=n.indexOf(u.EOL)}return n}catch(e){this._debug(`error processing line. Failed with error ${e}`);return""}}_getSpawnFileName(){if(h){if(this._isCmdFile()){return process.env["COMSPEC"]||"cmd.exe"}}return this.toolPath}_getSpawnArgs(e){if(h){if(this._isCmdFile()){let t=`/D /S /C "${this._windowsQuoteCmdArg(this.toolPath)}`;for(const r of this.args){t+=" ";t+=e.windowsVerbatimArguments?r:this._windowsQuoteCmdArg(r)}t+='"';return[t]}}return this.args}_endsWith(e,t){return e.endsWith(t)}_isCmdFile(){const e=this.toolPath.toUpperCase();return this._endsWith(e,".CMD")||this._endsWith(e,".BAT")}_windowsQuoteCmdArg(e){if(!this._isCmdFile()){return this._uvQuoteCmdArg(e)}if(!e){return'""'}const t=[" ","\t","&","(",")","[","]","{","}","^","=",";","!","'","+",",","`","~","|","<",">",'"'];let r=false;for(const n of e){if(t.some((e=>e===n))){r=true;break}}if(!r){return e}let n='"';let i=true;for(let t=e.length;t>0;t--){n+=e[t-1];if(i&&e[t-1]==="\\"){n+="\\"}else if(e[t-1]==='"'){i=true;n+='"'}else{i=false}}n+='"';return n.split("").reverse().join("")}_uvQuoteCmdArg(e){if(!e){return'""'}if(!e.includes(" ")&&!e.includes("\t")&&!e.includes('"')){return e}if(!e.includes('"')&&!e.includes("\\")){return`"${e}"`}let t='"';let r=true;for(let n=e.length;n>0;n--){t+=e[n-1];if(r&&e[n-1]==="\\"){t+="\\"}else if(e[n-1]==='"'){r=true;t+="\\"}else{r=false}}t+='"';return t.split("").reverse().join("")}_cloneExecOptions(e){e=e||{};const t={cwd:e.cwd||process.cwd(),env:e.env||process.env,silent:e.silent||false,windowsVerbatimArguments:e.windowsVerbatimArguments||false,failOnStdErr:e.failOnStdErr||false,ignoreReturnCode:e.ignoreReturnCode||false,delay:e.delay||1e4};t.outStream=e.outStream||process.stdout;t.errStream=e.errStream||process.stderr;return t}_getSpawnOptions(e,t){e=e||{};const r={};r.cwd=e.cwd;r.env=e.env;r["windowsVerbatimArguments"]=e.windowsVerbatimArguments||this._isCmdFile();if(e.windowsVerbatimArguments){r.argv0=`"${t}"`}return r}exec(){return s(this,void 0,void 0,(function*(){if(!f.isRooted(this.toolPath)&&(this.toolPath.includes("/")||h&&this.toolPath.includes("\\"))){this.toolPath=l.resolve(process.cwd(),this.options.cwd||process.cwd(),this.toolPath)}this.toolPath=yield d.which(this.toolPath,true);return new Promise(((e,t)=>s(this,void 0,void 0,(function*(){this._debug(`exec tool: ${this.toolPath}`);this._debug("arguments:");for(const e of this.args){this._debug(` ${e}`)}const r=this._cloneExecOptions(this.options);if(!r.silent&&r.outStream){r.outStream.write(this._getCommandString(r)+u.EOL)}const n=new ExecState(r,this.toolPath);n.on("debug",(e=>{this._debug(e)}));if(this.options.cwd&&!(yield f.exists(this.options.cwd))){return t(new Error(`The cwd: ${this.options.cwd} does not exist!`))}const i=this._getSpawnFileName();const o=c.spawn(i,this._getSpawnArgs(r),this._getSpawnOptions(this.options,i));let s="";if(o.stdout){o.stdout.on("data",(e=>{if(this.options.listeners&&this.options.listeners.stdout){this.options.listeners.stdout(e)}if(!r.silent&&r.outStream){r.outStream.write(e)}s=this._processLineBuffer(e,s,(e=>{if(this.options.listeners&&this.options.listeners.stdline){this.options.listeners.stdline(e)}}))}))}let a="";if(o.stderr){o.stderr.on("data",(e=>{n.processStderr=true;if(this.options.listeners&&this.options.listeners.stderr){this.options.listeners.stderr(e)}if(!r.silent&&r.errStream&&r.outStream){const t=r.failOnStdErr?r.errStream:r.outStream;t.write(e)}a=this._processLineBuffer(e,a,(e=>{if(this.options.listeners&&this.options.listeners.errline){this.options.listeners.errline(e)}}))}))}o.on("error",(e=>{n.processError=e.message;n.processExited=true;n.processClosed=true;n.CheckComplete()}));o.on("exit",(e=>{n.processExitCode=e;n.processExited=true;this._debug(`Exit code ${e} received from tool '${this.toolPath}'`);n.CheckComplete()}));o.on("close",(e=>{n.processExitCode=e;n.processExited=true;n.processClosed=true;this._debug(`STDIO streams have closed for tool '${this.toolPath}'`);n.CheckComplete()}));n.on("done",((r,n)=>{if(s.length>0){this.emit("stdline",s)}if(a.length>0){this.emit("errline",a)}o.removeAllListeners();if(r){t(r)}else{e(n)}}));if(this.options.input){if(!o.stdin){throw new Error("child process missing stdin")}o.stdin.end(this.options.input)}}))))}))}}t.ToolRunner=ToolRunner;function argStringToArray(e){const t=[];let r=false;let n=false;let i="";function append(e){if(n&&e!=='"'){i+="\\"}i+=e;n=false}for(let o=0;o0){t.push(i);i=""}continue}append(s)}if(i.length>0){t.push(i.trim())}return t}t.argStringToArray=argStringToArray;class ExecState extends a.EventEmitter{constructor(e,t){super();this.processClosed=false;this.processError="";this.processExitCode=0;this.processExited=false;this.processStderr=false;this.delay=1e4;this.done=false;this.timeout=null;if(!t){throw new Error("toolPath must not be empty")}this.options=e;this.toolPath=t;if(e.delay){this.delay=e.delay}}CheckComplete(){if(this.done){return}if(this.processClosed){this._setResult()}else if(this.processExited){this.timeout=p.setTimeout(ExecState.HandleTimeout,this.delay,this)}}_debug(e){this.emit("debug",e)}_setResult(){let e;if(this.processExited){if(this.processError){e=new Error(`There was an error when attempting to execute the process '${this.toolPath}'. This may indicate the process failed to start. Error: ${this.processError}`)}else if(this.processExitCode!==0&&!this.options.ignoreReturnCode){e=new Error(`The process '${this.toolPath}' failed with exit code ${this.processExitCode}`)}else if(this.processStderr&&this.options.failOnStdErr){e=new Error(`The process '${this.toolPath}' failed because one or more lines were written to the STDERR stream`)}}if(this.timeout){clearTimeout(this.timeout);this.timeout=null}this.done=true;this.emit("done",e,this.processExitCode)}static HandleTimeout(e){if(e.done){return}if(!e.processClosed&&e.processExited){const t=`The STDIO streams did not close within ${e.delay/1e3} seconds of the exit event from process '${e.toolPath}'. This may indicate a child process inherited the STDIO streams and has not yet exited.`;e._debug(t)}e._setResult()}}},962:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};var s=this&&this.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r((function(t){t(e)}))}return new(r||(r=Promise))((function(r,i){function fulfilled(e){try{step(n.next(e))}catch(e){i(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){i(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())}))};var u;Object.defineProperty(t,"__esModule",{value:true});t.getCmdPath=t.tryGetExecutablePath=t.isRooted=t.isDirectory=t.exists=t.IS_WINDOWS=t.unlink=t.symlink=t.stat=t.rmdir=t.rename=t.readlink=t.readdir=t.mkdir=t.lstat=t.copyFile=t.chmod=void 0;const a=o(r(747));const c=o(r(622));u=a.promises,t.chmod=u.chmod,t.copyFile=u.copyFile,t.lstat=u.lstat,t.mkdir=u.mkdir,t.readdir=u.readdir,t.readlink=u.readlink,t.rename=u.rename,t.rmdir=u.rmdir,t.stat=u.stat,t.symlink=u.symlink,t.unlink=u.unlink;t.IS_WINDOWS=process.platform==="win32";function exists(e){return s(this,void 0,void 0,(function*(){try{yield t.stat(e)}catch(e){if(e.code==="ENOENT"){return false}throw e}return true}))}t.exists=exists;function isDirectory(e,r=false){return s(this,void 0,void 0,(function*(){const n=r?yield t.stat(e):yield t.lstat(e);return n.isDirectory()}))}t.isDirectory=isDirectory;function isRooted(e){e=normalizeSeparators(e);if(!e){throw new Error('isRooted() parameter "p" cannot be empty')}if(t.IS_WINDOWS){return e.startsWith("\\")||/^[A-Z]:/i.test(e)}return e.startsWith("/")}t.isRooted=isRooted;function tryGetExecutablePath(e,r){return s(this,void 0,void 0,(function*(){let n=undefined;try{n=yield t.stat(e)}catch(t){if(t.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${e}': ${t}`)}}if(n&&n.isFile()){if(t.IS_WINDOWS){const t=c.extname(e).toUpperCase();if(r.some((e=>e.toUpperCase()===t))){return e}}else{if(isUnixExecutable(n)){return e}}}const i=e;for(const o of r){e=i+o;n=undefined;try{n=yield t.stat(e)}catch(t){if(t.code!=="ENOENT"){console.log(`Unexpected error attempting to determine if executable file exists '${e}': ${t}`)}}if(n&&n.isFile()){if(t.IS_WINDOWS){try{const r=c.dirname(e);const n=c.basename(e).toUpperCase();for(const i of yield t.readdir(r)){if(n===i.toUpperCase()){e=c.join(r,i);break}}}catch(t){console.log(`Unexpected error attempting to determine the actual case of the file '${e}': ${t}`)}return e}else{if(isUnixExecutable(n)){return e}}}}return""}))}t.tryGetExecutablePath=tryGetExecutablePath;function normalizeSeparators(e){e=e||"";if(t.IS_WINDOWS){e=e.replace(/\//g,"\\");return e.replace(/\\\\+/g,"\\")}return e.replace(/\/\/+/g,"/")}function isUnixExecutable(e){return(e.mode&1)>0||(e.mode&8)>0&&e.gid===process.getgid()||(e.mode&64)>0&&e.uid===process.getuid()}function getCmdPath(){var e;return(e=process.env["COMSPEC"])!==null&&e!==void 0?e:`cmd.exe`}t.getCmdPath=getCmdPath},436:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};var s=this&&this.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r((function(t){t(e)}))}return new(r||(r=Promise))((function(r,i){function fulfilled(e){try{step(n.next(e))}catch(e){i(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){i(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:true});t.findInPath=t.which=t.mkdirP=t.rmRF=t.mv=t.cp=void 0;const u=r(357);const a=o(r(129));const c=o(r(622));const l=r(669);const d=o(r(962));const f=l.promisify(a.exec);const p=l.promisify(a.execFile);function cp(e,t,r={}){return s(this,void 0,void 0,(function*(){const{force:n,recursive:i,copySourceDirectory:o}=readCopyOptions(r);const s=(yield d.exists(t))?yield d.stat(t):null;if(s&&s.isFile()&&!n){return}const u=s&&s.isDirectory()&&o?c.join(t,c.basename(e)):t;if(!(yield d.exists(e))){throw new Error(`no such file or directory: ${e}`)}const a=yield d.stat(e);if(a.isDirectory()){if(!i){throw new Error(`Failed to copy. ${e} is a directory, but tried to copy without recursive flag.`)}else{yield cpDirRecursive(e,u,0,n)}}else{if(c.relative(e,u)===""){throw new Error(`'${u}' and '${e}' are the same file`)}yield copyFile(e,u,n)}}))}t.cp=cp;function mv(e,t,r={}){return s(this,void 0,void 0,(function*(){if(yield d.exists(t)){let n=true;if(yield d.isDirectory(t)){t=c.join(t,c.basename(e));n=yield d.exists(t)}if(n){if(r.force==null||r.force){yield rmRF(t)}else{throw new Error("Destination already exists")}}}yield mkdirP(c.dirname(t));yield d.rename(e,t)}))}t.mv=mv;function rmRF(e){return s(this,void 0,void 0,(function*(){if(d.IS_WINDOWS){if(/[*"<>|]/.test(e)){throw new Error('File path must not contain `*`, `"`, `<`, `>` or `|` on Windows')}try{const t=d.getCmdPath();if(yield d.isDirectory(e,true)){yield f(`${t} /s /c "rd /s /q "%inputPath%""`,{env:{inputPath:e}})}else{yield f(`${t} /s /c "del /f /a "%inputPath%""`,{env:{inputPath:e}})}}catch(e){if(e.code!=="ENOENT")throw e}try{yield d.unlink(e)}catch(e){if(e.code!=="ENOENT")throw e}}else{let t=false;try{t=yield d.isDirectory(e)}catch(e){if(e.code!=="ENOENT")throw e;return}if(t){yield p(`rm`,[`-rf`,`${e}`])}else{yield d.unlink(e)}}}))}t.rmRF=rmRF;function mkdirP(e){return s(this,void 0,void 0,(function*(){u.ok(e,"a path argument must be provided");yield d.mkdir(e,{recursive:true})}))}t.mkdirP=mkdirP;function which(e,t){return s(this,void 0,void 0,(function*(){if(!e){throw new Error("parameter 'tool' is required")}if(t){const t=yield which(e,false);if(!t){if(d.IS_WINDOWS){throw new Error(`Unable to locate executable file: ${e}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.`)}else{throw new Error(`Unable to locate executable file: ${e}. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.`)}}return t}const r=yield findInPath(e);if(r&&r.length>0){return r[0]}return""}))}t.which=which;function findInPath(e){return s(this,void 0,void 0,(function*(){if(!e){throw new Error("parameter 'tool' is required")}const t=[];if(d.IS_WINDOWS&&process.env["PATHEXT"]){for(const e of process.env["PATHEXT"].split(c.delimiter)){if(e){t.push(e)}}}if(d.isRooted(e)){const r=yield d.tryGetExecutablePath(e,t);if(r){return[r]}return[]}if(e.includes(c.sep)){return[]}const r=[];if(process.env.PATH){for(const e of process.env.PATH.split(c.delimiter)){if(e){r.push(e)}}}const n=[];for(const i of r){const r=yield d.tryGetExecutablePath(c.join(i,e),t);if(r){n.push(r)}}return n}))}t.findInPath=findInPath;function readCopyOptions(e){const t=e.force==null?true:e.force;const r=Boolean(e.recursive);const n=e.copySourceDirectory==null?true:Boolean(e.copySourceDirectory);return{force:t,recursive:r,copySourceDirectory:n}}function cpDirRecursive(e,t,r,n){return s(this,void 0,void 0,(function*(){if(r>=255)return;r++;yield mkdirP(t);const i=yield d.readdir(e);for(const o of i){const i=`${e}/${o}`;const s=`${t}/${o}`;const u=yield d.lstat(i);if(u.isDirectory()){yield cpDirRecursive(i,s,r,n)}else{yield copyFile(i,s,n)}}yield d.chmod(t,(yield d.stat(e)).mode)}))}function copyFile(e,t,r){return s(this,void 0,void 0,(function*(){if((yield d.lstat(e)).isSymbolicLink()){try{yield d.lstat(t);yield d.unlink(t)}catch(e){if(e.code==="EPERM"){yield d.chmod(t,"0666");yield d.unlink(t)}}const r=yield d.readlink(e);yield d.symlink(r,t,d.IS_WINDOWS?"junction":null)}else if(!(yield d.exists(t))||r){yield d.copyFile(e,t)}}))}},84:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.prototype.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};var s=this&&this.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r((function(t){t(e)}))}return new(r||(r=Promise))((function(r,i){function fulfilled(e){try{step(n.next(e))}catch(e){i(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){i(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:true});t.matlab=void 0;const u=o(r(186));const a=o(r(514));const c=o(r(257));t.matlab=c;function run(){return s(this,void 0,void 0,(function*(){const e=process.platform;const t=process.cwd();const r=u.getInput("command");const n=yield u.group("Generate script",(()=>s(this,void 0,void 0,(function*(){const e=yield c.generateScript(t,r);u.info("Successfully generated script");return e}))));yield u.group("Run command",(()=>s(this,void 0,void 0,(function*(){yield c.runCommand(n,e,a.exec)}))))}))}if(false){}},257:function(e,t,r){var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){if(n===undefined)n=r;Object.defineProperty(e,n,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,n){if(n===undefined)n=r;e[n]=t[r]});var i=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var r in e)if(r!=="default"&&Object.prototype.hasOwnProperty.call(e,r))n(t,e,r);i(t,e);return t};var s=this&&this.__awaiter||function(e,t,r,n){function adopt(e){return e instanceof r?e:new r((function(t){t(e)}))}return new(r||(r=Promise))((function(r,i){function fulfilled(e){try{step(n.next(e))}catch(e){i(e)}}function rejected(e){try{step(n["throw"](e))}catch(e){i(e)}}function step(e){e.done?r(e.value):adopt(e.value).then(fulfilled,rejected)}step((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:true});t.getRunMATLABCommandScriptPath=t.runCommand=t.generateScript=void 0;const u=r(747);const a=o(r(87));const c=o(r(622));const l=r(840);const d=o(r(976));function generateScript(e,t){return s(this,void 0,void 0,(function*(){const r=d.safeName(`command_${l.v4()}`);const n=yield u.promises.mkdtemp(c.join(a.tmpdir(),"run_matlab_command-"));const i=c.join(n,r+".m");yield u.promises.writeFile(i,d.cdAndCall(e,t),{encoding:"utf8"});return{dir:n,command:r}}))}t.generateScript=generateScript;function runCommand(e,t,r){return s(this,void 0,void 0,(function*(){const n=getRunMATLABCommandScriptPath(t);yield u.promises.chmod(n,511);const i=d.cdAndCall(e.dir,e.command);const o=yield r(n,[i]);if(o!==0){return Promise.reject(Error(`Exited with non-zero code ${o}`))}}))}t.runCommand=runCommand;function getRunMATLABCommandScriptPath(e){const t=e==="win32"?"bat":"sh";const r=c.join(__dirname,"bin",`run_matlab_command.${t}`);return r}t.getRunMATLABCommandScriptPath=getRunMATLABCommandScriptPath},976:(e,t)=>{Object.defineProperty(t,"__esModule",{value:true});t.safeName=t.pathToCharVec=t.cdAndCall=void 0;function cdAndCall(e,t){return`cd('${pathToCharVec(e)}'); ${t}`}t.cdAndCall=cdAndCall;function pathToCharVec(e){return e.replace(/'/g,"''")}t.pathToCharVec=pathToCharVec;function safeName(e){return e.replace(/-/g,"_")}t.safeName=safeName},840:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});Object.defineProperty(t,"v1",{enumerable:true,get:function(){return n.default}});Object.defineProperty(t,"v3",{enumerable:true,get:function(){return i.default}});Object.defineProperty(t,"v4",{enumerable:true,get:function(){return o.default}});Object.defineProperty(t,"v5",{enumerable:true,get:function(){return s.default}});Object.defineProperty(t,"NIL",{enumerable:true,get:function(){return u.default}});Object.defineProperty(t,"version",{enumerable:true,get:function(){return a.default}});Object.defineProperty(t,"validate",{enumerable:true,get:function(){return c.default}});Object.defineProperty(t,"stringify",{enumerable:true,get:function(){return l.default}});Object.defineProperty(t,"parse",{enumerable:true,get:function(){return d.default}});var n=_interopRequireDefault(r(628));var i=_interopRequireDefault(r(409));var o=_interopRequireDefault(r(122));var s=_interopRequireDefault(r(120));var u=_interopRequireDefault(r(332));var a=_interopRequireDefault(r(595));var c=_interopRequireDefault(r(900));var l=_interopRequireDefault(r(950));var d=_interopRequireDefault(r(746));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}},569:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(417));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function md5(e){if(Array.isArray(e)){e=Buffer.from(e)}else if(typeof e==="string"){e=Buffer.from(e,"utf8")}return n.default.createHash("md5").update(e).digest()}var i=md5;t.default=i},332:(e,t)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var r="00000000-0000-0000-0000-000000000000";t.default=r},746:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(900));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function parse(e){if(!(0,n.default)(e)){throw TypeError("Invalid UUID")}let t;const r=new Uint8Array(16);r[0]=(t=parseInt(e.slice(0,8),16))>>>24;r[1]=t>>>16&255;r[2]=t>>>8&255;r[3]=t&255;r[4]=(t=parseInt(e.slice(9,13),16))>>>8;r[5]=t&255;r[6]=(t=parseInt(e.slice(14,18),16))>>>8;r[7]=t&255;r[8]=(t=parseInt(e.slice(19,23),16))>>>8;r[9]=t&255;r[10]=(t=parseInt(e.slice(24,36),16))/1099511627776&255;r[11]=t/4294967296&255;r[12]=t>>>24&255;r[13]=t>>>16&255;r[14]=t>>>8&255;r[15]=t&255;return r}var i=parse;t.default=i},814:(e,t)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var r=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;t.default=r},807:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=rng;var n=_interopRequireDefault(r(417));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const i=new Uint8Array(256);let o=i.length;function rng(){if(o>i.length-16){n.default.randomFillSync(i);o=0}return i.slice(o,o+=16)}},274:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(417));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function sha1(e){if(Array.isArray(e)){e=Buffer.from(e)}else if(typeof e==="string"){e=Buffer.from(e,"utf8")}return n.default.createHash("sha1").update(e).digest()}var i=sha1;t.default=i},950:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(900));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const i=[];for(let e=0;e<256;++e){i.push((e+256).toString(16).substr(1))}function stringify(e,t=0){const r=(i[e[t+0]]+i[e[t+1]]+i[e[t+2]]+i[e[t+3]]+"-"+i[e[t+4]]+i[e[t+5]]+"-"+i[e[t+6]]+i[e[t+7]]+"-"+i[e[t+8]]+i[e[t+9]]+"-"+i[e[t+10]]+i[e[t+11]]+i[e[t+12]]+i[e[t+13]]+i[e[t+14]]+i[e[t+15]]).toLowerCase();if(!(0,n.default)(r)){throw TypeError("Stringified UUID is invalid")}return r}var o=stringify;t.default=o},628:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(807));var i=_interopRequireDefault(r(950));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}let o;let s;let u=0;let a=0;function v1(e,t,r){let c=t&&r||0;const l=t||new Array(16);e=e||{};let d=e.node||o;let f=e.clockseq!==undefined?e.clockseq:s;if(d==null||f==null){const t=e.random||(e.rng||n.default)();if(d==null){d=o=[t[0]|1,t[1],t[2],t[3],t[4],t[5]]}if(f==null){f=s=(t[6]<<8|t[7])&16383}}let p=e.msecs!==undefined?e.msecs:Date.now();let h=e.nsecs!==undefined?e.nsecs:a+1;const m=p-u+(h-a)/1e4;if(m<0&&e.clockseq===undefined){f=f+1&16383}if((m<0||p>u)&&e.nsecs===undefined){h=0}if(h>=1e4){throw new Error("uuid.v1(): Can't create more than 10M uuids/sec")}u=p;a=h;s=f;p+=122192928e5;const v=((p&268435455)*1e4+h)%4294967296;l[c++]=v>>>24&255;l[c++]=v>>>16&255;l[c++]=v>>>8&255;l[c++]=v&255;const _=p/4294967296*1e4&268435455;l[c++]=_>>>8&255;l[c++]=_&255;l[c++]=_>>>24&15|16;l[c++]=_>>>16&255;l[c++]=f>>>8|128;l[c++]=f&255;for(let e=0;e<6;++e){l[c+e]=d[e]}return t||(0,i.default)(l)}var c=v1;t.default=c},409:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(998));var i=_interopRequireDefault(r(569));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const o=(0,n.default)("v3",48,i.default);var s=o;t.default=s},998:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=_default;t.URL=t.DNS=void 0;var n=_interopRequireDefault(r(950));var i=_interopRequireDefault(r(746));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function stringToBytes(e){e=unescape(encodeURIComponent(e));const t=[];for(let r=0;r{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(807));var i=_interopRequireDefault(r(950));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function v4(e,t,r){e=e||{};const o=e.random||(e.rng||n.default)();o[6]=o[6]&15|64;o[8]=o[8]&63|128;if(t){r=r||0;for(let e=0;e<16;++e){t[r+e]=o[e]}return t}return(0,i.default)(o)}var o=v4;t.default=o},120:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(998));var i=_interopRequireDefault(r(274));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const o=(0,n.default)("v5",80,i.default);var s=o;t.default=s},900:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(814));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function validate(e){return typeof e==="string"&&n.default.test(e)}var i=validate;t.default=i},595:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:true});t.default=void 0;var n=_interopRequireDefault(r(900));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}function version(e){if(!(0,n.default)(e)){throw TypeError("Invalid UUID")}return parseInt(e.substr(14,1),16)}var i=version;t.default=i},357:e=>{e.exports=require("assert")},129:e=>{e.exports=require("child_process")},417:e=>{e.exports=require("crypto")},614:e=>{e.exports=require("events")},747:e=>{e.exports=require("fs")},87:e=>{e.exports=require("os")},622:e=>{e.exports=require("path")},304:e=>{e.exports=require("string_decoder")},213:e=>{e.exports=require("timers")},669:e=>{e.exports=require("util")}};var t={};function __nccwpck_require__(r){var n=t[r];if(n!==undefined){return n.exports}var i=t[r]={exports:{}};var o=true;try{e[r].call(i.exports,i,i.exports,__nccwpck_require__);o=false}finally{if(o)delete t[r]}return i.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var r=__nccwpck_require__(822);module.exports=r})(); \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateCoberturaCodePluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateCoberturaCodePluginExpressionBuilder.m new file mode 100644 index 0000000..b9895ae --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateCoberturaCodePluginExpressionBuilder.m @@ -0,0 +1,21 @@ +classdef CreateCoberturaCodePluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + FilePath = '''coverage.xml''' + Source = {'pwd'} + end + + methods + function set.FilePath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FilePath = value; + end + + function set.Source(obj, value) + scriptgen.internal.validateTextArray(value); + obj.Source = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateCoberturaModelPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateCoberturaModelPluginExpressionBuilder.m new file mode 100644 index 0000000..d28898e --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateCoberturaModelPluginExpressionBuilder.m @@ -0,0 +1,15 @@ +classdef CreateCoberturaModelPluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + FilePath = '''coverage.xml''' + end + + methods + function set.FilePath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FilePath = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLCodePluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLCodePluginExpressionBuilder.m new file mode 100644 index 0000000..9d3af0b --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLCodePluginExpressionBuilder.m @@ -0,0 +1,20 @@ +classdef CreateHTMLCodePluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + FolderPath = '''htmlCodeCoverage''' + Source = {'pwd'} + end + + methods + function set.FolderPath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FolderPath = value; + end + + function set.Source(obj, value) + scriptgen.internal.validateTextArray(value); + obj.Source = value; + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLModelPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLModelPluginExpressionBuilder.m new file mode 100644 index 0000000..5ca0813 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLModelPluginExpressionBuilder.m @@ -0,0 +1,14 @@ +classdef CreateHTMLModelPluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2021 The MathWorks, Inc. + + properties + FolderPath = '''htmlModelCoverage''' + end + + methods + function set.FolderPath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FolderPath = value; + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLTestReportPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLTestReportPluginExpressionBuilder.m new file mode 100644 index 0000000..1ec207d --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHTMLTestReportPluginExpressionBuilder.m @@ -0,0 +1,14 @@ +classdef CreateHTMLTestReportPluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2021 The MathWorks, Inc. + + properties + FolderPath = '''report''' + end + + methods + function set.FolderPath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FolderPath = value; + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateHasBaseFolderSelectorExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHasBaseFolderSelectorExpressionBuilder.m new file mode 100644 index 0000000..b6ea0d9 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHasBaseFolderSelectorExpressionBuilder.m @@ -0,0 +1,14 @@ +classdef CreateHasBaseFolderSelectorExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + BaseFolder = {'pwd'} + end + + methods + function set.BaseFolder(obj, value) + scriptgen.internal.validateTextArray(value); + obj.BaseFolder = value; + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateHasTagSelectorExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHasTagSelectorExpressionBuilder.m new file mode 100644 index 0000000..701c8e2 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateHasTagSelectorExpressionBuilder.m @@ -0,0 +1,15 @@ +classdef CreateHasTagSelectorExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + Tag = '''tag''' + end + + methods + function set.Tag(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.Tag = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateJUnitPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateJUnitPluginExpressionBuilder.m new file mode 100644 index 0000000..b43f40d --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateJUnitPluginExpressionBuilder.m @@ -0,0 +1,15 @@ +classdef CreateJUnitPluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + FilePath = '''results.xml''' + end + + methods + function set.FilePath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FilePath = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreatePDFPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreatePDFPluginExpressionBuilder.m new file mode 100644 index 0000000..8d2a739 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreatePDFPluginExpressionBuilder.m @@ -0,0 +1,15 @@ +classdef CreatePDFPluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + FilePath = '''report.pdf''' + end + + methods + function set.FilePath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FilePath = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateSimulinkTestPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateSimulinkTestPluginExpressionBuilder.m new file mode 100644 index 0000000..8c6cc60 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateSimulinkTestPluginExpressionBuilder.m @@ -0,0 +1,4 @@ +classdef CreateSimulinkTestPluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. +end + diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateSimulinkTestResultsPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateSimulinkTestResultsPluginExpressionBuilder.m new file mode 100644 index 0000000..c72b63c --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateSimulinkTestResultsPluginExpressionBuilder.m @@ -0,0 +1,15 @@ +classdef CreateSimulinkTestResultsPluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + FilePath = '''results.mldatx''' + end + + methods + function set.FilePath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FilePath = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+expressions/+test/CreateTAPPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+expressions/+test/CreateTAPPluginExpressionBuilder.m new file mode 100644 index 0000000..bab3767 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+expressions/+test/CreateTAPPluginExpressionBuilder.m @@ -0,0 +1,15 @@ +classdef CreateTAPPluginExpressionBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + FilePath = '''results.tap''' + end + + methods + function set.FilePath(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.FilePath = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateCoberturaCodePluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateCoberturaCodePluginExpressionBuilder.m new file mode 100644 index 0000000..5e8f763 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateCoberturaCodePluginExpressionBuilder.m @@ -0,0 +1,24 @@ +classdef CreateCoberturaCodePluginExpressionBuilder < scriptgen.expressions.test.CreateCoberturaCodePluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2017b') + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = { ... + 'matlab.unittest.plugins.codecoverage.CoberturaFormat', ... + 'matlab.unittest.plugins.CodeCoveragePlugin'}; + + source = strjoin(obj.Source, ', '); + text = sprintf('CodeCoveragePlugin.forFolder({%s}, ''IncludingSubfolders'', true, ''Producing'', CoberturaFormat(%s))', source, obj.FilePath); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateCoberturaModelPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateCoberturaModelPluginExpressionBuilder.m new file mode 100644 index 0000000..6341926 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateCoberturaModelPluginExpressionBuilder.m @@ -0,0 +1,25 @@ +classdef CreateCoberturaModelPluginExpressionBuilder < scriptgen.expressions.test.CreateCoberturaModelPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent ... + & scriptgen.internal.mixin.PathDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2018b') + RequiredPathNames = {'sltest.plugins.ModelCoveragePlugin'} + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = { ... + 'matlab.unittest.plugins.codecoverage.CoberturaFormat', ... + 'sltest.plugins.ModelCoveragePlugin'}; + + text = sprintf('ModelCoveragePlugin(''Producing'', CoberturaFormat(%s))', obj.FilePath); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLCodePluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLCodePluginExpressionBuilder.m new file mode 100644 index 0000000..d5f3462 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLCodePluginExpressionBuilder.m @@ -0,0 +1,24 @@ +classdef CreateHTMLCodePluginExpressionBuilder< scriptgen.expressions.test.CreateHTMLCodePluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2019a') + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = { ... + 'matlab.unittest.plugins.codecoverage.CoverageReport', ... + 'matlab.unittest.plugins.CodeCoveragePlugin'}; + + source = strjoin(obj.Source, ', '); + text = sprintf('CodeCoveragePlugin.forFolder({%s}, ''IncludingSubfolders'', true, ''Producing'', CoverageReport(%s))', source, obj.FolderPath); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLModelPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLModelPluginExpressionBuilder.m new file mode 100644 index 0000000..b9cebb3 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLModelPluginExpressionBuilder.m @@ -0,0 +1,34 @@ +classdef CreateHTMLModelPluginExpressionBuilder < scriptgen.expressions.test.CreateHTMLModelPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent ... + & scriptgen.internal.mixin.PathDependent + % Copyright 2021 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2018a') + RequiredPathNames = {'sltest.plugins.ModelCoveragePlugin'} + end + + methods + function expression = build(obj) + import scriptgen.Expression; + import scriptgen.internal.unquoteText; + import scriptgen.internal.isAbsolutePath; + + imports = { ... + 'sltest.plugins.coverage.ModelCoverageReport', ... + 'sltest.plugins.ModelCoveragePlugin'}; + + % ModelCoverage report does not handle relative paths + if ~strcmp(obj.FolderPath, unquoteText(obj.FolderPath)) && ~isAbsolutePath(unquoteText(obj.FolderPath)) + folderPath = ['fullfile(pwd, ' obj.FolderPath ')']; + else + folderPath = obj.FolderPath; + end + + text = sprintf('ModelCoveragePlugin(''Producing'', ModelCoverageReport(%s))', folderPath); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLTestReportPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLTestReportPluginExpressionBuilder.m new file mode 100644 index 0000000..5b5439e --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHTMLTestReportPluginExpressionBuilder.m @@ -0,0 +1,20 @@ +classdef CreateHTMLTestReportPluginExpressionBuilder < scriptgen.expressions.test.CreateHTMLTestReportPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2021 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2017b') + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = {'matlab.unittest.plugins.TestReportPlugin'}; + + text = sprintf('TestReportPlugin.producingHTML(%s)', obj.FolderPath); + + expression = Expression(text, imports); + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHasBaseFolderSelectorExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHasBaseFolderSelectorExpressionBuilder.m new file mode 100644 index 0000000..36cfc77 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHasBaseFolderSelectorExpressionBuilder.m @@ -0,0 +1,36 @@ +classdef CreateHasBaseFolderSelectorExpressionBuilder < scriptgen.expressions.test.CreateHasBaseFolderSelectorExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2014a') + end + + methods + function expression = build(obj) + import scriptgen.internal.unquoteText; + import scriptgen.internal.isAbsolutePath; + import scriptgen.Expression; + + imports = { ... + 'matlab.unittest.selectors.HasBaseFolder', ... + 'matlab.unittest.constraints.StartsWithSubstring'}; + + constraints = {}; + for i = 1:numel(obj.BaseFolder) + folder = obj.BaseFolder{i}; + if ~strcmp(folder, unquoteText(folder)) && ~isAbsolutePath(unquoteText(folder)) + text = sprintf('StartsWithSubstring(fullfile(pwd, %s))', folder); + else + text = sprintf('StartsWithSubstring(%s)', folder); + end + constraints{end+1} = text; %#ok + end + + text = sprintf('HasBaseFolder(%s)', strjoin(constraints, ' | ')); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHasTagSelectorExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHasTagSelectorExpressionBuilder.m new file mode 100644 index 0000000..77c853e --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateHasTagSelectorExpressionBuilder.m @@ -0,0 +1,23 @@ +classdef CreateHasTagSelectorExpressionBuilder < scriptgen.expressions.test.CreateHasTagSelectorExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2015a') + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = {'matlab.unittest.selectors.HasTag'}; + + text = sprintf('HasTag(%s)', obj.Tag); + + expression = Expression(text, imports); + end + end +end + + + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateJUnitPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateJUnitPluginExpressionBuilder.m new file mode 100644 index 0000000..91402b8 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateJUnitPluginExpressionBuilder.m @@ -0,0 +1,21 @@ +classdef CreateJUnitPluginExpressionBuilder < scriptgen.expressions.test.CreateJUnitPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2015b') + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = {'matlab.unittest.plugins.XMLPlugin'}; + + text = sprintf('XMLPlugin.producingJUnitFormat(%s)', obj.FilePath); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreatePDFPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreatePDFPluginExpressionBuilder.m new file mode 100644 index 0000000..96ca0cb --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreatePDFPluginExpressionBuilder.m @@ -0,0 +1,23 @@ +classdef CreatePDFPluginExpressionBuilder < scriptgen.expressions.test.CreatePDFPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent ... + & scriptgen.internal.mixin.PlatformDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2017a') + SupportedPlatforms = {'GLN', 'PC'} + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = {'matlab.unittest.plugins.TestReportPlugin'}; + + text = sprintf('TestReportPlugin.producingPDF(%s)', obj.FilePath); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateSimulinkTestPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateSimulinkTestPluginExpressionBuilder.m new file mode 100644 index 0000000..c64714f --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateSimulinkTestPluginExpressionBuilder.m @@ -0,0 +1,23 @@ +classdef CreateSimulinkTestPluginExpressionBuilder < scriptgen.expressions.test.CreateSimulinkTestPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent ... + & scriptgen.internal.mixin.PathDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2018b') + RequiredPathNames = {'sltest.plugins.TestManagerResultsPlugin'} + end + + methods + function expression = build(~) + import scriptgen.Expression; + + imports = {'sltest.plugins.TestManagerResultsPlugin'}; + + text = sprintf('TestManagerResultsPlugin()'); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateSimulinkTestResultsPluginExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateSimulinkTestResultsPluginExpressionBuilder.m new file mode 100644 index 0000000..0868483 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateSimulinkTestResultsPluginExpressionBuilder.m @@ -0,0 +1,23 @@ +classdef CreateSimulinkTestResultsPluginExpressionBuilder < scriptgen.expressions.test.CreateSimulinkTestResultsPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent ... + & scriptgen.internal.mixin.PathDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2019a') + RequiredPathNames = {'sltest.plugins.TestManagerResultsPlugin'} + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = {'sltest.plugins.TestManagerResultsPlugin'}; + + text = sprintf('TestManagerResultsPlugin(''ExportToFile'', %s)', obj.FilePath); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateTAPPluginUsingProducingOriginalFormatExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateTAPPluginUsingProducingOriginalFormatExpressionBuilder.m new file mode 100644 index 0000000..03e1d6a --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateTAPPluginUsingProducingOriginalFormatExpressionBuilder.m @@ -0,0 +1,32 @@ +classdef CreateTAPPluginUsingProducingOriginalFormatExpressionBuilder < scriptgen.expressions.test.CreateTAPPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2014a') + end + + methods + function expression = build(obj) + import scriptgen.Expression; + import scriptgen.internal.unquoteText; + import scriptgen.internal.isAbsolutePath; + + imports = { ... + 'matlab.unittest.plugins.ToFile', ... + 'matlab.unittest.plugins.TAPPlugin'}; + + % Fixes an issue where ToFile did not properly resolve + % fullpaths prior to R2015a. + if ~strcmp(obj.FilePath, unquoteText(obj.FilePath)) && ~isAbsolutePath(unquoteText(obj.FilePath)) + filePath = ['fullfile(pwd, ' obj.FilePath ')']; + else + filePath = obj.FilePath; + end + + text = sprintf('TAPPlugin.producingOriginalFormat(ToFile(%s))', filePath); + + expression = Expression(text, imports); + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateTAPPluginUsingProducingVersion13ExpressionBuilder.m b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateTAPPluginUsingProducingVersion13ExpressionBuilder.m new file mode 100644 index 0000000..2821d5b --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+expressions/+test/CreateTAPPluginUsingProducingVersion13ExpressionBuilder.m @@ -0,0 +1,23 @@ +classdef CreateTAPPluginUsingProducingVersion13ExpressionBuilder < scriptgen.expressions.test.CreateTAPPluginExpressionBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2016b') + end + + methods + function expression = build(obj) + import scriptgen.Expression; + + imports = { ... + 'matlab.unittest.plugins.ToFile', ... + 'matlab.unittest.plugins.TAPPlugin'}; + + text = sprintf('TAPPlugin.producingVersion13(ToFile(%s))', obj.FilePath); + + expression = Expression(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+mixin/EnvironmentDependent.m b/dist/scriptgen/+scriptgen/+internal/+mixin/EnvironmentDependent.m new file mode 100644 index 0000000..abfaf51 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+mixin/EnvironmentDependent.m @@ -0,0 +1,41 @@ +classdef (Hidden, HandleCompatible) EnvironmentDependent + % EnvironmentDependent - Base class for mixins that indicate a class is + % dependent on the runtime environment in some way + % + % When a mixin class subclasses EnvironmentDependent, it should call + % the addIsSupportedFunction method in its constructor and add a + % function that evaluates to true/false depending on the current + % runtime environment. + + % Copyright 2020 The MathWorks, Inc. + + properties (Access = private) + IsSupportedFunctions + end + + methods + function tf = isSupportedByCurrentEnvironment(obj) + for i = 1:numel(obj.IsSupportedFunctions) + isSupported = obj.IsSupportedFunctions{i}; + if ~isSupported(obj) + tf = false; + return; + end + end + tf = true; + end + end + + methods (Hidden, Access = protected) + function obj = EnvironmentDependent() + if isempty(obj.IsSupportedFunctions) + obj.IsSupportedFunctions = {}; + end + end + + function obj = addIsSupportedFunction(obj, fcn) + obj.IsSupportedFunctions{end+1} = fcn; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+mixin/PathDependent.m b/dist/scriptgen/+scriptgen/+internal/+mixin/PathDependent.m new file mode 100644 index 0000000..b7067d3 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+mixin/PathDependent.m @@ -0,0 +1,24 @@ +classdef (Hidden, HandleCompatible) PathDependent < scriptgen.internal.mixin.EnvironmentDependent + % PathDependent - Indicates a class requires a set of path names on the + % current MATLAB search path + + % Copyright 2020 The MathWorks, Inc. + + properties (Abstract, Constant, Access = protected) + RequiredPathNames + end + + methods (Hidden, Access = protected) + function obj = PathDependent() + obj = obj.addIsSupportedFunction(@requiredNamesExistOnCurrentPath); + end + end + + methods (Access = protected) + function tf = requiredNamesExistOnCurrentPath(obj) + ret = cellfun(@(n)exist(n), obj.RequiredPathNames); %#ok + tf = all(ismember(ret, [2 3 4 5 6 7 8])); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+mixin/PlatformDependent.m b/dist/scriptgen/+scriptgen/+internal/+mixin/PlatformDependent.m new file mode 100644 index 0000000..b6617c7 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+mixin/PlatformDependent.m @@ -0,0 +1,25 @@ +classdef (Hidden, HandleCompatible) PlatformDependent < scriptgen.internal.mixin.EnvironmentDependent + % PlatformDependent - Indicates a class requires a particular runtime + % platform like PCWIN64 or MACI64 + + % Copyright 2020 The MathWorks, Inc. + + properties (Abstract, Constant, Access = protected) + SupportedPlatforms + end + + methods (Hidden, Access = protected) + function obj = PlatformDependent() + obj = obj.addIsSupportedFunction(@isSupportedByCurrentPlatform); + end + end + + methods (Access = protected) + function tf = isSupportedByCurrentPlatform(obj) + exp = ['^(' strjoin(obj.SupportedPlatforms, '|') ')\w*']; + matches = regexp(computer(), exp, 'once'); + tf = any(matches); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+mixin/Preferable.m b/dist/scriptgen/+scriptgen/+internal/+mixin/Preferable.m new file mode 100644 index 0000000..b9fd4a5 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+mixin/Preferable.m @@ -0,0 +1,75 @@ +classdef (Hidden, HandleCompatible) Preferable + % Preferable - Base class for mixins that indicate an array of class + % objects may be sorted by some type of preferability + % + % When a mixin class subclasses Preferable, it should call the + % addPreferabilityComparator method in its constructor and add a + % function that accepts two objects and returns a negative value, + % zero, or positive value if the first object is less than, equal to, + % or greater than the second object. + % + % Note: one or both objects passed to the comparator may not derive + % from the mixin class. + + % Copyright 2020 The MathWorks, Inc. + + properties (Access = private) + PreferabilityComparators + end + + methods (Sealed) + function sorted = sortByPreferability(array) + map = mergeMaps({array.PreferabilityComparators}); + sorted = insertionSort(array, @(a,b)chainedComparator(a,b,map.values)); + end + end + + methods (Hidden, Access = protected) + function obj = Preferable() + if isempty(obj.PreferabilityComparators) + obj.PreferabilityComparators = containers.Map(); + end + end + + function obj = addPreferabilityComparator(obj, mixinClass, comparator) + obj.PreferabilityComparators(mixinClass) = comparator; + end + end +end + +function sorted = insertionSort(array, comparator) +for i = 2:numel(array) + key = array(i); + j = i - 1; + while j >= 1 && comparator(array(j), key) > 0 + array(j+1) = array(j); + j = j - 1; + end + array(j+1) = key; +end +sorted = array; +end + +function p = chainedComparator(a, b, comparators) +for i = 1:numel(comparators) + compare = comparators{i}; + value = compare(a, b); + assert(compare(b, a) == -value, 'comparator violates contract!'); + if value ~= 0 + p = value; + return; + end +end +p = 0; +end + +function m = mergeMaps(maps) +m = containers.Map(); +for i = 1:numel(maps) + map = maps{i}; + keys = map.keys; + for j = 1:numel(keys) + m(keys{j}) = map(keys{j}); + end +end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+internal/+mixin/SetGet.m b/dist/scriptgen/+scriptgen/+internal/+mixin/SetGet.m new file mode 100644 index 0000000..902d618 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+mixin/SetGet.m @@ -0,0 +1,19 @@ +classdef (Abstract) SetGet < handle + % SetGet - A primitive alternative to matlab.mixin.SetGet that works + % with releases prior to R2014b + + % Copyright 2020 The MathWorks, Inc. + + methods + function set(obj, varargin) + for i = 1:2:numel(varargin) + obj.(varargin{i}) = varargin{i+1}; + end + end + + function value = get(obj, name) + value = obj.(name); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+mixin/VersionDependent.m b/dist/scriptgen/+scriptgen/+internal/+mixin/VersionDependent.m new file mode 100644 index 0000000..8108a08 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+mixin/VersionDependent.m @@ -0,0 +1,41 @@ +classdef (Hidden, HandleCompatible) VersionDependent < scriptgen.internal.mixin.EnvironmentDependent ... + & scriptgen.internal.mixin.Preferable + % VersionDependent - Indicates a class requires a particular version of + % MATLAB + + % Copyright 2020 The MathWorks, Inc. + + properties (Abstract, Constant, Access = protected) + MinSupportedVersion + end + + methods (Hidden, Access = protected) + function obj = VersionDependent() + obj = obj.addIsSupportedFunction(@isSupportedByCurrentVersion); + obj = obj.addPreferabilityComparator('scriptgen.internal.mixin.VersionDependent', @comparePreferabilityByMinVersion); + end + end + + methods (Access = protected) + function tf = isSupportedByCurrentVersion(obj) + import scriptgen.internal.Version; + tf = obj.MinSupportedVersion <= Version.forCurrentRelease(); + end + end +end + +function p = comparePreferabilityByMinVersion(a, b) + if ~isa(a, 'scriptgen.internal.mixin.VersionDependent') && ~isa(b, 'scriptgen.internal.mixin.VersionDependent') + p = 0; + elseif ~isa(a, 'scriptgen.internal.mixin.VersionDependent') + p = -1; + elseif ~isa(b, 'scriptgen.internal.mixin.VersionDependent') + p = 1; + elseif a.MinSupportedVersion == b.MinSupportedVersion + p = 0; + elseif a.MinSupportedVersion < b.MinSupportedVersion + p = -1; + else + p = 1; + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+internal/+scripts/TestScriptBuilder.m b/dist/scriptgen/+scriptgen/+internal/+scripts/TestScriptBuilder.m new file mode 100644 index 0000000..91a4275 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+scripts/TestScriptBuilder.m @@ -0,0 +1,178 @@ +classdef TestScriptBuilder < scriptgen.scripts.TestScriptBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 - 2021 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2013a') + end + + methods + function script = build(obj) + import scriptgen.Script; + import scriptgen.Sequence; + + testCodeProvider = obj.CodeProvider.withSubpackage('test'); + + suiteName = 'suite'; + runnerName = 'runner'; + resultsName = 'results'; + + sequences = Sequence.empty(); + + if ~isempty(obj.WorkingFolder) + sequences(end+1) = Sequence(sprintf('cd(''%s'');', escape(obj.WorkingFolder))); + end + + sequences = [sequences obj.buildAddpathSequence()]; + + sequences(end+1) = testCodeProvider.createSequence('CreateTestSuite', ... + 'CodeProvider', obj.CodeProvider, ... + 'SuiteName', suiteName,... + 'SelectByFolder', quoteCell(splitPath(obj.SelectByFolder)),... + 'SelectByTag', quote(obj.SelectByTag)); + + sequences = [sequences obj.buildMkdirSequence()]; + + sequences = [sequences obj.buildDeleteSequence()]; + + source = obj.SourceFolder; + if isempty(source) + source = '.'; + end + + sequences(end+1) = testCodeProvider.createSequence('CreateTestRunner', ... + 'CodeProvider', obj.CodeProvider, ... + 'RunnerName', runnerName, ... + 'PDFTestReport', quote(obj.PDFTestReport), ... + 'HTMLTestReport', quote(obj.HTMLTestReport), ... + 'TAPTestResults', quote(obj.TAPTestResults), ... + 'JUnitTestResults', quote(obj.JUnitTestResults), ... + 'SimulinkTestResults', quote(obj.SimulinkTestResults), ... + 'CoberturaCodeCoverage', quote(obj.CoberturaCodeCoverage), ... + 'HTMLCodeCoverage', quote(obj.HTMLCodeCoverage), ... + 'CoberturaModelCoverage', quote(obj.CoberturaModelCoverage), ... + 'HTMLModelCoverage', quote(obj.HTMLModelCoverage), ... + 'SourceFolder', quoteCell(splitPath(source))); + + sequences(end+1) = Sequence( ... + sprintf('%s = %s.run(%s);', resultsName, runnerName, suiteName)); + + sequences(end+1) = testCodeProvider.createSequence('AssertNoFailures', ... + 'CodeProvider', obj.CodeProvider, ... + 'ResultsName', resultsName); + + script = Script(sequences); + end + end + + methods (Access = private) + function s = buildAddpathSequence(obj) + import scriptgen.Sequence; + + dirs = splitPath(obj.SourceFolder); + + if isempty(dirs) + s = Sequence.empty(); + return; + end + + for i = numel(dirs):-1:1 + code{i} = sprintf('addpath(genpath(''%s''));', escape(dirs{i})); + end + s = Sequence(code); + end + + function s = buildMkdirSequence(obj) + import scriptgen.Sequence; + + dirs = cellfun(@(f)fileparts(f), { ... + obj.PDFTestReport, ... + obj.TAPTestResults, ... + obj.JUnitTestResults, ... + obj.SimulinkTestResults, ... + obj.CoberturaCodeCoverage, ... + obj.CoberturaModelCoverage}, ... + 'UniformOutput', false); + + % HTML artifacts take in folder path + htmlDirs = {obj.HTMLTestReport, ... + obj.HTMLCodeCoverage, ... + obj.HTMLModelCoverage}; + + dirs = [dirs htmlDirs]; + + dirs = dirs(~cellfun(@isempty, dirs)); + dirs = unique(dirs); + + if isempty(dirs) + s = Sequence.empty(); + return; + end + + for i = numel(dirs):-1:1 + code{i} = sprintf('[~,~] = mkdir(''%s'');', escape(dirs{i})); + end + s = Sequence(code); + end + + function s = buildDeleteSequence(obj) + import scriptgen.Sequence; + import scriptgen.internal.isAbsolutePath; + + % Only pre-existing TAP results need to be explicitly deleted + % at the moment. Other artifacts are automatically overwritten + % by their respective plugin. + files = {obj.TAPTestResults}; + files = files(~cellfun(@isempty, files)); + files = unique(files); + + if isempty(files) + s = Sequence.empty(); + return; + end + + code = {}; + for i = 1:numel(files) + filePath = escape(files{i}); + if ~isAbsolutePath(filePath) + fullFilePath = sprintf('fullfile(pwd, ''%s'')', filePath); + else + fullFilePath = sprintf('''%s''', filePath); + end + c{1} = sprintf('if exist(%s, ''file'') == 2', fullFilePath); + c{2} = sprintf(' delete(''%s'');', filePath); + c{3} = sprintf('end'); + code = [code c]; %#ok + end + s = Sequence(code); + end + end +end + +function text = splitPath(text) +if iscellstr(text) %#ok + return; +elseif isempty(text) + text = {}; +else + text = strtrim(strsplit(text, {';', ':'})); +end +end + +function text = quote(text) +if isempty(text) + return; +end +text = ['''' escape(text) '''']; +end + +function text = quoteCell(text) +text = cellfun(@(t)['''' t ''''], escape(text), 'UniformOutput', false); +end + +function text = escape(text) +if isempty(text) + return; +end +text = strrep(text, '''', ''''''); +end diff --git a/dist/scriptgen/+scriptgen/+internal/+sequences/+test/AssertNoFailuresSequenceBuilder.m b/dist/scriptgen/+scriptgen/+internal/+sequences/+test/AssertNoFailuresSequenceBuilder.m new file mode 100644 index 0000000..55249af --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+sequences/+test/AssertNoFailuresSequenceBuilder.m @@ -0,0 +1,19 @@ +classdef AssertNoFailuresSequenceBuilder < scriptgen.sequences.test.AssertNoFailuresSequenceBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2013a') + end + + methods + function sequence = build(obj) + import scriptgen.Sequence; + + sequence = Sequence({ ... + sprintf('nfailed = nnz([%s.Failed]);', obj.ResultsName), ... + 'assert(nfailed == 0, [num2str(nfailed) '' test(s) failed.'']);'}); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+sequences/+test/CreateTestRunnerSequenceBuilder.m b/dist/scriptgen/+scriptgen/+internal/+sequences/+test/CreateTestRunnerSequenceBuilder.m new file mode 100644 index 0000000..740a495 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+sequences/+test/CreateTestRunnerSequenceBuilder.m @@ -0,0 +1,113 @@ +classdef CreateTestRunnerSequenceBuilder < scriptgen.sequences.test.CreateTestRunnerSequenceBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 - 2021 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2013a') + end + + methods + function sequence = build(obj) + import scriptgen.Sequence; + + if ~isempty(obj.CoberturaCodeCoverage) && isempty(obj.SourceFolder) + error('scriptgen:CreateTestRunner:sourceRequiredForCoberturaCodeCoverage', ... + '''SourceFolder'' is required when specifying ''CoberturaCodeCoverage''.'); + end + + if ~isempty(obj.HTMLCodeCoverage) && isempty(obj.SourceFolder) + error('scriptgen:CreateTestRunner:sourceRequiredForHTMLCodeCoverage', ... + '''SourceFolder'' is required when specifying ''HTMLCodeCoverage''.'); + end + + testCodeProvider = obj.CodeProvider.withSubpackage('test'); + + statements = testCodeProvider.createStatement('CreateTestRunner', ... + 'RunnerName', obj.RunnerName); + + hasPDF = false; + if ~isempty(obj.PDFTestReport) + [statements(end+1), hasPDF] = obj.buildPluginStatement(testCodeProvider, 'PDF test reports', ... + 'CreatePDFPlugin', 'FilePath', obj.PDFTestReport); + end + + if ~isempty(obj.HTMLTestReport) + [statements(end+1)] = obj.buildPluginStatement(testCodeProvider, 'HTML test reports', ... + 'CreateHTMLTestReportPlugin', 'FolderPath', obj.HTMLTestReport); + end + + + if ~isempty(obj.TAPTestResults) + statements(end+1) = obj.buildPluginStatement(testCodeProvider, 'TAP test results', ... + 'CreateTAPPlugin', 'FilePath', obj.TAPTestResults); + end + + if ~isempty(obj.JUnitTestResults) + statements(end+1) = obj.buildPluginStatement(testCodeProvider, 'JUnit test results', ... + 'CreateJUnitPlugin', 'FilePath', obj.JUnitTestResults); + end + + hasSimTest = false; + if ~isempty(obj.SimulinkTestResults) + [statements(end+1), hasSimTest] = obj.buildPluginStatement(testCodeProvider, 'Simulink test results', ... + 'CreateSimulinkTestResultsPlugin', 'FilePath', obj.SimulinkTestResults); + end + + if hasPDF && ~hasSimTest + statements = [statements obj.buildAddPluginStatement(testCodeProvider.createExpression('CreateSimulinkTestPlugin'))]; + end + + if ~isempty(obj.CoberturaCodeCoverage) + statements(end+1) = obj.buildPluginStatement(testCodeProvider, 'Cobertura code coverage', ... + 'CreateCoberturaCodePlugin', 'FilePath', obj.CoberturaCodeCoverage, 'Source', obj.SourceFolder); + end + + if ~isempty(obj.HTMLCodeCoverage) + statements(end+1) = obj.buildPluginStatement(testCodeProvider, 'HTML code coverage', ... + 'CreateHTMLCodePlugin', 'FolderPath', obj.HTMLCodeCoverage, 'Source', obj.SourceFolder); + end + + if ~isempty(obj.CoberturaModelCoverage) + statements(end+1) = obj.buildPluginStatement(testCodeProvider, 'Cobertura model coverage', ... + 'CreateCoberturaModelPlugin', 'FilePath', obj.CoberturaModelCoverage); + end + + if ~isempty(obj.HTMLModelCoverage) + statements(end+1) = obj.buildPluginStatement(testCodeProvider, 'HTML model coverage', ... + 'CreateHTMLModelPlugin', 'FolderPath', obj.HTMLModelCoverage); + end + + + sequence = Sequence(statements); + end + end + + methods (Access = private) + function [statement, success] = buildPluginStatement(obj, provider, name, type, varargin) + import scriptgen.Statement; + + statement = obj.buildAddPluginStatement(provider.createExpression(type, varargin{:})); + if isempty(statement) + success = false; + msg = ['Unable to produce ' name '. This problem might be due to a MATLAB release ' ... + 'or operating system that does not support generating the specified artifact, ' ... + 'a missing toolbox, or a missing license.']; + statement = Statement(['% ' msg]); + warning('scriptgen:featureNotAvailable', msg); + return; + end + + success = true; + end + + function statement = buildAddPluginStatement(obj, expression) + import scriptgen.Statement; + + if isempty(expression) + statement = Statement.empty(); + return; + end + statement = Statement(sprintf('%s.addPlugin(%s);', obj.RunnerName, expression.Text), expression.RequiredImports); + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+internal/+sequences/+test/CreateTestSuiteSequenceBuilder.m b/dist/scriptgen/+scriptgen/+internal/+sequences/+test/CreateTestSuiteSequenceBuilder.m new file mode 100644 index 0000000..72fdafa --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+sequences/+test/CreateTestSuiteSequenceBuilder.m @@ -0,0 +1,61 @@ +classdef CreateTestSuiteSequenceBuilder < scriptgen.sequences.test.CreateTestSuiteSequenceBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2013a') + end + + methods + function sequence = build(obj) + import scriptgen.Sequence; + + testCodeProvider = obj.CodeProvider.withSubpackage('test'); + + statements = testCodeProvider.createStatement('CreateTestSuite', ... + 'SuiteName', obj.SuiteName); + + if ~isempty(obj.SelectByFolder) + statements(end+1) = obj.buildSelectorStatement(testCodeProvider, 'base folder selector', ... + 'CreateHasBaseFolderSelector', 'BaseFolder', obj.SelectByFolder); + end + + if ~isempty(obj.SelectByTag) + statements(end+1) = obj.buildSelectorStatement(testCodeProvider, 'tag selector', ... + 'CreateHasTagSelector', 'Tag', obj.SelectByTag); + end + + sequence = Sequence(statements); + end + end + + methods (Access = private) + function [statement, success] = buildSelectorStatement(obj, provider, name, type, varargin) + import scriptgen.Statement; + + statement = obj.buildSelectIfStatement(provider.createExpression(type, varargin{:})); + if isempty(statement) + success = false; + msg = ['Unable to create ' name '. This problem might be due to a MATLAB release ' ... + 'or operating system that does not support generating the specified artifact, ' ... + 'a missing toolbox, or a missing license.']; + statement = Statement(['% ' msg]); + warning('scriptgen:selector:featureNotAvailable', msg); + return; + end + + success = true; + end + + function statement = buildSelectIfStatement(obj, expression) + import scriptgen.Statement; + + if isempty(expression) + statement = Statement.empty(); + return; + end + statement = Statement(sprintf('%s = %s.selectIf(%s);', obj.SuiteName, obj.SuiteName, expression.Text), expression.RequiredImports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputDetailStatementBuilder.m b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputDetailStatementBuilder.m new file mode 100644 index 0000000..20dd5c0 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputDetailStatementBuilder.m @@ -0,0 +1,23 @@ +classdef CreateTestRunnerUsingWithTextOutputDetailStatementBuilder < scriptgen.statements.test.CreateTestRunnerStatementBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2018b') + end + + methods + function statement = build(obj) + import scriptgen.Statement; + + imports = { ... + 'matlab.unittest.Verbosity', ... + 'matlab.unittest.TestRunner'}; + + text = sprintf('%s = TestRunner.withTextOutput(''OutputDetail'', Verbosity.Detailed);', obj.RunnerName); + + statement = Statement(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputStatementBuilder.m b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputStatementBuilder.m new file mode 100644 index 0000000..6489599 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputStatementBuilder.m @@ -0,0 +1,21 @@ +classdef CreateTestRunnerUsingWithTextOutputStatementBuilder < scriptgen.statements.test.CreateTestRunnerStatementBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2013a') + end + + methods + function statement = build(obj) + import scriptgen.Statement; + + imports = {'matlab.unittest.TestRunner'}; + + text = sprintf('%s = TestRunner.withTextOutput();', obj.RunnerName); + + statement = Statement(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputVerbosityStatementBuilder.m b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputVerbosityStatementBuilder.m new file mode 100644 index 0000000..c75ccc6 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestRunnerUsingWithTextOutputVerbosityStatementBuilder.m @@ -0,0 +1,23 @@ +classdef CreateTestRunnerUsingWithTextOutputVerbosityStatementBuilder < scriptgen.statements.test.CreateTestRunnerStatementBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2014b') + end + + methods + function statement = build(obj) + import scriptgen.Statement; + + imports = { ... + 'matlab.unittest.Verbosity', ... + 'matlab.unittest.TestRunner'}; + + text = sprintf('%s = TestRunner.withTextOutput(''Verbosity'', Verbosity.Detailed);', obj.RunnerName); + + statement = Statement(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestSuiteUsingFromFolderStatementBuilder.m b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestSuiteUsingFromFolderStatementBuilder.m new file mode 100644 index 0000000..a35272f --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestSuiteUsingFromFolderStatementBuilder.m @@ -0,0 +1,21 @@ +classdef CreateTestSuiteUsingFromFolderStatementBuilder < scriptgen.statements.test.CreateTestSuiteStatementBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2013a') + end + + methods + function statement = build(obj) + import scriptgen.Statement; + + imports = {'matlab.unittest.TestSuite'}; + + text = sprintf('%s = TestSuite.fromFolder(pwd, ''IncludingSubfolders'', true);', obj.SuiteName); + + statement = Statement(text, imports); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestSuiteUsingTestsuiteStatementBuilder.m b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestSuiteUsingTestsuiteStatementBuilder.m new file mode 100644 index 0000000..f9ffc69 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/+statements/+test/CreateTestSuiteUsingTestsuiteStatementBuilder.m @@ -0,0 +1,19 @@ +classdef CreateTestSuiteUsingTestsuiteStatementBuilder < scriptgen.statements.test.CreateTestSuiteStatementBuilder ... + & scriptgen.internal.mixin.VersionDependent + % Copyright 2020 The MathWorks, Inc. + + properties (Constant, Access = protected) + MinSupportedVersion = scriptgen.internal.Version.forRelease('R2016a') + end + + methods + function statement = build(obj) + import scriptgen.Statement; + + text = sprintf('%s = testsuite(pwd, ''IncludeSubfolders'', true);', obj.SuiteName); + + statement = Statement(text); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/CodeBuilderFactory.m b/dist/scriptgen/+scriptgen/+internal/CodeBuilderFactory.m new file mode 100644 index 0000000..de0be85 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/CodeBuilderFactory.m @@ -0,0 +1,40 @@ +classdef CodeBuilderFactory < handle + % CodeBuilderFactory - Factory that creates CodeBuilders + + % Copyright 2020 The MathWorks, Inc. + + properties (Access = private) + Locator + end + + methods + function obj = CodeBuilderFactory(locator) + obj.Locator = locator; + end + + function builder = create(obj, type) + % create - Creates a single CodeBuilder + % + % Creates the most preferable CodeBuilder supported by the + % current runtime environment or empty. + + import scriptgen.internal.MissingCodeBuilder; + + metaclasses = obj.Locator.locate(type); + builder = MissingCodeBuilder.empty(); + for i = numel(metaclasses):-1:1 + constructor = str2func(metaclasses(i).Name); + builder(i) = constructor(); + end + + isSupported = arrayfun(@(b)b.isSupportedByCurrentEnvironment(), builder); + builder = builder(isSupported); + + if numel(builder) > 1 + builder = builder.sortByPreferability(); + builder = builder(end); + end + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/CodeBuilderLocator.m b/dist/scriptgen/+scriptgen/+internal/CodeBuilderLocator.m new file mode 100644 index 0000000..b6addb6 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/CodeBuilderLocator.m @@ -0,0 +1,55 @@ +classdef CodeBuilderLocator + % CodeBuilderLocator - Locator of CodeBuilder metaclasses + + % Copyright 2020 The MathWorks, Inc. + + properties (Dependent, Access = private) + ImplementationPackage + InterfacePackage + end + + properties (Access = private) + ImplementationPackageName + InterfacePackageName + end + + methods + function obj = CodeBuilderLocator(implPackage, intfPackage) + if ~ischar(implPackage) || ~ischar(intfPackage) + error('Packages must be provided as character arrays'); + end + obj.ImplementationPackageName = implPackage; + obj.InterfacePackageName = intfPackage; + end + + function p = get.ImplementationPackage(obj) + p = meta.package.fromName(obj.ImplementationPackageName); + end + + function p = get.InterfacePackage(obj) + p = meta.package.fromName(obj.InterfacePackageName); + end + + function metaclasses = locate(obj, type) + if ischar(type) + type = prependPrefix([obj.InterfacePackage.Name '.'], type); + type = meta.class.fromName(type); + end + if isempty(type) + metaclasses = type; + return; + end + classes = obj.ImplementationPackage.ClassList; + classes = classes(classes <= type); + classes = classes(~[classes.Abstract]); + metaclasses = classes; + end + end +end + +function name = prependPrefix(prefix, name) + if isempty(regexp(name, ['^' prefix '\w*'], 'once')) + name = [prefix name]; + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/MissingCode.m b/dist/scriptgen/+scriptgen/+internal/MissingCode.m new file mode 100644 index 0000000..06f9524 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/MissingCode.m @@ -0,0 +1,10 @@ +classdef MissingCode < scriptgen.Code + % Copyright 2020 The MathWorks, Inc. + + methods (Access={?scriptgen.CodeWriter, ?scriptgen.Code}) + function write(~, ~) + error('Called write on MissingCode'); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/MissingCodeBuilder.m b/dist/scriptgen/+scriptgen/+internal/MissingCodeBuilder.m new file mode 100644 index 0000000..70c8d0e --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/MissingCodeBuilder.m @@ -0,0 +1,10 @@ +classdef MissingCodeBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + methods + function code = build(~) %#ok + error('Called build on MissingCodeBuilder'); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/PrunedStackException.m b/dist/scriptgen/+scriptgen/+internal/PrunedStackException.m new file mode 100644 index 0000000..71e7853 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/PrunedStackException.m @@ -0,0 +1,49 @@ +classdef PrunedStackException < MException + % Copyright 2020 MathWorks, Inc. + + properties(SetAccess=immutable, GetAccess=protected) + PrunedStack + end + + methods + function pruned = PrunedStackException(other, frameToPrune) + if nargin < 2 + % If no frame is specified, prune the frame of the caller + s = dbstack('-completenames'); + if numel(s) > 1 + frameToPrune = rmfield(s(2), 'line'); + else + frameToPrune = struct('file', {}); + end + end + + pruned = pruned@MException(other.identifier, '%s', other.message); + if isprop(pruned, 'type') && isprop(other, 'type') + pruned.type = other.type; + end + for idx = 1:numel(other.cause) + pruned = pruned.addCause(scriptgen.internal.PrunedStackException(other.cause{idx}, frameToPrune)); + end + + stack = other.getStack(); + remove = ismember({stack.file}, {frameToPrune.file}); + if isfield(frameToPrune, 'name') + remove = ismember({stack.name}, {frameToPrune.name}) & remove; + end + if isfield(frameToPrune, 'line') + remove = ismember([stack.line], [frameToPrune.line]) & remove; + end + stack(remove) = []; + + pruned.PrunedStack = stack; + end + end + + methods(Access=protected) + function stack = getStack(pruned) + stack = pruned.PrunedStack; + end + end +end + + diff --git a/dist/scriptgen/+scriptgen/+internal/Version.m b/dist/scriptgen/+scriptgen/+internal/Version.m new file mode 100644 index 0000000..aae75bc --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/Version.m @@ -0,0 +1,113 @@ +classdef Version + % Version - A MATLAB-style version + % + % Valid versions take the form XXX.XXX.XXX.XXXXXXXXX, where X may be + % a digit only. + % + % Examples of valid versions: + % + % 9 + % 9.7 + % 9.7.0.1261785 + % + % Examples of invalid versions: + % + % 9.1-beta + % R2019a + + % Copyright 2020 The MathWorks, Inc. + + properties (SetAccess = immutable) + Parts + end + + methods + function obj = Version(verstr) + p = sscanf(verstr, '%3d.%3d.%3d.%9d'); + s = strjoin(strtrim(cellstr(num2str(p)))', '.'); + if ~strcmp(s, verstr) + error('scriptgen:Version:invalidFormat', 'invalid verstr format'); + end + p(end+1:4) = 0; + obj.Parts = p(:)'; + end + + function t = eq(a, b) + t = diff(a, b) == 0; + end + + function t = ne(a, b) + t = diff(a, b) ~= 0; + end + + function t = lt(a, b) + t = diff(a, b) < 0; + end + + function t = le(a, b) + t = diff(a, b) <= 0; + end + + function t = gt(a, b) + t = diff(a, b) > 0; + end + + function t = ge(a, b) + t = diff(a, b) >= 0; + end + end + + methods (Access = private) + function d = diff(a, b) + if ~isa(a, 'scriptgen.internal.Version') || ~isa(b, 'scriptgen.internal.Version') + error('incompatible types'); + end + d = a.num - b.num; + end + + function n = num(obj) + n = arrayfun(@(v)str2double(sprintf('%03d%03d%03d%09d', v.Parts)), obj); + end + end + + properties (Access = private, Constant) + ReleaseVersions = map( ... + 'R2020a', '9.8', ... + 'R2019b', '9.7', ... + 'R2019a', '9.6', ... + 'R2018b', '9.5', ... + 'R2018a', '9.4', ... + 'R2017b', '9.3', ... + 'R2017a', '9.2', ... + 'R2016b', '9.1', ... + 'R2016a', '9.0', ... + 'R2015b', '8.6', ... + 'R2015a', '8.5', ... + 'R2014b', '8.4', ... + 'R2014a', '8.3', ... + 'R2013b', '8.2', ... + 'R2013a', '8.1'); + end + + methods (Static) + function v = forRelease(release) + r = scriptgen.internal.Version.ReleaseVersions; + if ~r.isKey(release) + error('scriptgen:Version:unknownRelease', 'unknown release'); + end + v = scriptgen.internal.Version(r(release)); + end + + function v = forCurrentRelease() + s = strsplit(version()); + v = scriptgen.internal.Version(s{1}); + end + end +end + +function m = map(varargin) +m = containers.Map(); +for i = 1:2:numel(varargin) + m(varargin{i}) = varargin{i+1}; +end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+internal/isAbsolutePath.m b/dist/scriptgen/+scriptgen/+internal/isAbsolutePath.m new file mode 100644 index 0000000..d25ab5f --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/isAbsolutePath.m @@ -0,0 +1,8 @@ +function tf = isAbsolutePath(p) +if ispc() + tf = ~isempty(regexp(p, '^.:', 'once')) || strncmp(p, '\\', 2); +else + tf = any(strncmp(p, {'/', '~'}, 1)); +end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/unquoteText.m b/dist/scriptgen/+scriptgen/+internal/unquoteText.m new file mode 100644 index 0000000..18caebe --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/unquoteText.m @@ -0,0 +1,11 @@ +function u = unquoteText(text) +% Copyright 2020 The MathWorks, Inc. +s = regexp(text, '^''', 'once'); +e = regexp(text, '''$', 'once'); +if isempty(s) || isempty(e) + u = text; +else + u = text(s+1:e-1); +end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/validateText.m b/dist/scriptgen/+scriptgen/+internal/validateText.m new file mode 100644 index 0000000..c7d578e --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/validateText.m @@ -0,0 +1,9 @@ +function validateText(value) +% Copyright 2020 The MathWorks, Inc. +if ischar(value) + scriptgen.internal.validateTextScalar(value); +else + scriptgen.internal.validateTextArray(value); +end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/validateTextArray.m b/dist/scriptgen/+scriptgen/+internal/validateTextArray.m new file mode 100644 index 0000000..aff6396 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/validateTextArray.m @@ -0,0 +1,7 @@ +function validateTextArray(value) +% Copyright 2020 The MathWorks, Inc. +if ~iscellstr(value) || ~(isempty(value) || isvector(value)) %#ok + error('MATLAB:invalidType', 'Expected input to be cellstr vector'); +end +end + diff --git a/dist/scriptgen/+scriptgen/+internal/validateTextScalar.m b/dist/scriptgen/+scriptgen/+internal/validateTextScalar.m new file mode 100644 index 0000000..acad6cb --- /dev/null +++ b/dist/scriptgen/+scriptgen/+internal/validateTextScalar.m @@ -0,0 +1,8 @@ +function validateTextScalar(value) +% Copyright 2020 The MathWorks, Inc. +if isempty(value) && ischar(value) + return; +end +validateattributes(value, {'char'}, {'vector'}); +end + diff --git a/dist/scriptgen/+scriptgen/+scripts/TestScriptBuilder.m b/dist/scriptgen/+scriptgen/+scripts/TestScriptBuilder.m new file mode 100644 index 0000000..c1b2d79 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+scripts/TestScriptBuilder.m @@ -0,0 +1,93 @@ +classdef TestScriptBuilder < scriptgen.CodeBuilder + % Copyright 2020 - 2021 The MathWorks, Inc. + + properties + CodeProvider = scriptgen.CodeProvider.default() + WorkingFolder = '' + PDFTestReport = '' + HTMLTestReport = '' + TAPTestResults = '' + JUnitTestResults = '' + SimulinkTestResults = '' + CoberturaCodeCoverage = '' + HTMLCodeCoverage = '' + CoberturaModelCoverage = '' + HTMLModelCoverage = '' + SourceFolder = '' + SelectByFolder = '' + SelectByTag = '' + end + + methods + function set.CodeProvider(obj, value) + validateattributes(value, {'scriptgen.CodeProvider'}, {'scalar'}); + obj.CodeProvider = value; + end + + function set.WorkingFolder(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.WorkingFolder = value; + end + + function set.PDFTestReport(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.PDFTestReport = value; + end + + function set.HTMLTestReport(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.HTMLTestReport = value; + end + + function set.TAPTestResults(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.TAPTestResults = value; + end + + function set.JUnitTestResults(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.JUnitTestResults = value; + end + + function set.SimulinkTestResults(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.SimulinkTestResults = value; + end + + function set.CoberturaCodeCoverage(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.CoberturaCodeCoverage = value; + end + + function set.HTMLCodeCoverage(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.HTMLCodeCoverage = value; + end + + function set.CoberturaModelCoverage(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.CoberturaModelCoverage = value; + end + + function set.HTMLModelCoverage(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.HTMLModelCoverage = value; + end + + function set.SourceFolder(obj, value) + scriptgen.internal.validateText(value); + obj.SourceFolder = value; + end + + function set.SelectByFolder(obj, value) + scriptgen.internal.validateText(value); + obj.SelectByFolder = value; + end + + function set.SelectByTag(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.SelectByTag = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+sequences/+test/AssertNoFailuresSequenceBuilder.m b/dist/scriptgen/+scriptgen/+sequences/+test/AssertNoFailuresSequenceBuilder.m new file mode 100644 index 0000000..760eadb --- /dev/null +++ b/dist/scriptgen/+scriptgen/+sequences/+test/AssertNoFailuresSequenceBuilder.m @@ -0,0 +1,20 @@ +classdef AssertNoFailuresSequenceBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + CodeProvider = scriptgen.CodeProvider.default() + ResultsName = 'results' + end + + methods + function set.CodeProvider(obj, value) + validateattributes(value, {'scriptgen.CodeProvider'}, {'scalar'}); + obj.CodeProvider = value; + end + + function set.ResultsName(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.ResultsName = value; + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+sequences/+test/CreateTestRunnerSequenceBuilder.m b/dist/scriptgen/+scriptgen/+sequences/+test/CreateTestRunnerSequenceBuilder.m new file mode 100644 index 0000000..31c31dc --- /dev/null +++ b/dist/scriptgen/+scriptgen/+sequences/+test/CreateTestRunnerSequenceBuilder.m @@ -0,0 +1,80 @@ +classdef CreateTestRunnerSequenceBuilder < scriptgen.CodeBuilder + % Copyright 2020 - 2021 The MathWorks, Inc. + + properties + CodeProvider = scriptgen.CodeProvider.default() + RunnerName = 'runner' + PDFTestReport = '' + HTMLTestReport = '' + TAPTestResults = '' + JUnitTestResults = '' + SimulinkTestResults = '' + CoberturaCodeCoverage = '' + HTMLCodeCoverage = '' + CoberturaModelCoverage = '' + HTMLModelCoverage = '' + SourceFolder = {} + end + + methods + function set.CodeProvider(obj, value) + validateattributes(value, {'scriptgen.CodeProvider'}, {'scalar'}); + obj.CodeProvider = value; + end + + function set.RunnerName(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.RunnerName = value; + end + + function set.PDFTestReport(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.PDFTestReport = value; + end + + function set.HTMLTestReport(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.HTMLTestReport = value; + end + + function set.TAPTestResults(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.TAPTestResults = value; + end + + function set.JUnitTestResults(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.JUnitTestResults = value; + end + + function set.SimulinkTestResults(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.SimulinkTestResults = value; + end + + function set.CoberturaCodeCoverage(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.CoberturaCodeCoverage = value; + end + + function set.HTMLCodeCoverage(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.HTMLCodeCoverage = value; + end + + function set.CoberturaModelCoverage(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.CoberturaModelCoverage = value; + end + + function set.HTMLModelCoverage(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.HTMLModelCoverage = value; + end + + function set.SourceFolder(obj, value) + scriptgen.internal.validateTextArray(value); + obj.SourceFolder = value; + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/+sequences/+test/CreateTestSuiteSequenceBuilder.m b/dist/scriptgen/+scriptgen/+sequences/+test/CreateTestSuiteSequenceBuilder.m new file mode 100644 index 0000000..5992f2d --- /dev/null +++ b/dist/scriptgen/+scriptgen/+sequences/+test/CreateTestSuiteSequenceBuilder.m @@ -0,0 +1,33 @@ +classdef CreateTestSuiteSequenceBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + CodeProvider = scriptgen.CodeProvider.default() + SuiteName = 'suite' + SelectByFolder = {} + SelectByTag = '' + end + + methods + function set.CodeProvider(obj, value) + validateattributes(value, {'scriptgen.CodeProvider'}, {'scalar'}); + obj.CodeProvider = value; + end + + function set.SuiteName(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.SuiteName = value; + end + + function set.SelectByFolder(obj, value) + scriptgen.internal.validateTextArray(value); + obj.SelectByFolder = value; + end + + function set.SelectByTag(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.SelectByTag = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+statements/+test/CreateTestRunnerStatementBuilder.m b/dist/scriptgen/+scriptgen/+statements/+test/CreateTestRunnerStatementBuilder.m new file mode 100644 index 0000000..26c2a13 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+statements/+test/CreateTestRunnerStatementBuilder.m @@ -0,0 +1,15 @@ +classdef CreateTestRunnerStatementBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + RunnerName = 'runner' + end + + methods + function set.RunnerName(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.RunnerName = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/+statements/+test/CreateTestSuiteStatementBuilder.m b/dist/scriptgen/+scriptgen/+statements/+test/CreateTestSuiteStatementBuilder.m new file mode 100644 index 0000000..041aff8 --- /dev/null +++ b/dist/scriptgen/+scriptgen/+statements/+test/CreateTestSuiteStatementBuilder.m @@ -0,0 +1,15 @@ +classdef CreateTestSuiteStatementBuilder < scriptgen.CodeBuilder + % Copyright 2020 The MathWorks, Inc. + + properties + SuiteName = 'suite' + end + + methods + function set.SuiteName(obj, value) + scriptgen.internal.validateTextScalar(value); + obj.SuiteName = value; + end + end +end + diff --git a/dist/scriptgen/+scriptgen/Code.m b/dist/scriptgen/+scriptgen/Code.m new file mode 100644 index 0000000..e142341 --- /dev/null +++ b/dist/scriptgen/+scriptgen/Code.m @@ -0,0 +1,38 @@ +classdef Code < matlab.mixin.Heterogeneous + % Code - Base class for all classes writable by CodeWriter + + % Copyright 2020 The MathWorks, Inc. + + properties (SetAccess = immutable) + Contents + end + + methods + function contents = get.Contents(obj) + import scriptgen.TextOutput; + stream = TextOutput(); + obj.writeToStream(stream); + contents = stream.Text; + end + end + + methods (Abstract, Access={?scriptgen.CodeWriter, ?scriptgen.Code}) + write(obj, writer) + end + + methods (Access = protected) + function writeToStream(obj, stream) + import scriptgen.CodeWriter; + writer = CodeWriter(stream); + close = onCleanup(@()writer.close()); + obj.write(writer); + end + end + + methods (Static, Sealed, Access = protected) + function builder = getDefaultScalarElement() + builder = scriptgen.internal.MissingCode(); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/CodeBuilder.m b/dist/scriptgen/+scriptgen/CodeBuilder.m new file mode 100644 index 0000000..893213c --- /dev/null +++ b/dist/scriptgen/+scriptgen/CodeBuilder.m @@ -0,0 +1,18 @@ +classdef CodeBuilder < matlab.mixin.Heterogeneous & scriptgen.internal.mixin.SetGet ... + & scriptgen.internal.mixin.EnvironmentDependent ... + & scriptgen.internal.mixin.Preferable + % CodeBuilder - Base class for builders of immutable code objects + + % Copyright 2020 The MathWorks, Inc. + + methods (Abstract) + code = build(obj) + end + + methods (Static, Sealed, Access = protected) + function builder = getDefaultScalarElement() + builder = scriptgen.internal.MissingCodeBuilder(); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/CodeProvider.m b/dist/scriptgen/+scriptgen/CodeProvider.m new file mode 100644 index 0000000..fd64af5 --- /dev/null +++ b/dist/scriptgen/+scriptgen/CodeProvider.m @@ -0,0 +1,128 @@ +classdef CodeProvider < handle + % CodeProvider - Provider of immutable code objects + % + % The scriptgen.CodeProvider class serves as the primary interface + % for creating pre-made code objects. To create code objects the + % CodeProvider utilizes builders under the following packages: + % + % scriptgen.expressions - Expression builders + % scriptgen.scripts - Script builders + % scriptgen.sequences - Sequence builders + % scriptgen.statements - Statement builders + % + % To locate a builder, the CodeProvider relies on the builder's class + % name. For example, when called to create a Script of type 'Test', + % the CodeProvider will look for a Script builder under + % scriptgen.scripts with the class name 'TestScriptBuilder'. It will + % then utilize an internal implementation of that builder to create + % the requested Script object. + % + % Builders may also exist under subpackages. To access builders under + % subpackages, a new CodeProvider must be instantiated with the + % subpackage name. The withSubpackage method is a convenience for + % instantiating new providers off an existing provider. + + % Copyright 2020 The MathWorks, Inc. + + properties (SetAccess = private) + Subpackage + end + + properties (Access = private) + ExpressionBuilderFactory + StatementBuilderFactory + SequenceBuilderFactory + ScriptBuilderFactory + end + + methods + function obj = CodeProvider(subpackage) + import scriptgen.internal.validateTextScalar; + + if nargin < 1 + subpackage = ''; + end + validateTextScalar(subpackage); + + obj.ExpressionBuilderFactory = obj.createFactory('expressions', subpackage); + obj.StatementBuilderFactory = obj.createFactory('statements', subpackage); + obj.SequenceBuilderFactory = obj.createFactory('sequences', subpackage); + obj.ScriptBuilderFactory = obj.createFactory('scripts', subpackage); + + obj.Subpackage = subpackage; + end + + function expression = createExpression(obj, type, varargin) + type = appendSuffix(type, 'ExpressionBuilder'); + expression = obj.createCode(obj.ExpressionBuilderFactory, type, varargin{:}); + end + + function statement = createStatement(obj, type, varargin) + type = appendSuffix(type, 'StatementBuilder'); + statement = obj.createCode(obj.StatementBuilderFactory, type, varargin{:}); + end + + function sequence = createSequence(obj, type, varargin) + type = appendSuffix(type, 'SequenceBuilder'); + sequence = obj.createCode(obj.SequenceBuilderFactory, type, varargin{:}); + end + + function script = createScript(obj, type, varargin) + type = appendSuffix(type, 'ScriptBuilder'); + script = obj.createCode(obj.ScriptBuilderFactory, type, varargin{:}); + end + + function provider = withSubpackage(obj, subpackage) + import scriptgen.CodeProvider; + + sub = pkgjoin({obj.Subpackage, subpackage}); + provider = CodeProvider(sub); + end + end + + methods (Access = private) + function factory = createFactory(~, type, subpackage) + import scriptgen.internal.CodeBuilderLocator; + import scriptgen.internal.CodeBuilderFactory; + + implPackage = pkgjoin({'scriptgen.internal', type, subpackage}); + intfPackage = pkgjoin({'scriptgen', type, subpackage}); + + locator = CodeBuilderLocator(implPackage, intfPackage); + factory = CodeBuilderFactory(locator); + end + + function code = createCode(~, factory, type, varargin) + builder = factory.create(type); + if isempty(builder) + code = scriptgen.internal.MissingCode.empty(); + return; + end + if ~isempty(varargin) + set(builder, varargin{:}); + end + code = builder.build(); + end + end + + methods (Static) + function provider = default() + persistent singleton; + if isempty(singleton) + singleton = scriptgen.CodeProvider(); + end + provider = singleton; + end + end +end + +function name = appendSuffix(name, suffix) +if isempty(regexp(name, ['\w*' suffix '$'], 'once')) + name = [name suffix]; +end +end + +function p = pkgjoin(names) +tf = cellfun(@(n)~isempty(n), names); +p = strjoin(names(tf), '.'); +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/CodeWriter.m b/dist/scriptgen/+scriptgen/CodeWriter.m new file mode 100644 index 0000000..76862c8 --- /dev/null +++ b/dist/scriptgen/+scriptgen/CodeWriter.m @@ -0,0 +1,64 @@ +classdef CodeWriter < handle + % CodeWriter - Writes code objects in to code + + % Copyright 2020 The MathWorks, Inc. + + properties (Access = private) + OutputStream + WhitespaceBuffer + end + + methods + function obj = CodeWriter(stream) + validateattributes(stream, {'scriptgen.OutputStream'}, {'scalar'}); + obj.OutputStream = stream; + end + + function writeExpression(obj, expression) + obj.flushWhitespaceBuffer(); + expression.write(obj); + end + + function writeStatement(obj, statement) + obj.flushWhitespaceBuffer(); + statement.write(obj); + obj.bufferNewLine(); + end + + function writeSequence(obj, sequence) + obj.flushWhitespaceBuffer(); + sequence.write(obj); + obj.bufferNewLine(); + end + + function writeScript(obj, script) + obj.flushWhitespaceBuffer(); + script.write(obj); + end + + function close(obj) + obj.OutputStream.close(); + end + end + + methods (Access = {?scriptgen.Code}) + function write(obj, format, varargin) + text = sprintf(format, varargin{:}); + obj.OutputStream.write(text); + end + end + + methods (Access = private) + function bufferNewLine(obj) + obj.WhitespaceBuffer = strcat(obj.WhitespaceBuffer, '\n'); + end + + function flushWhitespaceBuffer(obj) + if ~isempty(obj.WhitespaceBuffer) + obj.write(obj.WhitespaceBuffer); + obj.WhitespaceBuffer = []; + end + end + end +end + diff --git a/dist/scriptgen/+scriptgen/Expression.m b/dist/scriptgen/+scriptgen/Expression.m new file mode 100644 index 0000000..b8719db --- /dev/null +++ b/dist/scriptgen/+scriptgen/Expression.m @@ -0,0 +1,42 @@ +classdef Expression < scriptgen.Code + % Expression - A unit of code that returns a value + % + % Expressions are typically located in statements on the right- or + % left-hand side of an equals sign. + % + % Example expressions: + % + % 1 + 2 + % zeros(5,1) + % A(1:3,2) + + % Copyright 2020 The MathWorks, Inc. + + properties (SetAccess = immutable) + Text + RequiredImports + end + + methods + function obj = Expression(text, imports) + if nargin < 2 + imports = {}; + end + if ischar(imports) + imports = {imports}; + end + scriptgen.internal.validateTextScalar(text); + scriptgen.internal.validateTextArray(imports); + + obj.Text = text; + obj.RequiredImports = imports; + end + end + + methods (Access={?scriptgen.CodeWriter, ?scriptgen.Code}) + function write(obj, writer) + writer.write('%s', obj.Text); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/FileOutput.m b/dist/scriptgen/+scriptgen/FileOutput.m new file mode 100644 index 0000000..84110e5 --- /dev/null +++ b/dist/scriptgen/+scriptgen/FileOutput.m @@ -0,0 +1,22 @@ +classdef FileOutput < scriptgen.OutputStream + % Copyright 2020 The MathWorks, Inc. + + properties (GetAccess = private, SetAccess = immutable) + Fid + end + + methods + function obj = FileOutput(filename) + obj.Fid = fopen(filename, 'w'); + end + + function write(obj, text) + fprintf(obj.Fid, '%s', text); + end + + function close(obj) + fclose(obj.Fid); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/OutputStream.m b/dist/scriptgen/+scriptgen/OutputStream.m new file mode 100644 index 0000000..1e2ced0 --- /dev/null +++ b/dist/scriptgen/+scriptgen/OutputStream.m @@ -0,0 +1,14 @@ +classdef OutputStream < handle + % Copyright 2020 The MathWorks, Inc. + + methods + function close(~) + % Available for subclasses to override + end + end + + methods (Abstract) + write(obj, text); + end +end + diff --git a/dist/scriptgen/+scriptgen/Script.m b/dist/scriptgen/+scriptgen/Script.m new file mode 100644 index 0000000..9311181 --- /dev/null +++ b/dist/scriptgen/+scriptgen/Script.m @@ -0,0 +1,83 @@ +classdef Script < scriptgen.Code + % Script - A collection of statements organized in to sequences + + % Copyright 2020 The MathWorks, Inc. + + properties (SetAccess = immutable) + Sequences + end + + methods + function obj = Script(sequences) + import scriptgen.Sequence; + + if iscellstr(sequences) || (ischar(sequences) && isvector(sequences)) %#ok + sequences = Sequence(sequences); + end + + validateattributes(sequences, {'scriptgen.Sequence'}, {'vector'}); + + obj.Sequences = sequences; + end + + function file = writeToFile(obj, file) + import scriptgen.FileOutput; + [~,~] = mkdir(fileparts(file)); + stream = FileOutput(file); + obj.writeToStream(stream); + end + + function text = writeToText(obj) + % DEPRECATED - Use the Contents property + text = obj.Contents; + end + + function run(obj) + % RUN - Run script + % + % RUN(SCRIPT) runs the code contents of the SCRIPT in the callers + % workspace as if it were executed from a script file on disk. + % + % This method is roughly equivalent to writing the contents of the + % SCRIPT to a file in the current working directory and executing + % the file by typing its name. + + tempFolder = tempname(); + [~, name] = fileparts(tempFolder); + scriptName = ['tempscript_' name(end-3:end)]; + scriptPath = fullfile(tempFolder, [scriptName '.m']); + + obj.writeToFile(scriptPath); + oldPath = addpath(tempFolder); + + restoreState = onCleanup(@()cleanup(oldPath, tempFolder)); + function cleanup(p, f) + path(p); + rmdir(f, 's'); + end + + try + evalin('caller', strcat(scriptName, ';')); + catch e + throw(scriptgen.internal.PrunedStackException(e)); + end + end + end + + methods (Access={?scriptgen.CodeWriter, ?scriptgen.Code}) + function write(obj, writer) + import scriptgen.Sequence; + import scriptgen.Statement; + + imports = sort(unique([obj.Sequences.RequiredImports])); + if ~isempty(imports) + importText = cellfun(@(i)sprintf('import %s;', i), imports, 'UniformOutput', false); + writer.writeSequence(Sequence(importText)); + end + + for sequence = obj.Sequences + writer.writeSequence(sequence); + end + end + end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/Sequence.m b/dist/scriptgen/+scriptgen/Sequence.m new file mode 100644 index 0000000..8be416e --- /dev/null +++ b/dist/scriptgen/+scriptgen/Sequence.m @@ -0,0 +1,43 @@ +classdef Sequence < scriptgen.Code + % Sequence - A collection of statements that achieve a task + + % Copyright 2020 The MathWorks, Inc. + + properties (SetAccess = immutable) + Statements + RequiredImports + end + + methods + function obj = Sequence(statements) + import scriptgen.Statement; + + if iscellstr(statements) || (ischar(statements) && isvector(statements)) %#ok + statements = Statement(statements); + end + validateattributes(statements, {'scriptgen.Statement'}, {'vector'}); + + obj.Statements = statements; + + % unique may return 0x1 cell array, valueOrElse ensures it is + % converted to a 0x0 cell array. + obj.RequiredImports = valueOrElse(unique([statements.RequiredImports]), {}); + end + end + + methods (Access={?scriptgen.CodeWriter, ?scriptgen.Code}) + function write(obj, writer) + for s = obj.Statements + writer.writeStatement(s); + end + end + end +end + +function v = valueOrElse(value, default) +if ~isempty(value) + v = value; +else + v = default; +end +end \ No newline at end of file diff --git a/dist/scriptgen/+scriptgen/Statement.m b/dist/scriptgen/+scriptgen/Statement.m new file mode 100644 index 0000000..99d3a42 --- /dev/null +++ b/dist/scriptgen/+scriptgen/Statement.m @@ -0,0 +1,55 @@ +classdef Statement < scriptgen.Code + % Statement - A unit of code that executes an action + % + % Statements are typically terminated with a semicolon. + % + % Example statements: + % + % a = 1 + 2; + % disp('hello world'); + % z = zeros(5,1); + + % Copyright 2020 The MathWorks, Inc. + + properties (SetAccess = immutable) + Text + RequiredImports + end + + methods + function obj = Statement(text, imports) + import scriptgen.internal.validateTextArray; + import scriptgen.internal.validateTextArray; + + if nargin < 2 + imports = {}; + end + if ischar(text) + text = {text}; + end + if ischar(imports) + imports = {imports}; + end + validateTextArray(text); + validateTextArray(imports); + + % Support array construction. + m = size(text, 1); + n = size(text, 2); + obj(1:m,1:n) = obj; + for i = 1:m + for j = 1:n + obj(i,j).Text = text{i,j}; + obj(i,j).RequiredImports = imports; + end + end + end + end + + methods (Access={?scriptgen.CodeWriter, ?scriptgen.Code}) + function write(obj, writer) + writer.write('%s', obj.Text); + end + end +end + diff --git a/dist/scriptgen/+scriptgen/TextOutput.m b/dist/scriptgen/+scriptgen/TextOutput.m new file mode 100644 index 0000000..50e3dee --- /dev/null +++ b/dist/scriptgen/+scriptgen/TextOutput.m @@ -0,0 +1,14 @@ +classdef TextOutput < scriptgen.OutputStream + % Copyright 2020 The MathWorks, Inc. + + properties (SetAccess = private) + Text + end + + methods + function write(obj, text) + obj.Text = [obj.Text sprintf('%s', text)]; + end + end +end + diff --git a/dist/scriptgen/genscript.m b/dist/scriptgen/genscript.m new file mode 100644 index 0000000..e672aa9 --- /dev/null +++ b/dist/scriptgen/genscript.m @@ -0,0 +1,26 @@ +function script = genscript(type, varargin) +% genscript - Generates a script +% +% The genscript function provides a convenient way to generate a pre-made +% script object. +% +% SCRIPT = genscript(TYPE) generates and returns a script of TYPE. TYPE +% must be a character vector and match the name of a script builder +% located in the scriptgen.scripts package. +% +% SCRIPT = genscript(TYPE, NAME, VALUE, ...) generates and returns a +% script of TYPE setting those name-value pairs on the script builder. +% +% Examples: +% +% testScript = genscript('Test', 'JUnitTestResults', 'results.xml'); +% writeToFile(testScript, 'myscript.m'); + +% Copyright 2020 The MathWorks, Inc. + +import scriptgen.CodeProvider; + +provider = CodeProvider.default(); +script = provider.createScript(type, varargin{:}); +end + diff --git a/dist/scriptgen/license.txt b/dist/scriptgen/license.txt new file mode 100644 index 0000000..853135c --- /dev/null +++ b/dist/scriptgen/license.txt @@ -0,0 +1,27 @@ +Copyright (c) 2020, The MathWorks, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. In all cases, the software is, and all modifications and derivatives of the + software shall be, licensed to you solely for use in conjunction with + MathWorks products and service offerings. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/lib/index.d.ts b/lib/index.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/lib/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..092e0ec --- /dev/null +++ b/lib/index.js @@ -0,0 +1,67 @@ +"use strict"; +// Copyright 2020 The MathWorks, Inc. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const core = __importStar(require("@actions/core")); +const exec = __importStar(require("@actions/exec")); +const run_command_1 = require("run-command"); +const scriptgen = __importStar(require("./scriptgen")); +/** + * Gather action inputs and then run action. + */ +function run() { + return __awaiter(this, void 0, void 0, function* () { + const platform = process.platform; + const workspaceDir = process.cwd(); + const options = { + JUnitTestResults: core.getInput("test-results-junit"), + CoberturaCodeCoverage: core.getInput("code-coverage-cobertura"), + SourceFolder: core.getInput("source-folder"), + PDFTestReport: core.getInput("test-results-pdf"), + SimulinkTestResults: core.getInput("test-results-simulink-test"), + CoberturaModelCoverage: core.getInput("model-coverage-cobertura"), + SelectByTag: core.getInput("select-by-tag"), + SelectByFolder: core.getInput("select-by-folder"), + }; + const command = scriptgen.generateCommand(options); + const helperScript = yield core.group("Generate script", () => __awaiter(this, void 0, void 0, function* () { + const helperScript = yield run_command_1.matlab.generateScript(workspaceDir, command); + core.info("Successfully generated script"); + return helperScript; + })); + yield core.group("Run command", () => __awaiter(this, void 0, void 0, function* () { + yield run_command_1.matlab.runCommand(helperScript, platform, exec.exec); + })); + }); +} +run().catch((e) => { + core.setFailed(e); +}); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/index.js.map b/lib/index.js.map new file mode 100644 index 0000000..199c165 --- /dev/null +++ b/lib/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAErC,oDAAsC;AACtC,oDAAsC;AACtC,6CAAqC;AACrC,uDAAyC;AAEzC;;GAEG;AACH,SAAe,GAAG;;QACd,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAEnC,MAAM,OAAO,GAA8B;YACvC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACrD,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YAC/D,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC5C,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAChD,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAChE,sBAAsB,EAAE,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YACjE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC3C,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;SACpD,CAAC;QAEF,MAAM,OAAO,GAAG,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEnD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAS,EAAE;YAChE,MAAM,YAAY,GAAG,MAAM,oBAAM,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACxE,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC3C,OAAO,YAAY,CAAC;QACxB,CAAC,CAAA,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,GAAS,EAAE;YACvC,MAAM,oBAAM,CAAC,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,CAAC,CAAA,CAAC,CAAC;IACP,CAAC;CAAA;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACd,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/lib/scriptgen.d.ts b/lib/scriptgen.d.ts new file mode 100644 index 0000000..16286a1 --- /dev/null +++ b/lib/scriptgen.d.ts @@ -0,0 +1,20 @@ +/** + * Interface representing collection of test-related options to pass to + * scriptgen. + */ +export interface RunTestsOptions { + JUnitTestResults?: string; + CoberturaCodeCoverage?: string; + SourceFolder?: string; + PDFTestReport?: string; + SimulinkTestResults?: string; + CoberturaModelCoverage?: string; + SelectByTag?: string; + SelectByFolder?: string; +} +/** + * Generate scriptgen command for running tests. + * + * @param options scriptgen options for running tests. + */ +export declare function generateCommand(options: RunTestsOptions): string; diff --git a/lib/scriptgen.js b/lib/scriptgen.js new file mode 100644 index 0000000..aa4dcdd --- /dev/null +++ b/lib/scriptgen.js @@ -0,0 +1,53 @@ +"use strict"; +// Copyright 2020 The MathWorks, Inc. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generateCommand = void 0; +const path = __importStar(require("path")); +/** + * Generate scriptgen command for running tests. + * + * @param options scriptgen options for running tests. + */ +function generateCommand(options) { + const command = ` + addpath('${path.join(__dirname, "scriptgen")}'); + testScript = genscript('Test', + 'JUnitTestResults','${options.JUnitTestResults || ""}', + 'CoberturaCodeCoverage','${options.CoberturaCodeCoverage || ""}', + 'SourceFolder','${options.SourceFolder || ""}', + 'PDFTestReport','${options.PDFTestReport || ""}', + 'SimulinkTestResults','${options.SimulinkTestResults || ""}', + 'CoberturaModelCoverage','${options.CoberturaModelCoverage || ""}', + 'SelectByTag','${options.SelectByTag || ""}', + 'SelectByFolder','${options.SelectByFolder || ""}' + ); + disp('Running MATLAB script with contents:'); + disp(testScript.Contents); + fprintf('__________\\n\\n'); + run(testScript); + ` + .replace(/$\n^\s*/gm, " ") + .trim(); // replace ending newlines and starting spaces + return command; +} +exports.generateCommand = generateCommand; +//# sourceMappingURL=scriptgen.js.map \ No newline at end of file diff --git a/lib/scriptgen.js.map b/lib/scriptgen.js.map new file mode 100644 index 0000000..d5eba0c --- /dev/null +++ b/lib/scriptgen.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scriptgen.js","sourceRoot":"","sources":["../src/scriptgen.ts"],"names":[],"mappings":";AAAA,qCAAqC;;;;;;;;;;;;;;;;;;;;;;AAErC,2CAA6B;AAiB7B;;;;GAIG;AACH,SAAgB,eAAe,CAAC,OAAwB;IACpD,MAAM,OAAO,GAAG;mBACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;;kCAElB,OAAO,CAAC,gBAAgB,IAAI,EAAE;uCACzB,OAAO,CAAC,qBAAqB,IAAI,EAAE;8BAC5C,OAAO,CAAC,YAAY,IAAI,EAAE;+BACzB,OAAO,CAAC,aAAa,IAAI,EAAE;qCACrB,OAAO,CAAC,mBAAmB,IAAI,EAAE;wCAC9B,OAAO,CAAC,sBAAsB,IAAI,EAAE;6BAC/C,OAAO,CAAC,WAAW,IAAI,EAAE;gCACtB,OAAO,CAAC,cAAc,IAAI,EAAE;;;;;;KAMvD;SACI,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,IAAI,EAAE,CAAC,CAAC,8CAA8C;IAC3D,OAAO,OAAO,CAAC;AACnB,CAAC;AArBD,0CAqBC"} \ No newline at end of file