Main Content

カスタム boolean 制約の作成

この例では、指定された値と期待値のサイズが同じかどうかを判定する、カスタムの boolean 制約の作成方法を説明します。

現在のフォルダー内のファイルに、matlab.unittest.constraints.BooleanConstraint クラスから派生する HasSameSizeAs という名前のクラスを作成します。クラス コンストラクターは期待値を受け入れ、そのサイズが実際の値のサイズと比較されます。期待値は 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

private アクセスが指定された methods ブロックで、実際の値と期待値が同サイズであるかどうかを判定する補助メソッド sizeMatchesExpected を定義します。このメソッドは他の制約メソッドによって呼び出されます。

    methods(Access = private)
        function bool = sizeMatchesExpected(constraint,actual)
            bool = isequal(size(actual),size(constraint.ValueWithExpectedSize));
        end
    end

matlab.unittest.constraints.BooleanConstraint クラスは matlab.unittest.constraints.Constraint クラスのサブクラスです。したがって、BooleanConstraint クラスから派生するクラスは、Constraint クラスのメソッドをオーバーライドしなければなりません。methods ブロック内で、satisfiedBy メソッドと getDiagnosticFor メソッドをオーバーライドします。satisfiedBy 実装は比較ロジックを含み、logical 値を返さなければなりません。getDiagnosticFor 実装は、制約に対して実際の値を評価し、Diagnostic オブジェクトを提供しなければなりません。この例では、getDiagnosticForStringDiagnostic オブジェクトを返します。

    methods
        function bool = satisfiedBy(constraint,actual)
            bool = constraint.sizeMatchesExpected(actual);
        end

        function diag = getDiagnosticFor(constraint,actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            if constraint.sizeMatchesExpected(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

BooleanConstraint から派生したクラスは、getNegativeDiagnosticFor メソッドを実装しなければなりません。制約が打ち消された場合、このメソッドは Diagnostic オブジェクトを提供しなければなりません。

protected アクセスが指定された methods ブロック内で getNegativeDiagnosticFor をオーバーライドします。

    methods(Access = protected)
        function diag = getNegativeDiagnosticFor(constraint,actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            if constraint.sizeMatchesExpected(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

必要なメソッドを実装することで、制約は適切な andor、および not のオーバーロードを継承し、他の BooleanConstraint オブジェクトとの組み合わせや打ち消しができるようになります。

HasSameSizeAs クラスの定義

以下は、HasSameSizeAs クラスの完全なコードです。

classdef HasSameSizeAs < matlab.unittest.constraints.BooleanConstraint
    
    properties(SetAccess = immutable)
        ValueWithExpectedSize
    end
    
    methods
        function constraint = HasSameSizeAs(value)
            constraint.ValueWithExpectedSize = value;
        end
        
        function bool = satisfiedBy(constraint,actual)
            bool = constraint.sizeMatchesExpected(actual);
        end
        
        function diag = getDiagnosticFor(constraint,actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            
            if constraint.sizeMatchesExpected(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
    
    methods(Access = protected)
        function diag = getNegativeDiagnosticFor(constraint,actual)
            import matlab.unittest.diagnostics.StringDiagnostic
            if constraint.sizeMatchesExpected(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

    methods(Access = private)
        function bool = sizeMatchesExpected(constraint,actual)
            bool = isequal(size(actual),size(constraint.ValueWithExpectedSize));
        end
    end

end

期待されるサイズのテスト

コマンド プロンプトで、対話型テスト用にテスト ケースを作成します。

import matlab.unittest.TestCase
import matlab.unittest.constraints.HasLength
testCase = TestCase.forInteractiveUse;

パスのケースをテストします。or 条件の 1 つ、HasLength(5) が true であるためテストはパスします。

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

失敗のケースをテストします。and 条件の 1 つ、~HasSameSizeAs(repmat(1,5)) が false であるためテストは失敗します。

testCase.verifyThat(zeros(5),HasLength(5) & ~HasSameSizeAs(repmat(1,5)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    AndConstraint failed.
    --> + [First Condition]:
         |   HasLength passed.
         |   
         |   Actual Value:
         |        0     0     0     0     0
         |        0     0     0     0     0
         |        0     0     0     0     0
         |        0     0     0     0     0
         |        0     0     0     0     0
         |   Expected Length:
         |        5
    --> AND
        + [Second Condition]:
         |   Negated HasSameSizeAs failed.
         |   Size [5  5] of Actual Value and Expected Value were the same but should not have been.
        -+---------------------

参考

| | | | | |

関連するトピック