Создание пользовательского допуска

Этот пример показывает, как создать пользовательский допуск, чтобы определить, имеют ли две последовательности 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.

Смотрите также