From d9768cd0315b0415d20818de9c897c6168c95b78 Mon Sep 17 00:00:00 2001
From: pacien
Date: Fri, 23 Nov 2018 12:57:00 +0100
Subject: Split bitstream into bitreader and bitwriter
---
tests/tbitreader.nim | 61 ++++++++++++++++++++++++
tests/tbitstream.nim | 131 ---------------------------------------------------
tests/tbitwriter.nim | 85 +++++++++++++++++++++++++++++++++
tests/tintegers.nim | 6 ++-
tests/trawblock.nim | 22 ++++-----
5 files changed, 162 insertions(+), 143 deletions(-)
create mode 100644 tests/tbitreader.nim
delete mode 100644 tests/tbitstream.nim
create mode 100644 tests/tbitwriter.nim
(limited to 'tests')
diff --git a/tests/tbitreader.nim b/tests/tbitreader.nim
new file mode 100644
index 0000000..6b3be2b
--- /dev/null
+++ b/tests/tbitreader.nim
@@ -0,0 +1,61 @@
+# "à-la-gzip" gzip-like LZSS compressor
+# Copyright (C) 2018 Pacien TRAN-GIRARD
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+import unittest, streams, sugar, sequtils
+import integers, bitreader
+
+suite "bitreader":
+ test "readBool":
+ let stream = newStringStream()
+ defer: stream.close()
+ stream.write(0b1001_1111'u8)
+ stream.write(0b0110_0000'u8)
+ stream.setPosition(0)
+
+ let bitReader = stream.bitReader()
+ check lc[bitReader.readBool() | (_ <- 0..<16), bool] == @[
+ true, true, true, true, true, false, false, true,
+ false, false, false, false, false, true, true, false]
+
+ expect IOError: discard bitReader.readBool()
+ check bitReader.atEnd()
+
+ test "readBits":
+ let stream = newStringStream()
+ defer: stream.close()
+ stream.write(0xF00F'u16)
+ stream.write(0x0FFF'u16)
+ stream.setPosition(0)
+
+ let bitReader = stream.bitReader()
+ check bitReader.readBits(8, uint8) == 0x0F'u8
+ check bitReader.readBits(16, uint16) == 0xFFF0'u16
+ check bitReader.readBits(8, uint8) == 0x0F'u8
+
+ expect RangeError: discard bitReader.readBits(9, uint8)
+ expect IOError: discard bitReader.readBits(16, uint16)
+ check bitReader.atEnd()
+
+ test "readSeq":
+ let stream = newStringStream()
+ defer: stream.close()
+ stream.write(0x0F00_F0FF_F0F0_F0F0'u64)
+ stream.setPosition(0)
+
+ let bitReader = stream.bitReader()
+ check bitReader.readSeq(32, uint16) == (32, @[0xF0F0'u16, 0xF0F0])
+ check bitReader.readSeq(40, uint8) == (32, @[0xFF'u8, 0xF0, 0x00, 0x0F])
+ check bitReader.atEnd()
diff --git a/tests/tbitstream.nim b/tests/tbitstream.nim
deleted file mode 100644
index 2292049..0000000
--- a/tests/tbitstream.nim
+++ /dev/null
@@ -1,131 +0,0 @@
-# "à-la-gzip" gzip-like LZSS compressor
-# Copyright (C) 2018 Pacien TRAN-GIRARD
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-
-import unittest, streams, sugar, sequtils
-import integers, bitstream
-
-suite "bitstream":
- test "chunks iterator":
- check toSeq(chunks(70, uint32)) == @[(0, 32), (1, 32), (2, 6)]
- check toSeq(chunks(32, uint16)) == @[(0, 16), (1, 16)]
-
- test "flush":
- let stream = newStringStream()
- defer: stream.close()
- let bitStream = stream.bitStream()
-
- bitStream.writeBool(true)
- stream.setPosition(0)
- expect IOError: discard stream.peekUint8()
-
- bitStream.flush()
- stream.setPosition(0)
- check stream.readUint8() == 0x01'u8
- check stream.atEnd()
-
- bitStream.flush()
- check stream.atEnd()
-
- test "readBool":
- let stream = newStringStream()
- defer: stream.close()
- stream.write(0b1001_1111'u8)
- stream.write(0b0110_0000'u8)
- stream.setPosition(0)
-
- let bitStream = stream.bitStream()
- check lc[bitStream.readBool() | (_ <- 0..<16), bool] == @[
- true, true, true, true, true, false, false, true,
- false, false, false, false, false, true, true, false]
-
- expect IOError: discard bitStream.readBool()
- check bitStream.atEnd()
-
- test "readBits":
- let stream = newStringStream()
- defer: stream.close()
- stream.write(0xF00F'u16)
- stream.write(0x0FFF'u16)
- stream.setPosition(0)
-
- let bitStream = stream.bitStream()
- check bitStream.readBits(8, uint8) == 0x0F'u8
- check bitStream.readBits(16, uint16) == 0xFFF0'u16
- check bitStream.readBits(8, uint8) == 0x0F'u8
-
- expect RangeError: discard bitStream.readBits(9, uint8)
- expect IOError: discard bitStream.readBits(16, uint16)
- check bitStream.atEnd()
-
- test "readSeq":
- let stream = newStringStream()
- defer: stream.close()
- stream.write(0x0F00_F0FF_F0F0_F0F0'u64)
- stream.setPosition(0)
-
- let bitStream = stream.bitStream()
- check bitStream.readSeq(32, uint16) == (32, @[0xF0F0'u16, 0xF0F0])
- check bitStream.readSeq(40, uint8) == (32, @[0xFF'u8, 0xF0, 0x00, 0x0F])
- check bitStream.atEnd()
-
- test "writeBool":
- let stream = newStringStream()
- defer: stream.close()
-
- let bitStream = stream.bitStream()
- let booleanValues = @[
- true, true, true, true, true, false, false, true,
- false, false, false, false, false, true, true, false,
- true, true, false, true]
- for b in booleanValues: bitStream.writeBool(b)
- bitStream.flush()
-
- stream.setPosition(0)
- check stream.readUint8() == 0b1001_1111'u8
- check stream.readUint8() == 0b0110_0000'u8
- check stream.readUint8() == 0b0000_1011'u8
- expect IOError: discard stream.readUint8()
- check stream.atEnd()
-
- test "writeBits":
- let stream = newStringStream()
- defer: stream.close()
-
- let bitStream = stream.bitStream()
- bitStream.writeBits(4, 0xF00F'u16)
- bitStream.writeBits(16, 0xF00F'u16)
- bitStream.writeBits(16, 0xFFFF'u16)
- bitStream.flush()
-
- stream.setPosition(0)
- check stream.readUint16() == 0x00FF'u16
- check stream.readUint16() == 0xFFFF'u16
- check stream.readUint8() == 0x0F'u8
- expect IOError: discard stream.readUint8()
- check stream.atEnd()
-
- test "writeSeq":
- let stream = newStringStream()
- defer: stream.close()
-
- let bitStream = stream.bitStream()
- bitStream.writeSeq(32, @[0xF0F0'u16, 0xF0F0])
- bitStream.writeSeq(28, @[0xFF'u8, 0xF0, 0x00, 0xFF])
- bitStream.flush()
-
- stream.setPosition(0)
- check stream.readUint64() == 0x0F00_F0FF_F0F0_F0F0'u64
- check stream.atEnd()
diff --git a/tests/tbitwriter.nim b/tests/tbitwriter.nim
new file mode 100644
index 0000000..cc7fdc5
--- /dev/null
+++ b/tests/tbitwriter.nim
@@ -0,0 +1,85 @@
+# "à-la-gzip" gzip-like LZSS compressor
+# Copyright (C) 2018 Pacien TRAN-GIRARD
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+
+import unittest, streams
+import integers, bitwriter
+
+suite "bitwriter":
+ test "flush":
+ let stream = newStringStream()
+ defer: stream.close()
+ let bitWriter = stream.bitWriter()
+
+ bitWriter.writeBool(true)
+ stream.setPosition(0)
+ expect IOError: discard stream.peekUint8()
+
+ bitWriter.flush()
+ stream.setPosition(0)
+ check stream.readUint8() == 0x01'u8
+ check stream.atEnd()
+
+ bitWriter.flush()
+ check stream.atEnd()
+
+ test "writeBool":
+ let stream = newStringStream()
+ defer: stream.close()
+
+ let bitWriter = stream.bitWriter()
+ let booleanValues = @[
+ true, true, true, true, true, false, false, true,
+ false, false, false, false, false, true, true, false,
+ true, true, false, true]
+ for b in booleanValues: bitWriter.writeBool(b)
+ bitWriter.flush()
+
+ stream.setPosition(0)
+ check stream.readUint8() == 0b1001_1111'u8
+ check stream.readUint8() == 0b0110_0000'u8
+ check stream.readUint8() == 0b0000_1011'u8
+ expect IOError: discard stream.readUint8()
+ check stream.atEnd()
+
+ test "writeBits":
+ let stream = newStringStream()
+ defer: stream.close()
+
+ let bitWriter = stream.bitWriter()
+ bitWriter.writeBits(4, 0xF00F'u16)
+ bitWriter.writeBits(16, 0xF00F'u16)
+ bitWriter.writeBits(16, 0xFFFF'u16)
+ bitWriter.flush()
+
+ stream.setPosition(0)
+ check stream.readUint16() == 0x00FF'u16
+ check stream.readUint16() == 0xFFFF'u16
+ check stream.readUint8() == 0x0F'u8
+ expect IOError: discard stream.readUint8()
+ check stream.atEnd()
+
+ test "writeSeq":
+ let stream = newStringStream()
+ defer: stream.close()
+
+ let bitWriter = stream.bitWriter()
+ bitWriter.writeSeq(32, @[0xF0F0'u16, 0xF0F0])
+ bitWriter.writeSeq(28, @[0xFF'u8, 0xF0, 0x00, 0xFF])
+ bitWriter.flush()
+
+ stream.setPosition(0)
+ check stream.readUint64() == 0x0F00_F0FF_F0F0_F0F0'u64
+ check stream.atEnd()
diff --git a/tests/tintegers.nim b/tests/tintegers.nim
index 720677e..de43c09 100644
--- a/tests/tintegers.nim
+++ b/tests/tintegers.nim
@@ -14,7 +14,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
-import unittest
+import unittest, sequtils
import integers
suite "integers":
@@ -26,3 +26,7 @@ suite "integers":
check truncateToUint8(0xFA'u8) == 0xFA'u8
check truncateToUint8(0x00FA'u16) == 0xFA'u8
check truncateToUint8(0xFFFA'u16) == 0xFA'u8
+
+ test "chunks iterator":
+ check toSeq(chunks(70, uint32)) == @[(0, 32), (1, 32), (2, 6)]
+ check toSeq(chunks(32, uint16)) == @[(0, 16), (1, 16)]
diff --git a/tests/trawblock.nim b/tests/trawblock.nim
index 1e92c60..e789b4b 100644
--- a/tests/trawblock.nim
+++ b/tests/trawblock.nim
@@ -15,7 +15,7 @@
# along with this program. If not, see .
import unittest, streams
-import bitstream, rawblock
+import bitreader, bitwriter, rawblock
suite "rawblock":
test "serialise":
@@ -23,14 +23,14 @@ suite "rawblock":
defer: rawStream.close()
rawStream.write(0xFEDC_BA98_7654_3210'u64)
rawStream.setPosition(0)
- let rawBitStream = rawStream.bitStream()
- let rawBlock = rawblock.readRaw(rawBitStream)
+ let rawBitReader = rawStream.bitReader()
+ let rawBlock = rawblock.readRaw(rawBitReader)
let outputStream = newStringStream()
defer: outputStream.close()
- let outputBitStream = outputStream.bitStream()
- rawBlock.writeSerialisedTo(outputBitStream)
- outputBitStream.flush()
+ let outputBitWriter = outputStream.bitWriter()
+ rawBlock.writeSerialisedTo(outputBitWriter)
+ outputBitWriter.flush()
outputStream.setPosition(0)
check outputStream.readUint16() == 64
@@ -43,14 +43,14 @@ suite "rawblock":
serialisedStream.write(60'u16)
serialisedStream.write(0xFEDC_BA98_7654_3210'u64)
serialisedStream.setPosition(0)
- let serialisedBitStream = serialisedStream.bitStream()
- let rawBlock = rawBlock.readSerialised(serialisedBitStream)
+ let serialisedBitReader = serialisedStream.bitReader()
+ let rawBlock = rawBlock.readSerialised(serialisedBitReader)
let outputStream = newStringStream()
defer: outputStream.close()
- let outputBitStream = outputStream.bitStream()
- rawBlock.writeRawTo(outputBitStream)
- outputBitStream.flush()
+ let outputBitWriter = outputStream.bitWriter()
+ rawBlock.writeRawTo(outputBitWriter)
+ outputBitWriter.flush()
outputStream.setPosition(0)
check outputStream.readUint64 == 0x0EDC_BA98_7654_3210'u64
--
cgit v1.2.3