2017-02-14 11 views
2

У меня есть Double значения, которые будут одинаковыми по стоимости, но не точными. Обычно я хотел бы сделать:Scalatest Двойная эквивалентность в списке классов случаев

val a: Double = ??? 
val b: Double = ??? 

a shouldEqual b +- 0.25 

И если бы я был просто сравнивая один класс случая я хотел бы сделать:

case class Data(label: String, value: Double) 
val a: Data = ??? 
val b: Data = ??? 
a.value shouldEqual b.value +- 0.25 

В моем случае, у меня есть список экземпляров случай класса, и хотел бы сравнить их с допуском для их value атрибутов:

val output = Seq(Data("a", 1.1), Data("b", 1.2)) 
val expected = Seq(Data("a", 0.9), Data("b", 1.1)) 
output should contain theSameElementsInOrderAs expected 

конечно, это было бы подать, потому что value атрибуты не совпадают точно. Что мне нужно что-то вроде этого:

output should contain theSameElementsInOrderAs expected +- 0.25 

ответ

0

я в конечном итоге определения пользовательских Matcher для моего Seq[Data] типа:

trait CustomMatcher { 

    class SeqDataContainsTheSameElementsInOrderAs(expected: Seq[Data]) { 

    override def apply(left: Seq[Data]): MatchResult = { 

     // ... do other checks like comparing the length and such 

     val bad = left.zip(expected).filter(t => { 
     val difference = Math.abs(t._1.value - t._2.value) 
     difference > TOLERANCE // Declare this somewhere 
     }) 

     // Return the MatchResult, you will probably want to give better error messages than this 
     MatchResult(
     bad.isEmpty, 
     s"""Some of the values were not equal""", 
     s"""Everything was equal""" 
    ) 
    } 

    def customContainTheSameElementsInOrderAs(expected: Seq[Data]) = new SeqDataContainsTheSameElementsInOrderAs(expected) 
    } 
} 

Затем я использую это нравится:

output should customContainTheSameElementsInOrderAs(expected) 
0

Вы можете просто пойти с

forAll(output.zipAll(expected, null, null)) { 
    case (a, b) => a.value shouldEqual b.value +- 0.25 
} 

zipAll Использование потому zip бы неправильно успеха, когда длины не совпадают, но сообщение об ошибке вы получите этот путь ISN «Слишком хорошо.