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.