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 current folder, create a class named
IsSameSizeAs
that derives from the matlab.unittest.constraints.BooleanConstraint
class. The class
constructor accepts an expected value whose size is compared to the size of an
actual value. The expected value is stored in the
ValueWithExpectedSize
property. The recommended practice
is to make BooleanConstraint
implementations immutable, so
set the property SetAccess
attribute to
immutable
.
classdef IsSameSizeAs < matlab.unittest.constraints.BooleanConstraint properties (SetAccess=immutable) ValueWithExpectedSize end methods function constraint = IsSameSizeAs(value) constraint.ValueWithExpectedSize = value; end end end
In a methods
block with private
access,
define a helper method sizeMatchesExpected
that determines if
the actual and expected values are the same size. This method is invoked by
other constraint methods.
methods (Access=private) function tf = sizeMatchesExpected(constraint,actual) tf = isequal(size(actual), ... size(constraint.ValueWithExpectedSize)); end end
The matlab.unittest.constraints.BooleanConstraint
class is a
subclass of the matlab.unittest.constraints.Constraint
class. Therefore, classes
that derive from the BooleanConstraint
class must implement
the methods of the Constraint
class. Within a
methods
block, implement the
satisfiedBy
and getDiagnosticFor
methods. The satisfiedBy
implementation must contain the
comparison logic and return a logical value. The
getDiagnosticFor
implementation must evaluate the actual
value against the constraint and provide a Diagnostic
object. In this
example, getDiagnosticFor
returns a StringDiagnostic
object.
methods function tf = satisfiedBy(constraint,actual) tf = constraint.sizeMatchesExpected(actual); end function diagnostic = getDiagnosticFor(constraint,actual) import matlab.automation.diagnostics.StringDiagnostic if constraint.sizeMatchesExpected(actual) diagnostic = StringDiagnostic("IsSameSizeAs passed."); else diagnostic = StringDiagnostic( ... "IsSameSizeAs failed." + newline + "Actual Size: [" ... + int2str(size(actual)) + "]" + newline ... + "Expected Size: [" ... + int2str(size(constraint.ValueWithExpectedSize)) ... + "]"); end end end
Classes that derive from BooleanConstraint
must implement
the getNegativeDiagnosticFor
method. This method must provide
a Diagnostic
object when the constraint is negated. Implement
getNegativeDiagnosticFor
in a methods
block with protected
access.
methods (Access=protected) function diagnostic = getNegativeDiagnosticFor(constraint,actual) import matlab.automation.diagnostics.StringDiagnostic if constraint.sizeMatchesExpected(actual) diagnostic = StringDiagnostic( ... "Negated IsSameSizeAs failed." + newline + ... "Actual and expected sizes were the same ([" ... + int2str(size(actual)) + ... "]) but should not have been."); else diagnostic = StringDiagnostic( ... "Negated IsSameSizeAs 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.
IsSameSizeAs
Class Definition
This is the complete code for the IsSameSizeAs
class.
classdef IsSameSizeAs < matlab.unittest.constraints.BooleanConstraint properties (SetAccess=immutable) ValueWithExpectedSize end methods function constraint = IsSameSizeAs(value) constraint.ValueWithExpectedSize = value; end function tf = satisfiedBy(constraint,actual) tf = constraint.sizeMatchesExpected(actual); end function diagnostic = getDiagnosticFor(constraint,actual) import matlab.automation.diagnostics.StringDiagnostic if constraint.sizeMatchesExpected(actual) diagnostic = StringDiagnostic("IsSameSizeAs passed."); else diagnostic = StringDiagnostic( ... "IsSameSizeAs failed." + newline + "Actual Size: [" ... + int2str(size(actual)) + "]" + newline ... + "Expected Size: [" ... + int2str(size(constraint.ValueWithExpectedSize)) ... + "]"); end end end methods (Access=protected) function diagnostic = getNegativeDiagnosticFor(constraint,actual) import matlab.automation.diagnostics.StringDiagnostic if constraint.sizeMatchesExpected(actual) diagnostic = StringDiagnostic( ... "Negated IsSameSizeAs failed." + newline + ... "Actual and expected sizes were the same ([" ... + int2str(size(actual)) + ... "]) but should not have been."); else diagnostic = StringDiagnostic( ... "Negated IsSameSizeAs passed."); end end end methods (Access=private) function tf = sizeMatchesExpected(constraint,actual) tf = isequal(size(actual), ... size(constraint.ValueWithExpectedSize)); end end end
Test for Expected Size
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. The test passes because one of the or
conditions, HasLength(5)
, is true.
testCase.verifyThat(zeros(5),HasLength(5) | ~IsSameSizeAs(repmat(1,5)))
Verification passed.
Test a failing case. The test fails because one of the and
conditions, ~IsSameSizeAs(repmat(1,5))
, is false.
testCase.verifyThat(zeros(5),HasLength(5) & ~IsSameSizeAs(repmat(1,5)))
Verification failed. --------------------- Framework Diagnostic: --------------------- AndConstraint failed. --> + [First Condition]: | HasLength passed. | | Actual Value: | 0 0 0 0 0 | 0 0 0 0 0 | 0 0 0 0 0 | 0 0 0 0 0 | 0 0 0 0 0 | Expected Length: | 5 --> AND + [Second Condition]: | Negated ISameSizeAs failed. | Actual and expected sizes were the same ([5 5]) but should not have been. -+---------------------
See Also
Classes
matlab.unittest.constraints.BooleanConstraint
|matlab.unittest.constraints.Constraint
|matlab.automation.diagnostics.StringDiagnostic
|matlab.automation.diagnostics.Diagnostic