{-# OPTIONS_GHC -F -pgmF htfpp #-} {-# LANGUAGE MagicHash, OverloadedStrings, TemplateHaskell, FlexibleInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module BufferTest (htf_thisModulesTests) where import Test.Framework import qualified Data.ByteString.Char8 as BSC import Data.BufferBuilder import Test.QuickCheck.Instances () import qualified Data.Text as T import qualified Data.Text.Internal as TI getTextOffset :: T.Text -> Int getTextOffset (TI.Text _array offset _length) = offset test_append_bytes :: IO () test_append_bytes = do let result = runBufferBuilder $ do appendChar8 'f' appendChar8 'o' appendChar8 'o' assertEqual "foo" result test_append_string :: IO () test_append_string = do let result = runBufferBuilder $ do appendChar8 'f' appendChar8 'o' appendChar8 'o' appendBS "bar" assertEqual "foobar" result test_append_json_escaped_text_with_zero_offset :: IO () test_append_json_escaped_text_with_zero_offset = do let t = "foo" assertEqual 0 (getTextOffset t) let result = runBufferBuilder $ do appendEscapedJsonText t appendBS "bar" assertEqual "\"foo\"bar" result test_append_json_escaped_text_with_nonzero_offset :: IO () test_append_json_escaped_text_with_nonzero_offset = do let [_, t] = T.split (== '-') "some_prefix-foo" assertNotEqual 0 (getTextOffset t) let result = runBufferBuilder $ do appendEscapedJsonText t appendBS "bar" assertEqual "\"foo\"bar" result test_append_literals :: IO () test_append_literals = do let result = runBufferBuilder $ do appendLiteral "foo"# appendLiteral "bar"# assertEqual "foobar" result test_append_url_encoded_safe :: IO () test_append_url_encoded_safe = do let safe = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_" let result = runBufferBuilder $ do appendUrlEncoded safe assertEqual safe result test_append_url_encoded_unsafe :: IO () test_append_url_encoded_unsafe = do let safe = "\0\1 /\\$%" let result = runBufferBuilder $ do appendUrlEncoded safe assertEqual "%00%01%20%2f%5c%24%25" result test_query_current_length :: IO () test_query_current_length = do let ((f, s), result) = runBufferBuilder' $ do appendBS "foo" first <- currentLength appendBS "bar" second <- currentLength return (first, second) assertEqual 3 f assertEqual 6 s assertEqual "foobar" result test_calculate_length :: IO () test_calculate_length = do let first = appendBS "foo" let second = first >> appendBS "bar" assertEqual 3 $ calculateLength first assertEqual 6 $ calculateLength second prop_match_intDec :: Int -> Bool prop_match_intDec i = runBufferBuilder (appendDecimalSignedInt i) == (BSC.pack $ show i) instance Arbitrary (BufferBuilder String) where arbitrary = oneof [ a "appendBS" appendBS , a "appendChar8" appendChar8 , a "appendCharUtf8" appendCharUtf8 , a "appendStringUtf8" appendStringUtf8 , a "appendEscapedJson" appendEscapedJson , a "appendEscapedJsonText" appendEscapedJsonText , a "appendDecimalSignedInt" appendDecimalSignedInt , a "appendDecimalDouble" appendDecimalDouble , a "appendUrlEncoded" appendUrlEncoded ] where a :: Arbitrary arg => String -> (arg -> BufferBuilder ()) -> Gen (BufferBuilder String) a name action = do arg <- arbitrary return $ do action arg return name instance Show (BufferBuilder String) where show = fst . runBufferBuilder' prop_length_calculation_matches_actual_length :: BufferBuilder String -> Bool prop_length_calculation_matches_actual_length bb = let cc = bb >> return () in BSC.length (runBufferBuilder cc) == calculateLength cc