Skip to content

Commit 6190e4b

Browse files
committed
Parameterize RecordBatchStreamReader tests against fromFile and fromBytes constructor functions.
1 parent abdc67d commit 6190e4b

File tree

1 file changed

+59
-36
lines changed

1 file changed

+59
-36
lines changed

matlab/test/arrow/io/ipc/tRecordBatchStreamReader.m

Lines changed: 59 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,32 @@
2525
end
2626

2727
properties (TestParameter)
28+
RecordBatchStreamReaderConstructorFcn = {@tRecordBatchStreamReader.FromBytes, @arrow.io.ipc.RecordBatchStreamReader.fromFile}
2829
RecordBatchReadFcn = {@read, @readRecordBatch}
2930
end
3031

32+
methods (Static)
33+
% Read the given file into memory as an array of bytes (uint8)
34+
% and then construct a RecordBatchStreamReader from the bytes.
35+
function reader = FromBytes(filename)
36+
if ismissing(filename)
37+
% Simulate the behavior of fromFile when a filename
38+
% that is a missing string value is supplied.
39+
error(message("MATLAB:validators:mustBeNonzeroLengthText", ""))
40+
end
41+
fid = fopen(filename, "r");
42+
try
43+
bytes = fread(fid, "uint8=>uint8");
44+
catch e
45+
% Simulate the behavior of fromFile when an invalid
46+
% filename is supplied.
47+
error(message("MATLAB:validators:mustBeNonzeroLengthText", ""))
48+
end
49+
fclose(fid);
50+
reader = arrow.io.ipc.RecordBatchStreamReader.fromBytes(bytes);
51+
end
52+
end
53+
3154
methods(TestClassSetup)
3255

3356
function setupDataFolder(testCase)
@@ -82,19 +105,19 @@ function setupMultipleBatchStreamFile(testCase)
82105

83106
methods (Test)
84107

85-
function ZeroLengthFilenameError(testCase)
108+
function ZeroLengthFilenameError(testCase, RecordBatchStreamReaderConstructorFcn)
86109
% Verify RecordBatchStreamReader throws an exception with the
87110
% identifier MATLAB:validators:mustBeNonzeroLengthText if the
88111
% filename input argument given is a zero length string.
89-
fcn = @() arrow.io.ipc.RecordBatchStreamReader("");
112+
fcn = @() RecordBatchStreamReaderConstructorFcn("");
90113
testCase.verifyError(fcn, "MATLAB:validators:mustBeNonzeroLengthText");
91114
end
92115

93-
function MissingStringFilenameError(testCase)
116+
function MissingStringFilenameError(testCase, RecordBatchStreamReaderConstructorFcn)
94117
% Verify RecordBatchStreamReader throws an exception with the
95118
% identifier MATLAB:validators:mustBeNonzeroLengthText if the
96119
% filename input argument given is a missing string.
97-
fcn = @() arrow.io.ipc.RecordBatchStreamReader(string(missing));
120+
fcn = @() RecordBatchStreamReaderConstructorFcn(string(missing));
98121
testCase.verifyError(fcn, "MATLAB:validators:mustBeNonzeroLengthText");
99122
end
100123

@@ -106,43 +129,43 @@ function FilenameInvalidTypeError(testCase)
106129
testCase.verifyError(fcn, "MATLAB:validation:UnableToConvert");
107130
end
108131

109-
function Schema(testCase)
132+
function Schema(testCase, RecordBatchStreamReaderConstructorFcn)
110133
% Verify the getter method for Schema returns the
111134
% expected value.
112135
fieldA = arrow.field("A", arrow.string());
113136
fieldB = arrow.field("B", arrow.float32());
114137
expectedSchema = arrow.schema([fieldA fieldB]);
115138

116-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.ZeroBatchStreamFile);
139+
reader = RecordBatchStreamReaderConstructorFcn(testCase.ZeroBatchStreamFile);
117140
testCase.verifyEqual(reader.Schema, expectedSchema);
118141

