52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 313

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 313

where gen = elements [St Blue De, St Red Lao,

St Green Til, St Orange Sever]

Проверим, те ли значения попали в выборку:

282 | Глава 19: Ориентируемся по карте

*Test> verboseCheckWith (stdArgs{ maxSuccess = 3 }) testFor

Passed:

(St Blue De, St Orange Sever)

Passed:

(St Orange Sever, St Red Lao)

Passed:

(St Red Lao, St Red Lao)

+++ OK, passed 3 tests.

Мы можем настроить формирование выборки ещё одним способом. Для этого мы сделаем специальный

тип обёртку над Station и определим для ненго свой экземпляр класса Arbitrary:

newtype OnlyOrange = OnlyOrange Station

newtype Only4

= Only4

Station

instance Arbitrary OnlyOrange where

arbitrary = OnlyOrange . St Orange <$>

elements [DnoBolota, PlBakha, Krest, Lao, Sever]

instance Arbitrary Only4 where

arbitrary = Only4 <$> elements [St Blue De, St Red Lao,

St Green Til, St Orange Sever]

После этого мы можем очень легко комбинировать различные выборки при тестировании.

*Test> quickCheck $ \(Only4 a) (Only4 b) -> prop1 a b

+++ OK, passed 100 tests.

*Test> quickCheck $ \(Only4 a) (OnlyOrange b) -> prop1 a b

+++ OK, passed 100 tests.

*Test> quickCheck $ \a (OnlyOrange b) -> prop2 a b

+++ OK, passed 100 tests.

Классификация тестовых случаев

Мы можем попросить у QuickCheck, чтобы он разбил тестовую выборку на классы и в конце тестирования

сообщил бы нам сколько элементов в какой класс попали. Это делается с помощью функции classify:

classify :: Testable prop => Bool -> String -> prop -> Property

Она принимает условие классификации, метку класса и свойство. Например так мы можем разбить вы-

борку по типам линий:

prop3 :: Station -> Station -> Property

prop3 a@(St wa _) b@(St wb _) =

classify (wa == Orange || wb == Orange) ”Orange” $

classify (wa == Black

|| wb == Black)

”Black”

$

classify (wa == Red

|| wb == Red)

”Red”

$ prop1 a b

Протестируем:

*Test> quickCheck prop3