Сравнение дискриминируемых союзов

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

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

Пример размеченного союза (очень простой)

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

person Jeffrey Cameron    schedule 14.09.2011    source источник
comment
(Объединения F # имеют структурное равенство, что означает, что = поступает правильно, сравнивая всю структуру / значение.)   -  person Brian    schedule 15.09.2011


Ответы (2)


Поскольку, как заметил Брайан, профсоюзы 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).
person Stephen Swensen    schedule 15.09.2011
comment
Спасибо, я попробую, когда доберусь до работы. Думаю, теперь я знаю, что делал не так, увидев твой пример. Я использовал (Variable VAR), но должен был использовать Variable (VAR), как я ожидал ... в ближайшее время, надеюсь, будет отмечен как ответ! - person Jeffrey Cameron; 15.09.2011
comment
Сработало как шарм, спасибо. Я собираюсь внимательно посмотреть на unquote, потому что FsUnit просто не работает для меня здесь ... - person Jeffrey Cameron; 15.09.2011
comment
Unquote - это здорово, мне это нравится. Спасибо - person Jeffrey Cameron; 15.09.2011

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

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

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

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

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

or

if result = Variable("hello") then stuff()
person John Palmer    schedule 15.09.2011