Где я могу определить произвольные экземпляры? - PullRequest
0 голосов
/ 24 ноября 2018

Я не могу понять, где определить Arbitrary экземпляров для моего типа данных.Если я добавлю в пакет, то пакет без необходимости должен иметь QuickCheck в качестве зависимости.Если я поставлю в тестах, то другие пакеты не смогут использовать этот экземпляр.Если я помещу его в отдельный пакет test-utils, то тесты также должны находиться в отдельном пакете, так что это экземпляр-сирота, а также stack test --coverage не работает.

Какие еще есть варианты?

1 Ответ

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

Я бы обычно выбирал отдельную опцию пакета - но тогда я не использую stack test --coverage.Спасибо за то, что познакомили меня с этим!

(Правка: я бы, вероятно, сделал это, а затем использовал бы опцию test flag только для запуска stack test --coverage --flag thepackage:arbitrary, чтобы больше никому не приходилось иметь дело с флагами.)

Может также стоить поднять проблему --coverage на трекере проблем stack, так как в этом случае будет полезно проверить покрытие.

Вы запрашиваете другие варианты -лучшим из них, вероятно, является тестовый флаг.

тестовый флаг

Можно определить флаг в вашем файле cabal (по умолчанию false), который будет создавать модули только с вашей зависимостью QuickCheckесли флаг установлен.

Поместите нужный код в каталог arbitrary (например).Затем добавьте эквивалент следующего к соответствующим частям вашего файла package.yaml (1-й фрагмент) или the-library.cabal (2-й фрагмент):

flags:
  arbitrary:
    description: Compile with arbitrary instances
    default: false
    manual: true

library:
  ⁝
  when:
  - condition: flag(arbitrary)
    dependencies:
    - QuickCheck
    source-dirs:
    - arbitrary
flag arbitrary
  description: Compile with arbitrary instances
  manual: True
  default: False

library
  ⁝
  if flag(arbitrary)
    hs-source-dirs:
      arbitrary
    build-depends:
      QuickCheck

Затем пакеты, которые хотят использоватьэкземпляры должны добавить следующее в свои stack.yaml (1-й) или cabal.project (2-й) файлы:

flag:
  the-library:
    arbitrary: true
constraints: the-library +arbitrary

Но есть небольшая проблема ... в настоящее время нет возможности для этой библиотеки толькозависит от версии +arbitrary только в его наборе тестов, если только он не определяет такой флаг.Это может быть цена, которую стоит заплатить.

Примечание: я еще не тестировал нижележащую упаковку.

Блог Ивана Миленовича был полезен в качестве начального ресурса.

DerivingVia / Generic instance

Может быть еще одна возможность, теперь, когда GHC 8.6 выпущен, с DerivingVia Blöndal, Löh & Scott (2018) для Arbitrary экземпляров есть пример.

Вы бы создали оболочки нового типа и внедрили Arbitrary для этих новых типов.

Это не совсем помогает избежать проблемы, как есть.Но вы можете реализовать Generic для этих новых типов таким образом, чтобы экземпляры, выводимые с использованием generic-arbitrary, соответствовали желаемому.


Могут быть и другие варианты.В частности, зависимости QuickCheck не так уж и тяжелы.И есть и другие библиотеки тестирования.Кроме того, обратите внимание, что было некоторое обсуждение разделения Arbitrary -подобного класса типов на отдельную библиотеку.

Я бы также предложил внутренние библиотеки, но это не позволяет другим пакетам использовать ваши экземпляры.

...