25
25
end
26
26
27
27
properties (TestParameter )
28
+ RecordBatchStreamReaderConstructorFcn = {@tRecordBatchStreamReader.FromBytes, @arrow.io.ipc.RecordBatchStreamReader.fromFile}
28
29
RecordBatchReadFcn = {@read, @readRecordBatch}
29
30
end
30
31
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
+
31
54
methods (TestClassSetup )
32
55
33
56
function setupDataFolder(testCase )
@@ -82,19 +105,19 @@ function setupMultipleBatchStreamFile(testCase)
82
105
83
106
methods (Test )
84
107
85
- function ZeroLengthFilenameError(testCase )
108
+ function ZeroLengthFilenameError(testCase , RecordBatchStreamReaderConstructorFcn )
86
109
% Verify RecordBatchStreamReader throws an exception with the
87
110
% identifier MATLAB:validators:mustBeNonzeroLengthText if the
88
111
% filename input argument given is a zero length string.
89
- fcn = @() arrow . io . ipc .RecordBatchStreamReader (" " );
112
+ fcn = @() RecordBatchStreamReaderConstructorFcn (" " );
90
113
testCase .verifyError(fcn , " MATLAB:validators:mustBeNonzeroLengthText" );
91
114
end
92
115
93
- function MissingStringFilenameError(testCase )
116
+ function MissingStringFilenameError(testCase , RecordBatchStreamReaderConstructorFcn )
94
117
% Verify RecordBatchStreamReader throws an exception with the
95
118
% identifier MATLAB:validators:mustBeNonzeroLengthText if the
96
119
% filename input argument given is a missing string.
97
- fcn = @() arrow . io . ipc .RecordBatchStreamReader (string(missing ));
120
+ fcn = @() RecordBatchStreamReaderConstructorFcn (string(missing ));
98
121
testCase .verifyError(fcn , " MATLAB:validators:mustBeNonzeroLengthText" );
99
122
end
100
123
@@ -106,43 +129,43 @@ function FilenameInvalidTypeError(testCase)
106
129
testCase .verifyError(fcn , " MATLAB:validation:UnableToConvert" );
107
130
end
108
131
109
- function Schema(testCase )
132
+ function Schema(testCase , RecordBatchStreamReaderConstructorFcn )
110
133
% Verify the getter method for Schema returns the
111
134
% expected value.
112
135
fieldA = arrow .field(" A" , arrow .string());
113
136
fieldB = arrow .field(" B" , arrow .float32());
114
137
expectedSchema = arrow .schema([fieldA fieldB ]);
115
138
116
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .ZeroBatchStreamFile );
139
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .ZeroBatchStreamFile );
117
140
testCase .verifyEqual(reader .Schema , expectedSchema );
118
141
119
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .OneBatchStreamFile );
142
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .OneBatchStreamFile );
120
143
testCase .verifyEqual(reader .Schema , expectedSchema );
121
144
122
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .MultipleBatchStreamFile );
145
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .MultipleBatchStreamFile );
123
146
testCase .verifyEqual(reader .Schema , expectedSchema );
124
147
end
125
148
126
- function SchemaNoSetter(testCase )
149
+ function SchemaNoSetter(testCase , RecordBatchStreamReaderConstructorFcn )
127
150
% Verify the Schema property is not settable.
128
151
fieldC = arrow .field(" C" , arrow .date32());
129
152
schema = arrow .schema(fieldC );
130
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .ZeroBatchStreamFile );
153
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .ZeroBatchStreamFile );
131
154
testCase .verifyError(@() setfield(reader , " Schema" , schema ), " MATLAB:class:SetProhibited" );
132
155
end
133
156
134
- function ReadErrorIfEndOfStream(testCase , RecordBatchReadFcn )
157
+ function ReadErrorIfEndOfStream(testCase , RecordBatchStreamReaderConstructorFcn , RecordBatchReadFcn )
135
158
% Verify read throws an execption with the identifier arrow:io:ipc:EndOfStream
136
159
% on an Arrow IPC Stream file containing zero batches.
137
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .ZeroBatchStreamFile );
160
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .ZeroBatchStreamFile );
138
161
fcn = @() RecordBatchReadFcn(reader );
139
162
testCase .verifyError(fcn , " arrow:io:ipc:EndOfStream" );
140
163
end
141
164
142
- function ReadOneBatchStreamFile(testCase , RecordBatchReadFcn )
165
+ function ReadOneBatchStreamFile(testCase , RecordBatchStreamReaderConstructorFcn , RecordBatchReadFcn )
143
166
% Verify read can successfully read an Arrow IPC Stream file
144
167
% containing one batch.
145
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .OneBatchStreamFile );
168
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .OneBatchStreamFile );
146
169
147
170
expectedMatlabTable = table([" Row1" ; " Row2" ], single([1 ; 2 ]), VariableNames= [" A" , " B" ]);
148
171
expected = arrow .recordBatch(expectedMatlabTable );
@@ -153,10 +176,10 @@ function ReadOneBatchStreamFile(testCase, RecordBatchReadFcn)
153
176
testCase .verifyError(fcn , " arrow:io:ipc:EndOfStream" );
154
177
end
155
178
156
- function ReadMultipleBatchStreamFile(testCase , RecordBatchReadFcn )
179
+ function ReadMultipleBatchStreamFile(testCase , RecordBatchStreamReaderConstructorFcn , RecordBatchReadFcn )
157
180
% Verify read can successfully read an Arrow IPC Stream file
158
181
% containing mulitple batches.
159
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .MultipleBatchStreamFile );
182
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .MultipleBatchStreamFile );
160
183
161
184
expectedMatlabTable1 = table([" Row1" ; " Row2" ], single([1 ; 2 ]), VariableNames= [" A" , " B" ]);
162
185
expected1 = arrow .recordBatch(expectedMatlabTable1 );
@@ -172,12 +195,12 @@ function ReadMultipleBatchStreamFile(testCase, RecordBatchReadFcn)
172
195
testCase .verifyError(fcn , " arrow:io:ipc:EndOfStream" );
173
196
end
174
197
175
- function HasNext(testCase , RecordBatchReadFcn )
198
+ function HasNext(testCase , RecordBatchStreamReaderConstructorFcn , RecordBatchReadFcn )
176
199
% Verify that the hasnext method returns true the correct
177
200
% number of times depending on the number of record
178
201
% batches in an Arrow IPC Stream format.
179
202
180
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .ZeroBatchStreamFile );
203
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .ZeroBatchStreamFile );
181
204
% hasnext should return true 0 times for a 0 batch file.
182
205
iterations = 0 ;
183
206
while reader .hasnext()
@@ -186,7 +209,7 @@ function HasNext(testCase, RecordBatchReadFcn)
186
209
end
187
210
testCase .verifyEqual(iterations , 0 );
188
211
189
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .OneBatchStreamFile );
212
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .OneBatchStreamFile );
190
213
% hasnext should return true 1 time for a 1 batch file.
191
214
iterations = 0 ;
192
215
while reader .hasnext()
@@ -195,7 +218,7 @@ function HasNext(testCase, RecordBatchReadFcn)
195
218
end
196
219
testCase .verifyEqual(iterations , 1 );
197
220
198
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .MultipleBatchStreamFile );
221
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .MultipleBatchStreamFile );
199
222
% hasnext should return true 2 times for a 2 batch file.
200
223
iterations = 0 ;
201
224
while reader .hasnext()
@@ -205,12 +228,12 @@ function HasNext(testCase, RecordBatchReadFcn)
205
228
testCase .verifyEqual(iterations , 2 );
206
229
end
207
230
208
- function Done(testCase , RecordBatchReadFcn )
231
+ function Done(testCase , RecordBatchStreamReaderConstructorFcn , RecordBatchReadFcn )
209
232
% Verify that the done method returns false the correct
210
233
% number of times depending on the number of record
211
234
% batches in an Arrow IPC Stream format.
212
235
213
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .ZeroBatchStreamFile );
236
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .ZeroBatchStreamFile );
214
237
% done should return false 0 times for a 0 batch file.
215
238
iterations = 0 ;
216
239
while ~reader .done()
@@ -219,7 +242,7 @@ function Done(testCase, RecordBatchReadFcn)
219
242
end
220
243
testCase .verifyEqual(iterations , 0 );
221
244
222
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .OneBatchStreamFile );
245
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .OneBatchStreamFile );
223
246
% done should return false 1 time for a 1 batch file.
224
247
iterations = 0 ;
225
248
while ~reader .done()
@@ -228,7 +251,7 @@ function Done(testCase, RecordBatchReadFcn)
228
251
end
229
252
testCase .verifyEqual(iterations , 1 );
230
253
231
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .MultipleBatchStreamFile );
254
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .MultipleBatchStreamFile );
232
255
% done should return false 2 times for a 2 batch file.
233
256
iterations = 0 ;
234
257
while ~reader .done()
@@ -238,40 +261,40 @@ function Done(testCase, RecordBatchReadFcn)
238
261
testCase .verifyEqual(iterations , 2 );
239
262
end
240
263
241
- function ReadTableZeroBatchStreamFile(testCase )
264
+ function ReadTableZeroBatchStreamFile(testCase , RecordBatchStreamReaderConstructorFcn )
242
265
% Verify read can successfully read an Arrow IPC Stream file
243
266
% containing zero batches as an arrow.tabular.Table.
244
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .ZeroBatchStreamFile );
267
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .ZeroBatchStreamFile );
245
268
matlabTable = table(' Size' , [0 , 2 ], ' VariableTypes' , [" string" , " single" ], ' VariableNames' , [" A" , " B" ]);
246
269
expected = arrow .table(matlabTable );
247
270
actual = reader .readTable();
248
271
testCase .verifyEqual(actual , expected );
249
272
end
250
273
251
- function ReadTableOneBatchStreamFile(testCase )
274
+ function ReadTableOneBatchStreamFile(testCase , RecordBatchStreamReaderConstructorFcn )
252
275
% Verify read can successfully read an Arrow IPC Stream file
253
276
% containing one batch as an arrow.tabular.Table.
254
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .OneBatchStreamFile );
277
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .OneBatchStreamFile );
255
278
matlabTable = table([" Row1" ; " Row2" ], single([1 ; 2 ]), VariableNames= [" A" , " B" ]);
256
279
expected = arrow .table(matlabTable );
257
280
actual = reader .readTable();
258
281
testCase .verifyEqual(actual , expected );
259
282
end
260
283
261
- function ReadTableMultipleBatchStreamFile(testCase )
284
+ function ReadTableMultipleBatchStreamFile(testCase , RecordBatchStreamReaderConstructorFcn )
262
285
% Verify read can successfully read an Arrow IPC Stream file
263
286
% containing multiple batches as an arrow.tabular.Table.
264
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .MultipleBatchStreamFile );
287
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .MultipleBatchStreamFile );
265
288
matlabTable = table([" Row1" ; " Row2" ; " Row3" ; " Row4" ], single([1 ; 2 ; 3 ; 4 ]), VariableNames= [" A" , " B" ]);
266
289
expected = arrow .table(matlabTable );
267
290
actual = reader .readTable();
268
291
testCase .verifyEqual(actual , expected );
269
292
end
270
293
271
- function ReadTableAfterReadRecordBatch(testCase , RecordBatchReadFcn )
294
+ function ReadTableAfterReadRecordBatch(testCase , RecordBatchStreamReaderConstructorFcn , RecordBatchReadFcn )
272
295
% Verify readTable returns only the remaining record batches
273
296
% in an Arrow IPC Stream file after calling readRecordBatch first.
274
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .MultipleBatchStreamFile );
297
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .MultipleBatchStreamFile );
275
298
276
299
testCase .verifyTrue(reader .hasnext());
277
300
testCase .verifyFalse(reader .done());
@@ -292,10 +315,10 @@ function ReadTableAfterReadRecordBatch(testCase, RecordBatchReadFcn)
292
315
testCase .verifyTrue(reader .done());
293
316
end
294
317
295
- function ReadTableMultipleCalls(testCase )
318
+ function ReadTableMultipleCalls(testCase , RecordBatchStreamReaderConstructorFcn )
296
319
% Verify readTable returns an empty table if it is called
297
320
% multiple times in a row.
298
- reader = arrow . io . ipc .RecordBatchStreamReader (testCase .MultipleBatchStreamFile );
321
+ reader = RecordBatchStreamReaderConstructorFcn (testCase .MultipleBatchStreamFile );
299
322
300
323
expected = arrow .table(...
301
324
table([" Row1" ; " Row2" ; " Row3" ; " Row4" ], single([1 ; 2 ; 3 ; 4 ]), VariableNames= [" A" , " B" ]) ...
@@ -323,11 +346,11 @@ function ReadTableMultipleCalls(testCase)
323
346
testCase .verifyTrue(reader .done());
324
347
end
325
348
326
- function ErrorIfNotIpcStreamFile(testCase )
349
+ function ErrorIfNotIpcStreamFile(testCase , RecordBatchStreamReaderConstructorFcn )
327
350
% Verify RecordBatchStreamReader throws an exception with the
328
351
% identifier arrow:io:ipc:FailedToOpenRecordBatchReader if
329
352
% the provided file is not an Arrow IPC Stream file.
330
- fcn = @() arrow . io . ipc .RecordBatchStreamReader (testCase .RandomAccessFile );
353
+ fcn = @() RecordBatchStreamReaderConstructorFcn (testCase .RandomAccessFile );
331
354
testCase .verifyError(fcn , " arrow:io:ipc:FailedToOpenRecordBatchReader" );
332
355
end
333
356
0 commit comments