Tree-native binary processing
This commit is contained in:
23
lib/binary.tri
Normal file
23
lib/binary.tri
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
!import "base.tri" !Local
|
||||||
|
!import "list.tri" !Local
|
||||||
|
!import "bytes.tri" !Local
|
||||||
|
|
||||||
|
errUnexpectedEof = 1
|
||||||
|
|
||||||
|
ok = value rest : pair true (pair value rest)
|
||||||
|
err = code rest : pair false (pair code rest)
|
||||||
|
|
||||||
|
readU8 = (bytes : matchList
|
||||||
|
(err errUnexpectedEof t)
|
||||||
|
(h r : ok h r)
|
||||||
|
bytes)
|
||||||
|
|
||||||
|
readBytesTaken = n bytes : bytesTake n bytes
|
||||||
|
readBytesRest = n bytes : bytesDrop n bytes
|
||||||
|
readBytesEnough? = n bytes : equal? (bytesLength (readBytesTaken n bytes)) n
|
||||||
|
|
||||||
|
readBytes = (n bytes :
|
||||||
|
matchBool
|
||||||
|
(ok (readBytesTaken n bytes) (readBytesRest n bytes))
|
||||||
|
(err errUnexpectedEof bytes)
|
||||||
|
(readBytesEnough? n bytes))
|
||||||
59
test/Spec.hs
59
test/Spec.hs
@@ -47,6 +47,7 @@ tests = testGroup "Tricu Tests"
|
|||||||
, byteMarshallingTests
|
, byteMarshallingTests
|
||||||
, wireTests
|
, wireTests
|
||||||
, byteListUtilities
|
, byteListUtilities
|
||||||
|
, binaryReaderTests
|
||||||
]
|
]
|
||||||
|
|
||||||
lexer :: TestTree
|
lexer :: TestTree
|
||||||
@@ -1028,6 +1029,7 @@ wireTests = testGroup "Wire Tests"
|
|||||||
-- --------------------------------------------------------------------------
|
-- --------------------------------------------------------------------------
|
||||||
|
|
||||||
-- | Helpers for byte-list test expectations.
|
-- | Helpers for byte-list test expectations.
|
||||||
|
|
||||||
trueT :: T
|
trueT :: T
|
||||||
trueT = Stem Leaf
|
trueT = Stem Leaf
|
||||||
|
|
||||||
@@ -1225,3 +1227,60 @@ byteListUtilities = testGroup "Byte List Utility Tests"
|
|||||||
let env = evalTricu library (parseTricu input)
|
let env = evalTricu library (parseTricu input)
|
||||||
result env @?= falseT
|
result env @?= falseT
|
||||||
]
|
]
|
||||||
|
|
||||||
|
-- --------------------------------------------------------------------------
|
||||||
|
-- Binary reader tests (binary.tri)
|
||||||
|
-- --------------------------------------------------------------------------
|
||||||
|
okT :: T -> T -> T
|
||||||
|
okT value rest = pairT trueT (pairT value rest)
|
||||||
|
|
||||||
|
errT :: T -> T -> T
|
||||||
|
errT code rest = pairT falseT (pairT code rest)
|
||||||
|
|
||||||
|
eofT :: T
|
||||||
|
eofT = byteT 1
|
||||||
|
|
||||||
|
binaryReaderTests :: TestTree
|
||||||
|
binaryReaderTests = testGroup "Binary Reader Tests"
|
||||||
|
[ testCase "readU8: empty input returns err" $ do
|
||||||
|
let input = "readU8 []"
|
||||||
|
library <- evaluateFile "./lib/binary.tri"
|
||||||
|
let env = evalTricu library (parseTricu input)
|
||||||
|
result env @?= errT eofT (bytesT [])
|
||||||
|
|
||||||
|
, testCase "readU8: single byte returns ok" $ do
|
||||||
|
let input = "readU8 [(7)]"
|
||||||
|
library <- evaluateFile "./lib/binary.tri"
|
||||||
|
let env = evalTricu library (parseTricu input)
|
||||||
|
result env @?= okT (byteT 7) (bytesT [])
|
||||||
|
|
||||||
|
, testCase "readU8: multi-byte returns first byte and rest" $ do
|
||||||
|
let input = "readU8 [(7) (8)]"
|
||||||
|
library <- evaluateFile "./lib/binary.tri"
|
||||||
|
let env = evalTricu library (parseTricu input)
|
||||||
|
result env @?= okT (byteT 7) (bytesT [8])
|
||||||
|
|
||||||
|
, testCase "readBytes 0: returns ok with empty bytes and original input" $ do
|
||||||
|
let input = "readBytes 0 [(1) (2)]"
|
||||||
|
library <- evaluateFile "./lib/binary.tri"
|
||||||
|
let env = evalTricu library (parseTricu input)
|
||||||
|
result env @?= okT (bytesT []) (bytesT [1,2])
|
||||||
|
|
||||||
|
, testCase "readBytes 2: exact read returns ok with taken and rest" $ do
|
||||||
|
let input = "readBytes 2 [(1) (2) (3)]"
|
||||||
|
library <- evaluateFile "./lib/binary.tri"
|
||||||
|
let env = evalTricu library (parseTricu input)
|
||||||
|
result env @?= okT (bytesT [1,2]) (bytesT [3])
|
||||||
|
|
||||||
|
, testCase "readBytes 3: exact read with no remainder" $ do
|
||||||
|
let input = "readBytes 3 [(1) (2) (3)]"
|
||||||
|
library <- evaluateFile "./lib/binary.tri"
|
||||||
|
let env = evalTricu library (parseTricu input)
|
||||||
|
result env @?= okT (bytesT [1,2,3]) (bytesT [])
|
||||||
|
|
||||||
|
, testCase "readBytes 5: overlong read returns err preserving input" $ do
|
||||||
|
let input = "readBytes 5 [(1) (2)]"
|
||||||
|
library <- evaluateFile "./lib/binary.tri"
|
||||||
|
let env = evalTricu library (parseTricu input)
|
||||||
|
result env @?= errT eofT (bytesT [1,2])
|
||||||
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user