Мне нужно сгенерировать тестовые примеры огурцов для приложения, написанного на Java.Реализация шаблона построителя для генерации тестовых примеров в haskell
Тестовый пример будет выглядеть так:
Scenario My great test
Given the following input
"""
Code snippet of a DSL
"""
And the following data
| name | type | value |
| a | Boolean | true |
| b | Integer | 5 |
When I run the evaluation
Then the result should be "Yay!"
Я создал типы данных, которые напоминают эту структуру в виде синтаксического дерева, а также «бэкэнда», который будет принимать синтаксическое дерево и создать тестовый пример строки.
их виды данных выглядит следующим образом:
data TestCase = Scenario String DslStatement DataStatement ResultStatement
data DslStatement = Dsl [TopLevelStatement]
data TopLevelStatement =
StatementTypeA String
| StatementTypeB String
| StatementTypeC String SubStatementTypeA [SubStatementTypeB]
| StatementTypeD String [String]
...
и так далее.
Теперь я хочу генерировать много и много данных структур данных, используя разные значения и типы и прочее.
Я мог писать функции, которые принимают необходимые параметры и создают дерево синтаксиса со значениями из параметров, вставленных в местоположения, которые они должны появиться. Однако, поскольку DSL, содержащаяся в тестовом случае, может быть изменена все время (она развивается постепенно), мне пришлось бы все время изменять все функции, создающие различные типы тестовых случаев, что является утомительным. Кроме того, тестовые примеры могут быть основаны на стандартном дереве синтаксиса, который модифицируется только в нескольких местах для большинства тестовых случаев.
Моей идеей сейчас является создание функций более или менее похожих на то, что было бы построением шаблона с плавным интерфейсом в Java. Начиная со стандартным синтаксическим деревом, я создаю функции, которые модифицируют, что и возвратить полученное дерево можно дополнительно модифицировать так:
withName :: String -> TestCase -> TestCase
withName name (Scenario _ dsl data result) = Scenario name dsl data result
withResult :: ResultStatement -> TestCase -> TestCase
withResult result (Scenario name dsl data _) = Scenario name dsl data result
...
Тогда я должен быть в состоянии написать что-то вроде этого:
withName "My Test Case" . withResult (Result "Yay!") $ createStandardTestCase
и как только изменения dsl должны изменить только функции строителя и бэкэнд, чтобы адаптировать мои тестовые примеры.
Это возможный/действительный подход к проблеме? Любые лучшие идеи для создания таких синтаксических деревьев?
Thx!
--Mathias.
Я написал сообщение некоторое время назад о свободном интерфейсе для строителей [в этом посте] (http://www.haskellforall.com/2013/02/you-could-have-invented-comonads.html). Это близко к тому, что вы имели в виду? –