WriteExcel 0.2.0

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.
Files changed (80) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +17 -0
  5. data/Rakefile +47 -0
  6. data/VERSION +1 -0
  7. data/examples/a_simple.rb +42 -0
  8. data/examples/autofilters.rb +266 -0
  9. data/examples/bigfile.rb +30 -0
  10. data/examples/copyformat.rb +51 -0
  11. data/examples/data_validate.rb +278 -0
  12. data/examples/date_time.rb +86 -0
  13. data/examples/demo.rb +118 -0
  14. data/examples/diag_border.rb +35 -0
  15. data/examples/formats.rb +489 -0
  16. data/examples/header.rb +136 -0
  17. data/examples/hidden.rb +28 -0
  18. data/examples/hyperlink.rb +42 -0
  19. data/examples/images.rb +52 -0
  20. data/examples/merge1.rb +39 -0
  21. data/examples/merge2.rb +44 -0
  22. data/examples/merge3.rb +65 -0
  23. data/examples/merge4.rb +82 -0
  24. data/examples/merge5.rb +79 -0
  25. data/examples/protection.rb +46 -0
  26. data/examples/regions.rb +52 -0
  27. data/examples/repeat.rb +42 -0
  28. data/examples/stats.rb +75 -0
  29. data/examples/stocks.rb +80 -0
  30. data/examples/tab_colors.rb +30 -0
  31. data/lib/WriteExcel.rb +30 -0
  32. data/lib/WriteExcel/biffwriter.rb +259 -0
  33. data/lib/WriteExcel/chart.rb +217 -0
  34. data/lib/WriteExcel/excelformula.y +138 -0
  35. data/lib/WriteExcel/excelformulaparser.rb +573 -0
  36. data/lib/WriteExcel/format.rb +1108 -0
  37. data/lib/WriteExcel/formula.rb +986 -0
  38. data/lib/WriteExcel/olewriter.rb +322 -0
  39. data/lib/WriteExcel/properties.rb +250 -0
  40. data/lib/WriteExcel/storage_lite.rb +590 -0
  41. data/lib/WriteExcel/workbook.rb +2602 -0
  42. data/lib/WriteExcel/worksheet.rb +6378 -0
  43. data/spec/WriteExcel_spec.rb +7 -0
  44. data/spec/spec.opts +1 -0
  45. data/spec/spec_helper.rb +9 -0
  46. data/test/tc_all.rb +31 -0
  47. data/test/tc_biff.rb +104 -0
  48. data/test/tc_chart.rb +22 -0
  49. data/test/tc_example_match.rb +1280 -0
  50. data/test/tc_format.rb +1264 -0
  51. data/test/tc_formula.rb +63 -0
  52. data/test/tc_ole.rb +110 -0
  53. data/test/tc_storage_lite.rb +102 -0
  54. data/test/tc_workbook.rb +115 -0
  55. data/test/tc_worksheet.rb +115 -0
  56. data/test/test_00_IEEE_double.rb +14 -0
  57. data/test/test_01_add_worksheet.rb +12 -0
  58. data/test/test_02_merge_formats.rb +58 -0
  59. data/test/test_04_dimensions.rb +397 -0
  60. data/test/test_05_rows.rb +182 -0
  61. data/test/test_06_extsst.rb +80 -0
  62. data/test/test_11_date_time.rb +484 -0
  63. data/test/test_12_date_only.rb +506 -0
  64. data/test/test_13_date_seconds.rb +486 -0
  65. data/test/test_21_escher.rb +629 -0
  66. data/test/test_22_mso_drawing_group.rb +739 -0
  67. data/test/test_23_note.rb +78 -0
  68. data/test/test_24_txo.rb +80 -0
  69. data/test/test_26_autofilter.rb +327 -0
  70. data/test/test_27_autofilter.rb +144 -0
  71. data/test/test_28_autofilter.rb +174 -0
  72. data/test/test_29_process_jpg.rb +131 -0
  73. data/test/test_30_validation_dval.rb +82 -0
  74. data/test/test_31_validation_dv_strings.rb +131 -0
  75. data/test/test_32_validation_dv_formula.rb +211 -0
  76. data/test/test_40_property_types.rb +191 -0
  77. data/test/test_41_properties.rb +238 -0
  78. data/test/test_42_set_properties.rb +430 -0
  79. data/test/ts_all.rb +34 -0
  80. metadata +154 -0
