o-inifile 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/o-inifile.rb ADDED
@@ -0,0 +1 @@
1
+ require 'inifile'
@@ -0,0 +1,6 @@
1
+ [section_one]
2
+ one = 1
3
+ two = 2
4
+
5
+ ; the following is not a valid line
6
+ invalid line
@@ -0,0 +1,11 @@
1
+ [section_one]
2
+ one = 1
3
+ two = 2
4
+
5
+ [section_two]
6
+ close-quote = "some text without
7
+ a closing quote - should
8
+ be interesting
9
+
10
+ [section_three]
11
+ wat = where is that closing quote?
@@ -0,0 +1,5 @@
1
+
2
+ ;just the offending entry
3
+ [www.substancia.com AutoHTTPAgent (ver *)]
4
+ Parent=Version Checkers
5
+ Browser=Subst�ncia
@@ -0,0 +1,10 @@
1
+ # comments should be ignored
2
+ [section_one]
3
+ one = 1
4
+ two = 2
5
+
6
+ [section_two] # you can comment here
7
+ one = 42 # and even here!
8
+ multi = 20 \ # and here, too
9
+ + 22 = 42
10
+
@@ -0,0 +1,6 @@
1
+ [section_one]
2
+ one = 1
3
+ two = 2
4
+
5
+ [section_two]
6
+ end-of-file = here is the last value \
@@ -0,0 +1,13 @@
1
+ ; this test file demonstrates escape sequences supported by IniFile
2
+ [normal]
3
+ foo = http://en.wikipedia.org/wiki/Foobar
4
+
5
+ [escaped]
6
+ tabs = There is a tab\tcharacter in here somewhere
7
+ carriage return = Who uses these anyways?\r
8
+ newline = Trust newline!\nAlways there when you need him.\nSplittin' those lines.
9
+ null = Who'd be silly enough to put\0 a null character in the middle of a string? \
10
+ Stroustrup would not approve!
11
+ backslash = This string \\t contains \\n no \\r special \\0 characters!
12
+ quoted = "Escaping works\tinside quoted strings!"
13
+
@@ -0,0 +1,5 @@
1
+ [section_one]
2
+ one = 1
3
+ two = 2
4
+ two = zinga
5
+ two = "new foils"
@@ -0,0 +1,3 @@
1
+ ; without any section, a default 'global' section will be created
2
+ one = 1
3
+ two = 2
@@ -0,0 +1,19 @@
1
+ [section_one]
2
+ one = 1
3
+ two = 2
4
+
5
+ [section_two]
6
+ three = -3
7
+ multi = multiline \
8
+ support
9
+
10
+ ; comments should be ignored
11
+ [section three]
12
+ four =true
13
+ five=false # comments can go here
14
+ six =6.0 ; and here, too
15
+
16
+ [section_four]
17
+ [section_five]
18
+ seven and eight= 7 & 8
19
+
@@ -0,0 +1,13 @@
1
+ ; this test file demonstrates escape sequences supported by IniFile
2
+ [normal]
3
+ foo = http://en.wikipedia.org/wiki/Foobar
4
+
5
+ [escaped]
6
+ tabs = There is a tab\tcharacter in here somewhere
7
+ carriage return = Who uses these anyways?\r
8
+ newline = Trust newline!\nAlways there when you need him.\nSplittin' those lines.
9
+ null = Who'd be silly enough to put\0 a null character in the middle of a string?
10
+ line_continuation = C:\Temp\path\
11
+ backslash = This string \\t contains \\n no \\r special \\0 characters!
12
+ quoted = "Escaping works\tinside quoted strings!"
13
+
@@ -0,0 +1,5 @@
1
+ [section_one]
2
+ one = 3
3
+
4
+ [section_five]
5
+ five=5
@@ -0,0 +1,7 @@
1
+ # comments should be ignored
2
+ ; multiple comments characters are supported
3
+ ; (I'm lookin' at you, samba)
4
+ [section_one]
5
+ one = 1
6
+ two = 2
7
+
@@ -0,0 +1,24 @@
1
+ [section_one]
2
+ one = 1
3
+ two = 2
4
+
5
+ [section_two]
6
+ three = 3
7
+
8
+ ; comments should be ignored
9
+ [section_three]
10
+ three = hello \
11
+ multiline
12
+ other = "stuff"
13
+
14
+ [section_four]
15
+ four = hello \ # comments work here, too
16
+ multiple \ # and here !!!
17
+ multilines # and even here (OMG)
18
+ five = "multiple lines
19
+ inside of quotations
20
+ preserve everything"
21
+
22
+ [empty_lines]
23
+ empty =
24
+ not_empty=full
@@ -0,0 +1,5 @@
1
+ ; comments should be ignored
2
+ [section_one]
3
+ one : 1
4
+ two:2
5
+
@@ -0,0 +1,4 @@
1
+ ; section headers can be values
2
+ [section_one]
3
+ one=[value]
4
+ two=2
@@ -0,0 +1,3 @@
1
+ [section_six]
2
+ switch_support
3
+
@@ -0,0 +1,7 @@
1
+ [section_one]
2
+ int1 = 146
3
+ float1 = 0.35
4
+ float2 = .634
5
+ float3 = 234.646
6
+ string1 = 00342
7
+ string2 = 345.
@@ -0,0 +1,629 @@
1
+ # encoding: UTF-8
2
+
3
+ libpath = File.expand_path '../../lib', __FILE__
4
+ require File.join(libpath, 'inifile')
5
+ require 'fileutils'
6
+ require 'test/unit'
7
+
8
+
9
+ class TestIniFile < Test::Unit::TestCase
10
+
11
+ def setup
12
+ @ini_file = IniFile.new(:filename => 'test/data/good.ini')
13
+ @contents = [
14
+ ['section_one', 'one', 1],
15
+ ['section_one', 'two', 2],
16
+ ['section_two', 'three', -3],
17
+ ['section_two', 'multi', "multiline support"],
18
+ ['section three', 'four', true],
19
+ ['section three', 'five', false],
20
+ ['section three', 'six', 6.0],
21
+ ['section_five', 'seven and eight', '7 & 8']
22
+ ].sort
23
+
24
+ FileUtils.rm_rf "test/data/tmp.ini"
25
+ FileUtils.cp "test/data/good.ini", "test/data/tmp.ini"
26
+ end
27
+
28
+ def teardown
29
+ FileUtils.rm_rf "test/data/tmp.ini"
30
+ end
31
+
32
+ def test_class_load
33
+ ini_file = IniFile.load 'test/data/good.ini'
34
+ assert_instance_of IniFile, ini_file
35
+
36
+ # see if we can parse different style comments
37
+ assert_raise(IniFile::Error) {IniFile.load 'test/data/comment.ini', :comment => ';'}
38
+
39
+ ini_file = IniFile.load 'test/data/comment.ini', :comment => '#'
40
+ assert_instance_of IniFile, ini_file
41
+
42
+ # see if we can parse mixed style comments
43
+ assert_raise(IniFile::Error) {IniFile.load 'test/data/mixed_comment.ini', :comment => '#'}
44
+
45
+ ini_file = IniFile.load 'test/data/mixed_comment.ini', :comment => ';#'
46
+ assert_instance_of IniFile, ini_file
47
+
48
+ # see if we can parse different style param separators
49
+ assert_raise(IniFile::Error) {IniFile.load 'test/data/param.ini'}
50
+
51
+ ini_file = IniFile.load 'test/data/param.ini', :parameter => ':'
52
+ assert_instance_of IniFile, ini_file
53
+
54
+ # check that backslash line continuation can be ignored by option
55
+ ini_file = IniFile.load 'test/data/line_continuation.ini', :continuation => false
56
+ assert_equal ini_file["escaped"]["line_continuation"], "C:\\Temp\\path\\"
57
+
58
+ # make sure we error out on files with bad lines
59
+ assert_raise(IniFile::Error) {IniFile.load 'test/data/bad_1.ini'}
60
+ end
61
+
62
+ def test_clone
63
+ clone = @ini_file.clone
64
+ assert_equal @ini_file, clone
65
+ assert !clone.tainted?
66
+ assert !clone.frozen?
67
+
68
+ # the clone should be completely independent of the original
69
+ clone['new_section']['one'] = 1
70
+ assert_not_equal @ini_file, clone
71
+
72
+ # the tainted state is copied to clones
73
+ @ini_file.taint
74
+ assert @ini_file.tainted?
75
+
76
+ clone = @ini_file.clone
77
+ assert clone.tainted?
78
+
79
+ # the frozen state is also copied to clones
80
+ @ini_file.freeze
81
+ assert @ini_file.frozen?
82
+
83
+ clone = @ini_file.clone
84
+ assert clone.tainted?
85
+ assert clone.frozen?
86
+ end
87
+
88
+ def test_delete_section
89
+ assert_nil @ini_file.delete_section('section_nil')
90
+
91
+ h = {'one' => 1, 'two' => 2}
92
+ assert_equal true, @ini_file.has_section?('section_one')
93
+ assert_equal h, @ini_file.delete_section('section_one')
94
+ assert_equal false, @ini_file.has_section?('section_one')
95
+ assert_nil @ini_file.delete_section('section_one')
96
+ end
97
+
98
+ def test_dup
99
+ dup = @ini_file.dup
100
+ assert_equal @ini_file, dup
101
+ assert !dup.tainted?
102
+ assert !dup.frozen?
103
+
104
+ # the duplicate should be completely independent of the original
105
+ dup['new_section']['one'] = 1
106
+ assert_not_equal @ini_file, dup
107
+
108
+ # the tainted state is copied to duplicates
109
+ @ini_file.taint
110
+ assert @ini_file.tainted?
111
+
112
+ dup = @ini_file.dup
113
+ assert dup.tainted?
114
+
115
+ # the frozen state, however, is not
116
+ @ini_file.freeze
117
+ assert @ini_file.frozen?
118
+
119
+ dup = @ini_file.dup
120
+ assert dup.tainted?
121
+ assert !dup.frozen?
122
+ end
123
+
124
+ def test_each
125
+ ary = []
126
+ @ini_file.each {|*args| ary << args}
127
+
128
+ assert_equal @contents, ary.sort
129
+
130
+ ary = []
131
+ IniFile.new(:filename => 'temp.ini').each {|*args| ary << args}
132
+ assert_equal [], ary
133
+ end
134
+
135
+ def test_each_section
136
+ expected = [
137
+ 'section_one', 'section_two', 'section three',
138
+ 'section_four', 'section_five'
139
+ ].sort
140
+
141
+ ary = []
142
+ @ini_file.each_section {|section| ary << section}
143
+
144
+ assert_equal expected, ary.sort
145
+
146
+ ary = []
147
+ IniFile.new(:filename => 'temp.ini').each_section {|section| ary << section}
148
+ assert_equal [], ary
149
+ end
150
+
151
+ def test_eql_eh
152
+ assert @ini_file.eql?(@ini_file)
153
+ assert @ini_file.eql?(@ini_file.clone)
154
+ assert !@ini_file.eql?('string')
155
+ assert !@ini_file.eql?(IniFile.new(:content => ''))
156
+ end
157
+
158
+ def test_freeze
159
+ assert_equal false, @ini_file.frozen?
160
+ @ini_file.each_section do |s|
161
+ assert_equal false, @ini_file[s].frozen?
162
+ end
163
+
164
+ @ini_file.freeze
165
+
166
+ assert_equal true, @ini_file.frozen?
167
+ @ini_file.each_section do |s|
168
+ assert_equal true, @ini_file[s].frozen?
169
+ end
170
+ end
171
+
172
+ def test_has_section_eh
173
+ assert_equal true, @ini_file.has_section?('section_one')
174
+ assert_equal false, @ini_file.has_section?('section_ten')
175
+ assert_equal true, @ini_file.has_section?(:section_two)
176
+ assert_equal false, @ini_file.has_section?(nil)
177
+
178
+ ini_file = IniFile.new(:filename => 'temp.ini')
179
+ assert_equal false, ini_file.has_section?('section_one')
180
+ assert_equal false, ini_file.has_section?('one')
181
+ assert_equal false, ini_file.has_section?('two')
182
+ end
183
+
184
+ def test_index
185
+ expected = {
186
+ 'one' => 1,
187
+ 'two' => 2
188
+ }
189
+ assert_equal expected, @ini_file[:section_one]
190
+
191
+ expected = {'three' => -3, 'multi' => "multiline support"}
192
+ assert_equal expected, @ini_file['section_two']
193
+
194
+ expected = {
195
+ 'four' => true,
196
+ 'five' => false,
197
+ 'six' => 6.0,
198
+ }
199
+ assert_equal expected, @ini_file['section three']
200
+
201
+ expected = {}
202
+ assert_equal expected, @ini_file['section_four']
203
+
204
+ expected = {'seven and eight' => '7 & 8'}
205
+ assert_equal expected, @ini_file['section_five']
206
+
207
+ expected = {}
208
+ assert_equal expected, @ini_file['section_six']
209
+
210
+ assert_nil @ini_file[nil]
211
+
212
+ expected = {}
213
+ ini_file = IniFile.new(:filename => 'temp.ini')
214
+ assert_equal expected, ini_file['section_one']
215
+ assert_equal expected, ini_file['one']
216
+ assert_nil ini_file[nil]
217
+ end
218
+
219
+ def test_match
220
+ expected = {
221
+ "section_two" => {
222
+ "three" => -3, "multi" => "multiline support"
223
+ },
224
+ "section three" => {
225
+ "four" => true, "five"=> false, "six" => 6.0
226
+ }
227
+ }
228
+ assert_equal expected, @ini_file.match(/(two|three)/)
229
+
230
+ # the match function should not delete entries from the inifile hash
231
+ assert_equal({'seven and eight' => '7 & 8'}, @ini_file['section_five'])
232
+
233
+ expected = {}
234
+ assert_equal expected, @ini_file.match(/houndreds/)
235
+ end
236
+
237
+ def test_initialize
238
+ # see if we can parse different style comments
239
+ #assert_raise(IniFile::Error) {IniFile.new 'test/data/comment.ini'}
240
+
241
+ ini_file = IniFile.new(:filename => 'test/data/comment.ini', :comment => '#')
242
+ assert ini_file.has_section?('section_one')
243
+ assert_equal '20 + 22 = 42', ini_file['section_two']['multi']
244
+
245
+ # see if we can parse different style param separators
246
+ assert_raise(IniFile::Error) {IniFile.new(:filename => 'test/data/param.ini')}
247
+
248
+ ini_file = IniFile.new(:filename => 'test/data/param.ini', :parameter => ':')
249
+ assert ini_file.has_section?('section_one')
250
+ assert_equal 1, ini_file['section_one']['one']
251
+ assert_equal 2, ini_file['section_one']['two']
252
+
253
+ # make sure we error out on files with bad lines
254
+ assert_raise(IniFile::Error) {IniFile.new :filename => 'test/data/bad_1.ini'}
255
+ end
256
+
257
+ def test_initialize_from_string_without_ending_newline
258
+ content = "[section_one]\n foo=bar"
259
+ ini_file = IniFile.new(:content => content)
260
+ assert ini_file.has_section?('section_one')
261
+ assert_equal 'bar', ini_file['section_one']['foo']
262
+ end
263
+
264
+ def test_initialize_from_string
265
+ content = File.read('test/data/good.ini')
266
+
267
+ ini_file = IniFile.new(:content => content, :comment => ';')
268
+ assert ini_file.has_section?('section_one')
269
+ assert ini_file.has_section?('section_two')
270
+ assert ini_file.has_section?('section three')
271
+ assert ini_file.has_section?('section_four')
272
+ assert ini_file.has_section?('section_five')
273
+
274
+ assert_equal '7 & 8', ini_file['section_five']['seven and eight']
275
+ end
276
+
277
+ def test_initialize_from_hash
278
+ hash = {
279
+ 'value' => 'bat',
280
+ 'section one' => {
281
+ 'foo' => 'bar',
282
+ 'baz' => 'buz'
283
+ },
284
+ 'colors' => {
285
+ 'perrywinkle' => '7e6ff3',
286
+ 'steelblue' => '4682b4'
287
+ },
288
+ 'empty' => nil
289
+ }
290
+
291
+ ini_file = IniFile.new(:content => hash)
292
+ assert ini_file.has_section?('section one')
293
+ assert ini_file.has_section?('colors')
294
+ assert ini_file.has_section?('empty')
295
+
296
+ assert_equal %w[baz foo], ini_file['section one'].keys.sort
297
+ assert_equal 'bar', ini_file['section one']['foo']
298
+ assert_equal 'buz', ini_file['section one']['baz']
299
+
300
+ assert_equal %w[perrywinkle steelblue], ini_file['colors'].keys.sort
301
+ assert_equal '7e6ff3', ini_file['colors']['perrywinkle']
302
+ assert_equal '4682b4', ini_file['colors']['steelblue']
303
+
304
+ assert_equal 'bat', ini_file['global']['value']
305
+
306
+ assert_empty ini_file['empty']
307
+ end
308
+
309
+ def test_to_s
310
+ hash = {
311
+ 'one' => 'bar',
312
+ 'two' => 'bat',
313
+ 'section one' => {
314
+ 'foo' => 'baz',
315
+ }
316
+ }
317
+
318
+ ini_file = IniFile.new(:content => hash)
319
+
320
+ assert_equal "one = bar\ntwo = bat\n[section one]\nfoo = baz\n", ini_file.to_s
321
+ end
322
+
323
+ def test_sections
324
+ expected = [
325
+ 'section_one', 'section_two', 'section three',
326
+ 'section_four', 'section_five'
327
+ ].sort
328
+
329
+ assert_equal expected, @ini_file.sections.sort
330
+
331
+ ini_file = IniFile.new(:filename => 'temp.ini')
332
+ assert_equal [], ini_file.sections
333
+ end
334
+
335
+ def test_taint
336
+ assert_equal false, @ini_file.tainted?
337
+ @ini_file.each_section do |s|
338
+ assert_equal false, @ini_file[s].tainted?
339
+ end
340
+
341
+ @ini_file.taint
342
+
343
+ assert_equal true, @ini_file.tainted?
344
+ @ini_file.each_section do |s|
345
+ assert_equal true, @ini_file[s].tainted?
346
+ end
347
+ end
348
+
349
+ def test_write
350
+ tmp = 'test/data/temp.ini'
351
+ File.delete tmp if Kernel.test(?f, tmp)
352
+
353
+ @ini_file.save(:filename => tmp)
354
+ assert_equal true, Kernel.test(?f, tmp)
355
+
356
+ File.delete tmp if Kernel.test(?f, tmp)
357
+
358
+ ini_file = IniFile.new(:filename => tmp)
359
+ ini_file.save
360
+ assert_nil Kernel.test(?s, tmp)
361
+
362
+ File.delete tmp if Kernel.test(?f, tmp)
363
+ end
364
+
365
+ def test_read
366
+ assert @ini_file.has_section?('section_one')
367
+
368
+ @ini_file['section_one']['one'] = 42
369
+ @ini_file['section_one']['two'] = 42
370
+ assert_equal 42, @ini_file['section_one']['one']
371
+ assert_equal 42, @ini_file['section_one']['two']
372
+
373
+ @ini_file.read
374
+ assert_equal 1, @ini_file['section_one']['one']
375
+ assert_equal 2, @ini_file['section_one']['two']
376
+
377
+ @ini_file.read(:filename => 'test/data/mixed_comment.ini')
378
+ assert_equal false, @ini_file.has_section?('section_two')
379
+ end
380
+
381
+ def test_modifies_current_keys
382
+ ini = IniFile.load("test/data/tmp.ini")
383
+ ini["section one"]["one"] = 17
384
+ ini.save
385
+
386
+ assert File.read("test/data/tmp.ini") =~ /one = 17/
387
+ end
388
+
389
+ def test_can_add_key_to_inifile
390
+ ini_file = IniFile.new(:filename => "test/data/tmp.ini")
391
+ ini_file["new_section"] = {}
392
+ ini_file.save
393
+
394
+ assert File.read("test/data/tmp.ini") =~ /\[new_section\]/
395
+ end
396
+
397
+ def test_adds_correct_key_to_inifile
398
+ ini_file = IniFile.new(:filename => "test/data/tmp.ini")
399
+ ini_file["foo"] = {}
400
+ ini_file.save
401
+
402
+ assert File.read("test/data/tmp.ini") =~ /\[foo\]/
403
+ end
404
+
405
+ def test_assigns_values_to_inifile
406
+ ini_file = IniFile.new(:filename => "test/data/tmp.ini")
407
+ ini_file["foo"] = {
408
+ :bar => "baz"
409
+ }
410
+
411
+ assert_equal ini_file["foo"], { :bar => "baz" }
412
+ end
413
+
414
+ def test_assigns_correct_values_to_inifile
415
+ ini_file = IniFile.new(:filename => "test/data/tmp.ini")
416
+ ini_file["foo"] = {
417
+ :one => "two"
418
+ }
419
+
420
+ assert_equal ini_file["foo"], { :one => "two" }
421
+ end
422
+
423
+ def test_assignment_stringifies_key
424
+ ini_file = IniFile.new(:filename => "test/data/tmp.ini")
425
+ ini_file["foo"] = {:one => :two}
426
+ ini_file[:foo] = {}
427
+ assert_equal ini_file["foo"], {}
428
+ end
429
+
430
+ def test_multiline_parsing
431
+ ini_file = IniFile.load('test/data/multiline.ini')
432
+
433
+ multiline = ini_file['section_three']
434
+ expected = {"three" => "hello multiline", "other" => "stuff"}
435
+ assert_equal expected, multiline
436
+
437
+ multiple = ini_file['section_four']
438
+ expected = {"four" => "hello multiple multilines",
439
+ "five" => "multiple lines\ninside of quotations\npreserve everything" }
440
+ assert_equal expected, multiple
441
+
442
+ multiple = ini_file['empty_lines']
443
+ expected = {'empty' => nil, 'not_empty' => 'full'}
444
+ assert_equal expected, multiple
445
+ end
446
+
447
+ def test_merge
448
+ ini_file = @ini_file.merge(IniFile.load("test/data/merge.ini"))
449
+ assert_equal 3, ini_file['section_one']['one']
450
+ assert_equal 2, ini_file['section_one']['two']
451
+
452
+ # make sure that the rest haven't changed
453
+ assert_equal(-3, ini_file['section_two']['three'])
454
+
455
+ # and that we got any additional sections too
456
+ assert_equal 5, ini_file['section_five']['five']
457
+
458
+ # original object is unchanged
459
+ assert_equal 1, @ini_file['section_one']['one']
460
+ end
461
+
462
+ def test_merge_hash
463
+ ini_file = @ini_file.merge({
464
+ 'section_one' => { 'one' => 3 },
465
+ 'section_five' => { 'five' => 5 }
466
+ })
467
+ assert_equal 3, ini_file['section_one']['one']
468
+ assert_equal 2, ini_file['section_one']['two']
469
+
470
+ # make sure that the rest haven't changed
471
+ assert_equal(-3, ini_file['section_two']['three'])
472
+
473
+ # and that we got any additional sections too
474
+ assert_equal 5, ini_file['section_five']['five']
475
+
476
+ # original object is unchanged
477
+ assert_equal 1, @ini_file['section_one']['one']
478
+ end
479
+
480
+ def test_merge_invalid_hash
481
+ bad_hash = { 'section_one' => [1, 2, 3, 4] }
482
+ assert_raise(IniFile::Error) { @ini_file.merge(bad_hash) }
483
+
484
+ not_a_hash = [['section_one', ['foo','bar'], ['baz', 'buz']]]
485
+ assert_raise(IniFile::Error) { @ini_file.merge(not_a_hash) }
486
+
487
+ ini_file = @ini_file.merge nil
488
+ assert ini_file.eql?(@ini_file)
489
+ end
490
+
491
+ def test_parse_encoding
492
+ ini_file = IniFile.new(:filename => "test/data/browscap.ini", :encoding => 'ISO-8859-1')
493
+ assert_equal ini_file['www.substancia.com AutoHTTPAgent (ver *)']['Browser'], "Subst\xE2ncia".force_encoding('ISO-8859-1')
494
+ end
495
+
496
+ def test_write_encoding
497
+ tmp = 'test/data/tmp.ini'
498
+ File.delete tmp if Kernel.test(?f, tmp)
499
+
500
+ @ini_file = IniFile.new(:filename => tmp, :encoding => 'UTF-8')
501
+ @ini_file['testutf-8'] = {"utf-8" => "appr\u20accier"}
502
+
503
+ @ini_file.save(:filename => tmp)
504
+
505
+ test = File.open(tmp)
506
+ assert_equal test.external_encoding.to_s, 'UTF-8'
507
+ end
508
+
509
+ def test_value_escaping
510
+ ini_file = IniFile.load('test/data/escape.ini')
511
+ escaped = ini_file['escaped']
512
+
513
+ assert_equal %Q{There is a tab\tcharacter in here somewhere}, escaped['tabs']
514
+ assert_equal %Q{Who uses these anyways?\r}, escaped['carriage return']
515
+ assert_equal %Q{Trust newline!\nAlways there when you need him.\nSplittin' those lines.}, escaped['newline']
516
+ assert_equal %Q{Who'd be silly enough to put\0 a null character in the middle of a string? Stroustrup would not approve!}, escaped['null']
517
+ assert_equal %q{This string \t contains \n no \r special \0 characters!}, escaped['backslash']
518
+ assert_equal %Q{Escaping works\tinside quoted strings!}, escaped['quoted']
519
+ end
520
+
521
+ # disabling escaping is no longer supported
522
+ def test_value_escaping_disabled
523
+ ini_file = IniFile.load('test/data/escape.ini', :escape => false)
524
+ escaped = ini_file['escaped']
525
+
526
+ assert_equal %Q{There is a tab\tcharacter in here somewhere}, escaped['tabs']
527
+ assert_equal %Q{Who uses these anyways?\r}, escaped['carriage return']
528
+ assert_equal %Q{Trust newline!\nAlways there when you need him.\nSplittin' those lines.}, escaped['newline']
529
+ assert_equal %Q{Who'd be silly enough to put\0 a null character in the middle of a string? Stroustrup would not approve!}, escaped['null']
530
+ assert_equal %q{This string \t contains \n no \r special \0 characters!}, escaped['backslash']
531
+ assert_equal %Q{Escaping works\tinside quoted strings!}, escaped['quoted']
532
+ end
533
+
534
+ def test_global_section
535
+ ini_file = IniFile.load('test/data/global.ini')
536
+
537
+ assert_equal %w[global], ini_file.sections
538
+ assert_equal 1, ini_file['global']['one']
539
+ assert_equal 2, ini_file['global']['two']
540
+ end
541
+
542
+ def test_default_global_section
543
+ ini_file = IniFile.load('test/data/global.ini', :default => 'nonce')
544
+
545
+ assert_equal %w[nonce], ini_file.sections
546
+ assert_equal 1, ini_file['nonce']['one']
547
+ assert_equal 2, ini_file['nonce']['two']
548
+ end
549
+
550
+ def test_unescaped_section_header_as_value
551
+ ini_file = IniFile.load('test/data/section.ini')
552
+
553
+ assert_equal %w[section_one], ini_file.sections
554
+ assert_equal '[value]', ini_file['section_one']['one']
555
+ assert_equal 2, ini_file['section_one']['two']
556
+ end
557
+
558
+ def test_unmatched_quotes
559
+ # missing a closing quote should raise an error
560
+ assert_raise(IniFile::Error) { IniFile.load 'test/data/bad_2.ini' }
561
+ end
562
+
563
+ def test_continuation_at_end_of_file
564
+ ini_file = IniFile.load('test/data/continuation.ini')
565
+
566
+ assert_equal 1, ini_file['section_one']['one']
567
+ assert_equal 2, ini_file['section_one']['two']
568
+
569
+ assert_equal 'here is the last value', ini_file['section_two']['end-of-file']
570
+ end
571
+
572
+ def test_empty_comment_string
573
+ ini_file = IniFile.load('test/data/merge.ini', :comment => nil)
574
+
575
+ assert_equal 3, ini_file['section_one']['one']
576
+ assert_equal 5, ini_file['section_five']['five']
577
+ end
578
+
579
+ def test_integer_typecast
580
+ ini_file = IniFile.load('test/data/typecast.ini')
581
+ assert_equal 146, ini_file['section_one']['int1']
582
+ assert_equal "00342", ini_file['section_one']['string1']
583
+ end
584
+
585
+ def test_float_typecast
586
+ ini_file = IniFile.load('test/data/typecast.ini')
587
+ assert_equal 0.35, ini_file['section_one']['float1']
588
+ assert_equal 0.634, ini_file['section_one']['float2']
589
+ assert_equal 234.646, ini_file['section_one']['float3']
590
+ assert_equal "345.", ini_file['section_one']['string2']
591
+ end
592
+
593
+ def test_switch_support_read
594
+ ini_file = IniFile.load('test/data/switch.ini')
595
+
596
+ assert_equal({}, ini_file['section_six']['switch_support'])
597
+ end
598
+
599
+ def test_switch_support_write
600
+ ini_file = IniFile.new(:filename => "test/data/tmp.ini")
601
+ ini_file["foo"] = {"switch_support" => {}}
602
+ ini_file.save
603
+
604
+ assert File.read("test/data/tmp.ini") =~ /^switch_support$/
605
+ end
606
+ end
607
+
608
+ class TestCustomIniFile < Test::Unit::TestCase
609
+
610
+ def setup
611
+ FileUtils.rm_rf "test/data/tmp.ini"
612
+ FileUtils.cp "test/data/good.ini", "test/data/tmp.ini"
613
+ end
614
+
615
+ def test_force_array
616
+ ini_file = IniFile.load('test/data/force_array.ini', force_array: true)
617
+ assert_equal 1, ini_file['section_one']['one']
618
+ assert_equal [2, "zinga", 'new foils'], ini_file['section_one']['two']
619
+
620
+ tmp = 'test/data/tmp.ini'
621
+ File.delete tmp if Kernel.test(?f, tmp)
622
+
623
+ ini_file.save(:filename => tmp)
624
+
625
+ lines = IO.readlines(tmp).map(&:chomp).keep_if{|x| x.size > 0}
626
+ assert_equal 5, lines.size
627
+ assert_equal ["[section_one]", "one = 1", "two = 2", "two = zinga", "two = new foils"], lines
628
+ end
629
+ end