Может ли генератор FsCheck создать постоянно растущую последовательность - PullRequest
0 голосов
/ 02 ноября 2018

Я использую FsCheck, чтобы создать генератор для создания поддельных записей в базе данных. В зависимости от рассматриваемого поля он использует chooseFromList или генераторы для чисел, чисел с плавающей запятой и т. Д.

Однако одно проблемное поле - это поле первичного ключа, которое должно быть последовательным. То есть укажите 1 в первой сгенерированной записи, 2 во второй сгенерированной записи и т. д. После создания набора записей я буду использовать их для олицетворения таблицы базы данных в тестируемом программном обеспечении.

Каждое решение, которое придумывает мой мозг на Фортране, кажется злым, нечистым и процедурным. Но я считаю, что это проблема более умных пользователей FsCheck, чем я занимался. Может ли это быть сценарий использования для функторов или монад ...

1 Ответ

0 голосов
/ 02 ноября 2018

Мы можем генерировать последовательные числа с помощью функции ident, которая увеличивает внутренний счетчик:

type Shirt = { Collar : float; Sleeve : float; id: int }

let collars = [ 14.0; 14.5; 15.0; 15.5; 16.0; 16.5; 17.0; 17.5; 18.0; ]
let sleeves = [ 30.5; 31.5; 32.5; 33.5; 34.5; 35.5; 36.5; 37.5; 38.5]

let ident = 
    let n = ref 0
    fun () -> n := !n + 1; !n

let shirtGen =  gen {
    let! collar = Gen.elements collars
    let! sleeve = Gen.elements sleeves
    return { Collar = collar ; Sleeve = sleeve; id = ident() }
}

shirtGen
|> Gen.sample 0 10
|> List.rev
|> Seq.iter (printfn "%A")

Я переворачиваю список, созданный Gen.sample, потому что он создает инвертированный список. Это сгенерированные образцы:

{Collar = 14.5; Sleeve = 35.5; id = 1;}
{Collar = 15.0; Sleeve = 31.5; id = 2;}
{Collar = 16.5; Sleeve = 32.5; id = 3;}
{Collar = 17.5; Sleeve = 35.5; id = 4;}
{Collar = 16.5; Sleeve = 37.5; id = 5;}
{Collar = 14.0; Sleeve = 35.5; id = 6;}
{Collar = 18.0; Sleeve = 30.5; id = 7;}
{Collar = 16.0; Sleeve = 38.5; id = 8;}
{Collar = 17.0; Sleeve = 34.5; id = 9;}
{Collar = 14.5; Sleeve = 36.5; id = 10;}
...