试图理解为什么DrRacket突出了我的一些cond条款

时间:2012-09-03 05:45:11

标签: racket

第二版How to Design Programs中的练习42解释了DrRacket突出显示了下面代码中的最后两个cond子句,因为测试用例并未涵盖所有可能的情况。

; TrafficLight -> TrafficLight
; given state s, determine the next state of the traffic light

(check-expect (traffic-light-next "red") "green")

(define (traffic-light-next s)
  (cond
    [(string=? "red" s) "green"]
    [(string=? "green" s) "yellow"]
    [(string=? "yellow" s) "red"]))

我的理解是最后的else条款应该涵盖其余的案例,所以我尝试替换最后的表达式:

(define (traffic-light-next s)
  (cond
    [(string=? "red" s) "green"]
    [(string=? "green" s) "yellow"]
    [(string=? "yellow" s) "red"]
    [else "green"]))

这不能解决突出显示问题。这是怎么回事?

1 个答案:

答案 0 :(得分:5)

我认为你可能会误解突出的目的。代码覆盖率工具的要点是确保您有足够的测试用例(即check-expect s)来覆盖您编写的所有代码,而不是确保您的{{1}子句涵盖了数据定义的所有情况。在您的代码段中,cond仅测试check-expect案例。您可以通过为数据定义的其他两种情况编写"red"来消除突出显示。

另请注意,您实际上不希望在此处编写check-expect案例,因为else的数据定义仅包含三种情况。在不违反签名/合同的情况下,您无法测试TrafficLight案例。