%% Coverage for S-Functions
% This example shows how to configure an S-Function generated with the
% Legacy Code Tool to be compatible with coverage.
% The model coverage tool supports S-Functions that are:
%
% * Generated with the Legacy Code Tool, with
% |def.Options.supportCoverage| set to |true|,
% * Generated with the SFunctionBuilder, with *Enable support for
% coverage* selected on the *Build Info* tab of the SFunctionBuilder
% dialog box, or
% * Compiled with the <docid:slcoverage_ref#buqlu47 slcovmex> function.

% Copyright 2014-2019 The MathWorks, Inc.

%% Open Example Model
% The example model <matlab:slcoverage_lct_bus slcoverage_lct_bus>
% contains an S-Function generated with the Legacy Code Tool.
% The S-Function has constructs that receive decision, condition, and MCDC
% coverage.

%%
% <matlab:open_system('slcoverage_lct_bus') Open slcoverage_lct_bus>

%% Configure S-Function to Be Compatible with Model Coverage
% The legacy source code in the files
% <matlab:slcoverage_lct_util('edit','slcoverage_lct_src/counterbus.h') counterbus.h>, and
% <matlab:slcoverage_lct_util('edit','slcoverage_lct_src/counterbus.c') counterbus.c>
% implements the same algorithm as in
% <matlab:open_system('slcoverage_lct_bus/slCounter') slcoverage_lct_bus/slCounter>.
% The Legacy Code Tool data structure is defined as follows:

load_system('slcoverage_lct_bus');
open_system('slcoverage_lct_bus/TestCounter'); 
load slcoverage_lct_data.mat

def = legacy_code('initialize');
def.SFunctionName = 'slcoverage_sfun_counterbus';
def.OutputFcnSpec = 'void counterbusFcn(COUNTERBUS u1[1], int32 u2, COUNTERBUS y1[1], int32 y2[1])';
def.HeaderFiles   = {'counterbus.h'};
def.SourceFiles   = {'counterbus.c'};

%%
% To make this S-Function compatible with model coverage,
% enable the following option:

def.Options.supportCoverage = true;

%%
% Generate and compile the S-Function using the <docid:simulink_ref#bqwyczg legacy_code> function:

legacy_code('generate_for_sim', def);

%% Enable S-Function Coverage
% To enable coverage collection for S-Functions, select *C/C++ S-Functions*
% in the *Coverage pane of the Configurations Parameters* dialog box.
% Alternatively, set the option through the command line:

set_param('slcoverage_lct_bus',...
          'CovMetricStructuralLevel', 'MCDC',...
          'RecordCoverage', 'on',...
          'CovSFcnEnable', 'on',...
          'CovSaveSingleToWorkspaceVar','on'...
          );

%% Run Simulation and Produce Coverage Report
% Once you enable coverage data collection, coverage information
% is automatically recorded when you simulate the model. At the end of the
% simulation, you can generate an HTML report of coverage information,
% which is displayed in the built-in MATLAB(R) web browser.

sim('slcoverage_lct_bus', 'StopTime', '20');
cvhtml('coverageResults', covdata);

%% Extract Information from Coverage Data Objects
% The |cvdata| object can be used to extract coverage information for
% S-Functions, just like any other supported model element. For instance, the |decisioninfo|
% command extracts coverage information from a block path or
% a block handle.  The output is a vector containing the satisfied and total outcomes
% for a single model object.

cov = decisioninfo(covdata, 'slcoverage_lct_bus/TestCounter/slcoverage_sfun_counterbus')

%%
% You then use this coverage information to calculate the percentage of covered model objects:

percentCov = 100 * (cov(1)/cov(2))

%%
% S-Function coverage is fully compatible with the model coverage commands,
% such as |decisioninfo|, |conditioninfo|, and |mcdcinfo|.