@@ -0,0 +1,82 @@
1
+ ##########################################################################
2
+ # test_30_validation_dval.rb
3
+ #
4
+ # Tests for the Excel DVAL structure used in data validation.
5
+ #
6
+ # reverse('©'), September 2005, John McNamara, jmcnamara@cpan.org
7
+ #
8
+ # original written in Perl by John McNamara
9
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
10
+ #
11
+ #########################################################################
12
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
13
+
14
+ require "test/unit"
15
+ require 'WriteExcel'
16
+
17
+ class TC_validation_dval < Test::Unit::TestCase
18
+
19
+ def setup
20
+ t = Time.now.strftime("%Y%m%d")
21
+ path = "temp#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
22
+ @test_file = File.join(Dir.tmpdir, path)
23
+ @workbook = Spreadsheet::WriteExcel.new(@test_file)
24
+ @worksheet = @workbook.add_worksheet
25
+ end
26
+
27
+ def teardown
28
+ @workbook.close
29
+ File.unlink(@test_file) if FileTest.exist?(@test_file)
30
+ end
31
+
32
+ def test_1
33
+ obj_id = 1
34
+ dv_count = 1
35
+
36
+ caption = " \tData validation: _store_dval(#{obj_id}, #{dv_count})"
37
+ target = %w(
38
+ B2 01 12 00 04 00 00 00 00 00 00 00 00 00 01 00
39
+ 00 00 01 00 00 00
40
+ ).join(' ')
41
+
42
+ result = unpack_record(@worksheet.store_dval(obj_id, dv_count))
43
+ assert_equal(target, result, caption)
44
+ end
45
+
46
+ def test_2
47
+ obj_id = -1
48
+ dv_count = 1
49
+
50
+ caption = " \tData validation: _store_dval(#{obj_id}, #{dv_count})"
51
+ target = %w(
52
+ B2 01 12 00 04 00 00 00 00 00 00 00 00 00 FF FF
53
+ FF FF 01 00 00 00
54
+ ).join(' ')
55
+
56
+ result = unpack_record(@worksheet.store_dval(obj_id, dv_count))
57
+ assert_equal(target, result, caption)
58
+ end
59
+
60
+ def test_3
61
+ obj_id = 1
62
+ dv_count = 2
63
+
64
+ caption = " \tData validation: _store_dval(#{obj_id}, #{dv_count})"
65
+ target = %w(
66
+ B2 01 12 00 04 00 00 00 00 00 00 00 00 00 01 00
67
+ 00 00 02 00 00 00
68
+ ).join(' ')
69
+
70
+ result = unpack_record(@worksheet.store_dval(obj_id, dv_count))
71
+ assert_equal(target, result, caption)
72
+ end
73
+
74
+ ###############################################################################
75
+ #
76
+ # Unpack the binary data into a format suitable for printing in tests.
77
+ #
78
+ def unpack_record(data)
79
+ data.unpack('C*').map! {|c| sprintf("%02X", c) }.join(' ')
80
+ end
81
+
82
+ end
@@ -0,0 +1,131 @@
1
+ ##########################################################################
2
+ # test_31_validation_dv_strings.rb
3
+ #
4
+ # Tests for the packed caption/message strings used in the Excel DV structure
5
+ # as part of data validation.
6
+ #
7
+ # reverse('©'), September 2005, John McNamara, jmcnamara@cpan.org
8
+ #
9
+ # original written in Perl by John McNamara
10
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
11
+ #
12
+ #########################################################################
13
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
14
+
15
+ require "test/unit"
16
+ require 'WriteExcel'
17
+
18
+ class TC_validation_dv_strings < Test::Unit::TestCase
19
+
20
+ def setup
21
+ t = Time.now.strftime("%Y%m%d")
22
+ path = "temp#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
23
+ @test_file = File.join(Dir.tmpdir, path)
24
+ @workbook = Spreadsheet::WriteExcel.new(@test_file)
25
+ @worksheet = @workbook.add_worksheet
26
+ end
27
+
28
+ def teardown
29
+ @workbook.close
30
+ File.unlink(@test_file) if FileTest.exist?(@test_file)
31
+ end
32
+
33
+ def test_empty_string
34
+ string = ''
35
+ max_length = 32
36
+
37
+ caption = " \tData validation: _pack_dv_string('', #{max_length})"
38
+ target = %w(
39
+ 01 00 00 00
40
+ ).join(' ')
41
+ result = unpack_record(@worksheet.pack_dv_string(string, max_length))
42
+ assert_equal(target, result, caption)
43
+ end
44
+
45
+ def test_nil
46
+ string = nil
47
+ max_length = 32
48
+
49
+ caption = " \tData validation: _pack_dv_string('', #{max_length})"
50
+ target = %w(
51
+ 01 00 00 00
52
+ ).join(' ')
53
+ result = unpack_record(@worksheet.pack_dv_string(string, max_length))
54
+ assert_equal(target, result, caption)
55
+ end
56
+
57
+ def test_single_space
58
+ string = ' '
59
+ max_length = 32
60
+
61
+ caption = " \tData validation: _pack_dv_string('', #{max_length})"
62
+ target = %w(
63
+ 01 00 00 20
64
+ ).join(' ')
65
+ result = unpack_record(@worksheet.pack_dv_string(string, max_length))
66
+ assert_equal(target, result, caption)
67
+ end
68
+
69
+ def test_single_character
70
+ string = 'A'
71
+ max_length = 32
72
+
73
+ caption = " \tData validation: _pack_dv_string('', #{max_length})"
74
+ target = %w(
75
+ 01 00 00 41
76
+ ).join(' ')
77
+ result = unpack_record(@worksheet.pack_dv_string(string, max_length))
78
+ assert_equal(target, result, caption)
79
+ end
80
+
81
+ def test_string_longer_than_32_characters_for_dialog_captions
82
+ string = 'This string is longer than 32 characters'
83
+ max_length = 32
84
+
85
+ caption = " \tData validation: _pack_dv_string('', #{max_length})"
86
+ target = %w(
87
+ 20 00 00 54 68 69 73 20
88
+ 73 74 72 69 6E 67 20 69 73 20 6C 6F 6E 67 65 72
89
+ 20 74 68 61 6E 20 33 32 20 63 68
90
+ ).join(' ')
91
+ result = unpack_record(@worksheet.pack_dv_string(string, max_length))
92
+ assert_equal(target, result, caption)
93
+ end
94
+
95
+ def test_string_longer_than_32_characters_for_dialog_messages
96
+ string = 'ABCD' * 64
97
+ max_length = 255
98
+
99
+ caption = " \tData validation: _pack_dv_string('', #{max_length})"
100
+ target = %w(
101
+ FF 00 00 41 42 43 44 41 42 43 44 41 42 43 44 41
102
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
103
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
104
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
105
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
106
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
107
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
108
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
109
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
110
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
111
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
112
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
113
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
114
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
115
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
116
+ 42 43 44 41 42 43 44 41 42 43 44 41 42 43 44 41
117
+ 42 43
118
+ ).join(' ')
119
+ result = unpack_record(@worksheet.pack_dv_string(string, max_length))
120
+ assert_equal(target, result, caption)
121
+ end
122
+
123
+ ###############################################################################
124
+ #
125
+ # Unpack the binary data into a format suitable for printing in tests.
126
+ #
127
+ def unpack_record(data)
128
+ data.unpack('C*').map! {|c| sprintf("%02X", c) }.join(' ')
129
+ end
130
+
131
+ end
@@ -0,0 +1,211 @@
1
+ ##########################################################################
2
+ # test_32_validation_dv_formula.rb
3
+ #
4
+ # Tests for the Excel DVAL structure used in data validation.
5
+ #
6
+ # reverse('©'), September 2005, John McNamara, jmcnamara@cpan.org
7
+ #
8
+ # original written in Perl by John McNamara
9
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
10
+ #
11
+ #########################################################################
12
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
13
+
14
+ require "test/unit"
15
+ require 'WriteExcel'
16
+
17
+ class TC_validation_dv_formula < Test::Unit::TestCase
18
+
19
+ def setup
20
+ t = Time.now.strftime("%Y%m%d")
21
+ path = "temp#{t}-#{$$}-#{rand(0x100000000).to_s(36)}"
22
+ @test_file = File.join(Dir.tmpdir, path)
23
+ @workbook = Spreadsheet::WriteExcel.new(@test_file)
24
+ @worksheet = @workbook.add_worksheet
25
+ @worksheet2 = @workbook.add_worksheet
26
+ end
27
+
28
+ def teardown
29
+ @workbook.close
30
+ File.unlink(@test_file) if FileTest.exist?(@test_file)
31
+ end
32
+
33
+ def test_integer_values
34
+ formula = '10'
35
+
36
+ caption = " \tData validation: _pack_dv_formula('#{formula}')"
37
+ bytes = %w(
38
+ 03 00 00 E0 1E 0A 00
39
+ )
40
+
41
+ # Zero out Excel's random unused word to allow comparison.
42
+ bytes[2] = '00'
43
+ bytes[3] = '00'
44
+ target = bytes.join(" ")
45
+
46
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
47
+ assert_equal(target, result, caption)
48
+ end
49
+
50
+ def test_decimal_values
51
+ formula = '1.2345'
52
+
53
+ caption = " \tData validation: _pack_dv_formula('#{formula}')"
54
+ bytes = %w(
55
+ 09 00 E0 3F 1F 8D 97 6E 12 83 C0 F3 3F
56
+ )
57
+
58
+ # Zero out Excel's random unused word to allow comparison.
59
+ bytes[2] = '00'
60
+ bytes[3] = '00'
61
+ target = bytes.join(" ")
62
+
63
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
64
+ assert_equal(target, result, caption)
65
+ end
66
+
67
+ def test_date_values
68
+ formula = @worksheet.convert_date_time('2008-07-24T')
69
+
70
+ caption = " \tData validation: _pack_dv_formula('2008-07-24T')"
71
+ bytes = %w(
72
+ 03 00 E0 3F 1E E5 9A
73
+ )
74
+
75
+ # Zero out Excel's random unused word to allow comparison.
76
+ bytes[2] = '00'
77
+ bytes[3] = '00'
78
+ target = bytes.join(" ")
79
+
80
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
81
+ assert_equal(target, result, caption)
82
+ end
83
+
84
+ def test_time_values
85
+ formula = @worksheet.convert_date_time('T12:00')
86
+
87
+ caption = " \tData validation: _pack_dv_formula('T12:00')"
88
+ bytes = %w(
89
+ 09 00 E0 3F 1F 00 00 00 00 00 00 E0 3F
90
+ )
91
+
92
+ # Zero out Excel's random unused word to allow comparison.
93
+ bytes[2] = '00'
94
+ bytes[3] = '00'
95
+ target = bytes.join(" ")
96
+
97
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
98
+ assert_equal(target, result, caption)
99
+ end
100
+
101
+ def test_cell_reference_value_C9
102
+ formula = '=C9'
103
+
104
+ caption = " \tData validation: _pack_dv_formula('#{formula}')"
105
+ bytes = %w(
106
+ 05 00 E0 3F 44 08 00 02 C0
107
+ )
108
+
109
+ # Zero out Excel's random unused word to allow comparison.
110
+ bytes[2] = '00'
111
+ bytes[3] = '00'
112
+ target = bytes.join(" ")
113
+
114
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
115
+ assert_equal(target, result, caption)
116
+ end
117
+
118
+ def test_cell_reference_value_E3_E6
119
+ formula = '=E3:E6'
120
+
121
+ caption = " \tData validation: _pack_dv_formula('#{formula}')"
122
+ bytes = %w(
123
+ 09 00 0C 00 25 02 00 05 00 04 C0 04 C0
124
+ )
125
+
126
+ # Zero out Excel's random unused word to allow comparison.
127
+ bytes[2] = '00'
128
+ bytes[3] = '00'
129
+ target = bytes.join(" ")
130
+
131
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
132
+ assert_equal(target, result, caption)
133
+ end
134
+
135
+ def test_cell_reference_value_E3_E6_absolute
136
+ formula = '=$E$3:$E$6'
137
+
138
+ caption = " \tData validation: _pack_dv_formula('#{formula}')"
139
+ bytes = %w(
140
+ 09 00 0C 00 25 02 00 05 00 04 00 04 00
141
+ )
142
+
143
+ # Zero out Excel's random unused word to allow comparison.
144
+ bytes[2] = '00'
145
+ bytes[3] = '00'
146
+ target = bytes.join(" ")
147
+
148
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
149
+ assert_equal(target, result, caption)
150
+ end
151
+
152
+ def test_list_values
153
+ formula = ['a', 'bb', 'ccc']
154
+
155
+ caption = " \tData validation: _pack_dv_formula(['a', 'bb', 'ccc'])"
156
+ bytes = %w(
157
+ 0B 00 0C 00 17 08 00 61 00 62 62 00 63 63 63
158
+ )
159
+
160
+ # Zero out Excel's random unused word to allow comparison.
161
+ bytes[2] = '00'
162
+ bytes[3] = '00'
163
+ target = bytes.join(" ")
164
+
165
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
166
+ assert_equal(target, result, caption)
167
+ end
168
+
169
+ def test_empty_string
170
+ formula = ''
171
+
172
+ caption = " \tData validation: _pack_dv_formula('')"
173
+ bytes = %w(
174
+ 00 00 00
175
+ )
176
+
177
+ # Zero out Excel's random unused word to allow comparison.
178
+ bytes[2] = '00'
179
+ bytes[3] = '00'
180
+ target = bytes.join(" ")
181
+
182
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
183
+ assert_equal(target, result, caption)
184
+ end
185
+
186
+ def test_undefined_value
187
+ formula = nil
188
+
189
+ caption = " \tData validation: _pack_dv_formula(nil)"
190
+ bytes = %w(
191
+ 00 00 00
192
+ )
193
+
194
+ # Zero out Excel's random unused word to allow comparison.
195
+ bytes[2] = '00'
196
+ bytes[3] = '00'
197
+ target = bytes.join(" ")
198
+
199
+ result = unpack_record(@worksheet.pack_dv_formula(formula))
200
+ assert_equal(target, result, caption)
201
+ end
202
+
203
+ ###############################################################################
204
+ #
205
+ # Unpack the binary data into a format suitable for printing in tests.
206
+ #
207
+ def unpack_record(data)
208
+ data.unpack('C*').map! {|c| sprintf("%02X", c) }.join(' ')
209
+ end
210
+
211
+ end
@@ -0,0 +1,191 @@
1
+ ##########################################################################
2
+ # test_40_property_types.rb
3
+ #
4
+ # Tests for the basic property types used in OLE property sets.
5
+ #
6
+ # reverse('©'), September 2005, John McNamara, jmcnamara@cpan.org
7
+ #
8
+ # original written in Perl by John McNamara
9
+ # converted to Ruby by Hideo Nakamura, cxn03651@msj.biglobe.ne.jp
10
+ #
11
+ #########################################################################
12
+ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib"
13
+
14
+ require 'test/unit'
15
+ require 'rubygems'
16
+ require 'WriteExcel'
17
+
18
+ class TC_property_types < Test::Unit::TestCase
19
+
20
+ def setup
21
+ @smiley = '☺' # chr 0x263A; in perl
22
+ end
23
+
24
+ def test_pack_a_VT_I2
25
+ caption = " \tDoc properties: pack_VT_I2(1252)"
26
+ target = %w(
27
+ 02 00 00 00 E4 04 00 00
28
+ ).join(' ')
29
+
30
+ result = unpack_record( pack_VT_I2(1252) )
31
+ assert_equal(target, result, caption)
32
+ end
33
+
34
+ def test_pack_a_VT_LPSTR_string_and_check_for_padding
35
+ string = ''
36
+ codepage = 0x04E4
37
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
38
+ target = %w(
39
+ 1E 00 00 00 01 00 00 00 00 00 00 00
40
+ ).join(' ')
41
+
42
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
43
+ assert_equal(target, result, caption)
44
+ end
45
+
46
+ def test_pack_a_VT_LPSTR_string_and_check_for_padding_2
47
+ string = 'a'
48
+ codepage = 0x04E4
49
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
50
+ target = %w(
51
+ 1E 00 00 00 02 00 00 00 61 00 00 00
52
+ ).join(' ')
53
+
54
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
55
+ assert_equal(target, result, caption)
56
+ end
57
+
58
+ def test_pack_a_VT_LPSTR_string_and_check_for_padding_3
59
+ string = 'bb'
60
+ codepage = 0x04E4
61
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
62
+ target = %w(
63
+ 1E 00 00 00 03 00 00 00 62 62 00 00
64
+ ).join(' ')
65
+
66
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
67
+ assert_equal(target, result, caption)
68
+ end
69
+
70
+ def test_pack_a_VT_LPSTR_string_and_check_for_padding_4
71
+ string = 'ccc'
72
+ codepage = 0x04E4
73
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
74
+ target = %w(
75
+ 1E 00 00 00 04 00 00 00 63 63 63 00
76
+ ).join(' ')
77
+
78
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
79
+ assert_equal(target, result, caption)
80
+ end
81
+
82
+ def test_pack_a_VT_LPSTR_string_and_check_for_padding_5
83
+ string = 'dddd'
84
+ codepage = 0x04E4
85
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
86
+ target = %w(
87
+ 1E 00 00 00 05 00 00 00 64 64 64 64 00 00 00 00
88
+ ).join(' ')
89
+
90
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
91
+ assert_equal(target, result, caption)
92
+ end
93
+
94
+ def test_pack_a_VT_LPSTR_string_and_check_for_padding_6
95
+ string = 'Username'
96
+ codepage = 0x04E4
97
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
98
+ target = %w(
99
+ 1E 00 00 00 09 00 00 00 55 73 65 72 6E 61 6D 65
100
+ 00 00 00 00
101
+ ).join(' ')
102
+
103
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
104
+ assert_equal(target, result, caption)
105
+ end
106
+
107
+ def test_pack_a_VT_LPSTR_UTF8_string
108
+ string = @smiley
109
+ codepage = 0xFDE9
110
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{@smiley}',\t#{codepage}')"
111
+ target = %w(
112
+ 1E 00 00 00 04 00 00 00 E2 98 BA 00
113
+ ).join(' ')
114
+
115
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
116
+ assert_equal(target, result, caption)
117
+ end
118
+
119
+ def test_pack_a_VT_LPSTR_UTF8_string_2
120
+ string = "a" + @smiley
121
+ codepage = 0xFDE9
122
+ caption = " \tDoc properties: _pack_VT_LPSTR('a#{@smiley}',\t#{codepage}')"
123
+ target = %w(
124
+ 1E 00 00 00 05 00 00 00 61 E2 98 BA 00 00 00 00
125
+ ).join(' ')
126
+
127
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
128
+ assert_equal(target, result, caption)
129
+ end
130
+
131
+ def test_pack_a_VT_LPSTR_UTF8_string_3
132
+ string = "aa" + @smiley
133
+ codepage = 0xFDE9
134
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
135
+ target = %w(
136
+ 1E 00 00 00 06 00 00 00 61 61 E2 98 BA 00 00 00
137
+ ).join(' ')
138
+
139
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
140
+ assert_equal(target, result, caption)
141
+ end
142
+
143
+ def test_pack_a_VT_LPSTR_UTF8_string_4
144
+ string = "aaa" + @smiley
145
+ codepage = 0xFDE9
146
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
147
+ target = %w(
148
+ 1E 00 00 00 07 00 00 00 61 61 61 E2 98 BA 00 00
149
+ ).join(' ')
150
+
151
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
152
+ assert_equal(target, result, caption)
153
+ end
154
+
155
+ def test_pack_a_VT_LPSTR_UTF8_string_5
156
+ string = "aaaa" + @smiley
157
+ codepage = 0xFDE9
158
+ caption = " \tDoc properties: _pack_VT_LPSTR('#{string}',\t#{codepage}')"
159
+ target = %w(
160
+ 1E 00 00 00 08 00 00 00 61 61 61 61 E2 98 BA 00
161
+ ).join(' ')
162
+
163
+ result = unpack_record( pack_VT_LPSTR(string, codepage) )
164
+ assert_equal(target, result, caption)
165
+ end
166
+
167
+ def test_pack_a_VT_FILETIME
168
+ # Wed Aug 13 00:40:00 2008
169
+ # $sec,$min,$hour,$mday,$mon,$year
170
+ # We normalise the time using timegm() so that the tests don't fail due to
171
+ # different timezones.
172
+ filetime = Time.gm(2008,8,13,0,40,0)
173
+
174
+ caption = " \tDoc properties: _pack_VT_FILETIME()"
175
+ target = %w(
176
+ 40 00 00 00 00 70 EB 1D DD FC C8 01
177
+ ).join(' ')
178
+
179
+ result = unpack_record( pack_VT_FILETIME(filetime) )
180
+ assert_equal(target, result, caption)
181
+ end
182
+
183
+ ###############################################################################
184
+ #
185
+ # Unpack the binary data into a format suitable for printing in tests.
186
+ #
187
+ def unpack_record(data)
188
+ data.unpack('C*').map! {|c| sprintf("%02X", c) }.join(' ')
189
+ end
190
+
191
+ end