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

Этот пример показывает, как создать пользовательское булево ограничение, которое определяет, одного размера ли данное значение как ожидаемое значение.

В файле в вашей рабочей папке создайте файл HasSameSizeAs.m. Конструктор принимает, что значение выдерживает сравнение с фактическим размером. Это значение хранится в свойстве ValueWithExpectedSize. Поскольку рекомендуется, чтобы реализации BooleanConstraint были неизменяемыми, установите атрибут свойства SetAccess на immutable.

classdef HasSameSizeAs < matlab.unittest.constraints.BooleanConstraint
    
    properties(SetAccess=immutable)
        ValueWithExpectedSize
    end
    
    methods
        function constraint = HasSameSizeAs(value)
            constraint.ValueWithExpectedSize = value;
        end
    end
end

Включайте эти методы в блок methods в HasSameSizeAs.m. Поскольку класс BooleanConstraint является подклассом Constraint, классы, которые выводят от него, должны реализовать методы getDiagnosticFor и satisfiedBy. Для получения дополнительной информации об этих методах, смотрите matlab.unittest.constraints.Constraint.

    methods
        function bool = satisfiedBy(constraint, actual)
            bool = isequal(size(actual), size(constraint.ValueWithExpectedSize));
        end
        function diag = getDiagnosticFor(constraint, actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            
            if constraint.satisfiedBy(actual)
                diag = StringDiagnostic('HasSameSizeAs passed.');
            else
                diag = StringDiagnostic(sprintf(...
                    'HasSameSizeAs failed.\nActual Size: [%s]\nExpectedSize: [%s]',...
                    int2str(size(actual)),...
                    int2str(size(constraint.ValueWithExpectedSize))));
            end
        end
    end

Включайте метод getNegativeDiagnosticFor в блок methods с защищенным доступом в HasSameSizeAs.m. Классы, которые выводят от BooleanConstraint, должны реализовать метод getNegativeDiagnosticFor. Этот метод должен обеспечить объект Diagnostic, который выражается в отрицательном смысле ограничения.

    methods(Access=protected)
        function diag = getNegativeDiagnosticFor(constraint, actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            
            if constraint.satisfiedBy(actual)
                diag = StringDiagnostic(sprintf(...
                    ['Negated HasSameSizeAs failed.\nSize [%s] of ' ...
                    'Actual Value and Expected Value were the same ' ...
                    'but should not have been.'], int2str(size(actual))));
            else
                diag = StringDiagnostic('Negated HasSameSizeAs passed.');
            end 
        end 
    end

В обмен на реализацию требуемых методов ограничение наследовало соответствующий and, or и перегрузки not, таким образом, это может объединяться с другими объектами BooleanConstraint или отрицаться.

 Сводные данные определения класса HasSameSizeAs

В командной строке создайте тест для интерактивного тестирования.

import matlab.unittest.TestCase
import matlab.unittest.constraints.HasLength

testCase = TestCase.forInteractiveUse;

Протестируйте передающий случай.

testCase.verifyThat(zeros(5), HasLength(5) | ~HasSameSizeAs(repmat(1,5)))
Interactive verification passed.

Тест передает, потому что одно из условий or, HasLength(5), верно.

Протестируйте провальный случай.

testCase.verifyThat(zeros(5), HasLength(5) & ~HasSameSizeAs(repmat(1,5)))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
AndConstraint failed.
--> + [First Condition]:
     |   HasLength passed.
--> AND
    + [Second Condition]:
     |   Negated HasSameSizeAs failed.
     |   Size [5  5] of Actual Value and Expected Value were the same but should not have been.
    -+---------------------

Тест перестал работать, потому что одно из условий and, ~HasSameSizeAs(repmat(1,5)), является ложным.

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

Похожие темы