Этот пример показывает, как создать пользовательский допуск, чтобы определить, имеют ли две последовательности DNA Расстояние Хемминга в заданном допуске. Для двух последовательностей DNA той же длины Расстояние Хемминга является количеством положений, в которых нуклеотиды (буквы) от одной последовательности отличаются от другого.
В файле DNA.m
, в вашей рабочей папке, создает простой класс для последовательности DNA.
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
В файле в вашей рабочей папке создайте класс допуска так, чтобы можно было протестировать тот DNA, который последовательности в заданном Расстоянии Хемминга. Конструктор требует свойства Value
, которое задает максимальное Расстояние Хемминга.
classdef HammingDistance < matlab.unittest.constraints.Tolerance properties Value end methods function tolerance = HammingDistance(value) tolerance.Value = value; end end end
В блоке methods
с определением класса HammingDistance
включайте следующий метод так, чтобы допуск поддержал объекты DNA. Классы допуска должны реализовать метод supports
.
methods function tf = supports(~, value) tf = isa(value, 'DNA'); end end
В блоке methods
с определением класса HammingDistance
включайте следующий метод, который возвращает true
или false
. Классы допуска должны реализовать метод satisfiedBy
. Среда тестирования использует этот метод, чтобы определить, ли два значения в допуске.
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
В файле HammingDistance.m
задайте следующие функции помощника за пределами блока classdef
. Функция isSameSize
возвращает true
, если две последовательности DNA одного размера, и функция hammingDistance
возвращает Расстояние Хемминга между двумя последовательностями.
function tf = isSameSize(str1, str2) tf = isequal(size(str1), size(str2)); end function distance = hammingDistance(str1, str2) distance = nnz(str1 ~= str2); end
Функция возвращает объект Diagnostic
с информацией о сравнении. В блоке methods
с определением класса HammingDistance
включайте следующий метод, который возвращает StringDiagnostic
. Классы допуска должны реализовать метод getDiagosticFor
.
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
В командной строке создайте TestCase
для интерактивного тестирования.
import matlab.unittest.TestCase import matlab.unittest.constraints.IsEqualTo testCase = TestCase.forInteractiveUse;
Создайте два объекта DNA.
sampleA = DNA('ACCTGAGTA'); sampleB = DNA('ACCACAGTA');
Проверьте, что последовательности DNA равны друг другу.
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'
Проверьте, что последовательности DNA равны друг другу в Расстоянии Хемминга 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'
Последовательности не равны друг другу в допуске 1. Среда тестирования отображает дополнительную диагностику из метода getDiagnosticFor
.
Проверьте, что последовательности DNA равны друг другу в Расстоянии Хемминга 2.
testCase.verifyThat(sampleA, IsEqualTo(sampleB,... 'Within', HammingDistance(2)))
Interactive verification passed.