2016-11-19 4 views
3

私は2つのTraversableがその順序に関係なく同じ要素を含んでいるかどうかをチェックしたいと思います。 the documentationが言うように2つのTraversableが全く同じ要素を含んでいることを比較するには?

implicit val l = 3 
implicit def equality(implicit l: Int) = new Equality[String] { 
    override def areEqual(a: String, b: Any): Boolean = (a, b) match { 
    case (_, b: Int) => a.toInt == b 
    } 
} 

"Test" should "check how equality works" in { 
    List("1") should contain theSameElementsAs Vector(1) //Fine 
    List("1", "2") should contain theSameElementsAs Vector(1, 2) //Fine 
    List("1", "2", "3") should contain theSameElementsAs Vector(1, 2, 3) //Fine 
    List("1", "2", "2") should contain theSameElementsAs Vector(1, 2, 2) //Error 
    List("2", "1") should contain theSameElementsAs Vector(1, 2) //Error 
} 

contain theSameElementsAs」構文を使用すると、2件の 集計が同じが含まれていることを主張することができます

だから、私はそれを自分自身を試してみましたが、次の簡単な例を書きましたオブジェクト

重複や秩序を考慮する必要はありません。それのどこが悪いんだい?

答えて

1

私は1つが期待通りに根本的な問題は、equality関係が反映していないということであると思います。つまり、x == yならばy == xです。

Scalacheckは、equality機能を使用して、ターゲットコレクション内でcount the number of repetitionsを試行します。

equality(2,2)tryEqualityfails internally with a ClassCastExceptionを満たしている場合は、比較をfalseにデフォルト設定します。

ボトムライン:Equalityは、期待される結果を得るためには、(古い古い数学のように)反射的である必要があります。

+0

完全に同意します。平等[L]の正確な契約を知らなかっただけです。 –

0

Int左の文字列リストの代わりにリストを使用します。

"Test" should "check how equality works" in { 
    List(1) should contain theSameElementsAs Vector(1) //Fine 
    List(1, 2) should contain theSameElementsAs Vector(1, 2) //Fine 
    List(1, 2, 3) should contain theSameElementsAs Vector(1, 2, 3) //Fine 
    List(1, 2, 2) should contain theSameElementsAs Vector(1, 2, 2) //Fine 
    List(2, 1) should contain theSameElementsAs Vector(1, 2) //Fine 
    } 

出力:

[info] Test 
[info] - should check how equality works 
[info] Run completed in 354 milliseconds. 
[info] Total number of tests run: 1 
[info] Suites: completed 1, aborted 0 
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0 
[info] All tests passed. 
+0

ああ、それは私が欲しかったものではありません。私たちが暗黙の平等を提供しなければ、それは確かにそのように機能します。しかし、私たちがするなら、それは...私はちょうどそのすべての合併症で私の特定のケースを公開するのが好きではなかった... –

関連する問題