v

Зеркало из https://github.com/vlang/v
Форк
0
/
reader_test.v 
307 строк · 7.2 Кб
1
import encoding.csv
2

3
fn test_encoding_csv_reader() {
4
	data := 'name,email,phone,other\njoe,joe@blow.com,0400000000,test\nsam,sam@likesham.com,0433000000,"test quoted field"\n#chris,chris@nomail.com,94444444,"commented row"\n'
5
	mut csv_reader := csv.new_reader(data)
6
	mut row_count := 0
7
	for {
8
		row := csv_reader.read() or { break }
9
		row_count++
10
		if row_count == 1 {
11
			assert row[0] == 'name'
12
			assert row[1] == 'email'
13
			assert row[2] == 'phone'
14
			assert row[3] == 'other'
15
		} else if row_count == 2 {
16
			assert row[0] == 'joe'
17
			assert row[1] == 'joe@blow.com'
18
			assert row[2] == '0400000000'
19
			assert row[3] == 'test'
20
		} else if row_count == 3 {
21
			assert row[0] == 'sam'
22
			assert row[1] == 'sam@likesham.com'
23
			assert row[2] == '0433000000'
24
			// quoted field
25
			assert row[3] == 'test quoted field'
26
		}
27
	}
28
	assert row_count == 3
29
}
30

31
fn test_encoding_csv_reader_with_custom_delimiter() {
32
	data := 'name|email|phone|other\njoe|joe@blow.com|0400000000|test\nsam|sam@likesham.com|0433000000|"test quoted field"\n#chris|chris@nomail.com|94444444|"commented row"\n'
33
	mut csv_reader := csv.new_reader(data, delimiter: `|`)
34
	mut row_count := 0
35
	for {
36
		row := csv_reader.read() or { break }
37
		row_count++
38
		if row_count == 1 {
39
			assert row[0] == 'name'
40
			assert row[1] == 'email'
41
			assert row[2] == 'phone'
42
			assert row[3] == 'other'
43
		} else if row_count == 2 {
44
			assert row[0] == 'joe'
45
			assert row[1] == 'joe@blow.com'
46
			assert row[2] == '0400000000'
47
			assert row[3] == 'test'
48
		} else if row_count == 3 {
49
			assert row[0] == 'sam'
50
			assert row[1] == 'sam@likesham.com'
51
			assert row[2] == '0433000000'
52
			// quoted field
53
			assert row[3] == 'test quoted field'
54
		}
55
	}
56
	assert row_count == 3
57
}
58

59
fn test_line_break_lf() {
60
	lf_data := 'name,email\njoe,joe@blow.com\n'
61
	mut csv_reader := csv.new_reader(lf_data)
62
	mut row_count := 0
63
	for {
64
		row := csv_reader.read() or { break }
65
		row_count++
66
		if row_count == 1 {
67
			assert row[0] == 'name'
68
			assert row[1] == 'email'
69
		} else if row_count == 2 {
70
			assert row[0] == 'joe'
71
			assert row[1] == 'joe@blow.com'
72
		}
73
	}
74
	assert row_count == 2
75
}
76

77
fn test_line_break_cr() {
78
	cr_data := 'name,email\rjoe,joe@blow.com\r'
79
	mut csv_reader := csv.new_reader(cr_data)
80
	mut row_count := 0
81
	for {
82
		row := csv_reader.read() or { break }
83
		row_count++
84
		if row_count == 1 {
85
			assert row[0] == 'name'
86
			assert row[1] == 'email'
87
		} else if row_count == 2 {
88
			assert row[0] == 'joe'
89
			assert row[1] == 'joe@blow.com'
90
		}
91
	}
92
	assert row_count == 2
93
}
94

95
fn test_line_break_crlf() {
96
	crlf_data := 'name,email\r\njoe,joe@blow.com\r\n'
97
	mut csv_reader := csv.new_reader(crlf_data)
98
	mut row_count := 0
99
	for {
100
		row := csv_reader.read() or { break }
101
		row_count++
102
		if row_count == 1 {
103
			assert row[0] == 'name'
104
			assert row[1] == 'email'
105
		} else if row_count == 2 {
106
			assert row[0] == 'joe'
107
			assert row[1] == 'joe@blow.com'
108
		}
109
	}
110
	assert row_count == 2
111
}
112

113
fn test_no_line_ending() {
114
	data := 'name,email,phone,other\njoe,joe@blow.com,0400000000,test'
115
	mut csv_reader := csv.new_reader(data)
116
	mut row_count := 0
117
	for {
118
		csv_reader.read() or { break }
119
		row_count++
120
	}
121
	assert row_count == 2
122
}
123

124
fn test_last_field_empty() {
125
	data := '"name","description","value"\n"one","first","1"\n"two","second",\n'
126
	mut csv_reader := csv.new_reader(data)
127
	mut row_count := 0
128
	for {
129
		row := csv_reader.read() or { break }
130
		row_count++
131
		if row_count == 1 {
132
			assert row[0] == 'name'
133
			assert row[1] == 'description'
134
			assert row[2] == 'value'
135
		} else if row_count == 2 {
136
			assert row[0] == 'one'
137
			assert row[1] == 'first'
138
			assert row[2] == '1'
139
		} else if row_count == 3 {
140
			assert row[0] == 'two'
141
			assert row[1] == 'second'
142
			assert row[2] == ''
143
		}
144
	}
145
	assert row_count == 3
146
}
147

