Create Custom Boolean Constraint

This example shows how to create a custom boolean constraint that determines if a given value is the same size as an expected value.

In a file in your working folder, create a file HasSameSizeAs.m. The constructor accepts a value to compare to the actual size. This value is stored within the ValueWithExpectedSize property. It is recommended that BooleanConstraint implementations be immutable, so set the property SetAccess=immutable.

classdef HasSameSizeAs < matlab.unittest.constraints.BooleanConstraint
    
    properties(SetAccess=immutable)
        ValueWithExpectedSize
    end
    
    methods
        function constraint = HasSameSizeAs(value)
            constraint.ValueWithExpectedSize = value;
        end
    end
end

Include these methods in the methods block in HasSameSizeAs.m. Since the BooleanConstraint class is a subclass of Constraint, classes that derive from it must implement the satisfiedBy and getDiagnosticFor methods. For more information about these methods, see matlab.unittest.constraints.Constraint.

    methods
        function bool = satisfiedBy(constraint, actual)
            bool = isequal(size(actual), size(constraint.ValueWithExpectedSize));
        end
        function diag = getDiagnosticFor(constraint, actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            
            if constraint.satisfiedBy(actual)
                diag = StringDiagnostic('HasSameSizeAs passed.');
            else
                diag = StringDiagnostic(sprintf(...
                    'HasSameSizeAs failed.\nActual Size: [%s]\nExpectedSize: [%s]',...
                    int2str(size(actual)),...
                    int2str(size(constraint.ValueWithExpectedSize))));
            end
        end
    end

Include the getNegativeDiagnosticFor method in the methods block with protected access in HasSameSizeAs.m. Classes that derive from BooleanConstraint must implement the getNegativeDiagnosticFor method. This method must provide a Diagnostic object that is expressed in the negative sense of the constraint.

    methods(Access=protected)
        function diag = getNegativeDiagnosticFor(constraint, actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            
            if constraint.satisfiedBy(actual)
                diag = StringDiagnostic(sprintf(...
                    ['Negated HasSameSizeAs failed.\nSize [%s] of ' ...
                    'Actual Value and Expected Value were the same ' ...
                    'but should not have been.'], int2str(size(actual))));
            else
                diag = StringDiagnostic('Negated HasSameSizeAs passed.');
            end 
        end 
    end

In exchange for implementing the required methods, the constraint inherits the appropriate and, or, and not overloads so it can be combined with other BooleanConstraint objects or negated.

 HasSameSizeAs Class Definition Summary

At the command prompt, create a test case for interactive testing.

import matlab.unittest.TestCase
import matlab.unittest.constraints.HasLength

testCase = TestCase.forInteractiveUse;

Test a passing case.

testCase.verifyThat(zeros(5), HasLength(5) | ~HasSameSizeAs(repmat(1,5)))
Interactive verification passed.

The test passes because one of the or conditions, HasLength(5), is true.

Test a failing case.

testCase.verifyThat(zeros(5), HasLength(5) & ~HasSameSizeAs(repmat(1,5)))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
AndConstraint failed.
--> + [First Condition]:
     |   HasLength passed.
--> AND
    + [Second Condition]:
     |   Negated HasSameSizeAs failed.
     |   Size [5  5] of Actual Value and Expected Value were the same but should not have been.
    -+---------------------

The test fails because one of the and conditions, ~HasSameSizeAs(repmat(1,5)), is false.

See Also

Related Topics

Was this topic helpful?