Implement readInto and read(n)
This commit is contained in:
parent
b24300bd3f
commit
bf930b6f1b
12 changed files with 636 additions and 220 deletions
34
tests/files/ascii_table.txt
Normal file
34
tests/files/ascii_table.txt
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel|
|
||||
|010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si |
|
||||
|020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb|
|
||||
|030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us |
|
||||
|040 sp |041 ! |042 " |043 # |044 $ |045 % |046 & |047 ' |
|
||||
|050 ( |051 ) |052 * |053 + |054 , |055 - |056 . |057 / |
|
||||
|060 0 |061 1 |062 2 |063 3 |064 4 |065 5 |066 6 |067 7 |
|
||||
|070 8 |071 9 |072 : |073 ; |074 < |075 = |076 > |077 ? |
|
||||
|100 @ |101 A |102 B |103 C |104 D |105 E |106 F |107 G |
|
||||
|110 H |111 I |112 J |113 K |114 L |115 M |116 N |117 O |
|
||||
|120 P |121 Q |122 R |123 S |124 T |125 U |126 V |127 W |
|
||||
|130 X |131 Y |132 Z |133 [ |134 \ |135 ] |136 ^ |137 _ |
|
||||
|140 ` |141 a |142 b |143 c |144 d |145 e |146 f |147 g |
|
||||
|150 h |151 i |152 j |153 k |154 l |155 m |156 n |157 o |
|
||||
|160 p |161 q |162 r |163 s |164 t |165 u |166 v |167 w |
|
||||
|170 x |171 y |172 z |173 { |174 | |175 } |176 ~ |177 del|
|
||||
|
||||
| 00 nul| 01 soh| 02 stx| 03 etx| 04 eot| 05 enq| 06 ack| 07 bel|
|
||||
| 08 bs | 09 ht | 0a nl | 0b vt | 0c np | 0d cr | 0e so | 0f si |
|
||||
| 10 dle| 11 dc1| 12 dc2| 13 dc3| 14 dc4| 15 nak| 16 syn| 17 etb|
|
||||
| 18 can| 19 em | 1a sub| 1b esc| 1c fs | 1d gs | 1e rs | 1f us |
|
||||
| 20 sp | 21 ! | 22 " | 23 # | 24 $ | 25 % | 26 & | 27 ' |
|
||||
| 28 ( | 29 ) | 2a * | 2b + | 2c , | 2d - | 2e . | 2f / |
|
||||
| 30 0 | 31 1 | 32 2 | 33 3 | 34 4 | 35 5 | 36 6 | 37 7 |
|
||||
| 38 8 | 39 9 | 3a : | 3b ; | 3c < | 3d = | 3e > | 3f ? |
|
||||
| 40 @ | 41 A | 42 B | 43 C | 44 D | 45 E | 46 F | 47 G |
|
||||
| 48 H | 49 I | 4a J | 4b K | 4c L | 4d M | 4e N | 4f O |
|
||||
| 50 P | 51 Q | 52 R | 53 S | 54 T | 55 U | 56 V | 57 W |
|
||||
| 58 X | 59 Y | 5a Z | 5b [ | 5c \ | 5d ] | 5e ^ | 5f _ |
|
||||
| 60 ` | 61 a | 62 b | 63 c | 64 d | 65 e | 66 f | 67 g |
|
||||
| 68 h | 69 i | 6a j | 6b k | 6c l | 6d m | 6e n | 6f o |
|
||||
| 70 p | 71 q | 72 r | 73 s | 74 t | 75 u | 76 v | 77 w |
|
||||
| 78 x | 79 y | 7a z | 7b { | 7c | | 7d } | 7e ~ | 7f del|
|
||||
|
||||
0
tests/files/empty_file
Normal file
0
tests/files/empty_file
Normal file
|
|
@ -1,23 +1,121 @@
|
|||
{.used.}
|
||||
|
||||
import
|
||||
os, unittest, strutils, stew/ranges/ptr_arith,
|
||||
../faststreams
|
||||
os, unittest, strutils, random,
|
||||
stew/ranges/ptr_arith, testutils,
|
||||
../faststreams, ../faststreams/textio
|
||||
|
||||
suite "input stream":
|
||||
test "empty input":
|
||||
setCurrentDir getAppDir()
|
||||
|
||||
proc bytes(s: string): seq[byte] =
|
||||
result = newSeqOfCap[byte](s.len)
|
||||
for c in s: result.add byte(c)
|
||||
|
||||
proc str(bytes: openarray[byte]): string =
|
||||
result = newStringOfCap(bytes.len)
|
||||
for b in bytes:
|
||||
result.add b.char
|
||||
|
||||
proc countLines(s: InputStream): Natural =
|
||||
for s in lines(s):
|
||||
inc result
|
||||
|
||||
const
|
||||
asciiTableFile = "files" / "ascii_table.txt"
|
||||
asciiTableContents = slurp(asciiTableFile)
|
||||
|
||||
procSuite "input stream":
|
||||
template emptyInputTests(suiteName, setupCode: untyped) =
|
||||
suite suiteName & " empty inputs":
|
||||
setup setupCode
|
||||
|
||||
test "input is not readable with read":
|
||||
check not input.readable
|
||||
expect Defect:
|
||||
echo "This read should not complete: ", input.read
|
||||
|
||||
test "input is not readable with read(n)":
|
||||
check not input.readable(10)
|
||||
expect Defect:
|
||||
echo "This read should not complete: ", input.read(10)
|
||||
|
||||
test "next returns none":
|
||||
check input.next.isNone
|
||||
|
||||
emptyInputTests "unsafeMemoryInput":
|
||||
var str = ""
|
||||
var i = unsafeMemoryInput(str)
|
||||
var input = unsafeMemoryInput(str)
|
||||
|
||||
check:
|
||||
i.readable == false
|
||||
i.next.isNone
|
||||
emptyInputTests "fileInput":
|
||||
var input = memFileInput("files" / "empty_file")
|
||||
|
||||
expect Defect:
|
||||
echo i.read
|
||||
emptyInputTests "memFileInput":
|
||||
var input = fileInput("files" / "empty_file")
|
||||
|
||||
template asciiTableFileTest(name: string, body: untyped) =
|
||||
test name & " of ascii table with regular pageSize":
|
||||
var input {.inject.} = fileInput(asciiTableFile)
|
||||
try:
|
||||
body
|
||||
finally:
|
||||
close input
|
||||
|
||||
test name & " of ascii table with pageSize = 10":
|
||||
var input {.inject.} = fileInput(asciiTableFile, pageSize = 10)
|
||||
try:
|
||||
body
|
||||
finally:
|
||||
close input
|
||||
|
||||
test name & " of ascii table with pageSize = 1":
|
||||
var input {.inject.} = fileInput(asciiTableFile, pageSize = 1)
|
||||
try:
|
||||
body
|
||||
finally:
|
||||
close input
|
||||
|
||||
asciiTableFileTest "count lines":
|
||||
check countLines(input) == 34
|
||||
|
||||
asciiTableFileTest "mixed read types":
|
||||
randomize(10000)
|
||||
|
||||
var fileContents = ""
|
||||
|
||||
while true:
|
||||
let r = rand(100)
|
||||
if r < 20:
|
||||
let readSize = 1 + rand(10)
|
||||
|
||||
var buf = newSeq[byte](readSize)
|
||||
let bytesRead = input.readIntoEx(buf)
|
||||
fileContents.add buf.toOpenArray(0, bytesRead - 1).str
|
||||
|
||||
if bytesRead < buf.len:
|
||||
break
|
||||
|
||||
elif r < 50:
|
||||
let readSize = 6 + rand(10)
|
||||
|
||||
if input.readable(readSize):
|
||||
fileContents.add input.read(readSize).str
|
||||
else:
|
||||
while input.readable:
|
||||
fileContents.add input.read.char
|
||||
break
|
||||
|
||||
else:
|
||||
if input.readable:
|
||||
fileContents.add input.read.char
|
||||
|
||||
# You can uncomment this to get earlier failure in the test:
|
||||
when false:
|
||||
require fileContents == asciiTableContents[0 ..< fileContents.len]
|
||||
|
||||
check fileContents == asciiTableContents
|
||||
|
||||
test "missing file input":
|
||||
const fileName = "there-is-no-such-faststreams-file-1"
|
||||
const fileName = "there-is-no-such-faststreams-file"
|
||||
|
||||
check not fileExists(fileName)
|
||||
expect CatchableError: discard fileInput(fileName)
|
||||
|
|
|
|||
|
|
@ -166,11 +166,11 @@ suite "output stream":
|
|||
fileStream.write delayedWriteContent
|
||||
streamWritingToExistingBuffer.write delayedWriteContent
|
||||
|
||||
var totalBytesWritten = 0
|
||||
var bytesWritten = 0
|
||||
for i, count in [2]: # 12, 342, 2121, 23, 1, 34012, 932]:
|
||||
output repeat(byte(i), count)
|
||||
totalBytesWritten += count
|
||||
check memStream.pos - cursorStart == totalBytesWritten
|
||||
bytesWritten += count
|
||||
check memStream.pos - cursorStart == bytesWritten
|
||||
|
||||
cursor.finalWrite delayedWriteContent
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue