fake to stand in for start_reading in tests

This commit is contained in:
Kartik K. Agaram 2022-03-18 09:24:53 -07:00
parent 5c42b1de32
commit 4a90a28a15
1 changed files with 44 additions and 0 deletions

View File

@ -15,6 +15,50 @@ function start_reading(fs, filename)
}
end
-- fake file object with the same 'shape' as that returned by start_reading
function fake_file_stream(s)
local i = 1
local max = string.len(s)
return {
read = function(format)
if i > max then
return nil
end
if type(format) == 'number' then
local result = s:sub(i, i+format-1)
i = i+format
return result
elseif format == '*a' then
local result = s:sub(i)
i = max+1
return result
elseif format == '*l' then
local start = i
while i <= max do
if s:sub(i, i) == '\n' then
break
end
i = i+1
end
local result = s:sub(start, i)
i = i+1
return result
elseif format == '*n' then
error('fake file streams: *n not yet supported')
end
end,
}
end
function test_fake_file_system()
local s = fake_file_stream('abcdefgh\nijk\nlmn')
check_eq(s.read(1), 'a', 'fake_file_system: 1 char')
check_eq(s.read(1), 'b', 'fake_file_system: 1 more char')
check_eq(s.read(3), 'cde', 'fake_file_system: multiple chars')
check_eq(s.read('*l'), 'fgh\n', 'fake_file_system: line')
check_eq(s.read('*a'), 'ijk\nlmn', 'fake_file_system: all')
end
-- primitive for writing files to a file system (or, later, network)
-- returns an object or nil on error
-- write to the object using .write()