function sldvmisscovtool
% SLDVMISSCOVTOOL A GUI tool to obtain test cases for missing coverage objectives
%
% Required MATLAB version: R2007a+ or newer version.
%
% Description:
% This tool helps users to import hand-created test cases into a Simulink
% model and obtain test cases for missing coverage objectives using
% Simulink Design Verifier (SLDV).
% You can supply existing test cases by CSV files or Simulink MAT files
% (variable name and structure are hard-coded).
%
% Example use case 1:
% This tool semi-automates test generation by using SLDV to augment tests
% developed by hand. You start by manually creating test cases using your
% existing workflow or process.
% Hand-created test cases are often easy to understand but may not fully
% cover your model. SLDV can then be used to provide additional test cases
% for the missing coverage objectives.
%
% Example use case 2:
% This tool imports test cases created by SLDV and then incrementally adds
% new test cases for your modified model. You start by specifying a MAT
% file generated by SLDV for the original model
% (It contains the sldvData variable). You then run SLDV for the modified
% model. SLDV generates test cases only for the newly added coverage
% objectives.
% There are two benefits to this use case:
% 1. You can focus on understanding the new test cases for the missing
% coverage objectives. (Without this tool, some of existing test cases
% might be changed for the unmodified portions of your model)
% 2. Importing test cases often reduces analysis time.
%
% Installation:
% (1-1) Extract sldvmisscovtool.zip into the directory you want to store.
% (1-2) Add the above folder on your MATLAB path.
%
% Run:
% (2-1) type
% >> sldvmisscovtool
% on your MATLAB desktop.
%
% Example procedure:
% (3-1) Run sldvmisscovtool.
% (3-2) Select a sample model named "sldvmiscovtool_sample.mdl" as "Target
% Model". (Make sure inport block settings are loaded into listbox.)
% (3-3) In the "Data to import" pane, select "CSV" radio button and
% "cruise_control_data" as "Directory/File". Then, the test cases given by
% CSV file are loaded into work space, and listed on the listbox.
% (3-4) You can plot the test cases by clicking "simplot" button.
% (3-5) In the "Coverage" pane, "Record coverage" button creates a coverage
% data for a selected test case(s).
% The coverage object is stored in the work space as "covData".
% (3-6) "Coverage Report" displays coverage report on web browser from
% "covData" in the work space.
% (3-7) In the "SLDV" pane, "Analyse missing coverages" button calls
% sldvgencov function, which enables you to obtain the test cases in order
% to satisfy all coverage objectives missed by the test cases you specified.
% (3-8) "Combined report" displays a combined coverage report.
% (3-9) "Merge test cases" creates a harness model which has signal builder
% block with all test cases obtained by (3-3) and (3-7).
% (3-10) "Save as MAT file" creates a MAT file which has "simdata" variable
% inside. This MAT file can be used to import test cases into
% sldvmisscovtool again. "simdata" is "structure with time" format, so you
% can also use this variable in your simulation manually.
% sldvmisscovtool Utility for importing existing test cases into a model
% and generate missing coverage objectives by SLDV.
%
% For more documentation, open help from sldvmisscovtool GUI.
%
% See also SLDVGENCOV
% Author: Yasumitsu Ito (yasumitsu.ito@mathworks.co.jp)
% Version: 4.000
% Update:
% 2008/04/21 : Cosmetic modification.
% 2008/02/13 : The first release.
% 2008/06/23 : Inherited data type as inport block is supported.
% 2008/10/31 : Submitted for MATLAB Central
% 2009/01/07 : Added error avoidance. Model closed after recording
% coverage.
% 2009/06/28 : The second version has been released to MATLAB Central.
% 2010/05/06 : The third version has been released to MATLAB Central. Added
% Signal Viewer and fixed-point support for R2009a or later.
% 2011/12/28 : The fourth version has been released to MATLAB Central.
% Help documents can be referred via MATLAB Help Browser.
% Supported Japanese environment detection on R2010b or later.
%
% Copyright 2010-2011 The MathWorks, Inc.
hObject = findobj('Tag','sldvmisscovtool');
if ~isempty(hObject)
set(hObject,'Visible','on')
return;
end
%% === Draw GUI ====
hObject = figure('MenuBar','none','Name','sldvmisscovtool','NumberTitle','off','Position',[624 107 533 617],'Resize','off','UserData',[],'Tag','sldvmisscovtool','Visible','on');
create_localized_messages();
rarrow = getRarrowCData();
larrow = getLarrowCData(rarrow);
deleteCData = getDeleteCData();
fileCData = getFileCData();
%% Data management pane
datamanage_pn =...
uibuttongroup('Parent',hObject,'Units','pixels','FontSize',9,'Title','Data management',...
'Tag','datamanage_pn','UserData',[],'Clipping','on',...
'Position',[10 349 295 258],'SelectedObject',[],'SelectionChangeFcn',[],'OldSelectedObject',[]);
uicontrol('Parent',datamanage_pn,'BackgroundColor',[1 1 1],...
'Callback',@testcases_lb_Callback,'CData',[],'Max',10,...
'Position',[14 63 180 122],...
'Style','listbox','Value',[],'UserData',[],...
'Tag','testcases_lb');
uicontrol('Parent',datamanage_pn,...
'Callback',@refresh_bt_Callback,...
'Position',[207 112 72 36],'String','Refresh','UserData',[],...
'Tag','refresh_bt');
uicontrol('Parent',datamanage_pn,...
'Callback',@signalview_bt_Callback,'Enable','off',...
'Position',[207 68 72 36],'String','<html>Signal<br>Viewer</html>','UserData',[],...
'Tag','signalview_bt');
uicontrol('Parent',datamanage_pn,'HorizontalAlignment','left',...
'Position',[13 188 87 13],'String','Test Cases',...
'Style','text',...
'Tag','testcases_str_lb','Value',[]);
uicontrol('Parent',datamanage_pn,...
'Callback',@export_loaded_data_bt_Callback,'CData',rarrow,...
'Position',[207 23 30 24],'String',blanks(0),'UserData',[],...
'Tag','export_loaded_data_bt');
uicontrol('Parent',datamanage_pn,'HorizontalAlignment','left',...
'Position',[13 226 87 13],'String','Import',...
'Style','text',...
'Tag','import_tx');
uicontrol('Parent',datamanage_pn,'HorizontalAlignment','left',...
'Position',[13 47 87 13],'String','Export ',...
'Style','text',...
'Tag','export_tx');
uicontrol('Parent',datamanage_pn,...
'Callback',@import_and_add_data_bt_Callback,'CData',larrow,...
'Position',[207 199 30 24],'String',blanks(0),'UserData',[],...
'Tag','import_and_add_data_bt');
uicontrol('Parent',datamanage_pn,...
'Callback',@delete_signal_bt_Callback,'CData',deleteCData,...
'Position',[207 156 30 24],'String',blanks(0),'UserData',[],...
'Tag','delete_signal_bt');
uicontrol('Parent',datamanage_pn,'BackgroundColor',[1 1 1],...
'Callback',@exportfun_selection_pm_Callback,...
'Position',[16 26 180 18],'String',blanks(0),...
'Style','popupmenu','Value',1,...
'Tag','exportfun_selection_pm');
uicontrol('Parent',datamanage_pn,'BackgroundColor',[1 1 1],...
'Callback',@importfun_selection_pm_Callback,...
'Position',[16 205 180 18],'String',blanks(0),...
'Style','popupmenu','Value',1,...
'Tag','importfun_selection_pm');
%% Model pane
model_pn =...
uipanel('Parent',hObject,'Units','pixels','FontSize',9,'Title','Target Model',...
'Tag','model_pn','Clipping','on',...
'Position',[323 349 197 258]);
uicontrol('Parent',model_pn,'BackgroundColor',[1 1 1],...
'Callback',@target_model_eb_Callback,'HorizontalAlignment','left',...
'Position',[9 213 143 23],'String',blanks(0),...
'Style','edit',...
'Tag','target_model_eb');
uicontrol('Parent',model_pn,'BackgroundColor',[1 1 1],...
'Callback',@model_inport_lb_Callback,...
'Position',[9 36 180 123],'String',blanks(0),...
'Style','listbox','Value',1 ,...
'Tag','model_inport_lb');
uicontrol('Parent',model_pn,...
'Callback',@loadmodel_bt_Callback,'CData',fileCData,...
'Position',[160 212 24 24],'String',blanks(0),...
'Tag','loadmodel_bt');
uicontrol('Parent',model_pn,'HorizontalAlignment','left',...
'Position',[9 163 128 13],'String','Name/DataType',...
'Style','text',...
'Tag','datatype_str_lb');
uicontrol('Parent',model_pn,...
'Callback',@setdatatyep_pb_Callback,...
'Position',[9 8 166 21],'String','Convert DataTypes',...
'Tag','setdatatyep_pb');
uicontrol('Parent',model_pn,...
'Callback',@load_current_model_bt_Callback,...
'Position',[65 185 112 21],'String','Load bdroot',...
'Tag','load_current_model_bt');
%% Coverage pane
coverage_pn =...
uipanel('Parent',hObject,'Units','pixels','FontSize',9,'Title','Coverage',...
'Tag','coverage_pn','Clipping','on',...
'Position',[10 289 341 54]);
uicontrol('Parent',coverage_pn,...
'Callback',@get_covdata_bt_Callback,...
'Position',[12 11 98 24],'String','Record coverage',...
'Tag','get_covdata_bt');
uicontrol('Parent',coverage_pn,...
'Callback',@covrep_bt_Callback,...
'Position',[117 11 98 24],'String','Coverage Report',...
'Tag','covrep_bt');
uicontrol('Parent',coverage_pn,...
'Position',[231 13 97 19],'String','Model Coloring',...
'Style','checkbox',...
'Tag','blockcolor_cb');
%% SLDV pane
sldv_pn=...
uipanel('Parent',hObject,'Units','pixels','FontSize',9,'Title','SLDV',...
'Tag','sldv_pn','Clipping','on',...
'Position',[10 175 514 105]);
uicontrol('Parent',sldv_pn,...
'Callback',@sldvgencov_bt_Callback,...
'Position',[21 34 154 38],'String','Analyze missing coverages',...
'Tag','sldvgencov_bt');
uicontrol('Parent',sldv_pn,...
'Position',[212 73 126 19],'String','Create harness',...
'Style','checkbox','Value',1,...
'Tag','create_harness_cb');
uicontrol('Parent',sldv_pn,...
'Callback',@create_sldvreport_cb_Callback,...
'Position',[212 54 101 18],'String','Create report',...
'Style','checkbox','Value',1,...
'Tag','create_sldvreport_cb');
uicontrol('Parent',sldv_pn,...
'Position',[212 33 149 19],'String','ModelReferenceHarness',...
'Style','checkbox',...
'Tag','ModelReferenceHarness_cb');
uicontrol('Parent',sldv_pn,...
'Position',[212 13 149 19],'String','SaveSystemTestHarness',...
'Style','checkbox',...
'Tag','SaveSystemTestHarness_cb');
uicontrol('Parent',sldv_pn,'HorizontalAlignment','left',...
'Position',[353 76 119 16],'String','TestSuiteOptimization',...
'Style','text',...
'Tag','text11');
uicontrol('Parent',sldv_pn,'BackgroundColor',[1 1 1],...
'Position',[353 56 148 18],'String',blanks(0),...
'Style','popupmenu','Value',1,...
'Tag','TestSuiteOptimization_pm');
%% Merge pane
merging_pn =...
uipanel('Parent',hObject,'Units','pixels','FontSize',9,'Title','Merge',...
'Tag','merging_pn','Clipping','on',...
'Position',[10 113 261 54]);
uicontrol('Parent',merging_pn,...
'Callback',@getnewharness_bt_Callback,...
'Position',[140 10 107 24],'String','Merge test cases',...
'Tag','getnewharness_bt');
uicontrol('Parent',merging_pn,...
'Callback',@covrep_all_bt_Callback,...
'Position',[13 10 107 24],'String','Combined Report',...
'Tag','covrep_all_bt');
%% File menu
filemenu =...
uimenu('Parent',hObject,'Label','File',...
'Tag','filemenu');
uimenu('Parent',filemenu,...
'Callback',@finish_menu_Callback,'Label','Quit',...
'Tag','finish_menu');
%% Preference menu
preferences_menu =...
uimenu('Parent',hObject,'Label','Preferences',...
'Tag','preferences_menu');
uimenu('Parent',preferences_menu,...
'Callback',@show_model_menu_Callback,'Checked','on','Label','Show model',...
'Tag','show_model_menu');
coverage_menu =...
uimenu('Parent',preferences_menu,...
'Label','Coverage metrics',...
'Tag','coverage_menu');
uimenu('Parent',coverage_menu,...
'Callback',@decision_menu_Callback,'Label','Decision',...
'Tag','decision_menu');
uimenu('Parent',coverage_menu,...
'Callback',@condition_menu_Callback,'Label','Condition',...
'Tag','condition_menu');
uimenu('Parent',coverage_menu,...
'Callback',@mcdc_menu_Callback,'Checked','on','Label','MC/DC',...
'Tag','mcdc_menu');
lang_setting_menu =...
uimenu('Parent',preferences_menu,'Label','Language',...
'Tag','lang_setting_menu');
uimenu('Parent',lang_setting_menu,...
'Callback',@lang_ja_menu_Callback,'Label','Japanese',...
'Tag','lang_ja_menu');
uimenu('Parent',lang_setting_menu,...
'Callback',@lang_en_menu_Callback,'Label','English',...
'Tag','lang_en_menu');
uimenu('Parent',preferences_menu,...
'Callback',@update_document_mb_Callback,'Label','Update document',...
'Tag','update_document_mb');
%% Help menu
help_mb =...
uimenu('Parent',hObject,'Label','Help',...
'Tag','help_mb');
uimenu('Parent',help_mb,...
'Callback',@document_mn_Callback,'Label','Document',...
'Tag','document_mn');
uimenu('Parent',help_mb,...
'Callback',@check_update_mb_Callback,'Label','Check update via web',...
'Tag','check_update_mb');
%% Information pane
information_pn =...
uipanel('Parent',hObject,'Units','pixels','FontSize',9,'Title','Information',...
'Tag','information_pn','Clipping','on',...
'Position',[13 5 496 100]);
uicontrol('Parent',information_pn,'HorizontalAlignment','left',...
'Position',[16 11 472 74],'String',blanks(0),...
'Style','text',...
'Tag','information_text');
% call Openinig fun
sldvmisscovtool_OpeningFcn();
% set background color of figure window to the same color with uipanels.
set(hObject,'Color',get(findobj('Tag','datamanage_pn'),'BackgroundColor'))
end
%% Opening Function
function sldvmisscovtool_OpeningFcn()
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
set_GUI_strings(guistr);
% Read Plug-in files for importing
[impFunc,impCmd,expFunc,expCmd] = getPlugInFunction();
if ~isempty(impFunc)
set(findobj('Tag','importfun_selection_pm'),'String',impFunc);
else
set(findobj('Tag','importfun_selection_pm'),'String',{''});
end
%incmd = impCmd;
setappdata(findobj('Tag','importfun_selection_pm'),'ImportCommand',impCmd);
% Read Plug-in files for exporting
if ~isempty(expFunc)
set(findobj('Tag','exportfun_selection_pm'),'String',expFunc);
else
set(findobj('Tag','exportfun_selection_pm'),'String',{''});
end
setappdata(findobj('Tag','exportfun_selection_pm'),'ExportCommand',expCmd)
% Show only DataManagement pane
setGUIvisibility('DataManagement')
% If there is SLDV license, we show related GUIs otherwise we disable them.
strTestSuiteOptimization = {''};
if exist(fullfile(matlabroot,'toolbox','sldv','sldv'),'dir') &&...
license('test','Simulink_Design_Verifier')
opts = sldvoptions();
strTestSuiteOptimization = set(opts,'TestSuiteOptimization');
optstr = set(opts);
if ~isfield(optstr,'ModelReferenceHarness')
set(findobj('Tag','ModelReferenceHarness_cb'),'Visible','off')
else
set(findobj('Tag','ModelReferenceHarness_cb'),'Visible','on')
end
if ~isfield(optstr,'SaveSystemTestHarness')
set(findobj('Tag','SaveSystemTestHarness_cb'),'Visible','off')
else
set(findobj('Tag','SaveSystemTestHarness_cb'),'Visible','on')
end
end
set(findobj('Tag','TestSuiteOptimization_pm'),'String',strTestSuiteOptimization);
% warn if "simdata" is defined in base workspace
if evalin('base','exist(''simdata'',''var'')')
warndlg(guistr.warndlg{28})
end
end
%% === Data Management ===
%% Import button
function import_and_add_data_bt_Callback(hObject, eventdata)%#ok
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
incmd = getappdata(findobj('Tag','importfun_selection_pm'),'ImportCommand');
if isempty(incmd)
return
end
nfun = get(findobj('Tag','importfun_selection_pm'),'Value');
simdata_str = get(findobj('Tag','testcases_lb'),'String');
if isempty(simdata_str)
simdata_str = {};
end
if evalin('base','exist(''simdata'',''var'')')
simdata = evalin('base','simdata');
if length(simdata) ~= length(simdata_str)
warndlg(guistr.warndlg{25})
return;
end
end
[simdata_new,testcasename] = eval(sprintf('%s(''import'')',incmd{nfun}));
% In case of canceled or no test cases
if isempty(simdata_new)
warndlg(testcasename)
return;
end
% adding simdata.signalName if there are no member named signalName.
for n=1:length(simdata_new)
if ~isfield(simdata_new(n),'signalName') || isempty(simdata_new(n).signalName)
simdata_new(n).signalName = testcasename{n};
end
end
fldname = {'time','signals','signalName'};
if evalin('base','exist(''simdata'',''var'')')
try
simdata = evalin('base','simdata');
for n=1:length(simdata_new)
idx = numel(simdata)+1;
for m=1:length(fldname)
simdata(idx).(fldname{m}) = simdata_new(n).(fldname{m});
end
end
catch %#ok
warndlg(guistr.warndlg{21})
return;
end
else
simdata = simdata_new;
end
% Parsing signalName for new added signals
for n=1:length(simdata)
if isempty(simdata(n).signalName)
simdata(n).signalName = sprintf('TestCase%3d',n);
else
simdata(n).signalName = sprintf(simdata(n).signalName,n);
end
end
% Test case names shown in testcases_lb
for n=1:length(simdata)
newtcname{n} = simdata(n).signalName; %#ok
end
assignin('base','simdata',simdata);
set(findobj('Tag','testcases_lb'),'String',newtcname);
% select all test cases in the list box
set(findobj('Tag','testcases_lb'),'Value',1:length(newtcname));
setGUIvisibility('TargetModel')
end
%% Export button
function export_loaded_data_bt_Callback(hObject, eventdata) %#ok
excmd = getappdata(findobj('Tag','exportfun_selection_pm'),'ExportCommand');
if isempty(excmd)
return
end
nfun = get(findobj('Tag','exportfun_selection_pm'),'Value');
selected = get(findobj('Tag','testcases_lb'),'Value'); %#ok
eval(sprintf('%s(''export'',selected);',excmd{nfun}));
end
%% List of Testcases
function testcases_lb_Callback(hObject, eventdata) %#ok
% double-click action of Test cases in the listbox
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
if strcmp(get(findobj('Tag','sldvmisscovtool'),'SelectionType'),'open')
simdata = evalin('base','simdata');
testcasenames = get(hObject,'String');
selected = get(hObject,'Value');
%% Dialog to specify variable name
qstr=guistr.warndlg(26);
titlestr=guistr.warndlg{27};
defaultanswer=testcasenames(selected); % This should not be simdata.
valname=inputdlg(qstr,titlestr,1,defaultanswer);
if isempty(valname)% Cancel button
return;
else
simdata(selected).signalName = sprintf(valname{1},selected);
end
% Test case names shown in testcases_lb
for n=1:length(simdata)
newtcname{n} = simdata(n).signalName; %#ok
end
assignin('base','simdata',simdata);
set(findobj('Tag','testcases_lb'),'String',newtcname);
end
end
%% Refresh button
function refresh_bt_Callback(hObject, eventdata) %#ok
% action of refresh button
setGUIvisibility('DataManagement')
evalin('base','clear simdata');
end
%% Delete signal button
function delete_signal_bt_Callback(hObject, eventdata) %#ok
selected = get(findobj('Tag','testcases_lb'),'Value');
strs = get(findobj('Tag','testcases_lb'),'String');
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
if ~evalin('base','exist(''simdata'',''var'')')
% If there is no simdata variable in WorkSpace, we clear the list in GUI.
% Manually removing the variable or pressing removing button before
% importing are the case.
warndlg(guistr.warndlg{22})
set(findobj('Tag','testcases_lb'),'Value',[])
set(findobj('Tag','testcases_lb'),'String','');
return;
end
simdata = evalin('base','simdata');
simdata(selected)=[];
strs(selected) = [];
if ~isempty(simdata)
assignin('base','simdata',simdata);
else
% In case simdata is defiend as 0x1 size.
evalin('base','clear simdata')
end
set(findobj('Tag','testcases_lb'),'Value',[])
set(findobj('Tag','testcases_lb'),'String',strs);
end
%% === Model ===
%% Load model button
function loadmodel_bt_Callback(hObject, eventdata) %#ok
isViewModel = strcmp(get(findobj('Tag','show_model_menu'),'Check'),'on');
[stat,ModelName] = loadModel(isViewModel);
% set GUI visiblity depending on status
if stat
setGUIvisibility('CoverageMeasurement')
set(findobj('Tag','target_model_eb'),'String',ModelName);
else
setGUIvisibility('TargetModel')
return;
end
% Read data-types of inport blocks
readInportSetting();
end
%% load current model
function load_current_model_bt_Callback(hObject, eventdata)%#ok
set(findobj('Tag','target_model_eb'),'String',bdroot);
setGUIvisibility('CoverageMeasurement')
readInportSetting();
end
%% [helper] ReadInportBlocks
function readInportSetting()
ModelName=get(findobj('Tag','target_model_eb'),'String');
try
[inportBlks, inportBlkDT] = readInportBlockSettings(ModelName);
catch %#ok
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
warndlg(guistr.warndlg{24})
rethrow(lasterror)%#ok
return;%#ok
end
inportBlkNames = get_param(inportBlks,'Name');
GUINames = cell(size(inportBlks));
for n=1:length(inportBlks)
GUINames{n} = sprintf('%s (%s)',inportBlkNames{n},inportBlkDT{n});
end
set(findobj('Tag','model_inport_lb'),'String',GUINames);
setappdata(findobj('Tag','sldvmisscovtool'),'InportBlockDataType',inportBlkDT);
end
%% Override simdata to model's datatype
function setdatatyep_pb_Callback(hObject, eventdata) %#ok
readInportSetting();
selected = get(findobj('Tag','testcases_lb'),'Value');
datatypes = getappdata(findobj('Tag','sldvmisscovtool'),'InportBlockDataType');
setSimdata2ModelDatatype(datatypes,selected);
end
%% === Coverage ===
%% Run simulation and record coverage
function get_covdata_bt_Callback(hObject, eventdata) %#ok
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
ModelName=get(findobj('Tag','target_model_eb'),'String');
if strcmp(get(findobj('Tag','show_model_menu'),'Checked'),'on')
open_system(ModelName)
else
load_system(ModelName)
end
selected = get(findobj('Tag','testcases_lb'),'Value');
simdata = evalin('base','simdata');
datatypes = getappdata(findobj('Tag','sldvmisscovtool'),'InportBlockDataType');
% Warn if there is mismatch between simdata and inport block settings
if ~checkDatatypeMatching(datatypes,selected)
ystr = guistr.warndlg{6};
nstr = guistr.warndlg{7};
ButtonName=questdlg(guistr.warndlg{13},guistr.warndlg{18},ystr,nstr,ystr);
switch ButtonName
case ystr
% force to cast datatypes into model's
setSimdata2ModelDatatype(datatypes,selected)
simdata = evalin('base','simdata');
otherwise
return;
end
end
set(hObject,'Enable','off')
selected = get(findobj('Tag','testcases_lb'),'Value');
if strcmp(get(findobj('Tag','decision_menu'),'Checked'),'on')
metrics = 'decision';
elseif strcmp(get(findobj('Tag','condition_menu'),'Checked'),'on')
metrics = 'condition';
elseif strcmp(get(findobj('Tag','mcdc_menu'),'Checked'),'on')
metrics = 'MCDC';
end
if evalin('base','exist(''covData'',''var'')')
evalin('base','clear covData');
end
if evalin('base','exist(''cvto'',''var'')')
evalin('base','clear cvto');
end
[selected,covData,cvdo,cvto] = runcvsim(ModelName,simdata, selected, metrics); %#ok
set(findobj('Tag','testcases_lb'),'Value',selected);
if isempty(selected)
warning('sldvmisscovtool:NoAvalableInput','Coverage information is empty. Please check input data.')
setGUIvisibility('CoverageMeasurement');
return;
end
if get(findobj('Tag','blockcolor_cb'),'Value')
cvmodelview(covData);
end
assignin('base','covData',covData);
assignin('base','cvto',cvto);
setGUIvisibility('sldvGenCov');
set(hObject,'Enable','on')
end
%% Coverage report button
function covrep_bt_Callback(hObject, eventdata) %#ok
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
try
if evalin('base','exist(''covData'',''var'')')
covData = evalin('base','covData');
cvhtml('userdatacov.html',covData);
end
catch %#ok
ME = lasterror; %#ok
switch ME.identifier
case {'SLVNV:simcoverage:subsref:NonExistentData','MATLAB:nonExistentField'}
warndlg(guistr.warndlg{10});
case 'Simulink:SL_InvSimulinkObjectName'
warndlg(guistr.warndlg{12});
otherwise
warndlg(guistr.warndlg{11});
rethrow(ME)
end
setGUIvisibility('TergetModel');
end
end
%% Call SignalViewer
function signalview_bt_Callback(hObject, eventdata) %#ok
simdata = evalin('base','simdata');
selected = get(findobj('Tag','testcases_lb'),'Value');
sldvmisscovtool_signalviewer('simdata',simdata(selected));
end
%% === Obtain missing coverage test ===
%% Obtain missing tests
function sldvgencov_bt_Callback(hObject, eventdata) %#ok
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
ModelName=get(findobj('Tag','target_model_eb'),'String');
if strcmp(get(findobj('Tag','show_model_menu'),'Check'),'on')
open_system(ModelName)
else
load_system(ModelName)
end
opts = setsldvOptions();
tic % measure analysis time
covData = evalin('base','covData');
try
set(hObject,'Enable','off')
switch version('-release')
case {'2007a','2007b'}
[status,SldvCovData,sldvfileNames]=sldvgencov(ModelName,opts,covData); %#ok
otherwise
[status,SldvCovData,sldvfileNames]=sldvgencov(ModelName,opts,true,covData); %#ok
end
assignin('base','SldvCovData',SldvCovData)
setappdata(findobj('Tag','sldvmisscovtool'),'sldvfileNames',sldvfileNames)
setGUIvisibility('Merging');
catch %#ok
set(hObject,'Enable','on')
ME = lasterror; %#ok
toc
switch ME.identifier
case 'SLVNV:simcoverage:subsref:NonExistentData'
warndlg(guistr.warndlg{10});
case 'Simulink:SL_InvSimulinkObjectName'
warndlg(guistr.warndlg{12});
otherwise
warndlg(guistr.warndlg{11});
rethrow(ME)
end
setGUIvisibility('sldvGenCov');
end
set(hObject,'Enable','on')
toc
end
%% [helper] Set SLDV Options
function opts = setsldvOptions()
ModelName=get(findobj('Tag','target_model_eb'),'String');
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
opts=sldvoptions();
% modelopts is only for reference because changes cause model to dirty
modelopts=sldvoptions(ModelName);
if strcmp(get(findobj('Tag','decision_menu'),'Checked'),'on')
opts.ModelCoverageObjectives='Decision';
end
if strcmp(get(findobj('Tag','condition_menu'),'Checked'),'on')
opts.ModelCoverageObjectives='Condition';
end
if strcmp(get(findobj('Tag','mcdc_menu'),'Checked'),'on')
opts.ModelCoverageObjectives='MCDC';
end
if get(findobj('Tag','create_harness_cb'),'Value')
opts.SaveHarnessModel='on';
% We cannot generate report without harness.
opts.SaveReport = 'on';
set(findobj('Tag','create_sldvreport_cb'),'Value',1)
else
opts.SaveHarnessModel='off';
opts.SaveReport = 'off';
end
if get(findobj('Tag','create_sldvreport_cb'),'Value')
opts.DisplayReport='on';
else
opts.DisplayReport='off';
end
strs = get(findobj('Tag','TestSuiteOptimization_pm'),'String');
if ~isempty(strs)
opts.TestSuiteOptimization = strs{get(findobj('Tag','TestSuiteOptimization_pm'),'Value')};
end
optstr = set(opts);
if isfield(optstr,'ModelReferenceHarness')
if get(findobj('Tag','ModelReferenceHarness_cb'),'Value')
if strcmp(get_param(ModelName,'dirty'),'on')
ystr = guistr.warndlg{6};
nstr = guistr.warndlg{7};
Answ = questdlg(guistr.warndlg{17},guistr.warndlg{16},ystr,nstr,ystr);
if strcmp(Answ,nstr)
opts = []; % do nothing
return;
end
save_system(ModelName)
end
opts.ModelReferenceHarness='on';
else
opts.ModelReferenceHarness='off';
end
end
if isfield(optstr,'SaveSystemTestHarness')
if get(findobj('Tag','SaveSystemTestHarness_cb'),'Value')
opts.SaveSystemTestHarness='on';
else
opts.SaveSystemTestHarness='off';
end
end
if strcmp(modelopts.Parameters,'on')
ystr = guistr.warndlg{6};
nstr = guistr.warndlg{7};
Answ = questdlg(guistr.warndlg{14},guistr.warndlg{15},ystr,nstr,ystr);
if strcmp(Answ,nstr)
opts = []; % do nothing
return;
end
end
if strcmp(modelopts.SaveDataFile,'off')
ystr = guistr.warndlg{6};
nstr = guistr.warndlg{7};
Answ = questdlg(guistr.warndlg{19},guistr.warndlg{20},ystr,nstr,ystr);
if strcmp(Answ,nstr)
opts = []; % do nothing
return;
end
opts.SaveDataFile='on';
end
end
function create_sldvreport_cb_Callback(hObject, eventdata) %#ok
% harness is needed to report
switch version('-release')
case {'2007a','2007b','2008a'}
if get(hObject,'Value')
set(findobj('Tag','create_harness_cb'),'Value',1)
end
end
end
%% === Merge ===
%% create a merged harness
function getnewharness_bt_Callback(hObject, eventdata) %#ok
selected = get(findobj('Tag','testcases_lb'),'Value');
sldvfileNames = getappdata(findobj('Tag','sldvmisscovtool'),'sldvfileNames');
if ~isfield(sldvfileNames,'HarnessModel') || isempty(sldvfileNames.HarnessModel)
warndlg(guistr.warndlg{5});
return;
end
simdata = evalin('base','simdata');
createMergedHarness(sldvfileNames.HarnessModel,simdata(selected));
end
%% cvhtml for both test cases
function covrep_all_bt_Callback(hObject, eventdata) %#ok
% save as a temporary html file
covData = evalin('base','covData');
SldvCovData = evalin('base','SldvCovData');
cvhtml([tempname '.html'],covData,SldvCovData)
end
%% === Menubar ====
%% Show model
function show_model_menu_Callback(hObject, eventdata) %#ok
if strcmp(get(hObject,'Checked'),'on')
set(hObject,'Checked','off')
else
set(hObject,'Checked','on')
end
end
%% Quit GUI
function finish_menu_Callback(hObject, eventdata) %#ok
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
ystr = guistr.warndlg{6};
nstr = guistr.warndlg{7};
A = questdlg(guistr.warndlg{8},guistr.warndlg{9},ystr,nstr,ystr);
if strcmp(A,ystr)
close(gcf)
end
end
%% Coverage setting
function decision_menu_Callback(hObject, eventdata) %#ok
set(findobj('Tag','decision_menu'),'Checked','on')
set(findobj('Tag','condition_menu'),'Checked','off')
set(findobj('Tag','mcdc_menu'),'Checked','off')
end
function condition_menu_Callback(hObject, eventdata) %#ok
set(findobj('Tag','decision_menu'),'Checked','off')
set(findobj('Tag','condition_menu'),'Checked','on')
set(findobj('Tag','mcdc_menu'),'Checked','off')
end
function mcdc_menu_Callback(hObject, eventdata) %#ok
set(findobj('Tag','decision_menu'),'Checked','off')
set(findobj('Tag','condition_menu'),'Checked','off')
set(findobj('Tag','mcdc_menu'),'Checked','on')
end
function lang_ja_menu_Callback(hObject, eventdata) %#ok
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr_ja');
set_GUI_strings(guistr);
end
function lang_en_menu_Callback(hObject, eventdata) %#ok
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr_en');
set_GUI_strings(guistr);
end
% --- Executes on selection change in findobj('Tag','importfun_selection_pm').
function importfun_selection_pm_Callback(hObject, eventdata) %#ok
incmd = getappdata(findobj('Tag','importfun_selection_pm'),'ImportCommand');
if ~isempty(incmd)
nfunI = get(findobj('Tag','importfun_selection_pm'),'Value');
[labelstrI,infostrI] = eval(sprintf('%s(''description'')',incmd{nfunI})); %#ok
else
infostrI='';
end
excmd = getappdata(findobj('Tag','exportfun_selection_pm'),'ExportCommand');
if ~isempty(excmd)
nfunE = get(findobj('Tag','exportfun_selection_pm'),'Value');
[labelstrE,infostrE] = eval(sprintf('%s(''description'')',excmd{nfunE})); %#ok
else
infostrE='';
end
information_text = sprintf('%s\n%s',infostrI,infostrE);
set(findobj('Tag','information_text'),'String',information_text)
end
% --- Executes on selection change in findobj('Tag','exportfun_selection_pm').
function exportfun_selection_pm_Callback(hObject, eventdata) %#ok
nfunI = get(findobj('Tag','importfun_selection_pm'),'Value');
incmd = getappdata(findobj('Tag','importfun_selection_pm'),'ImportCommand');
excmd = getappdata(findobj('Tag','exportfun_selection_pm'),'ExportCommand');
if ~isempty(incmd)
[labelstrI,infostrI] = eval(sprintf('%s(''description'')',incmd{nfunI})); %#ok
else
infostrI='';
end
if ~isempty(excmd)
nfunE = get(findobj('Tag','exportfun_selection_pm'),'Value');
[labelstrE,infostrE] = eval(sprintf('%s(''description'')',excmd{nfunE})); %#ok
else
infostrE='';
end
information_text = sprintf('%s\n%s',infostrI,infostrE);
set(findobj('Tag','information_text'),'String',information_text)
end
%% Check for updates
function check_update_mb_Callback(hObject, eventdata)%#ok
web('http://www.mathworks.com/matlabcentral/fileexchange/21957','-browser')
end
%% Open Help browser
function document_mn_Callback(hObject, eventdata) %#ok
path = fileparts(which('sldvmisscovtool'));
if isJapaneseEnv()
docdir= 'doc';
else
docdir = 'doc_en';
end
web(fullfile(path,docdir,'sldvmisscovtool_doc_overview.html'),'-helpbrowser');
end
%% Fix documents
function update_document_mb_Callback(hObject, eventdata) %#ok
checkfixInfoxml();
end
%% === Helper functions ====
%% Set GUI visiblity
function setGUIvisibility(mode)
guistr = getappdata(findobj('Tag','sldvmisscovtool'),'guistr');
switch mode
case 'DataManagement'
set(findobj('Tag','datamanage_pn'),'Visible','on')
set(findobj('Tag','model_pn'), 'Visible','off')
set(findobj('Tag','coverage_pn'), 'Visible','off')
set(findobj('Tag','sldv_pn'), 'Visible','off')
set(findobj('Tag','merging_pn'), 'Visible','off')
set(findobj('Tag','testcases_lb'),'String','');
set(findobj('Tag','target_model_eb'),'String','');
set(findobj('Tag','signalview_bt'),'Enable','off');
set(findobj('Tag','testcases_lb'),'Value',[]);
set(findobj('Tag','testcases_lb'),'String','');
nfunI = get(findobj('Tag','importfun_selection_pm'),'Value');
incmd = getappdata(findobj('Tag','importfun_selection_pm'),'ImportCommand');
if ~isempty(incmd)
[labelstrI,infostrI] = eval(sprintf('%s(''description'')',incmd{nfunI})); %#ok
else
labelstrI=''; %#ok
infostrI = '';
end
nfunE = get(findobj('Tag','exportfun_selection_pm'),'Value');
excmd = getappdata(findobj('Tag','exportfun_selection_pm'),'ExportCommand');
if ~isempty(excmd)
[labelstrE,infostrE] = eval(sprintf('%s(''description'')',excmd{nfunE})); %#ok
else
labelstrE=''; %#ok
infostrE = '';
end
information_text_str = sprintf('%s\n%s',infostrI,infostrE);
set(findobj('Tag','information_text'),'String',information_text_str)
case 'TargetModel'
set(findobj('Tag','signalview_bt'),'Enable','on');
set(findobj('Tag','model_pn'), 'Visible','on')
set(findobj('Tag','datamanage_pn'),'Visible','on')
set(findobj('Tag','sldv_pn'), 'Visible','off')
set(findobj('Tag','merging_pn'), 'Visible','off')
set(findobj('Tag','information_text'),'String',guistr.information_text{3})
case 'CoverageMeasurement'
set(findobj('Tag','model_pn'), 'Visible','on')
set(findobj('Tag','datamanage_pn'),'Visible','on')
set(findobj('Tag','coverage_pn'), 'Visible','on')
set(findobj('Tag','sldv_pn'), 'Visible','off')
set(findobj('Tag','merging_pn'), 'Visible','off')
set(findobj('Tag','information_text'),'String',guistr.information_text{2})
set(findobj('Tag','get_covdata_bt'),'Enable','on')
case 'sldvGenCov'
ModelName=get(findobj('Tag','target_model_eb'),'String');
cvto = evalin('base','cvto');
covData = evalin('base','covData');
tcov = getTotalCov(ModelName,cvto,covData);
% if 100% coverage has been reached, gencov is not needed.
if tcov == 1
set(findobj('Tag','sldv_pn'), 'Visible','off')
set(findobj('Tag','information_text'),'String',guistr.information_text{6});
return;
end
set(findobj('Tag','datamanage_pn'),'Visible','on')
set(findobj('Tag','coverage_pn'), 'Visible','on')
set(findobj('Tag','sldv_pn'), 'Visible','on')
set(findobj('Tag','merging_pn'), 'Visible','off')
set(findobj('Tag','information_text'),'String',guistr.information_text{4});
if exist(fullfile(matlabroot,'toolbox','sldv','sldv'),'dir') &&...
license('test','Simulink_Design_Verifier')
ModelName=get(findobj('Tag','target_model_eb'),'String');
opts = sldvoptions(ModelName);
optstr = set(opts);
if strcmp(opts.SaveHarnessModel,'on')
set(findobj('Tag','create_harness_cb'),'Value',1)
else
set(findobj('Tag','create_harness_cb'),'Value',0)
end
if strcmp(opts.SaveReport,'on')
set(findobj('Tag','create_sldvreport_cb'),'Value',1)
else
set(findobj('Tag','create_sldvreport_cb'),'Value',0)
end
if isfield(optstr,'ModelReferenceHarness')
if strcmp(opts.ModelReferenceHarness,'on')
set(findobj('Tag','ModelReferenceHarness_cb'),'Value',1)
else
set(findobj('Tag','ModelReferenceHarness_cb'),'Value',0)
end
end
if isfield(optstr,'SaveSystemTestHarness')
if strcmp(opts.SaveSystemTestHarness,'on')
set(findobj('Tag','SaveSystemTestHarness_cb'),'Value',1)
else
set(findobj('Tag','SaveSystemTestHarness_cb'),'Value',0);
end
end
strs = get(findobj('Tag','TestSuiteOptimization_pm'),'String');
for n=1:length(strs)
if strcmp(opts.TestSuiteOptimization,strs{n})
set(findobj('Tag','TestSuiteOptimization_pm'),'Value',n);
end
end
else
set(findobj('Tag','sldv_pn'), 'Visible','off')
end
case 'Merging'
set(findobj('Tag','datamanage_pn'),'Visible','on')
set(findobj('Tag','coverage_pn'), 'Visible','on')
set(findobj('Tag','sldv_pn'), 'Visible','on')
set(findobj('Tag','merging_pn'), 'Visible','on')
set(findobj('Tag','information_text'),'String',guistr.information_text{5});
end
end
%% Create localized messages
function create_localized_messages()
% Change languages depending of system locale
[guistr_ja,guistr_en] = setLocalizedMessages();
if isJapaneseEnv()
guistr = guistr_ja;
else
guistr = guistr_en;
end
setappdata(findobj('Tag','sldvmisscovtool'),'guistr',guistr);
setappdata(findobj('Tag','sldvmisscovtool'),'guistr_ja',guistr_ja);
setappdata(findobj('Tag','sldvmisscovtool'),'guistr_en',guistr_en);
end
%% Set GUI strings
function set_GUI_strings(guistr)
% Set localized strings to GUI components
% set String properties
flnames=fieldnames(guistr.string);
for n=1:length(flnames)
set(findobj('Tag',flnames{n}),'String',guistr.string.(flnames{n}));
end
% set Title properties
flnames=fieldnames(guistr.title);
for n=1:length(flnames)
set(findobj('Tag',flnames{n}),'Title',guistr.title.(flnames{n}));
end
% set label properties
flnames=fieldnames(guistr.label);
for n=1:length(flnames)
set(findobj('Tag',flnames{n}),'Label',guistr.label.(flnames{n}));
end
% set tooltips properties
flnames=fieldnames(guistr.tooltips);
for n=1:length(flnames)
set(findobj('Tag',flnames{n}),'TooltipString',guistr.tooltips.(flnames{n}));
end
end