{-# LANGUAGE ScopedTypeVariables, TypeFamilies, FlexibleContexts #-} module Chunker (tests) where import Language.KansasLava import Language.KansasLava.Test import Hardware.KansasLava.Chunker import Data.Sized.Unsigned import Data.Sized.Signed import Data.Sized.Arith import Data.Sized.Matrix (Matrix,(!), matrix) import Data.Sized.Ix import Data.Ratio import System.Random --import Data.Maybe import Debug.Trace import Data.Word import Data.List as L tests :: TestSeq -> IO () tests test = do -- testing Chunker let waitForItTest :: (Size x, Size y, Rep w, Show w) => Unsigned x -> Witness y -> StreamTest w (Unsigned x) waitForItTest mx w = StreamTest { theStream = waitForIt mx w , correctnessCondition = \ ins outs -> -- trace (show ("cc",length ins,length outs)) $ -- trace (show ("ins",map show (take 100 ins))) $ -- trace (show ("outs",map show (take 100 outs))) $ case (length ins, sum $ map fromIntegral outs) of (i,o) | maximum outs > mx -> Just ("packet to large " ++ show (outs,mx)) | any (== 0) outs -> Just ("found empty packet " ++ show outs) | i == o -> Nothing | otherwise -> Just ("found " ++ show i ++ " elements, tagged " ++ show o ++ show (ins,outs)) , theStreamTestCount = count , theStreamTestCycles = count * 100 , theStreamName = "chunker/waitForIt" } count = 1000 -- Need to think about 0. let t :: forall w . (Size w) => Witness w -> IO () t w = sequence_ [ testStream test ("U4/" ++ show n ++ "/" ++ show (size (undefined :: w))) (waitForItTest n w :: StreamTest S11 U4) | n <- [1,2,3,4,8,15] ] t (Witness :: Witness X1) t (Witness :: Witness X2) t (Witness :: Witness X3) t (Witness :: Witness X4) t (Witness :: Witness X5) t (Witness :: Witness X10) let chunkCounterTest :: forall x y . (Size x, Size y, Rep y, Rep x, Num y, Num x) => Witness x -> StreamTest (Unsigned y) Bool chunkCounterTest w = StreamTest { theStream = chunkCounter w , correctnessCondition = \ ins outs -> let msgs = fn outs x = size (undefined :: x) -- fn xs | trace (show $ take 10 xs) False = undefined fn [] = [] fn xs | L.all (== True) (take x xs) = n : fn (drop n xs') where n = length (takeWhile (== False) xs') xs' = drop x xs fn _ = error "bad stream from chunkCounter" ins' = ins ++ [0] -- always will have a zero, because of the pre-issue in case () of _ | msgs /= map fromIntegral ins' -> Just $ "bad length of lows " ++ show (msgs,ins') _ | otherwise -> Nothing , theStreamTestCount = count , theStreamTestCycles = count * 500 , theStreamName = "chunker/chunkCounter" } count = 20 let t :: forall x . (Rep x, Size x, Num x) => Witness x -> IO () t w = testStream test ("U4/" ++ show (size (undefined :: x))) (chunkCounterTest w :: StreamTest U4 Bool) t (Witness :: Witness X1) t (Witness :: Witness X2) t (Witness :: Witness X3) t (Witness :: Witness X4) t (Witness :: Witness X5) t (Witness :: Witness X6) let chunkSplitJoinTest :: StreamTest U4 U4 chunkSplitJoinTest = StreamTest { theStream = chunkSplitHeader f $$ -- here we -- (1) Turn header ABC into headder CBA, where B is the length; -- (2) Add one to every member of the payload. stackP (forwardP (mapEnabled (\ ms -> let m = unpack ms in pack (matrix [m ! 2,m ! 1,m ! 0])))) (forwardP (mapEnabled (+1))) $$ chunkJoinHeader f , correctnessCondition = \ ins outs -> -- trace (show ("cc",length ins,length outs)) $ -- trace (show ("ins",map show (take 100 ins))) $ -- trace (show ("outs",map show (take 100 outs))) $ let readPackets (a:b:c:d) = (a,b,c,take (fromIntegral b) d) : readPackets (drop (fromIntegral b) d) readPackets [] = [] -- hack readPackets _ = error "bad packet!" xs = map (\(a,b,c,d) -> (c,b,a,map (+1) d)) $ readPackets (take (length outs) ins) ys = readPackets outs in case () of -- _ | trace (show xs) False -> Nothing -- _ | trace (show ys) False -> Nothing _ | length xs < 100 -> Just $ "too few packets ???" ++ show (length xs) _ | length xs /= length ys -> Just $ "# of packets different " ++ show ( length xs, length ys ) _ | xs /= ys -> Just $ "bad join + split: " ++ show (zip xs ys) _ | otherwise -> Nothing , theStreamTestCount = count , theStreamTestCycles = count * 4 , theStreamName = "chunker/join-split" } f :: forall comb . Signal comb (Matrix X3 U4) -> Signal comb U4 f m = (unpack m :: Matrix X3 (Signal comb U4)) ! 1 count = 2000 testStream test ("U4") (chunkSplitJoinTest) return ()