119-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.OneBatchStreamFile);
142+
reader = RecordBatchStreamReaderConstructorFcn(testCase.OneBatchStreamFile);
120143
testCase.verifyEqual(reader.Schema, expectedSchema);
121144

122-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.MultipleBatchStreamFile);
145+
reader = RecordBatchStreamReaderConstructorFcn(testCase.MultipleBatchStreamFile);
123146
testCase.verifyEqual(reader.Schema, expectedSchema);
124147
end
125148

126-
function SchemaNoSetter(testCase)
149+
function SchemaNoSetter(testCase, RecordBatchStreamReaderConstructorFcn)
127150
% Verify the Schema property is not settable.
128151
fieldC = arrow.field("C", arrow.date32());
129152
schema = arrow.schema(fieldC);
130-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.ZeroBatchStreamFile);
153+
reader = RecordBatchStreamReaderConstructorFcn(testCase.ZeroBatchStreamFile);
131154
testCase.verifyError(@() setfield(reader, "Schema", schema), "MATLAB:class:SetProhibited");
132155
end
133156

134-
function ReadErrorIfEndOfStream(testCase, RecordBatchReadFcn)
157+
function ReadErrorIfEndOfStream(testCase, RecordBatchStreamReaderConstructorFcn, RecordBatchReadFcn)
135158
% Verify read throws an execption with the identifier arrow:io:ipc:EndOfStream
136159
% on an Arrow IPC Stream file containing zero batches.
137-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.ZeroBatchStreamFile);
160+
reader = RecordBatchStreamReaderConstructorFcn(testCase.ZeroBatchStreamFile);
138161
fcn = @() RecordBatchReadFcn(reader);
139162
testCase.verifyError(fcn, "arrow:io:ipc:EndOfStream");
140163
end
141164

142-
function ReadOneBatchStreamFile(testCase, RecordBatchReadFcn)
165+
function ReadOneBatchStreamFile(testCase, RecordBatchStreamReaderConstructorFcn, RecordBatchReadFcn)
143166
% Verify read can successfully read an Arrow IPC Stream file
144167
% containing one batch.
145-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.OneBatchStreamFile);
168+
reader = RecordBatchStreamReaderConstructorFcn(testCase.OneBatchStreamFile);
146169

147170
expectedMatlabTable = table(["Row1"; "Row2"], single([1; 2]), VariableNames=["A", "B"]);
148171
expected = arrow.recordBatch(expectedMatlabTable);
@@ -153,10 +176,10 @@ function ReadOneBatchStreamFile(testCase, RecordBatchReadFcn)
153176
testCase.verifyError(fcn, "arrow:io:ipc:EndOfStream");
154177
end
155178

156-
function ReadMultipleBatchStreamFile(testCase, RecordBatchReadFcn)
179+
function ReadMultipleBatchStreamFile(testCase, RecordBatchStreamReaderConstructorFcn, RecordBatchReadFcn)
157180
% Verify read can successfully read an Arrow IPC Stream file
158181
% containing mulitple batches.
159-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.MultipleBatchStreamFile);
182+
reader = RecordBatchStreamReaderConstructorFcn(testCase.MultipleBatchStreamFile);
160183

161184
expectedMatlabTable1 = table(["Row1"; "Row2"], single([1; 2]), VariableNames=["A", "B"]);
162185
expected1 = arrow.recordBatch(expectedMatlabTable1);
@@ -172,12 +195,12 @@ function ReadMultipleBatchStreamFile(testCase, RecordBatchReadFcn)
172195
testCase.verifyError(fcn, "arrow:io:ipc:EndOfStream");
173196
end
174197

175-
function HasNext(testCase, RecordBatchReadFcn)
198+
function HasNext(testCase, RecordBatchStreamReaderConstructorFcn, RecordBatchReadFcn)
176199
% Verify that the hasnext method returns true the correct
177200
% number of times depending on the number of record
178201
% batches in an Arrow IPC Stream format.
179202

