awesome-cheeba 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,64 @@
1
+ module Cheeba
2
+ module Reader
3
+ module Parser
4
+ class IndentError < StandardError; end
5
+
6
+ def self.parse(line, opts, num)
7
+ results = self.parse_line(line, opts)
8
+ phs = self.results_to_hash(results, opts)
9
+ self.check_indent(line, phs[:spc], opts[:indent], num)
10
+ phs
11
+ end
12
+
13
+ ##
14
+ # invalid number of spaces, line num and truncated line for context
15
+ #
16
+ def self.check_indent(line, spc, idt, num)
17
+ raise IndentError, "#{num} #{line[1..50]}" if spc % idt != 0
18
+ end
19
+
20
+ ##
21
+ # parses line, returns array, dependent on Node module
22
+ #
23
+ def self.parse_line(line, opts)
24
+ chb = Cheeba::Reader::Node
25
+ spc = opts[:space]
26
+ hsh = opts[:hash]
27
+ sym = opts[:symbol]
28
+ dcs = opts[:doc_start]
29
+ dct = opts[:doc_term]
30
+ arr = opts[:array]
31
+ com = opts[:comment]
32
+
33
+ case line
34
+ when chb.left_match(arr, spc): [:arr, Regexp.last_match.captures]
35
+ when chb.left_match(com, spc): [:com, Regexp.last_match.captures]
36
+ when chb.hashkey_sym(hsh, sym, spc): [:hky, Regexp.last_match.captures, nil, true]
37
+ when chb.hashkey(hsh, spc): [:hky, Regexp.last_match.captures]
38
+ when chb.hashpair_sym_all(hsh, sym, spc): [:hpr, Regexp.last_match.captures, true, true]
39
+ when chb.hashpair_sym_key(hsh, sym, spc): [:hpr, Regexp.last_match.captures, true]
40
+ when chb.hashpair_sym_val(hsh, sym, spc): [:hpr, Regexp.last_match.captures, nil, true]
41
+ when chb.hashpair(hsh, sym, spc): [:hpr, Regexp.last_match.captures]
42
+ when /^\s*$/: [:bla]
43
+ when chb.document(dcs, spc): [:dcs]
44
+ when chb.document(dct, spc): [:dct]
45
+ else; [:mal, nil, nil, line]
46
+ end
47
+ end
48
+
49
+ ##
50
+ # creates hash with array vals, includes options
51
+ #
52
+ def self.results_to_hash(results, opt)
53
+ msg, spc, key, val, ask, asv = results.flatten
54
+ { :msg => msg,
55
+ :spc => (spc.nil? ? 0 : spc.length),
56
+ :key => key.to_s.sub(/^:/, ""),
57
+ :val => val.to_s.sub(/^:/, ""),
58
+ :ask => ask,
59
+ :asv => asv,
60
+ :opt => opt}
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ module Cheeba
2
+ VERSION = '1.0.1'
3
+ end
@@ -0,0 +1,49 @@
1
+ require 'cheeba/writer/builder'
2
+
3
+ module Cheeba
4
+ module Writer
5
+ class EmptyFilenameError < StandardError; end
6
+ class EmptyInputError < StandardError; end
7
+ class InvalidInputError < StandardError; end
8
+ class InvalidFilenameError < StandardError; end
9
+ #
10
+ # array, hash, or string to array of lines of .cash file
11
+ #
12
+ def self.build(object, options)
13
+ raise Cheeba::Writer::EmptyInputError if (object.is_a?(String) && object.strip.empty?)
14
+ raise Cheeba::Writer::InvalidInputError unless (object.is_a?(String) or object.is_a?(Array) or object.is_a?(Hash))
15
+ Cheeba::Writer::Builder.build([], object, options)
16
+ end
17
+
18
+ #
19
+ # array, hash, or string to file
20
+ #
21
+ def self.write(object, filename, options)
22
+ filename = "#{ENV['HOME']}/#{File.basename(filename.to_s)}" if (filename =~ /^~/)
23
+ raise Cheeba::Writer::EmptyInputError if (object.is_a?(String) && object.strip.empty?)
24
+ raise Cheeba::Writer::InvalidInputError unless (object.is_a?(String) or object.is_a?(Array) or object.is_a?(Hash))
25
+ raise Cheeba::Writer::EmptyFilenameError if File.basename(filename.to_s).strip.empty?
26
+ raise Cheeba::Writer::InvalidFilenameError unless File.exists?(File.dirname(filename))
27
+ File.open(filename, "w") do |file|
28
+ self.build(object, options).each {|line|
29
+ file.print("#{line}\n")
30
+ }
31
+ end
32
+ filename
33
+ end
34
+
35
+ #
36
+ # write a cheeba dotfile to home dir
37
+ #
38
+ def self.dotfile(options, home)
39
+ filename = "#{home.chomp("/")}/.cheeba"
40
+ new_name = nil
41
+ if File.exists?(filename)
42
+ new_name = "#{filename}.#{Time.now.strftime("%Y%m%d%H%M%S")}"
43
+ File.rename(filename, new_name)
44
+ end
45
+ self.write(options, filename, Cheeba::Indicators.options)
46
+ new_name ? new_name : filename
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,95 @@
1
+ module Cheeba
2
+ module Writer
3
+ module Builder
4
+ def self.build(arr, inp, opt)
5
+ spc = (opt[:space] * opt[:indent])
6
+ case
7
+ when inp.is_a?(Hash): self.hash_to_array(arr, inp, opt, spc)
8
+ when inp.is_a?(Array): self.array_to_lines(arr, inp, opt, spc)
9
+ when inp.is_a?(String): self.string_to_array(arr, inp, opt, spc)
10
+ end
11
+ arr
12
+ end
13
+
14
+ def self.sym_to_str(x, y = nil)
15
+ a = x.is_a?(Symbol) ? x.inspect : x
16
+ b = (!y.nil? && y.is_a?(Symbol)) ? y.inspect : y
17
+ [a, b]
18
+ end
19
+
20
+ def self.string_to_array(arr, inp, opt, spc)
21
+ self.array_to_lines(arr, inp.split(opt[:line_end]), opt, spc)
22
+ end
23
+
24
+ def self.hash_to_array(arr, inp, opt, spc)
25
+ inp.each do |key,val|
26
+ case
27
+ when val.is_a?(Hash)
28
+ key = self.sym_to_str(key)
29
+ arr << opt[:doc_start] if opt[:docs]
30
+ arr << "#{key}#{opt[:hash]}" unless opt[:docs]
31
+ self.hash_to_lines(arr, val, val.keys, opt, spc, (opt[:docs] ? 0 : 1))
32
+ when val.is_a?(Array)
33
+ arr << opt[:doc_start] if opt[:docs]
34
+ self.array_to_lines(arr, val, opt)
35
+ else
36
+ key, val = self.sym_to_str(key, val)
37
+ arr << "#{key}#{opt[:hash]} #{val}"
38
+ end
39
+ end
40
+ end
41
+
42
+ #
43
+ # line is array, push each indice to array, assumes every indice is a string
44
+ #
45
+ def self.array_to_lines(arr, val, opt, spc, idt = nil)
46
+ idt = 0 if idt.nil?
47
+ ist = spc * idt
48
+ ind = opt[:array]
49
+ until val.empty? do
50
+ x = val.shift
51
+ case
52
+ when x.is_a?(Hash)
53
+ arr << "#{ist}#{ind}"
54
+ self.hash_to_lines(arr, x, x.keys, opt, spc, (idt + 1))
55
+ when x.is_a?(Array)
56
+ i = idt
57
+ arr << "#{ist}#{ind}" if opt[:yaml]
58
+ i += 1
59
+ self.array_to_lines(arr, x, opt, spc, i)
60
+ else
61
+ x = self.sym_to_str(x)
62
+ arr << "#{ist}#{ind} #{x}"
63
+ end
64
+ end
65
+ end
66
+
67
+ #
68
+ # recursively add lines to array
69
+ #
70
+ def self.hash_to_lines(arr, hsh, kys, opt, spc, idt = nil)
71
+ idt = 0 if idt.nil?
72
+ while !kys.empty?
73
+ ist = spc * idt
74
+ key = kys.shift
75
+ val = hsh[key]
76
+ ind = opt[:hash]
77
+ case
78
+ when val.is_a?(Hash)
79
+ # push key into lines_array
80
+ arr << "#{ist}#{key}#{ind}"
81
+ # step indent
82
+ # call this again (the recursive part)
83
+ self.hash_to_lines(arr, val, val.keys, opt, spc, (idt + 1))
84
+ when val.is_a?(Array)
85
+ arr << "#{ist}#{key}#{ind}"
86
+ self.array_to_lines(arr, val, opt, spc, (idt + 1))
87
+ else
88
+ # if not Writer or Array, it must be String
89
+ arr << "#{ist}#{key}#{ind} #{val}"
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,15 @@
1
+ -
2
+ - 1
3
+ - 2
4
+ -
5
+ -
6
+ -
7
+ - awesome
8
+ - awesome
9
+ - 4
10
+ - 5
11
+ - 6
12
+ - 7
13
+ - 8
14
+ - dude
15
+ -
File without changes
@@ -0,0 +1,17 @@
1
+ # dude
2
+ 1: 1
3
+ # awesome
4
+ 2: 2
5
+ #
6
+ # camaro
7
+ #
8
+ 3: 3
9
+ ##
10
+ # nice
11
+ # one
12
+ # bro!
13
+ #
14
+ 4:
15
+ - 1
16
+ - 2
17
+ - 3
@@ -0,0 +1,26 @@
1
+ grocery_list:
2
+ beer:
3
+ 1:
4
+ model: 24 pack - Coors Lite
5
+ count: 1
6
+ meatsez:
7
+ 1:
8
+ model: Spam
9
+ count: 5
10
+ 2:
11
+ model: Log of ground beef
12
+ count: 1
13
+ cigarettes:
14
+ 1:
15
+ model: Carton - Basic Ultra Menthol Box 100
16
+ count: 2
17
+ other:
18
+ 1:
19
+ model: Economy-Size Pork & Beans
20
+ count: 2
21
+ 2:
22
+ model: Jumbo Miracle Whip
23
+ count: 1
24
+ 3:
25
+ model: White Wonder Bread
26
+ count: 2
@@ -0,0 +1,3 @@
1
+ 2341234
2
+ awesome
3
+ dude
@@ -0,0 +1,12 @@
1
+ 1:1
2
+ 2:
3
+ -
4
+ - one
5
+ - two
6
+ 5:
7
+ 6:6
8
+ 7:7
9
+ 8:
10
+ dude:dude
11
+ -
12
+ 3: awesome
@@ -0,0 +1,9 @@
1
+ 1:1
2
+ 2:3
3
+ 3:3
4
+ - 1
5
+ - 2
6
+ - 3
7
+ 1:1
8
+ 2:2
9
+ 3:3
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require 'rubygems'
4
+ require 'minitest/unit'
5
+ $: << 'lib' << 'test'
6
+ require 'cheeba'
7
+ MiniTest::Unit.autorun
8
+
9
+ class TestCheeba < MiniTest::Unit::TestCase
10
+ def setup
11
+ @files = "#{File.dirname(__FILE__)}/files"
12
+ @test = "#{@files}/test.cash"
13
+ @opt = Cheeba::Defaults.options.merge(Cheeba::Indicators.options)
14
+ @hom = ENV['HOME']
15
+ @dot = "#{@hom}/.cheeba"
16
+ @hsh = {
17
+ "grocery_list" => {
18
+ "meatsez" => {
19
+ 1 => {"count"=>5, "model"=>"Spam"},
20
+ 2 => {"count"=>1, "model"=>"Log of ground beef"}},
21
+ "beer"=>{1=>{"count"=>1, "model"=>"24 pack - Coors Lite"}},
22
+ "cigarettes" => {
23
+ 1 => {"count"=>2, "model"=>"Carton - Basic Ultra Menthol Box 100"}},
24
+ "other" => {
25
+ 1 => {"count"=>2, "model"=>"Economy-Size Pork & Beans"},
26
+ 2 => {"count"=>1, "model"=>"Jumbo Miracle Whip"},
27
+ 3 => {"count"=>2, "model"=>"White Wonder Bread"}}}}
28
+ @exp =
29
+ ["grocery_list:",
30
+ " meatsez:",
31
+ " 1:",
32
+ " count: 5",
33
+ " model: Spam",
34
+ " 2:",
35
+ " count: 1",
36
+ " model: Log of ground beef",
37
+ " cigarettes:",
38
+ " 1:",
39
+ " count: 2",
40
+ " model: Carton - Basic Ultra Menthol Box 100",
41
+ " beer:",
42
+ " 1:",
43
+ " count: 1",
44
+ " model: 24 pack - Coors Lite",
45
+ " other:",
46
+ " 1:",
47
+ " count: 2",
48
+ " model: Economy-Size Pork & Beans",
49
+ " 2:",
50
+ " count: 1",
51
+ " model: Jumbo Miracle Whip",
52
+ " 3:",
53
+ " count: 2",
54
+ " model: White Wonder Bread"]
55
+ end
56
+
57
+ def test_read_hash
58
+ act = Cheeba.read("#{@files}/hashes.cash")
59
+ assert_equal @hsh, act
60
+ end
61
+
62
+ def test_read_hash_options_symbolize_keys
63
+ hsh = ":awesome: dude"
64
+ exp = {:awesome => "dude"}
65
+ act = Cheeba.read(hsh, {:symbolize_keys => true})
66
+ assert_equal exp, act
67
+ end
68
+
69
+ def test_read_string
70
+ str = IO.read("#{@files}/hashes.cash")
71
+ act = Cheeba.read(str)
72
+ assert_equal @hsh, act
73
+ end
74
+
75
+ def test_parse_hash
76
+ act = Cheeba.parse(@hsh)
77
+ assert_equal @exp, act
78
+ end
79
+
80
+ def test_write
81
+ File.delete(@test) if File.exists?(@test)
82
+ refute(File.exists?(@test), "dude!")
83
+ Cheeba.write(@hsh, @test)
84
+ act = (IO.readlines(@test).map {|x| x.chomp})
85
+ assert(File.exists?(@test))
86
+ assert_equal @exp, act
87
+ File.delete(@test)
88
+ end
89
+
90
+ def test_dotfile
91
+ File.delete(@dot) if File.exists?(@dot)
92
+ refute(File.exists?(@dot), "dude!")
93
+ Cheeba.dotfile
94
+ assert(File.exists?(@dot))
95
+ exp_keys = Cheeba::Defaults.options
96
+ act_keys = Cheeba::Reader.read(@dot, @opt.merge({:symbolize_keys => true}))
97
+ assert_equal exp_keys, act_keys
98
+ File.delete(@dot)
99
+ end
100
+
101
+ def test_dotfile_exists
102
+ len = Dir.entries(@hom).length
103
+ mv_by_test = (File.exists?(@dot) ? "#{@dot}.mv_by_test" : "")
104
+ File.rename(@dot, mv_by_test) unless mv_by_test.empty?
105
+ refute(File.exists?(@dot), "dude!")
106
+ dot = Cheeba.dotfile
107
+ assert File.exists?(@dot)
108
+ assert File.exists?(dot)
109
+ assert_equal len, (Dir.entries(@hom).length - 1)
110
+ File.delete(@dot) if File.exists?(@dot)
111
+ File.delete(dot) if File.exists?(dot)
112
+ refute(File.exists?(@dot), "dude!")
113
+ refute(File.exists?(dot), "dude!")
114
+ File.rename(mv_by_test, @dot) if File.exists?(mv_by_test)
115
+ end
116
+
117
+ def test_read_raise_on_empty_string
118
+ assert_raises(Cheeba::Reader::EmptyInputError) {Cheeba.read("")}
119
+ end
120
+ end
@@ -0,0 +1,210 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require 'rubygems'
4
+ require 'minitest/unit'
5
+ $: << 'lib' << 'test'
6
+ require 'cheeba/reader'
7
+ require 'cheeba/indicators'
8
+ require 'cheeba/defaults'
9
+ MiniTest::Unit.autorun
10
+
11
+ class TestReader < MiniTest::Unit::TestCase
12
+ def setup
13
+ @file_com = "test/files/comments.cash"
14
+ @file_arr = "test/files/arrays.cash"
15
+ @file_hsh = "test/files/hashes.cash"
16
+ @file_mix = "test/files/mixed.cash"
17
+ @file_mal = "test/files/malformed.cash"
18
+ @file_bla = "test/files/blank.cash"
19
+ @file_spl = "test/files/split.cash"
20
+ opt = Cheeba::Indicators.options
21
+ @opt = Cheeba::Defaults.options.merge(opt)
22
+ @reader = Cheeba::Reader
23
+ end
24
+
25
+ def test_test_files_exists
26
+ assert File.exists?(@file_com)
27
+ assert File.exists?(@file_arr)
28
+ assert File.exists?(@file_hsh)
29
+ assert File.exists?(@file_mix)
30
+ assert File.exists?(@file_mal)
31
+ assert File.exists?(@file_bla)
32
+ assert File.exists?(@file_spl)
33
+ end
34
+
35
+ def test_parse_string
36
+ exp1 = {"awesome" => "dude"}
37
+ exp2 = {1 => {"awesome" => "dude"}, :lst => {1 => "1"}}
38
+ act1 = @reader.read("awesome: dude", @opt.merge({:list => false}))
39
+ act2 = @reader.read("awesome: dude", @opt.merge({:list => true}))
40
+ assert_equal exp1, act1
41
+ assert_equal exp2, act2
42
+ end
43
+
44
+ def test_parse_empty_string_raise_emptystringerror
45
+ assert_raises(Cheeba::Reader::EmptyInputError) {@reader.read("", @opt)}
46
+ end
47
+
48
+ def test_parse_blank_file_raise_emptyfileerror
49
+ assert_raises(Cheeba::Reader::EmptyFileError) {@reader.read(@file_bla, @opt)}
50
+ end
51
+
52
+ def test_parse_blank_file_raise_invalidinputerror
53
+ assert_raises(Cheeba::Reader::InvalidInputError) {@reader.read({}, @opt)}
54
+ end
55
+
56
+ def test_parse_split_raise_rootnodeerror
57
+ assert_raises(Cheeba::Reader::Builder::RootNodeError) {
58
+ @reader.read(@file_spl, @opt.merge({:list => true}))
59
+ }
60
+ end
61
+
62
+ def test_parse_file_array
63
+ exp1 = ["", 1, 2, [["", "awesome", "awesome"]], 4, 5, 6, [7, [8], "dude"], ""]
64
+ exp2 = {1 => ["", 1, 2, [["", "awesome", "awesome"]], 4, 5, 6, [7, [8], "dude"], ""],
65
+ :lst=> {
66
+ 1 => "1",
67
+ 2 => "1",
68
+ 3 => "1",
69
+ 4 => "1",
70
+ 5 => "1,3",
71
+ 6 => "1,3,0",
72
+ 7 => "1,3,0",
73
+ 8 => "1,3,0",
74
+ 9 => "1",
75
+ 10 => "1",
76
+ 11 => "1",
77
+ 12 => "1,7",
78
+ 13 => "1,7,1",
79
+ 14 => "1,7",
80
+ 15 => "1"}}
81
+ act1 = @reader.read(@file_arr, @opt.merge({:list => false}))
82
+ act2 = @reader.read(@file_arr, @opt.merge({:list => true}))
83
+ assert_equal exp1, act1
84
+ assert_equal exp2, act2
85
+ end
86
+
87
+ def test_parse_file_hash
88
+ exp1 = {"grocery_list" =>
89
+ {"meatsez" =>
90
+ {1 => {"count" => 5, "model" => "Spam"},
91
+ 2 => {"count" => 1, "model" => "Log of ground beef"}},
92
+ "beer" => {1 => {"count" => 1, "model" => "24 pack - Coors Lite"}},
93
+ "cigarettes" =>
94
+ {1 => {"count" => 2, "model" => "Carton - Basic Ultra Menthol Box 100"}},
95
+ "other" =>
96
+ {1 => {"count" => 2, "model" => "Economy-Size Pork & Beans"},
97
+ 2 => {"count" => 1, "model" => "Jumbo Miracle Whip"},
98
+ 3 => {"count" => 2, "model" => "White Wonder Bread"}}}}
99
+ exp2 = {1 => {"grocery_list" =>
100
+ {"meatsez" =>
101
+ {1 => {"count" => 5, "model" => "Spam"},
102
+ 2 => {"count" => 1, "model" => "Log of ground beef"}},
103
+ "beer" => {1 => {"count" => 1, "model" => "24 pack - Coors Lite"}},
104
+ "cigarettes" =>
105
+ {1 => {"count" => 2, "model" => "Carton - Basic Ultra Menthol Box 100"}},
106
+ "other" =>
107
+ {1 => {"count" => 2, "model" => "Economy-Size Pork & Beans"},
108
+ 2 => {"count" => 1, "model" => "Jumbo Miracle Whip"},
109
+ 3 => {"count" => 2, "model" => "White Wonder Bread"}}}},
110
+ :lst =>
111
+ {1 => "1,grocery_list",
112
+ 2 => "1,grocery_list,beer",
113
+ 3 => "1,grocery_list,beer,1",
114
+ 4 => "1,grocery_list,beer,1",
115
+ 5 => "1,grocery_list,beer,1",
116
+ 6 => "1,grocery_list,meatsez",
117
+ 7 => "1,grocery_list,meatsez,1",
118
+ 8 => "1,grocery_list,meatsez,1",
119
+ 9 => "1,grocery_list,meatsez,1",
120
+ 10 => "1,grocery_list,meatsez,2",
121
+ 11 => "1,grocery_list,meatsez,2",
122
+ 12 => "1,grocery_list,meatsez,2",
123
+ 13 => "1,grocery_list,cigarettes",
124
+ 14 => "1,grocery_list,cigarettes,1",
125
+ 15 => "1,grocery_list,cigarettes,1",
126
+ 16 => "1,grocery_list,cigarettes,1",
127
+ 17 => "1,grocery_list,other",
128
+ 18 => "1,grocery_list,other,1",
129
+ 19 => "1,grocery_list,other,1",
130
+ 20 => "1,grocery_list,other,1",
131
+ 21 => "1,grocery_list,other,2",
132
+ 22 => "1,grocery_list,other,2",
133
+ 23 => "1,grocery_list,other,2",
134
+ 24 => "1,grocery_list,other,3",
135
+ 25 => "1,grocery_list,other,3",
136
+ 26 => "1,grocery_list,other,3"}}
137
+ act1 = @reader.read(@file_hsh, @opt.merge({:list => false}))
138
+ act2 = @reader.read(@file_hsh, @opt.merge({:list => true}))
139
+ assert_equal exp1, act1
140
+ assert_equal exp2, act2
141
+ end
142
+
143
+ def test_parse_file_mixed
144
+ exp1 = {1=>1,
145
+ 2 => ["", "one", "two", {5=>{6=>6, 7=>7}, 8=>{"dude"=>"dude"}}, ""],
146
+ 3 =>"awesome"}
147
+ exp2 = {1=>
148
+ {1=>1,
149
+ 2=>["", "one", "two", {5=>{6=>6, 7=>7}, 8=>{"dude"=>"dude"}}, ""],
150
+ 3=>"awesome"},
151
+ :lst => {
152
+ 1 => "1",
153
+ 2 => "1,2",
154
+ 3 => "1,2",
155
+ 4 => "1,2",
156
+ 5 => "1,2",
157
+ 6 => "1,2,3,5",
158
+ 7 => "1,2,3,5",
159
+ 8 => "1,2,3,5",
160
+ 9 => "1,2,3,8",
161
+ 10 => "1,2,3,8",
162
+ 11 => "1,2",
163
+ 12 => "1"}}
164
+ act1 = @reader.read(@file_mix, @opt.merge({:list => false}))
165
+ act2 = @reader.read(@file_mix, @opt.merge({:list => true}))
166
+ assert_equal exp1, act1
167
+ assert_equal exp2, act2
168
+ end
169
+
170
+ def test_parse_file_comments
171
+ exp1 = {1=>1, 2=>2, 3=>3, 4=>[1, 2, 3]}
172
+ exp2 = {1=>{1=>1, 2=>2, 3=>3, 4=>[1, 2, 3]},
173
+ :lst => {
174
+ 1 => "#COMMENT: dude",
175
+ 2 => "1",
176
+ 3 => "#COMMENT: awesome",
177
+ 4 => "1",
178
+ 5 => "#COMMENT: ",
179
+ 6 => "#COMMENT: camaro",
180
+ 7 => "#COMMENT: ",
181
+ 8 => "1",
182
+ 9 => "#COMMENT: #",
183
+ 10 => "#COMMENT: nice",
184
+ 11 => "#COMMENT: one",
185
+ 12 => "#COMMENT: bro!",
186
+ 13 => "#COMMENT: ",
187
+ 14 => "1,4",
188
+ 15 => "1,4",
189
+ 16 => "1,4",
190
+ 17 => "1,4"}}
191
+ act1 = @reader.read(@file_com, @opt.merge({:list => false}))
192
+ act2 = @reader.read(@file_com, @opt.merge({:list => true}))
193
+ assert_equal exp1, act1
194
+ assert_equal exp2, act2
195
+ end
196
+
197
+ def test_parse_file_malformed
198
+ exp1 = {}
199
+ exp2 = {
200
+ 1=>{},
201
+ :lst => {
202
+ 1 => "#MALFORMED: 2341234",
203
+ 2 => "#MALFORMED: awesome",
204
+ 3 => "#MALFORMED: dude"}}
205
+ act1 = @reader.read(@file_mal, @opt.merge({:list => false}))
206
+ act2 = @reader.read(@file_mal, @opt.merge({:list => true}))
207
+ assert_equal exp1, act1
208
+ assert_equal exp2, act2
209
+ end
210
+ end