Использование Haskell QuickCheck для проверки валидатора TCP-порта
Я пытаюсь использовать QuickCheck (впервые) для проверки функции, которая проверяет номера портов TCP:
validatePort :: Int -> Either String Int
validatePort port =
if port > 0 && port <= 65535
then Right port
else Left "Port must be between 1 and 65535 inclusive"
Я написал экземпляр Arbitrary следующим образом:
instance Arbitrary Int where
arbitrary = choose (1, 65535)
но я не уверен, как написать свойство test.
2 ответа
Решение
Для начала, сначала: import Test.QuickCheck
который уже определяет произвольный экземпляр для Int
Затем напишите свойство:
prop_validate_port port =
if port > 0 && port <= 65535
then validatePort port == Right port
else validatePort port == Left "Port must be between 1 and 65535 inclusive"
И запустить тест:
>quickCheck prop_validate_port
>+++ OK. passed 100 tests.
Так же, как дополнение к ответу jev, вы можете также использовать слабосвязанную среду тестирования, используя пользовательские Gen
s:
validPorts :: Gen Int
validPorts = choose (1, 65535)
invalidPorts :: Gen Int
invalidPorts = oneof [choose (minBound, 0), choose (65536, maxBound)]
prop_validatePortValidatesValidPorts =
forAll validPorts (\port -> validatePort port == Right port)
prop_validatePortDoesNotValidateInvalidPorts =
forAll invalidPorts (\port -> validatePort port == Left "...")