This example shows how to create a custom tolerance to determine if two DNA sequences have a Hamming distance within a specified tolerance. For two DNA sequences of the same length, the Hamming distance is the number of positions in which the nucleotides (letters) of one sequence differ from the other.
In a file, DNA.m
, in your working folder,
create a simple class for a DNA sequence.
classdef DNA properties(SetAccess=immutable) Sequence end methods function dna = DNA(sequence) validLetters = ... sequence == 'A' | ... sequence == 'C' | ... sequence == 'T' | ... sequence == 'G'; if ~all(validLetters(:)) error('Sequence contained a letter not found in DNA.') end dna.Sequence = sequence; end end end
In a file in your working folder, create a tolerance class
so that you can test that DNA sequences are within a specified Hamming
distance. The constructor requires a Value
property
that defines the maximum Hamming distance.
classdef HammingDistance < matlab.unittest.constraints.Tolerance properties Value end methods function tolerance = HammingDistance(value) tolerance.Value = value; end end end
In a methods
block with the HammingDistance
class
definition, include the following method so that the tolerance supports
DNA objects. Tolerance classes must implement a supports
method.
methods function tf = supports(~, value) tf = isa(value, 'DNA'); end end
In a methods
block with the HammingDistance
class
definition, include the following method that returns true
or false
.
Tolerance classes must implement a satisfiedBy
method.
The testing framework uses this method to determine if two values
are within the tolerance.
methods function tf = satisfiedBy(tolerance, actual, expected) if ~isSameSize(actual.Sequence, expected.Sequence) tf = false; return end tf = hammingDistance(actual.Sequence,expected.Sequence) <= tolerance.Value; end end
In the HammingDistance.m
file, define
the following helper functions outside of the classdef
block.
The isSameSize
function returns true
if
two DNA sequences are the same size, and the hammingDistance
function
returns the Hamming distance between two sequences.
function tf = isSameSize(str1, str2) tf = isequal(size(str1), size(str2)); end function distance = hammingDistance(str1, str2) distance = nnz(str1 ~= str2); end
The function returns a Diagnostic
object
with information about the comparison. In a methods
block
with the HammingDistance
class definition, include
the following method that returns a StringDiagnostic
.
Tolerance classes must implement a getDiagosticFor
method.
methods function diag = getDiagnosticFor(tolerance, actual, expected) import matlab.unittest.diagnostics.StringDiagnostic if ~isSameSize(actual.Sequence, expected.Sequence) str = 'The DNA sequences must be the same length.'; else str = sprintf('%s%d.\n%s%d.', ... 'The DNA sequences have a Hamming distance of ', ... hammingDistance(actual.Sequence, expected.Sequence), ... 'The allowable distance is ', ... tolerance.Value); end diag = StringDiagnostic(str); end end
HammingDistance Class Definition Summary
At the command prompt, create a TestCase
for
interactive testing.
import matlab.unittest.TestCase import matlab.unittest.constraints.IsEqualTo testCase = TestCase.forInteractiveUse;
Create two DNA objects.
sampleA = DNA('ACCTGAGTA'); sampleB = DNA('ACCACAGTA');
Verify that the DNA sequences are equal to each other.
testCase.verifyThat(sampleA, IsEqualTo(sampleB))
Interactive verification failed. --------------------- Framework Diagnostic: --------------------- IsEqualTo failed. --> ObjectComparator failed. --> The objects are not equal using "isequal". Actual Object: DNA with properties: Sequence: 'ACCTGAGTA' Expected Object: DNA with properties: Sequence: 'ACCACAGTA'
Verify that the DNA sequences are equal to each other within a Hamming distance of 1.
testCase.verifyThat(sampleA, IsEqualTo(sampleB,... 'Within', HammingDistance(1)))
Interactive verification failed. --------------------- Framework Diagnostic: --------------------- IsEqualTo failed. --> ObjectComparator failed. --> The objects are not equal using "isequal". --> The DNA sequences have a Hamming distance of 2. The allowable distance is 1. Actual Object: DNA with properties: Sequence: 'ACCTGAGTA' Expected Object: DNA with properties: Sequence: 'ACCACAGTA'
The sequences are not equal to each other within a tolerance
of 1. The testing framework displays additional diagnostics from the getDiagnosticFor
method.
Verify that the DNA sequences are equal to each other within a Hamming distance of 2.
testCase.verifyThat(sampleA, IsEqualTo(sampleB,... 'Within', HammingDistance(2)))
Interactive verification passed.