180-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.ZeroBatchStreamFile);
203+
reader = RecordBatchStreamReaderConstructorFcn(testCase.ZeroBatchStreamFile);
181204
% hasnext should return true 0 times for a 0 batch file.
182205
iterations = 0;
183206
while reader.hasnext()
@@ -186,7 +209,7 @@ function HasNext(testCase, RecordBatchReadFcn)
186209
end
187210
testCase.verifyEqual(iterations, 0);
188211

189-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.OneBatchStreamFile);
212+
reader = RecordBatchStreamReaderConstructorFcn(testCase.OneBatchStreamFile);
190213
% hasnext should return true 1 time for a 1 batch file.
191214
iterations = 0;
192215
while reader.hasnext()
@@ -195,7 +218,7 @@ function HasNext(testCase, RecordBatchReadFcn)
195218
end
196219
testCase.verifyEqual(iterations, 1);
197220

198-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.MultipleBatchStreamFile);
221+
reader = RecordBatchStreamReaderConstructorFcn(testCase.MultipleBatchStreamFile);
199222
% hasnext should return true 2 times for a 2 batch file.
200223
iterations = 0;
201224
while reader.hasnext()
@@ -205,12 +228,12 @@ function HasNext(testCase, RecordBatchReadFcn)
205228
testCase.verifyEqual(iterations, 2);
206229
end
207230

208-
function Done(testCase, RecordBatchReadFcn)
231+
function Done(testCase, RecordBatchStreamReaderConstructorFcn, RecordBatchReadFcn)
209232
% Verify that the done method returns false the correct
210233
% number of times depending on the number of record
211234
% batches in an Arrow IPC Stream format.
212235

213-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.ZeroBatchStreamFile);
236+
reader = RecordBatchStreamReaderConstructorFcn(testCase.ZeroBatchStreamFile);
214237
% done should return false 0 times for a 0 batch file.
215238
iterations = 0;
216239
while ~reader.done()
@@ -219,7 +242,7 @@ function Done(testCase, RecordBatchReadFcn)
219242
end
220243
testCase.verifyEqual(iterations, 0);
221244

222-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.OneBatchStreamFile);
245+
reader = RecordBatchStreamReaderConstructorFcn(testCase.OneBatchStreamFile);
223246
% done should return false 1 time for a 1 batch file.
224247
iterations = 0;
225248
while ~reader.done()
@@ -228,7 +251,7 @@ function Done(testCase, RecordBatchReadFcn)
228251
end
229252
testCase.verifyEqual(iterations, 1);
230253

231-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.MultipleBatchStreamFile);
254+
reader = RecordBatchStreamReaderConstructorFcn(testCase.MultipleBatchStreamFile);
232255
% done should return false 2 times for a 2 batch file.
233256
iterations = 0;
234257
while ~reader.done()
@@ -238,40 +261,40 @@ function Done(testCase, RecordBatchReadFcn)
238261
testCase.verifyEqual(iterations, 2);
239262
end
240263

241-
function ReadTableZeroBatchStreamFile(testCase)
264+
function ReadTableZeroBatchStreamFile(testCase, RecordBatchStreamReaderConstructorFcn)
242265
% Verify read can successfully read an Arrow IPC Stream file
243266
% containing zero batches as an arrow.tabular.Table.
244-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.ZeroBatchStreamFile);
267+
reader = RecordBatchStreamReaderConstructorFcn(testCase.ZeroBatchStreamFile);
245268
matlabTable = table('Size', [0, 2], 'VariableTypes', ["string", "single"], 'VariableNames', ["A", "B"]);
246269
expected = arrow.table(matlabTable);
247270
actual = reader.readTable();
248271
testCase.verifyEqual(actual, expected);
249272
end
250273

