2015-04-28 42 views
3

這是我到目前爲止已經試過:如何比較使用Scalatest相等類型的Double列表?

implicit val doubleEq = TolerantNumerics.tolerantDoubleEquality(0.1) 

implicit val listEq = new Equivalence[List[Double]] { 
    override def areEquivalent(a: List[Double], b: List[Double]): Boolean = { 
    (a, b) match { 
     case (Nil, Nil) => true 
     case (x :: xs, y :: ys) => x === y && areEquivalent(xs, ys) 
     case _ => false 
    } 
    } 
} 

第一斷言成功,但第二個失敗:

assert(1.0 === 1.01) 

assert(List(1.0) === List(1.01)) 

有沒有辦法有收藏使用我爲定義的implicits他們的元素呢?

回答

1

Equality類僅用於:

提供===和==返回布爾運算,委託平等決心在平等類型的類,並且需要的類型!這兩個值比較是在一個子類型/超類型關係。

下面是我使用來解決此基礎測試類:

import org.scalactic.{Equivalence, TolerantNumerics, TypeCheckedTripleEquals} 
import org.scalatest.FunSuite 

abstract class UnitSpec extends FunSuite with TypeCheckedTripleEquals { 
    implicit val doubleEq = TolerantNumerics.tolerantDoubleEquality(0.001) 

    implicit val listEq = new Equivalence[List[Double]] { 
    override def areEquivalent(a: List[Double], b: List[Double]): Boolean = { 
     (a, b) match { 
     case (Nil, Nil) => true 
     case (x :: xs, y :: ys) => x === y && areEquivalent(xs, ys) 
     case _ => false 
     } 
    } 
    } 
} 
1

在我的情況,我重新定義是通過提供一種new Equality[List[Double]]這是Equivalence[List[Double]]一個子類考慮areEqualAny爲第二類型參數areEqual方法。進口TypeCheckedTripleEquals

implicit val listEq = new Equality[List[Double]] { 
    def areEqual(a: List[Double], b: Any): Boolean = { 
    def areEqualRec(a: List[Double], b: List[Double]): Boolean = { 
     (a, b) match { 
     case (Nil, Nil) => true 
     case (x :: xs, y :: ys) => x === y && areEquivalent(xs, ys) 
     case _ => false 
     } 
    } 
    b match { 
     case daList: List[Double] => areEqualRec(a, daList) 
     case _ => false 
    } 
    } 
}