Использование 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, вы можете также использовать слабосвязанную среду тестирования, используя пользовательские Gens:

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 "...")
Другие вопросы по тегам