2010-09-20 49 views
0

我似乎無法測試我在PLT球拍中使用test-engine/racket-tests包編寫的函數。PLT球拍測試用例多值

代碼如下。它返回多個值(不知道爲什麼他們不稱他們爲元組)。

(define (euclid-ext a b) 
    (cond 
    [(= b 0) (values a 1 0)] 
    [else (let-values ([(d x y) (euclid-ext b (modulo a b))]) 
      (values d y (- x (* (quotient a b) y))))] 
    )) 

問題是使用以下格式對其進行測試。這是我嘗試過的一些。

(check-expect (values (euclid-ext 99 78)) (values 3 -11 14)) 
(check-expect (euclid-ext 99 78) (values 3 -11 14)) 
(check-expect (list (euclid-ext 99 78)) (list 3 -11 14)) 

現在,這產生了錯誤context expected 1 value, received 3 values: 3 -11 14。無論我如何嘗試工作(使用列表,值,沒有值等),我都無法讓這個測試用例成功評估。

回答

1

它看起來像測試框架不會接受值。我想你會發現使用返回值的列表不那麼痛苦。

但是,如果你真的想這樣做事,你可以轉換values使用call-with-values像這樣的列表:

(call-with-values (lambda() (values 1 2 3)) list) 

因此,一個測試將是這樣的:

(check-expect (call-with-values (lambda() (euclid-ext 99 78)) list) 
       (list 3 -11 14)) 
+0

感謝您的建議,我會嘗試與列表。我這樣做是因爲返回一個元組很方便。你可以做類似的清單嗎?但無論如何,謝謝你的解決方案。 :) – sholsapp 2010-09-20 02:50:38

+0

我不確定這是否是您要問的問題的答案,但您可以使用類似於以下內容的方式返回三個值列表:'(define(example)(list 3 -11 14))'。因此,不要返回'(values d y( - x(*(商a b)y)))'你可以返回'(list d y ...)'。 – msandiford 2010-09-20 02:59:04

3

test-engine庫專供學生使用,因此它不處理多個值(大多數課程不涉及)。像Rackunit庫這樣的東西更適合這種情況。

+0

感謝您的建議。下次我會使用這個庫。 – sholsapp 2010-09-20 05:27:46