{-# LANGUAGE ScopedTypeVariables #-}
module Module.Capnp.Basics (basicsTests) where

import Test.Hspec
import Test.QuickCheck

import Control.Monad.IO.Class    (liftIO)
import Test.QuickCheck.Instances ()
import Test.QuickCheck.IO        (propertyIO)

import qualified Data.ByteString as BS
import qualified Data.Text       as T

import Capnp.Basics

import Capnp (cerialize, evalLimitT, newMessage)

import qualified Capnp.Untyped as U

basicsTests :: Spec
basicsTests =
    describe "textBuffer and textBytes agree" $
        it "Should return the same number of bytes" $
            property $ \(text :: T.Text) -> propertyIO $ evalLimitT maxBound $ do
                msg <- newMessage Nothing
                cerial <- cerialize msg text
                buf <- textBuffer cerial
                bytes <- textBytes cerial
                liftIO $ BS.length bytes `shouldBe` U.length buf