Main Content

matlab.unittest.constraints.StructComparator クラス

パッケージ: matlab.unittest.constraints

MATLAB 構造体配列の比較演算子

構築

StructComparator は、MATLAB® 構造体配列の比較演算子を作成します。

StructComparator(compObj) は、構造体に含まれる値の比較に使用する比較演算子を定義する比較演算子 compObj を示します。既定では、StructComparator は空の構造体配列のみをサポートします。

StructComparator(compObj,Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加オプションをもつ比較演算子を提供します。

StructComparator(Name,Value) は、1 つ以上の Name,Value のペアの引数で指定された追加オプションをもつ、空の構造体配列用の比較演算子を提供します。

入力引数

すべて展開する

compObj

Comparator オブジェクト

比較演算子は StructComparator に渡され、再帰時にデータ型をサポートします。既定では、StructComparator は空の構造体配列のみをサポートします。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

struct の比較時に無視するフィールド。文字ベクトルの cell 配列または string 配列として指定します。

比較演算子が再帰的に演算するかどうかの設定。false または true (logical 0 または 1) として指定します。この値が false の場合、データで比較演算子が再帰的に機能しません。

値が true の場合、StructComparator がサポートするデータ型が再帰で完全にサポートされます。以下に例を示します。

comp1 = StructComparator(NumericComparator);
comp2 = StructComparator(NumericComparator, 'Recursively', true);
comp1 および comp2 は、数値をフィールドとして含む構造体をサポートします。ただし、構造体または数値がフィールドとして再帰的に含まれる構造体をサポートするのは comp2 だけです。

プロパティ

IgnoredFields

struct の比較時に無視されるフィールド。名前と値のペアの引数 'IgnoringFields' で指定します。

Recursive

比較演算子が再帰的に演算するかどうかを示すインジケーター。名前と値のペアの引数 'Recursively' で指定します。

コピーのセマンティクス

値。値クラスがコピー操作に与える影響については、オブジェクトのコピーを参照してください。

すべて折りたたむ

対話型テスト用にテスト ケースを作成します。

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.AbsoluteTolerance
import matlab.unittest.constraints.StructComparator
import matlab.unittest.constraints.NumericComparator

testCase = TestCase.forInteractiveUse;

2 つの等価の構造体を作成します。

s1 = struct('id',7,'score',7.3);
s2 = s1;

構造体が等しいことをテストします。既定では、StructComparator は空の構造体のみをサポートするため、NumericComparator で比較演算子を構成する必要があります。

testCase.verifyThat(s1, IsEqualTo(s2, 'Using', ...
    StructComparator(NumericComparator)))
Verification passed.

s2 のスコアを変更して、もう一度構造体を比較します。

s2.score = 7.6;
testCase.verifyThat(s1, IsEqualTo(s2, 'Using', ...
    StructComparator(NumericComparator)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> Path to failure: <Value>.score
        --> NumericComparator failed.
            --> The numeric values are not equal using "isequaln".
            --> Failure table:
                    Actual    Expected    Error       RelativeError   
                    ______    ________    _____    ___________________
                     7.3        7.6       -0.3     -0.0394736842105263
            
            Actual Value:
               7.300000000000000
            Expected Value:
               7.600000000000000
    
    Actual Value:
      struct with fields:
    
           id: 7
        score: 7.300000000000000
    Expected Value:
      struct with fields:
    
           id: 7
        score: 7.600000000000000

比較の絶対許容誤差を指定します。

testCase.verifyThat(s1, IsEqualTo(s2, 'Using', ...
    StructComparator(NumericComparator), 'Within', ...
    AbsoluteTolerance(0.5)))
Verification passed.

対話型テスト用にテスト ケースを作成します。

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.StructComparator
import matlab.unittest.constraints.StringComparator

testCase = TestCase.forInteractiveUse;

2 つの構造体を作成します。フィールドの 1 つを、入れ子にされた構造体にします。

e1 = struct('name', struct('first','sam','last','smith'), ...
    'location','Building A');
e2 = e1;

2 つの構造体が等しいことを検証します。struct には入れ子にされた struct が含まれるため、制約を再帰的に処理するように構成します。

testCase.verifyThat(e1, IsEqualTo(e2, 'Using', ...
    StructComparator(StringComparator, 'Recursively', true)))
Verification passed.

e2 構造体の最初の name フィールドを変更して、もう一度比較を実行します。

e2.name.first = ' SAM';
testCase.verifyThat(e1, IsEqualTo(e2, 'Using', ...
    StructComparator(StringComparator, 'Recursively', true)))
Verification failed.
    ---------------------
    Framework Diagnostic:
    ---------------------
    IsEqualTo failed.
    --> Path to failure: <Value>.name.first
        --> StringComparator failed.
            --> The character arrays are not equal.
            
            Actual char:
                sam
            Expected char:
                 SAM
    
    Actual Value:
      struct with fields:
    
            name: [1×1 struct]
        location: 'Building A'
    Expected Value:
      struct with fields:
    
            name: [1×1 struct]
        location: 'Building A'

大文字と小文字の区別および空白文字を無視する比較演算子を構成します。

testCase.verifyThat(e1, IsEqualTo(e2, 'Using', ...
    StructComparator(StringComparator, 'Recursively', true), ...
    'IgnoringCase', true, 'IgnoringWhitespace', true))
Verification passed.

ヒント

  • ほとんどの場合、StructComparator オブジェクトを使用する必要はありません。構造体を含むさまざまなタイプのデータ間の等価性をテストする制約が IsEqualTo クラスで作成されます。

    StructComparator オブジェクトは、IsEqualTo クラスで実行される比較をオーバーライドする必要がある場合に使用します。たとえば、構造体に数値以外の値が含まれる場合に比較を失敗とするには、StructComparator オブジェクトをテストに含めます。この例では、s1s2 に数値以外の値が格納されているため、MATLAB から例外がスローされます。

    import matlab.unittest.constraints.IsEqualTo
    import matlab.unittest.constraints.StructComparator
    import matlab.unittest.constraints.NumericComparator
       
    s1 = struct('f1',zeros(1,10),'f2','a','f3',{'b','c'});
    s2 = s1;
    
    testCase = matlab.unittest.TestCase.forInteractiveUse;
    testCase.verifyThat(s2,IsEqualTo(s1,'Using',StructComparator(NumericComparator)))
    

バージョン履歴

R2013a で導入