148
fn test_empty_fields_no_quotes() {
149
	data := '1,2,3,4\n,6,7,8\n9,,11,12\n13,14,,16\n17,18,19,\n'
150

151
	mut csv_reader := csv.new_reader(data)
152
	mut row_count := 0
153
	for {
154
		row := csv_reader.read() or { break }
155
		row_count++
156
		if row_count == 1 {
157
			assert row[0] == '1'
158
			assert row[1] == '2'
159
			assert row[2] == '3'
160
			assert row[3] == '4'
161
		} else if row_count == 2 {
162
			assert row[0] == ''
163
			assert row[1] == '6'
164
			assert row[2] == '7'
165
			assert row[3] == '8'
166
		} else if row_count == 3 {
167
			assert row[0] == '9'
168
			assert row[1] == ''
169
			assert row[2] == '11'
170
			assert row[3] == '12'
171
		} else if row_count == 4 {
172
			assert row[0] == '13'
173
			assert row[1] == '14'
174
			assert row[2] == ''
175
			assert row[3] == '16'
176
		} else if row_count == 5 {
177
			assert row[0] == '17'
178
			assert row[1] == '18'
179
			assert row[2] == '19'
180
			assert row[3] == ''
181
		}
182
	}
183
	assert row_count == 5
184
}
185

186
fn test_empty_line() {
187
	data := '"name","description","value"\n\n\n"one","first","1"\n\n"two","second",\n'
188
	mut csv_reader := csv.new_reader(data)
189
	mut row_count := 0
190
	for {
191
		row := csv_reader.read() or { break }
192
		row_count++
193
		if row_count == 1 {
194
			assert row[0] == 'name'
195
			assert row[1] == 'description'
196
			assert row[2] == 'value'
197
		} else if row_count == 2 {
198
			assert row[0] == 'one'
199
			assert row[1] == 'first'
200
			assert row[2] == '1'
201
		} else if row_count == 3 {
202
			assert row[0] == 'two'
203
			assert row[1] == 'second'
204
		}
205
	}
206
	assert row_count == 3
207
}
208

209
fn test_field_multiple_line() {
210
	data := '"name","multiple
211

212
 line","value"\n"one","first","1"\n'
213
	mut csv_reader := csv.new_reader(data)
214
	mut row_count := 0
215
	for {
216
		row := csv_reader.read() or { break }
217
		row_count++
218
		if row_count == 1 {
219
			assert row[0] == 'name'
220
			assert row[1] == 'multiple\n\n line'
221
			assert row[2] == 'value'
222
		} else if row_count == 2 {
223
			assert row[0] == 'one'
224
			assert row[1] == 'first'
225
			assert row[2] == '1'
226
		}
227
	}
228
	assert row_count == 2
229
}
230

231
fn test_field_quotes_for_parts() {
232
	data := 'a1,"b1",c1\n"a2",b2,c2\na3,b3,"c3"\na4,b4,c4\n'
233
	mut csv_reader := csv.new_reader(data)
234
	mut row_count := 0
235
	for {
236
		row := csv_reader.read() or { break }
237
		row_count++
238
		if row_count == 1 {
239
			assert row[0] == 'a1'
240
			assert row[1] == 'b1'
241
			assert row[2] == 'c1'
242
		} else if row_count == 2 {
243
			assert row[0] == 'a2'
244
			assert row[1] == 'b2'
245
			assert row[2] == 'c2'
246
		} else if row_count == 3 {
247
			assert row[0] == 'a3'
248
			assert row[1] == 'b3'
249
			assert row[2] == 'c3'
250
		} else if row_count == 4 {
251
			assert row[0] == 'a4'
252
			assert row[1] == 'b4'
253
			assert row[2] == 'c4'
254
		}
255
	}
256
	assert row_count == 4
257
}
258

259
fn test_field_double_quotes() {
260
	row1 := '11,"12\n13"\n'
261
	row2 := '21,"2""2""\n23"\n'
262
	row3 := '"3""1""",32\n'
263
	data := row1 + row2 + row3
264
	mut csv_reader := csv.new_reader(data)
265
	mut row_count := 0
266
	for {
267
		row := csv_reader.read() or { break }
268
		row_count++
269
		if row_count == 1 {
270
			assert row[0] == '11'
271
			assert row[1] == '12\n13'
272
		} else if row_count == 2 {
273
			assert row[0] == '21'
274
			assert row[1] == '2"2"\n23'
275
		} else if row_count == 3 {
276
			assert row[0] == '3"1"'
277
			assert row[1] == '32'
278
		}
279
	}
280
	assert row_count == 3
281
}
282

283
struct Test {
284
mut:
285
	id     int
286
	bonus  string
287
	amount int
288
	yes    bool
289
}
290

291
fn test_decode_to_struct() {
292
	text := 'id,bonus,amount,yes\r\n1,bomb,1,true\r\n2,rocket,1,false,\r\n3,lightning,2,2\r\n'
293
	arr := csv.decode[Test](text)
294
	assert arr[0].id == 1
295
	assert arr[0].bonus == 'bomb'
296
	assert arr[0].amount == 1
297
	assert arr[0].yes == true
298
	assert arr[1].id == 2
299
	assert arr[1].bonus == 'rocket'
300
	assert arr[1].amount == 1
301
	assert arr[1].yes == false
302
	assert arr[2].id == 3
303
	assert arr[2].bonus == 'lightning'
304
	assert arr[2].amount == 2
305
	assert arr[2].yes == true
306
	assert arr.len == 3
307
}
308

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.