Search code examples
matlabtestingargumentsmatlab-figure

How to test arguments for a figure or axis object in MATLAB 2022?


A function receives a figure or axis object object as parameter. I want to test this as shown in the FIXME line. Which test should be used here in order to allow all valid objects for exportgraphics?

% myexportgraphics.m
function myexportgraphics(f)
arguments
  f (1,1) {}; % FIXME add a test here 
end

exportgraphics(f,...);
end

Solution

  • This full list of validation functions is documented here:

    https://uk.mathworks.com/help/matlab/matlab_prog/argument-validation-functions.html

    The only relevant one for checking the input type (other than ones for specific types like "double") is mustBeUnderlyingType

    You can check which types are valid using underlyingType on example objects you want to accept.

    underlyingType( figure() );  % 'matlab.ui.Figure'
    underlyingType( axes() );    % 'matlab.graphics.axis.Axes'
    

    So this would check for figures

    function myexportgraphics(f)
    arguments
      f (1,1) {mustBeUnderlyingType(f,'matlab.ui.Figure')};  
    end
    
    end
    

    However, that doesn't allow multiple variable types, so per the docs you probably want to make your own validation function

    function myexportgraphics(f)
    arguments
      f (1,1) {mustBeExportGraphicsType(f)}; 
    end
    
    end
    
    function mustBeExportGraphicsType(g)
        if ~ismember( class(g), {'matlab.ui.Figure','matlab.graphics.axis.Axes'} )
            eidType = 'mustBeExportGraphicsType:notExportGraphicsType';
            msgType = 'Input must be a figure or axes object';
            throwAsCaller(MException(eidType,msgType));
        end
    end
    

    These are the requirements for a custom validation function, emphasis mine:

    Functions used for validation have these design elements:

    • Validation functions do not return outputs or modify program state. The only purpose is to check the validity of the input value.
    • Validation functions must accept the value being validated as an input argument. If the function accepts more than one input argument, the first input is the value to be validated.
    • Validation functions rely only on the inputs. No other values are available to the function.
    • Validation functions throw an error if the validation fails. Using throwAsCaller to throw exceptions avoids showing the validation function itself in the displayed error message.

    Creating your own validation function is useful when you want to provide specific validation that is not available using the MATLAB validation functions. You can create a validation function as a local function within the function file or place it on the MATLAB path.


    As an aside, you could use ishghandle within the custom validation function which returns true for figure and axes inputs. If you didn't use the arguments validation syntax, you could instead use ishghandle with the slightly older inputParser approach to input validation, or a simple assert near the start of your function, but that's probably beyond the scope of this question.