2016-09-27 68 views
1

我在Racket中製作了一個階乘函數,它需要進行單元測試以傳遞一個非常大的數字,以捕獲溢出異常。如果發現異常,測試應該通過,反之亦然。這是我的代碼。如何在我的階乘函數中對堆棧溢出進行單元測試?

#lang racket 

(provide recursive_factorial) 
(provide tail_factorial) 


(define (recursive_factorial number) 
(cond [(= 0 number) 1] 
     [(negative? number) (raise-argument-error 'recursive_factorial "negative?" number)] 
     [(* number (recursive_factorial (- number 1)))])) 


(define (tail_factorial number accumulator) 

(cond[(= number 0) accumulator] 
     [(negative? number) accumulator (raise-argument-error 'tail_factorial "negative?" number accumulator)] 
     [(tail_factorial (- number 1) (* accumulator number))] 
    )) 

這裏是我試圖單元測試它。

(check-not-exn (λ() (recursive_factorial(100000000)))"stack overflow") 
(check-not-exn (λ() (tail_factorial(100000000)))"stack overflow") 

有了很大的幫助,我是能夠得到一個負的狀態下。任何幫助表示讚賞。

+0

球拍沒有堆棧溢出(見http://docs.racket-lang.org/ 。導向/ Lists__Iteration__and_Recursion.html#%28part ._ Recursion_versus_.Iteration%29);直到您耗盡Racket的所有可用內存(然後Racket VM可能剛剛退出),您將不會收到錯誤。 –

+0

@RyanCulpepper所以有沒有辦法單元測試呢? – user6800688

回答

1

number爲負數時,您的函數返回-1。所以,不應該在測試是:

(check-equal? (recursive_factorial -4) -1) 

UPDATE

如何:

#lang racket 
(provide recursive_factorial) 
(define (recursive_factorial number) 
    (cond [(= 0 number)  1] 
     [(negative? number) (error 'recursive_factorial 
            "Cannot pass a negative number")] 
     [else    (* number (recursive_factorial (- number 1)))])) 
+0

其實我需要它以某種方式不返回-1。相反告訴我這個電話是無效的。 – user6800688

+0

@ user6800688添加了新建議。 – soegaard

+0

這很好!我實際上可以通過引發一個異常,然後使用(check-exn)來解決這個問題 – user6800688