私はいくつかのScala非常にコレクションが重いです。これらのコレクションはIterable[T]
として返されるので、に興味があります。基になる型が異なる場合でも、コレクションのコンテンツこれは、実際には2つの関連する問題です。
要約すると、ScalaTestでNUnitのCollectionAssert.AreEqual
(順序付け)とCollectionAssert.AreEquivalent
(順序付けなし)に相当するScalaを探しています。
Set(1, 2) should equal (List(1, 2)) // ordered, pass
Iterable(2, 1) should equal (Iterable(1, 2)) // unordered, pass
順序付けられたコレクションには.toSeq
を、順序付けされていないコレクションには.toSet
を試すことができます。
次のパス:
class Temp extends FunSuite with ShouldMatchers {
test("1") { Array(1, 2).toSeq should equal (List(1, 2).toSeq) }
test("2") { Array(2, 1).toSeq should not equal (List(1, 2).toSeq) }
test("2b") { Array(2, 1) should not equal (List(1, 2)) }
test("3") { Iterable(2, 1).toSet should equal (Iterable(1, 2).toSet) }
test("4") { Iterable(2, 1) should not equal (Iterable(1, 2)) }
}
ところでSet
は注文されていません。
編集:重複する要素が削除されないようにするには、toSeq.sorted
を試してください。次のパス:
test("5") { Iterable(2, 1).toSeq.sorted should equal (Iterable(1, 2).toSeq.sorted) }
test("6") { Iterable(2, 1).toSeq should not equal (Iterable(1, 2).toSeq) }
編集2:要素をソートできない順序付けられていないコレクションの場合、このメソッドを使用できます。
def sameAs[A](c: Traversable[A], d: Traversable[A]): Boolean =
if (c.isEmpty) d.isEmpty
else {
val (e, f) = d span (c.head !=)
if (f.isEmpty) false else sameAs(c.tail, e ++ f.tail)
}
例えば(順序が定義されていない記号'a 'b 'c
の使用に注意してください)
test("7") { assert( sameAs(Iterable(2, 1), Iterable(1, 2) )) }
test("8") { assert( sameAs(Array('a, 'c, 'b), List('c, 'a, 'b) )) }
test("9") { assert( sameAs("cba", Set('a', 'b', 'c') )) }
代替のsameAs
実装:
def sameAs[A](c: Traversable[A], d: Traversable[A]) = {
def counts(e: Traversable[A]) = e groupBy identity mapValues (_.size)
counts(c) == counts(d)
}
その間、あなたは使うことができます
Iterable(2, 1) should contain theSameElementsAs Iterable(1, 2)
順序付きセットをテストするには、それをシーケンスに変換する必要があります。
Set(1, 2).toSeq should contain theSameElementsInOrderAs List(1, 2)