2014-07-22 3 views
1

필자는 경로 종속 형식을 사용하여 모듈러 산술로 작업하기 위해 스칼라를 작성했습니다. 부모 클래스는 정수를 모듈로 한 그룹을 나타내며 내부 클래스는이 그룹의 요소를 나타냅니다.스칼라 경로 종속 형식 : 형식 오류에 대한 테스트

class ModularInt(modulus : Int) { 
    case class Value(value: Int) { 
    def plus(a: Value) : Value = { 
     val rem: Int = (value + a.toInt) % modulus 
     if(rem < 0) 
     Value(modulus + rem) 
     else 
     Value(rem) 
    } 

    def toInt = value 
    } 
} 

올바르게 작동하는 것 같습니다 (예 : 모듈로 7 : 6 + 2 = 1).

경로 의존형을 사용할 때의 좋은 효과는 함께 작동 시키려고하면 다른 정수가 모듈화 된 정수가 유형 오류를 발생한다는 것입니다. 그러나이 사실을 확인하는 테스트를 삽입하고 싶습니다. a plus b는 컴파일 타임에 유형 오류가 발생으로

import org.scalatest.FunSuite 
import org.junit.runner.RunWith 
import org.scalatest.junit.JUnitRunner 

@RunWith(classOf[JUnitRunner]) 
class ModularIntSuite extends FunSuite { 
    test("a mod n + b mod m => error") { 
    val n: Int = 3 
    val m: Int = 4 
    val modulen = new ModularInt(n) 
    val modulem = new ModularInt(m) 

    val a = new modulen.Value(0) 
    val b = new modulem.Value(0) 

    assert(a plus b) // catch error here 
    } 
} 

그러나, 테스트도 실행되지 않습니다.

어쨌든 컴파일 오류에 대한 테스트를 삽입 하시겠습니까? 또는 컴파일 오류가 정확성 테스트라는 사실 자체가 중복 체크임을 의미합니까 (즉, 내가하려는 것은 의미가 없습니다)?

감사합니다.

+0

중복 된 http://stackoverflow.com/questions/20114298/how-do-i-write-a-scala-unit-test-that-ensures-compliation-fails –

답변

0

테스트가 중복되었습니다. 강력한 타입 시스템의 장점 중 하나는 정확하게 타입을 디자인하면 코드가 컴파일되지 않는다는 것입니다.

+3

전혀 ... 특히 작업 할 때 유형 클래스를 사용하면 특정 유형에 대해 인스턴스가 사용 가능하지 않음을 아는 것이 중요 할 수 있습니다. 이 경우 관련 표현식이 실제로 컴파일되지 않는지 확인해야합니다. –

+0

@MilesSabin 전 정정되었습니다. 감사! –