Сравнение дискриминационных союзов - PullRequest
5 голосов
/ 15 сентября 2011

Я новичок в F # и играю с FParsec.Я бы использовал FParsec для генерации AST.Я хотел бы использовать FsUnit для написания некоторых тестов вокруг различных частей синтаксического анализатора для обеспечения правильной работы.

У меня возникли некоторые проблемы с синтаксисом (извините, точный код работает, яможно опубликовать конкретный пример позже), так как точно можно сравнить два различающихся союза (один ожидаемый, другой фактический результат)?Может ли кто-нибудь предоставить небольшой пример кода с использованием FsUnit (или NUnit), пожалуйста?

Пример различного объединения (очень простой)

type AST = 
    | Variable of string
    | Class of string
    | Number of int

Ответы [ 2 ]

6 голосов
/ 15 сентября 2011

Поскольку, как указывал Брайан, у профсоюзов F # есть структурное равенство, это легко с помощью любой системы модульного тестирования, которая вам нравится.

FsUnit - это библиотека F #, созданная поверх NUnit.Моя личная любимая библиотека модульного тестирования для F # - Unquote ,;), которая не зависит от фреймворка, отлично работает с NUnit, xUnit.net, MbUnit, ... или даже внутри FSI.Возможно, вас заинтересует это сравнение с FsUnit.

Итак, как бы вы сделали это с NUnit + Unquote?Вот полный рабочий пример:

module UnitTests

open NUnit.Framework
open Swensen.Unquote

type AST = 
    | Variable of string
    | Class of string
    | Number of int

let mockFParsec_parseVariable input = Variable(input)

[<Test>]
let ``test variable parse, passing example`` () =
    test <@ mockFParsec_parseVariable "x" = Variable("x") @>

[<Test>]
let ``test variable parse, failing example`` () =
    test <@ mockFParsec_parseVariable "y" = Variable("x") @>

Затем, запустив тесты с использованием TestDriven.NET, вы получите следующий вывод:

------ Test started: Assembly: xxx.exe ------

Test 'UnitTests.test variable parse, failing example' failed: 

UnitTests.mockFParsec_parseVariable "y" = Variable("x")
Variable "y" = Variable("x")
false
    C:\xxx\UnitTests.fs(19,0): at UnitTests.test variable parse, failing example()

1 passed, 1 failed, 0 skipped, took 0.80 seconds (NUnit 2.5.10).
2 голосов
/ 15 сентября 2011

Пример - если вы хотите проверить тип, но не содержимое

let matched x= 
    match x with
    |Variable(_) -> true
    | _ -> false

Обратите внимание, что вам нужна отдельная функция для каждого элемента различимого объединения

Если вы хотите сравнить равенство, вы можете просто сделать это стандартным способом, как

Assert.AreEqual(Variable("hello"),result)

или

if result = Variable("hello") then stuff()
...