Add new tests for inputstreams

This commit is contained in:
Starfflame 2021-05-19 20:21:17 -05:00
parent 253ab538ca
commit c5833e094e
5 changed files with 103 additions and 8 deletions

View File

@ -1,6 +1,8 @@
local ds = require("DataStructures")
local Dictionary, Stack, WordInfo, Environment = ds.Dictionary, ds.Stack, ds.WordInfo, ds.Environment
local Pointer = ds.Pointer
local InputStream = require("InputStream")
local CoreHelpers = {}
function CoreHelpers.defineWord(dict: Dictionary, str: string, func: function(Environment, ...: any): any..., imm: boolean)
@ -13,6 +15,37 @@ function CoreHelpers.standardInputRefill(): string
return input
end
function CoreHelpers._oneReadRefill(str: string): function(): string
local alreadyRead: boolean = false
return function(): string
if not alreadyRead then
alreadyRead = true
return str
else
return ""
end
end
end
function CoreHelpers._fileRefill(fname: string): function(): string
local f = assert(io.open(fname, "r"))
return function(): string
local chunk = f:read(2^13)
if not chunk then chunk = "" end
return chunk
end
end
function CoreHelpers.fileStream(fname: string): InputStream
local istream = InputStream:new(CoreHelpers._fileRefill(fname))
return istream
end
function CoreHelpers.oneReadInputStream(str: string): InputStream
local iStream = InputStream:new(CoreHelpers._oneReadRefill(str))
return iStream
end
function CoreHelpers.areNumbers(a: any, b: any): boolean
return a is number and b is number
end

View File

@ -25,7 +25,7 @@ function InputStream:_manageBuffer()
end
local function initial_stream(): string
return "DUMMY"
return ""
end
@ -52,14 +52,21 @@ function InputStream:__setRefill(func: function(): string)
end
--
function InputStream:curr(): string
return self.str:sub(self.offset, self.offset)
function InputStream:curr(): string | nil
self:_manageBuffer()
if #self.str > 0 then
return self.str:sub(self.offset, self.offset)
end
return nil
end
function InputStream:next(): string
function InputStream:next(): string | nil
self:_manageBuffer()
local current_char = self.str:sub(self.offset, self.offset)
self.offset = self.offset + 1
local current_char: string | nil = nil
if #self.str > 0 then
current_char = self.str:sub(self.offset, self.offset)
self.offset = self.offset + 1
end
return current_char
end

20
filetest.txt Normal file
View File

@ -0,0 +1,20 @@
as;dlfkjasl;dfjasl;dfkjasl;dfkjaslfjgbag;aga;gja;gjasl
afasl;fjasl;kdfj
adfl;jkasl;dfasjkl;j;l
;alsjdfl;kasjd
a;sldkfjals;dfj
g;aga;fgnagbn;
;
kaFASDLFM
;aSKDFa;fJ
;lkjasdldjkfal
lasfsalfkmakvml;mzxcv,mz!6*84a;lskdmas,dmfas.,fm

2
test.sh Executable file
View File

@ -0,0 +1,2 @@
#! /bin/sh
tl build && busted tests.lua

View File

@ -1,7 +1,7 @@
local istream = require("InputStream")
local ds = require("DataStructures")
local Stack, Dictionary, WordInfo, Environment = ds.Stack, ds.Dictionary, ds.WordInfo, ds.Environment
local CoreHelpers = require("CoreHelpers")
function pushThree(s)
s:push(1)
@ -61,9 +61,42 @@ describe("InputStream tests", function()
local inputString = dummyInput()
for i = 0, 100 do
local j = i % #inputString + 1
assert.are.same(inputString:sub(j, j), input:advance())
assert.are.same(inputString:sub(j, j), input:next())
end
end)
describe("Tests with ends of input", function()
it("handles a single line", function()
local inputstr = "TEST TEST TEST"
input = CoreHelpers.oneReadInputStream(inputstr)
for i = 1, #inputstr do
assert.are.same(inputstr:sub(i, i), input:next())
end
for i = 1, 1000 do
assert.are.same(nil, input:next())
end
end)
it("handles multiple lines", function()
local inputstr = "TEST\nTEST\nTEST\nTEST\nTEST\nTEST51515151"
input = CoreHelpers.oneReadInputStream(inputstr)
for i = 1, #inputstr do
assert.are.same(inputstr:sub(i, i), input:next())
end
for i = 1, 1000 do
assert.are.same(nil, input:next())
end
end)
it("can do files", function()
local fname = "./filetest.txt"
input = CoreHelpers.fileStream(fname)
local expected_output = io.open(fname, "r"):read("*all")
for i = 1, #expected_output do
assert.are.same(expected_output:sub(i,i), input:next())
end
for i = 1, 1000 do
assert.are.same(nil, input:next())
end
end)
end)
end)
describe("WordInfo tests", function()
local Environment = ds.Environment