2010-05-14 2 views
2

Я пытаюсь сделать тест для этой функцииFsCheck NUnit. Тесты с условием

let extract_one_rule (rule:Rule.t<'a,'b>) = 
    let rec expand = function 
    |PAlt  (a,b) -> expand a @ expand b 
    |PSeq  (a,b) -> let wrap = List.map (fun x -> (x.rule, fun r -> {x with rule = r})) a 
            |> List.unzip 
         in 
         let rec gen = function 
          | hd::tl -> [for x in hd -> x :: (gen tl |> List.concat)] 
          | []  -> [] 
         in 
         fst wrap |> List.map expand |> gen 
         |> List.map (fun x -> PSeq ((List.map2 (|>) x (snd wrap)),b)) 
    |PRef _ 
    |PLiteral _ 
    |PToken _ as t -> [t] 
    | _    -> (System.Console.WriteLine("incorrect tree for alternative expanding!") 
         ; failwith "incorrect tree for alternative expanding!") 
    in 
    expand rule.body |> List.map (fun x -> {rule with body = x}) 

с использованием FsCheck так что я это

let ExpandAlterTest(t : Rule.t<Source.t,Source.t>) = convertToMeta t |> List.forall (fun x -> ruleIsAfterEBNF x) 

но I'l см исключения «неправильное дерево для альтернативных расширяющегося!» но когда я использую то вроде этого

let ExpandAlterTest(t : Rule.t<Source.t,Source.t>) = (correctForAlExp t.body) ==> lazy (convertToMeta t |> List.forall (fun x -> ruleIsAfterEBNF x)) 

NUnit не перестает работать Почему это может быть?

ответ

3

Возможно, что предварительное условие, которое вы добавили, очень ограничительно, так что требуется долгое время до того, как будет найдено хорошее значение (которое фактически передает предварительное условие). FsCheck ожесточен против этого - по умолчанию он пытается найти 100 значений, но когда он отклонил 1000, он сдался, и вы увидите результат «Аргументы, исчерпанные после x тестов». Но это может занять много времени, если генерация и проверка значения занимает много времени.

Также может быть, что у вас на самом деле есть ошибка, как бесконечный цикл.

Попробуйте изменить конфигурацию FsCheck, чтобы выполнить меньше тестов, выполнить подробный прогон (verboseCheck) и взломать отладчик, когда он, кажется, зависает.