251-
function ReadTableOneBatchStreamFile(testCase)
274+
function ReadTableOneBatchStreamFile(testCase, RecordBatchStreamReaderConstructorFcn)
252275
% Verify read can successfully read an Arrow IPC Stream file
253276
% containing one batch as an arrow.tabular.Table.
254-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.OneBatchStreamFile);
277+
reader = RecordBatchStreamReaderConstructorFcn(testCase.OneBatchStreamFile);
255278
matlabTable = table(["Row1"; "Row2"], single([1; 2]), VariableNames=["A", "B"]);
256279
expected = arrow.table(matlabTable);
257280
actual = reader.readTable();
258281
testCase.verifyEqual(actual, expected);
259282
end
260283

261-
function ReadTableMultipleBatchStreamFile(testCase)
284+
function ReadTableMultipleBatchStreamFile(testCase, RecordBatchStreamReaderConstructorFcn)
262285
% Verify read can successfully read an Arrow IPC Stream file
263286
% containing multiple batches as an arrow.tabular.Table.
264-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.MultipleBatchStreamFile);
287+
reader = RecordBatchStreamReaderConstructorFcn(testCase.MultipleBatchStreamFile);
265288
matlabTable = table(["Row1"; "Row2"; "Row3"; "Row4"], single([1; 2; 3; 4]), VariableNames=["A", "B"]);
266289
expected = arrow.table(matlabTable);
267290
actual = reader.readTable();
268291
testCase.verifyEqual(actual, expected);
269292
end
270293

271-
function ReadTableAfterReadRecordBatch(testCase, RecordBatchReadFcn)
294+
function ReadTableAfterReadRecordBatch(testCase, RecordBatchStreamReaderConstructorFcn, RecordBatchReadFcn)
272295
% Verify readTable returns only the remaining record batches
273296
% in an Arrow IPC Stream file after calling readRecordBatch first.
274-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.MultipleBatchStreamFile);
297+
reader = RecordBatchStreamReaderConstructorFcn(testCase.MultipleBatchStreamFile);
275298

276299
testCase.verifyTrue(reader.hasnext());
277300
testCase.verifyFalse(reader.done());
@@ -292,10 +315,10 @@ function ReadTableAfterReadRecordBatch(testCase, RecordBatchReadFcn)
292315
testCase.verifyTrue(reader.done());
293316
end
294317

295-
function ReadTableMultipleCalls(testCase)
318+
function ReadTableMultipleCalls(testCase, RecordBatchStreamReaderConstructorFcn)
296319
% Verify readTable returns an empty table if it is called
297320
% multiple times in a row.
298-
reader = arrow.io.ipc.RecordBatchStreamReader(testCase.MultipleBatchStreamFile);
321+
reader = RecordBatchStreamReaderConstructorFcn(testCase.MultipleBatchStreamFile);
299322

300323
expected = arrow.table(...
301324
table(["Row1"; "Row2"; "Row3"; "Row4"], single([1; 2; 3; 4]), VariableNames=["A", "B"]) ...
@@ -323,11 +346,11 @@ function ReadTableMultipleCalls(testCase)
323346
testCase.verifyTrue(reader.done());
324347
end
325348

326-
function ErrorIfNotIpcStreamFile(testCase)
349+
function ErrorIfNotIpcStreamFile(testCase, RecordBatchStreamReaderConstructorFcn)
327350
% Verify RecordBatchStreamReader throws an exception with the
328351
% identifier arrow:io:ipc:FailedToOpenRecordBatchReader if
329352
% the provided file is not an Arrow IPC Stream file.
330-
fcn = @() arrow.io.ipc.RecordBatchStreamReader(testCase.RandomAccessFile);
353+
fcn = @() RecordBatchStreamReaderConstructorFcn(testCase.RandomAccessFile);
331354
testCase.verifyError(fcn, "arrow:io:ipc:FailedToOpenRecordBatchReader");
332355
end
333356

0 commit comments

Comments
 (0)