From c5833e094ec1448e5b2dbb364eae09c406ec44ed Mon Sep 17 00:00:00 2001 From: Starfflame Date: Wed, 19 May 2021 20:21:17 -0500 Subject: [PATCH] Add new tests for inputstreams --- CoreHelpers.tl | 33 +++++++++++++++++++++++++++++++++ InputStream.tl | 19 +++++++++++++------ filetest.txt | 20 ++++++++++++++++++++ test.sh | 2 ++ tests.lua | 37 +++++++++++++++++++++++++++++++++++-- 5 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 filetest.txt create mode 100755 test.sh diff --git a/CoreHelpers.tl b/CoreHelpers.tl index d92a69a..f276e4c 100644 --- a/CoreHelpers.tl +++ b/CoreHelpers.tl @@ -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 diff --git a/InputStream.tl b/InputStream.tl index 03c9a48..5c18132 100644 --- a/InputStream.tl +++ b/InputStream.tl @@ -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 diff --git a/filetest.txt b/filetest.txt new file mode 100644 index 0000000..6290aaf --- /dev/null +++ b/filetest.txt @@ -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 + diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..49b62df --- /dev/null +++ b/test.sh @@ -0,0 +1,2 @@ +#! /bin/sh +tl build && busted tests.lua diff --git a/tests.lua b/tests.lua index 04deecb..6cef769 100644 --- a/tests.lua +++ b/tests.lua @@ -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