parseexcel_mod 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,745 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # TestParser -- Spreadsheet -- 02.06.2003 -- hwyss@ywesee.com
4
+
5
+ $: << File.expand_path("../lib", File.dirname(__FILE__))
6
+
7
+ require 'test/unit'
8
+ require 'parseexcel/parser'
9
+
10
+ module Spreadsheet
11
+ module ParseExcel
12
+ class Parser
13
+ attr_reader :proc_table
14
+ attr_accessor :workbook, :current_sheet, :buff
15
+ attr_writer :bigendian, :prev_pos, :prev_info, :prev_cond
16
+ end
17
+ class Workbook
18
+ attr_reader :pkg_strs
19
+ end
20
+ end
21
+ end
22
+ class StubParserWorksheet
23
+ attr_accessor :header, :footer, :row_height, :dimensions, :default_row_height
24
+ attr_accessor :paper, :scale, :page_start, :fit_width, :fit_height
25
+ attr_accessor :resolution, :v_resolution
26
+ attr_accessor :header_margin, :footer_margin, :copies, :left_to_right
27
+ attr_accessor :no_pls, :no_color, :draft, :notes, :no_orient, :use_page
28
+ attr_accessor :landscape, :name
29
+ def initialize
30
+ @cells = []
31
+ end
32
+ def add_cell(x, y, cell)
33
+ (@cells[x] ||= [])[y] = cell
34
+ end
35
+ def cell(x, y)
36
+ (@cells[x] ||= [])[y]
37
+ end
38
+ def set_row_height(row, hght)
39
+ @row_height = hght
40
+ end
41
+ def set_dimensions(row, scol, ecol)
42
+ @dimensions = [row, scol, ecol]
43
+ end
44
+ end
45
+ class StubParserWorkbook
46
+ attr_accessor :header, :footer, :worksheets, :text_format
47
+ attr_accessor :biffversion, :version, :flg_1904
48
+ attr_writer :format, :pkg_strs
49
+ def add_cell_format(format)
50
+ @format = format
51
+ end
52
+ def add_text_format(idx, fmt)
53
+ @text_format = fmt
54
+ end
55
+ def worksheet(index)
56
+ @worksheets[index] ||= StubParserWorksheet.new
57
+ end
58
+ def format(index=nil)
59
+ @format
60
+ end
61
+ def sheet_count
62
+ (@worksheets.respond_to? :size) ? @worksheets.size : 0
63
+ end
64
+ def pkg_str(idx)
65
+ @pkg_strs[idx]
66
+ end
67
+ end
68
+ class StubParserFormat
69
+ attr_writer :cell_type
70
+ def text_format(txt, code=nil)
71
+ txt
72
+ end
73
+ def cell_type(foo)
74
+ @cell_type
75
+ end
76
+ end
77
+
78
+ class TestParser < Test::Unit::TestCase
79
+ def setup
80
+ @source = File.expand_path('data/foo.xls', File.dirname(__FILE__))
81
+ @book = StubParserWorkbook.new
82
+ @sheet = StubParserWorksheet.new
83
+ @format = StubParserFormat.new
84
+ @book.worksheets = [@sheet]
85
+ @book.format = @format
86
+ @parser = Spreadsheet::ParseExcel::Parser.new
87
+ @parser.workbook = @book
88
+ @parser.current_sheet = @sheet
89
+ @parser.private_methods.each { |m|
90
+ @parser.class.instance_eval("public :#{m}")
91
+ }
92
+ @bin_header = "\x03\x00\x02\x00\x01\x00"
93
+ end
94
+ def test_initialize
95
+ @parser.proc_table.each { |key, val|
96
+ assert_instance_of(Method, val)
97
+ assert_equal(3, val.arity)
98
+ }
99
+ bigendian = ([2].pack('L').unpack('H8').first != '02000000')
100
+ assert_equal(bigendian, @parser.bigendian)
101
+ parser = Spreadsheet::ParseExcel::Parser.new(:bigendian => false)
102
+ assert_equal(false, parser.bigendian)
103
+ parser = Spreadsheet::ParseExcel::Parser.new(:bigendian => true)
104
+ assert_equal(true, parser.bigendian)
105
+ end
106
+ def test_blank
107
+ @parser.blank(nil, nil, @bin_header)
108
+ cell = @sheet.cell(3,2)
109
+ assert_instance_of(Spreadsheet::ParseExcel::Worksheet::Cell, cell)
110
+ assert_equal(:blank, cell.kind)
111
+ end
112
+ def test_bof
113
+ bof = [0x500, 0x5].pack("v2")
114
+ @parser.bof(nil, nil, bof)
115
+ assert_nil(@parser.current_sheet)
116
+ assert_equal(0x08, @book.biffversion)
117
+ bof = [0x000, 0x3].pack("v2")
118
+ @parser.bof(0x02*0x100, nil, bof)
119
+ assert_instance_of(StubParserWorksheet, @parser.current_sheet)
120
+ end
121
+ def test_bool_err1
122
+ @parser.bool_err(nil, nil, @bin_header + "\x01\x00")
123
+ cell = @sheet.cell(3,2)
124
+ assert_equal(:bool_error, cell.kind)
125
+ assert_equal("TRUE", cell.value)
126
+ end
127
+ def test_bool_err2
128
+ @parser.bool_err(nil, nil, @bin_header + "\x00\x00")
129
+ cell = @sheet.cell(3,2)
130
+ assert_equal("FALSE", cell.value)
131
+ assert_equal(:bool_error, cell.kind)
132
+ end
133
+ def test_bool_err3
134
+ @parser.bool_err(nil, nil, @bin_header + "\x01\x01")
135
+ cell = @sheet.cell(3,2)
136
+ assert_equal(:bool_error, cell.kind)
137
+ assert_equal("#ERR", cell.value)
138
+ end
139
+ def test_bool_err4
140
+ @parser.bool_err(nil, nil, @bin_header + "\x00\x01")
141
+ cell = @sheet.cell(3,2)
142
+ assert_equal(:bool_error, cell.kind)
143
+ assert_equal("#NULL!", cell.value)
144
+ end
145
+ def test_cell_factory
146
+ @format.cell_type = :text
147
+ params = {
148
+ :kind => :blank,
149
+ :value => '',
150
+ :format_no => 1,
151
+ :numeric => false,
152
+ }
153
+ cell = @parser.cell_factory(1,1,params)
154
+ assert_equal('', cell.value)
155
+ assert_equal(false, cell.numeric)
156
+ assert_nil(cell.code)
157
+ assert_equal(@book, cell.book)
158
+ assert_equal(@format, cell.format)
159
+ assert_equal(1, cell.format_no)
160
+ assert_equal(:text, cell.type)
161
+ end
162
+ def test_conv_biff8_data1 # compressed
163
+ biff8_data = [
164
+ "\3\0\0foo"
165
+ ].join
166
+ expected = [
167
+ [ "f\0o\0o\0", false, "", "" ],
168
+ 6, 3, 3,
169
+ ]
170
+ assert_equal(expected, @parser.conv_biff8_data(biff8_data))
171
+ end
172
+ def test_conv_biff8_data2 # short string
173
+ biff8_data = [
174
+ "\x04\x00\x00foo"
175
+ ].join
176
+ expected = [
177
+ [ nil, false, nil, nil ],
178
+ 7, 3, 4,
179
+ ]
180
+ assert_equal(expected, @parser.conv_biff8_data(biff8_data))
181
+ end
182
+ def test_conv_biff8_data3 # uncompressed
183
+ biff8_data = [
184
+ "\3\0\1\0f\0o\0o"
185
+ ].join
186
+ expected = [
187
+ [ "\0f\0o\0o" , true, "", "" ],
188
+ 9, 3, 6,
189
+ ]
190
+ assert_equal(expected, @parser.conv_biff8_data(biff8_data))
191
+ end
192
+ def test_conv_biff8_data4 # ext
193
+ biff8_data = [
194
+ "\x03\x00\x04\x01\x00\x00\x00foobar"
195
+ ].join
196
+ expected = [
197
+ [ "f\0o\0o\0" , false, "bar", "b" ],
198
+ 11, 7, 3,
199
+ ]
200
+ assert_equal(expected, @parser.conv_biff8_data(biff8_data))
201
+ end
202
+ def test_conv_biff8_data5 # rich
203
+ biff8_data = [
204
+ "\x03\x00\x08\x01\x00foobaar"
205
+ ].join
206
+ expected = [
207
+ [ "f\0o\0o\0" , false, "", "" ],
208
+ 12, 5, 3,
209
+ ]
210
+ assert_equal(expected, @parser.conv_biff8_data(biff8_data))
211
+ end
212
+ def test_conv_biff8_data6 # ext && rich
213
+ biff8_data = [
214
+ "\x03\x00\x0C\x01\x00\x01\x00\x00\x00foobaarbaz"
215
+ ].join
216
+ expected = [
217
+ [ "f\0o\0o\0" , false, "baz", "b" ],
218
+ 17, 9, 3,
219
+ ]
220
+ assert_equal(expected, @parser.conv_biff8_data(biff8_data))
221
+ end
222
+ def test_conv_biff8_string1
223
+ str = "\010\000\000DD/MM/YY"
224
+ assert_equal("D\0D\0/\0M\0M\0/\0Y\0Y\0", @parser.conv_biff8_string(str))
225
+ end
226
+ def test_conv_dval
227
+ @parser.bigendian = true
228
+ assert_equal(0.0, @parser.conv_dval("\x00"))
229
+ last_bit = "\x00\x00\x00\x00\x00\x00\x00\x01"
230
+ frst_bit = "\x01\x00\x00\x00\x00\x00\x00\x00"
231
+ assert_in_delta(4.940656458412465e-324, @parser.conv_dval(last_bit), 1e-300)
232
+ assert_in_delta(7.291122019556397e-304, @parser.conv_dval(frst_bit), 1e-300)
233
+ @parser.bigendian = false
234
+ assert_in_delta(7.291122019556397e-304, @parser.conv_dval(last_bit), 1e-300)
235
+ assert_in_delta(4.940656458412465e-324, @parser.conv_dval(frst_bit), 1e-300)
236
+ end
237
+ def test_decode_bool_err
238
+ assert_equal("FALSE", @parser.decode_bool_err(0x00))
239
+ assert_equal("TRUE", @parser.decode_bool_err(0x01))
240
+ assert_equal("#NULL!", @parser.decode_bool_err(0x00, true))
241
+ assert_equal("#DIV/0!", @parser.decode_bool_err(0x07, true))
242
+ assert_equal("#VALUE!", @parser.decode_bool_err(0x0F, true))
243
+ assert_equal("#REF!", @parser.decode_bool_err(0x17, true))
244
+ assert_equal("#NAME?", @parser.decode_bool_err(0x1D, true))
245
+ assert_equal("#NUM!", @parser.decode_bool_err(0x24, true))
246
+ assert_equal("#N/A!", @parser.decode_bool_err(0x2A, true))
247
+ assert_equal("#ERR", @parser.decode_bool_err(0x02, true))
248
+ end
249
+ def test_default_row_height
250
+ @parser.default_row_height(nil,nil,"\x00\x00\x28\x00")
251
+ assert_equal(2.0, @sheet.default_row_height)
252
+ end
253
+ def test_flg_1904
254
+ @parser.flg_1904(nil, nil, "\x00\x00")
255
+ assert_nil(@book.flg_1904)
256
+ @parser.flg_1904(nil, nil, "\x01\x00")
257
+ assert(@book.flg_1904)
258
+ end
259
+ def test_footer1
260
+ @book.biffversion = 0x08
261
+ @parser.footer(nil, nil, "\x03\x00\x00\x00")
262
+ assert_equal(nil, @sheet.footer)
263
+ @parser.footer(nil, nil, "\x03foo")
264
+ assert_equal('foo', @sheet.footer)
265
+ @parser.footer(nil, nil, "\x03foobarbaz")
266
+ assert_equal('foo', @sheet.footer)
267
+ end
268
+ def test_footer2
269
+ @book.biffversion = 0x18
270
+ @parser.footer(nil, nil, "\x01\x00\x00\x00")
271
+ assert_equal(nil, @sheet.footer)
272
+ @parser.footer(nil, nil, "\x03\x00\x00foo")
273
+ assert_equal("f\0o\0o\0", @sheet.footer)
274
+ @parser.footer(nil, nil, "\x03\x00\x00foobarbaz")
275
+ assert_equal("f\0o\0o\0", @sheet.footer)
276
+ end
277
+ def test_format
278
+ @book.biffversion = 0x02
279
+ fmt = "\x00\x00\x03foo"
280
+ @parser.format(nil, nil, fmt)
281
+ assert_equal("foo", @book.text_format)
282
+ @book.biffversion = 0x18
283
+ fmt = "\x00\x00\x03\000\000foo"
284
+ @parser.format(nil, nil, fmt)
285
+ assert_equal("f\0o\0o\0", @book.text_format)
286
+ fmt = "\0\0\6\0\1f\0o\0o\0"
287
+ @parser.format(nil, nil, fmt)
288
+ assert_equal("f\0o\0o\0", @book.text_format)
289
+ end
290
+ def test_header1
291
+ @book.biffversion = 0x08
292
+ @parser.header(nil, nil, "\x03\x00\x00\x00")
293
+ assert_equal(nil, @sheet.header)
294
+ @parser.header(nil, nil, "\x03foo")
295
+ assert_equal('foo', @sheet.header)
296
+ @parser.header(nil, nil, "\x03foobarbaz")
297
+ assert_equal('foo', @sheet.header)
298
+ end
299
+ def test_header2
300
+ @book.biffversion = 0x18
301
+ @parser.header(nil, nil, "\x01\x00\x00\x00")
302
+ assert_equal(nil, @sheet.header)
303
+ @parser.header(nil, nil, "\x03\x00\x00foo")
304
+ assert_equal("f\0o\0o\0", @sheet.header)
305
+ @parser.header(nil, nil, "\x03\x00\x00foobarbaz")
306
+ assert_equal("f\0o\0o\0", @sheet.header)
307
+ end
308
+ def test_integer
309
+ @parser.integer(nil, nil, @bin_header + "x\x1A\x00")
310
+ cell = @sheet.cell(3,2)
311
+ assert_equal(:integer, cell.kind)
312
+ assert_equal(26, cell.value)
313
+ end
314
+ def test_label1
315
+ @parser.label(nil, nil, @bin_header+'abfoo')
316
+ cell = @sheet.cell(3,2)
317
+ assert_equal(:label, cell.kind)
318
+ assert_equal('foo', cell.value)
319
+ assert_equal(:_native_, cell.code)
320
+ end
321
+ def test_label2
322
+ @book.biffversion = 0x18
323
+ @parser.label(nil, nil, @bin_header+"\x03\x003\x00f\x00o\x00o")
324
+ cell = @sheet.cell(3,2)
325
+ assert_equal(:label, cell.kind)
326
+ assert_equal("\0f\0o\0o", cell.value)
327
+ assert_equal(:ucs2, cell.code)
328
+ end
329
+ def test_label_sst
330
+ foo = Spreadsheet::ParseExcel::Worksheet::PkgString.new("foo", nil, 0, 0)
331
+ @book.pkg_strs = [nil, nil, nil, nil, foo]
332
+ label = [
333
+ "\x01\x00",
334
+ "\x02\x00",
335
+ "\x03\x00",
336
+ "\x04\x00\x00\x00",
337
+ ].join
338
+ @parser.label_sst(nil, nil, label)
339
+ cell = @sheet.cell(1,2)
340
+ assert_equal("foo", cell.value)
341
+ end
342
+ def test_mul_rk
343
+ mul_rk = [
344
+ "\x01\x00",
345
+ "\x02\x00",
346
+ "\x01\x00\x00\x00\xF0\x3F",
347
+ "\x01\x00\x01\x00\xF0\x3F",
348
+ "\x01\x00\x46\x56\x4B\x00",
349
+ "\x04\x00",
350
+ ].join
351
+ @parser.mul_rk(nil, nil, mul_rk)
352
+ cell1 = @sheet.cell(1,2)
353
+ assert_equal(:mul_rk, cell1.kind)
354
+ assert_equal(1.0, cell1.value)
355
+ cell2 = @sheet.cell(1,3)
356
+ assert_equal(:mul_rk, cell2.kind)
357
+ assert_equal(0.01, cell2.value)
358
+ cell3 = @sheet.cell(1,4)
359
+ assert_equal(:mul_rk, cell3.kind)
360
+ assert_equal(1234321, cell3.value)
361
+ end
362
+ def test_mul_blank
363
+ blanks = [
364
+ "\x02\x00",
365
+ "\x01\x00",
366
+ "\x01\x00",
367
+ "\x02\x00",
368
+ "\x03\x00",
369
+ "\x04\x00",
370
+ "\x04\x00",
371
+ ].join
372
+ @parser.mul_blank(nil, nil, blanks)
373
+ cell1 = @sheet.cell(2,1)
374
+ assert_equal(:mul_blank, cell1.kind)
375
+ cell2 = @sheet.cell(2,2)
376
+ assert_equal(:mul_blank, cell2.kind)
377
+ cell3 = @sheet.cell(2,3)
378
+ assert_equal(:mul_blank, cell3.kind)
379
+ cell4 = @sheet.cell(2,4)
380
+ assert_equal(:mul_blank, cell4.kind)
381
+ end
382
+ def test_number
383
+ @parser.number(nil, nil, @bin_header + "\x00\x00\x00\x00\x00\x00\x00\x00")
384
+ cell = @sheet.cell(3,2)
385
+ assert_equal(:number, cell.kind)
386
+ assert_equal(0.0, cell.value)
387
+ end
388
+ def test_rk
389
+ rk = "\x01\x00\x02\x00\x04\x00\x46\x56\x4B\x00"
390
+ @parser.rk(nil, nil, rk)
391
+ cell = @sheet.cell(1,2)
392
+ assert_equal(:rk, cell.kind)
393
+ assert_equal(1234321, cell.value)
394
+ end
395
+ def test_row
396
+ row = [
397
+ "\x01\x00", #row
398
+ "\x01\x00", #scol
399
+ "\x04\x00", #ecol
400
+ "\x14\x00", #hght
401
+ "\x00\x00", #nil
402
+ "\x00\x00", #nil
403
+ "\x00\x20", #gr
404
+ "\x00\x00", #xf
405
+ ]
406
+ @parser.row(nil, nil, row.join)
407
+ assert_equal([1,1,3], @sheet.dimensions)
408
+ assert_equal(1.0, @sheet.row_height)
409
+ end
410
+ def test_rstring
411
+ rstr = "\x01\x00\x01\x00\x04\x00\x03\x00foo"
412
+ @parser.rstring(nil, nil, rstr)
413
+ cell = @sheet.cell(1,1)
414
+ assert_equal("foo", cell.value)
415
+ assert_nil(cell.rich)
416
+ rstr = "\x01\x00\x02\x00\x04\x00\x03\x00foorich"
417
+ @parser.rstring(nil, nil, rstr)
418
+ cell = @sheet.cell(1,2)
419
+ assert_equal("foo", cell.value)
420
+ assert_equal("rich", cell.rich)
421
+ end
422
+ def test_setup
423
+ setup = [
424
+ "\x01\x00",
425
+ "\x02\x00",
426
+ "\x03\x00",
427
+ "\x04\x00",
428
+ "\x05\x00",
429
+ "\x06\x00",
430
+ "\x07\x00",
431
+ "\x08\x00",
432
+ "\x00\x00\x00\x00\x00\x00\xF0\x3F",
433
+ "\x00\x00\x00\x00\x00\x00\xF1\x3F",
434
+ "\x0B\x00",
435
+ ].join
436
+ @parser.setup(nil, nil, setup)
437
+ assert_equal(1, @sheet.paper)
438
+ assert_equal(2, @sheet.scale)
439
+ assert_equal(3, @sheet.page_start)
440
+ assert_equal(4, @sheet.fit_width)
441
+ assert_equal(5, @sheet.fit_height)
442
+ assert_equal(7, @sheet.resolution)
443
+ assert_equal(8, @sheet.v_resolution)
444
+ assert_equal(2.54, @sheet.header_margin)
445
+ assert_equal(2.69875, @sheet.footer_margin)
446
+ assert(!@sheet.left_to_right, "left_to_right")
447
+ assert(@sheet.landscape, "landscape")
448
+ assert(@sheet.no_pls, "no_pls")
449
+ assert(!@sheet.no_color, "no_color")
450
+ assert(!@sheet.draft, "draft")
451
+ assert(!@sheet.notes, "notes")
452
+ assert(!@sheet.no_orient, "no_orient")
453
+ assert(!@sheet.use_page, "use_page")
454
+ end
455
+ def test_sst
456
+ @parser.sst(nil, nil, '12345678foo')
457
+ assert_equal('foo', @parser.buff)
458
+ end
459
+ def test_string1
460
+ @parser.prev_pos = [1,2,3]
461
+ @parser.string(nil, nil, "\x06foobar")
462
+ cell = @sheet.cell(1,2)
463
+ assert_equal(:string, cell.kind)
464
+ assert_equal("foobar", cell.value)
465
+ end
466
+ def test_string2 # BIFF5
467
+ @parser.prev_pos = [1,2,3]
468
+ @book.biffversion = 0x08
469
+ @parser.string(nil, nil, "\x00\x06foobar")
470
+ cell = @sheet.cell(1,2)
471
+ assert_equal(:string, cell.kind)
472
+ assert_equal("foobar", cell.value)
473
+ end
474
+ def test_string3 # BIFF5
475
+ @parser.prev_pos = [1,2,3]
476
+ @book.biffversion = 0x18
477
+ @parser.string(nil, nil, "\x06\x00\x00foobar")
478
+ cell = @sheet.cell(1,2)
479
+ assert_equal(:string, cell.kind)
480
+ assert_equal("f\0o\0o\0b\0a\0r\0", cell.value)
481
+ assert_equal("foobar", cell.to_s('latin1'))
482
+ end
483
+ def test_str_wk1
484
+ @parser.str_wk('foo')
485
+ assert_equal('foo', @parser.buff)
486
+ end
487
+ def test_str_wk2
488
+ @parser.str_wk('foo', true)
489
+ assert_equal('foo', @parser.buff)
490
+ end
491
+ def test_str_wk3
492
+ @parser.buff = 'f'
493
+ @parser.str_wk('foo', true)
494
+ assert_equal('foo', @parser.buff)
495
+ end
496
+ def test_str_wk4
497
+ @parser.buff = 'f'
498
+ @parser.prev_cond = true
499
+ @parser.prev_info = [0,1]
500
+ @parser.str_wk("oo", true)
501
+ assert_equal('foo', @parser.buff)
502
+ end
503
+ def test_str_wk5
504
+ @parser.buff = 'f'
505
+ @parser.prev_cond = true
506
+ @parser.prev_info = [1,2]
507
+ @parser.str_wk("\x01oo", true)
508
+ assert_equal('foo', @parser.buff)
509
+ end
510
+ def test_str_wk6
511
+ @parser.buff = 'f'
512
+ @parser.prev_cond = true
513
+ @parser.prev_info = [1,2]
514
+ @parser.str_wk("\x01oo", true)
515
+ assert_equal('foo', @parser.buff)
516
+ end
517
+ def test_str_wk7
518
+ @parser.buff = "fo"
519
+ @parser.prev_cond = 1
520
+ @parser.prev_info = [1,2]
521
+ @parser.str_wk("\x01o", true)
522
+ assert_equal("foo", @parser.buff)
523
+ end
524
+ def test_str_wk8
525
+ @parser.buff = "\x00fo"
526
+ @parser.prev_cond = false
527
+ @parser.prev_info = [1,3]
528
+ @parser.str_wk("\x01o\x00", true)
529
+ assert_equal("\x00f\x00o\x00o\x00", @parser.buff)
530
+ end
531
+ def test_unpack_rk_rec
532
+ rk_rec = "\030\000\001\330\200@"
533
+ result = @parser.unpack_rk_rec(rk_rec)
534
+ expected = [25, 5.39]
535
+ rk_rec = "\017\000o\010\000\000"
536
+ rk_rec = "\031\000o\010\000\000"
537
+ result = @parser.unpack_rk_rec(rk_rec)
538
+ expected = [25, 5.39]
539
+ #assert_equal(expected, result)
540
+ rk_rec = "\x01\x00\x00\x00\xF0\x3F"
541
+ result = @parser.unpack_rk_rec(rk_rec)
542
+ expected = [1, 1.0]
543
+ assert_equal(expected, result)
544
+ rk_rec = "\x01\x00\x01\x00\xF0\x3F"
545
+ result = @parser.unpack_rk_rec(rk_rec)
546
+ expected = [1, 0.01]
547
+ assert_equal(expected, result)
548
+ rk_rec = "\x01\x00\x46\x56\x4B\x00"
549
+ result = @parser.unpack_rk_rec(rk_rec)
550
+ expected = [1, 1234321]
551
+ assert_equal(expected, result)
552
+ rk_rec = "\x01\x00\x47\x56\x4B\x00"
553
+ result = @parser.unpack_rk_rec(rk_rec)
554
+ expected = [1, 12343.21]
555
+ assert_equal(expected, result)
556
+ end
557
+ def test_xf
558
+ @book.biffversion = 0x18
559
+ fmt = "\006\000\244\000\001\000 \000\000\000\000\000\010\004\010\004\002\000\t\004"
560
+ format = @parser.xf(nil, nil, fmt)
561
+ assert_equal(6, format.font_no)
562
+ assert_equal(164, format.fmt_idx)
563
+ assert_not_nil(format.lock)
564
+ assert_equal(false, format.hidden)
565
+ assert_equal(false, format.style)
566
+ assert_equal(false, format.key_123)
567
+ assert_equal(0, format.align_h)
568
+ assert_equal(false, format.wrap)
569
+ assert_equal(2, format.align_v)
570
+ assert_equal(false, format.just_last)
571
+ assert_equal(0, format.rotate)
572
+ assert_equal(0, format.indent)
573
+ assert_equal(false, format.shrink)
574
+ assert_equal(false, format.merge)
575
+ assert_equal(0, format.read_dir)
576
+ assert_equal([0,0,0,0], format.border_style)
577
+ assert_equal([8,8,8,8], format.border_color)
578
+ assert_equal([0,0,0], format.border_diag)
579
+ assert_equal([0,9,8], format.fill)
580
+ end
581
+ end
582
+
583
+ class TestParser2 < Test::Unit::TestCase
584
+ def setup
585
+ @parser = Spreadsheet::ParseExcel::Parser.new
586
+ end
587
+ def test_file_bar # Simple text-values
588
+ source = File.expand_path('data/bar.xls', File.dirname(__FILE__))
589
+ book = @parser.parse(source)
590
+ assert_equal(1, book.sheet_count)
591
+ sheet = book.worksheet(0)
592
+ assert_equal('A1',sheet.cell(0,0).value)
593
+ assert_equal('A2',sheet.cell(1,0).value)
594
+ assert_equal('A3',sheet.cell(2,0).value)
595
+ assert_equal('B1',sheet.cell(0,1).value)
596
+ assert_equal('B2',sheet.cell(1,1).value)
597
+ assert_equal('B3',sheet.cell(2,1).value)
598
+ assert_equal('C1',sheet.cell(0,2).value)
599
+ assert_equal('C2',sheet.cell(1,2).value)
600
+ assert_equal('C3',sheet.cell(2,2).value)
601
+ end
602
+ def test_file_foo
603
+ source = File.expand_path('data/foo.xls', File.dirname(__FILE__))
604
+ book = @parser.parse(source)
605
+ assert_equal(3, book.sheet_count)
606
+ sheet = book.worksheet(0)
607
+ cell0 = sheet.cell(0,0)
608
+ assert_equal("F\0o\0o\0",cell0.value)
609
+ assert_equal(:text, cell0.type)
610
+ assert_equal('UTF-16LE', cell0.encoding)
611
+ assert_equal('Foo', cell0.to_s('latin1'))
612
+ cell1 = sheet.cell(0,1)
613
+ assert_equal(12,cell1.value)
614
+ assert_equal(:numeric, cell1.type)
615
+ cell2 = sheet.cell(1,0)
616
+ assert_equal(27627,cell2.value)
617
+ assert_equal(:date, cell2.type)
618
+ # once formulas are implemented:
619
+ # cell3 = sheet.cell(1,1)
620
+ # assert_equal(27627,cell3.value)
621
+ # assert_equal(:numeric, cell3.type)
622
+ end
623
+ def test_file_float
624
+ source = File.expand_path('data/float.xls', File.dirname(__FILE__))
625
+ book = @parser.parse(source)
626
+ sheet = book.worksheet(0)
627
+ cell0 = sheet.cell(0,0)
628
+ assert_equal(5.39,cell0.value)
629
+ end
630
+ def test_file_image
631
+ source = File.expand_path('data/image.xls', File.dirname(__FILE__))
632
+ book = nil
633
+ assert_nothing_raised {
634
+ book = @parser.parse(source)
635
+ }
636
+ sheet = book.worksheet(0)
637
+ cell0 = sheet.cell(48,0)
638
+ assert_equal('TEST', cell0.to_s('latin1'))
639
+ end
640
+ def test_file_umlaut__5_0
641
+ source = File.expand_path('data/umlaut.5.0.xls', File.dirname(__FILE__))
642
+ book = nil
643
+ assert_nothing_raised {
644
+ book = @parser.parse(source)
645
+ }
646
+ sheet = book.worksheet(0)
647
+ cell0 = sheet.cell(0,0)
648
+ assert_equal('WINDOWS-1252', cell0.encoding)
649
+ # assert_equal('�', cell0.to_s('latin1'))
650
+ assert_equal("\xE4", cell0.to_s('latin1'))
651
+ end
652
+ def test_file_umlaut__biff8
653
+ source = File.expand_path('data/umlaut.biff8.xls', File.dirname(__FILE__))
654
+ book = nil
655
+ assert_nothing_raised {
656
+ book = @parser.parse(source)
657
+ }
658
+ sheet = book.worksheet(0)
659
+ cell0 = sheet.cell(0,0)
660
+ assert_equal('UTF-16LE', cell0.encoding)
661
+ # assert_equal('�', cell0.to_s('latin1'))
662
+ assert_equal("\xE4", cell0.to_s('latin1'))
663
+ end
664
+ def test_file_uncompressed_str
665
+ source = File.expand_path('data/uncompressed.str.xls', File.dirname(__FILE__))
666
+ book = nil
667
+ assert_nothing_raised {
668
+ book = @parser.parse(source)
669
+ }
670
+ sheet = book.worksheet(0)
671
+ cell0 = sheet.cell(0,0)
672
+ assert_equal('UTF-16LE', cell0.encoding)
673
+ assert_equal('Aaaaa Aaaaaaaaa Aaaaaa', cell0.to_s('latin1'))
674
+ end
675
+ def test_file_comment
676
+ source = File.expand_path('data/comment.xls', File.dirname(__FILE__))
677
+ book = nil
678
+ assert_nothing_raised {
679
+ book = @parser.parse(source)
680
+ }
681
+ sheet = book.worksheet(0)
682
+ cell0 = sheet.cell(0,0)
683
+ assert_equal('cellcontent', cell0.to_s('latin1'))
684
+ assert_equal('cellcomment', cell0.annotation)
685
+ assert_equal('HW', cell0.annotation.author)
686
+ cell1 = sheet.cell(1,1)
687
+ assert_equal('cellcontent', cell1.to_s('latin1'))
688
+ assert_equal('annotation', cell1.annotation)
689
+ end
690
+ def test_file_comment__5_0
691
+ source = File.expand_path('data/comment.5.0.xls', File.dirname(__FILE__))
692
+ book = nil
693
+ assert_nothing_raised {
694
+ book = @parser.parse(source)
695
+ }
696
+ sheet = book.worksheet(0)
697
+ cell0 = sheet.cell(0,0)
698
+ assert_equal('cellcontent', cell0.to_s('latin1'))
699
+ assert_equal('cellcomment', cell0.annotation)
700
+ cell1 = sheet.cell(1,1)
701
+ assert_equal('cellcontent', cell1.to_s('latin1'))
702
+ assert_equal('annotation', cell1.annotation)
703
+ end
704
+ def test_file_comment__ds
705
+ source = File.expand_path('data/annotation.xls', File.dirname(__FILE__))
706
+ book = nil
707
+ assert_nothing_raised {
708
+ book = @parser.parse(source)
709
+ }
710
+ sheet = book.worksheet(0)
711
+ cell0 = sheet.cell(0,0)
712
+ assert_equal('hello', cell0.to_s('latin1'))
713
+ ann = cell0.annotation
714
+ assert_equal("david surmon:\nnow is the time for all good men to come to the aid of their country!", ann)
715
+ assert_equal('david surmon', ann.author)
716
+ cell1 = sheet.cell(0,1)
717
+ assert_equal('there', cell1.to_s('latin1'))
718
+ ann = cell1.annotation
719
+ assert_equal("david surmon:\nwhat should this comment be? Now what?", ann)
720
+ assert_equal('david surmon', ann.author)
721
+ cell2 = sheet.cell(0,2)
722
+ assert_equal('whos', cell2.to_s('latin1'))
723
+ cell3 = sheet.cell(1,0)
724
+ assert_equal('I', cell3.to_s('latin1'))
725
+ end
726
+ def test_file_several_sheets
727
+ source = File.expand_path('data/annotation.xls', File.dirname(__FILE__))
728
+ book = nil
729
+ assert_nothing_raised {
730
+ book = @parser.parse(source)
731
+ }
732
+ sheet = book.worksheet(0)
733
+ assert_equal('Sheet1', sheet.name('latin1'))
734
+ sheet = book.worksheet(1)
735
+ assert_equal('Sheet2', sheet.name('latin1'))
736
+ cell0 = sheet.cell(0,0)
737
+ assert_equal('version', cell0.to_s('latin1'))
738
+ cell1 = sheet.cell(1,0)
739
+ assert_equal(1, cell1.to_i)
740
+ sheet = book.worksheet(2)
741
+ assert_equal('Sheet3', sheet.name('latin1'))
742
+ assert_equal(sheet, book.worksheet('Sheet3', 'latin1'))
743
+ assert_equal(sheet, book.worksheet("S\x00h\x00e\x00e\x00t\x003\x00"))
744
+ end
745
+ end