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