cldwalker-hirb 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,164 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper')
2
+
3
+ module Hirb
4
+ class PagerTest < Test::Unit::TestCase
5
+ def pager; View.pager; end
6
+
7
+ def create_pageable_string(inspect_mode=false, size={})
8
+ size = {:width=>pager.width, :height=>pager.height}.merge(size)
9
+ seed = inspect_mode ? "a" : "a\n"
10
+ if inspect_mode
11
+ seed * (size[:width] * size[:height] + 1)
12
+ else
13
+ seed * (size[:height] + 1)
14
+ end
15
+ end
16
+
17
+ test "command_pager sets pager_command when command exists" do
18
+ Util.expects(:command_exists?).returns(true)
19
+ Pager.expects(:basic_pager)
20
+ Pager.command_pager 'blah', :pager_command=>'less'
21
+ end
22
+
23
+ test "command_pager doesn't set pager_command when command doesn't exist" do
24
+ Util.expects(:command_exists?).returns(false)
25
+ Pager.expects(:basic_pager).never
26
+ Pager.command_pager 'blah', :pager_command=>'moreless'
27
+ end
28
+
29
+ context "default_pager" do
30
+ before(:all) { reset_config; Hirb.enable {|c| c.pager = true}}
31
+ before(:each) { View.pager = nil; Pager.stubs(:pager_command).returns(nil) }
32
+ after(:all) { Hirb.disable }
33
+
34
+ test "pages once in normal mode" do
35
+ $stdin.expects(:gets).returns("\n")
36
+ output = capture_stdout { pager.page(create_pageable_string, false) }
37
+ output.include?('quit').should be(true)
38
+ output.include?('finished').should be(true)
39
+ end
40
+
41
+ test "doesn't page in normal mode" do
42
+ $stdin.expects(:gets).never
43
+ output = capture_stdout { pager.page("a\n", false) }
44
+ output.include?("a\n=== Pager finished. ===\n").should be(true)
45
+ end
46
+
47
+ test "pages once in inspect mode" do
48
+ $stdin.expects(:gets).returns("\n")
49
+ output = capture_stdout { pager.page(create_pageable_string(true), true) }
50
+ output.include?('quit').should be(true)
51
+ output.include?('finished').should be(true)
52
+ end
53
+
54
+ test "doesn't page in inspect mode" do
55
+ $stdin.expects(:gets).never
56
+ output = capture_stdout { pager.page("a", true) }
57
+ output.include?("a\n=== Pager finished. ===\n").should be(true)
58
+ end
59
+ end
60
+
61
+ context "pager" do
62
+ before(:all) { reset_config; Hirb.enable }
63
+ before(:each) { View.pager = nil; View.formatter = nil }
64
+ after(:all) { Hirb.disable }
65
+
66
+ def irb_eval(string)
67
+ context_stub = stub(:last_value=>string)
68
+ ::IRB::Irb.new(context_stub).output_value
69
+ end
70
+
71
+ # this mode is called within @irb.output_value
72
+ context "in inspect_mode" do
73
+ test "activates when output is wide enough" do
74
+ output = create_pageable_string(true)
75
+ pager.expects(:page).with(output.inspect, true)
76
+ View.expects(:render_output).returns(false)
77
+ irb_eval output
78
+ end
79
+
80
+ test "doesn't activate when output isn't wide enough" do
81
+ pager.expects(:page).never
82
+ View.expects(:render_output).returns(false)
83
+ irb_eval("a")
84
+ end
85
+
86
+ test "activates with an explicit width" do
87
+ View.config[:width] = 10
88
+ output = create_pageable_string true, :width=>10
89
+ pager.expects(:page).with(output.inspect, true)
90
+ View.expects(:render_output).returns(false)
91
+ irb_eval output
92
+ end
93
+
94
+ test "activates default_pager when pager command is invalid" do
95
+ Pager.expects(:pager_command).returns(nil)
96
+ output = create_pageable_string(true)
97
+ Pager.expects(:default_pager).with(output.inspect, anything)
98
+ View.expects(:render_output).returns(false)
99
+ capture_stdout { irb_eval output }
100
+ end
101
+ end
102
+
103
+ # this mode is called within Hirb::View.render_output
104
+ context "in normal mode" do
105
+ test "activates when output is long enough" do
106
+ output = create_pageable_string
107
+ View.formatter.expects(:format_output).returns(output)
108
+ pager.expects(:page).with(output, false)
109
+ irb_eval(output)
110
+ end
111
+
112
+ test "doesn't activate when output isn't long enough" do
113
+ output = "a\n"
114
+ View.formatter.expects(:format_output).returns(output)
115
+ pager.expects(:page).never
116
+ capture_stdout { irb_eval(output) }
117
+ end
118
+
119
+ test "activates with an explicit height" do
120
+ View.config[:height] = 100
121
+ output = create_pageable_string false, :height=>100
122
+ View.formatter.expects(:format_output).returns(output)
123
+ pager.expects(:page).with(output, false)
124
+ irb_eval(output)
125
+ end
126
+
127
+ test "activates default_pager when pager_command is invalid" do
128
+ Pager.expects(:pager_command).returns(nil)
129
+ output = create_pageable_string
130
+ Pager.expects(:default_pager).with(output, anything)
131
+ View.formatter.expects(:format_output).returns(output)
132
+ capture_stdout { irb_eval output }
133
+ end
134
+ end
135
+
136
+ test "activates pager_command with valid pager_command option" do
137
+ View.config[:pager_command] = "less"
138
+ View.expects(:render_output).returns(false)
139
+ Util.expects(:command_exists?).returns(true)
140
+ Pager.expects(:command_pager)
141
+ irb_eval create_pageable_string(true)
142
+ View.config[:pager_command] = nil
143
+ end
144
+
145
+ test "activates pager_command with pager_command option that has command options" do
146
+ View.config[:pager_command] = "less -r"
147
+ View.expects(:render_output).returns(false)
148
+ Util.expects(:command_exists?).with('less').returns(true)
149
+ Pager.expects(:command_pager)
150
+ irb_eval create_pageable_string(true)
151
+ View.config[:pager_command] = nil
152
+ end
153
+
154
+ test "doesn't activate pager_command with invalid pager_command option" do
155
+ View.config[:pager_command] = "moreless"
156
+ View.expects(:render_output).returns(false)
157
+ Util.expects(:command_exists?).returns(false)
158
+ Pager.expects(:default_pager)
159
+ irb_eval create_pageable_string(true)
160
+ View.config[:pager_command] = nil
161
+ end
162
+ end
163
+ end
164
+ end
data/test/table_test.rb CHANGED
@@ -4,6 +4,7 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
4
4
  def table(*args)
5
5
  Hirb::Helpers::Table.render(*args)
6
6
  end
7
+ before(:all) { reset_config }
7
8
 
8
9
  context "basic table" do
9
10
  test "renders" do
@@ -89,6 +90,12 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
89
90
  TABLE
90
91
  table([[1,2,3]], :fields=>[0,2]).should == expected_table
91
92
  end
93
+
94
+ test "fields and number options copies fields option and does not modify it" do
95
+ options = {:fields=>[:f1], :number=>true}
96
+ table({:f1=>1, :f2=>2}, options)
97
+ options[:fields].should == [:f1]
98
+ end
92
99
 
93
100
  test "invalid fields option renders empty columns" do
94
101
  expected_table = <<-TABLE.unindent
@@ -141,11 +148,11 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
141
148
 
142
149
  test "max_width option renders" do
143
150
  expected_table = <<-TABLE.unindent
144
- +--------------------------+---+------------+
145
- | a | b | c |
146
- +--------------------------+---+------------+
147
- | AAAAAAAAAAAAAAAAAAAAA... | 2 | CCCCCCCCCC |
148
- +--------------------------+---+------------+
151
+ +-----------+---+-----------+
152
+ | a | b | c |
153
+ +-----------+---+-----------+
154
+ | AAAAAA... | 2 | CCCCCC... |
155
+ +-----------+---+-----------+
149
156
  1 row in set
150
157
  TABLE
151
158
  table([{:a=> "A" * 50, :b=>2, :c=>"C"*10}], :max_width=>30).should == expected_table
@@ -163,18 +170,19 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
163
170
  table([{:a=> "A" * 50, :b=>2, :c=>"C"*10}], :max_width=>nil).should == expected_table
164
171
  end
165
172
 
166
- test "global max_width renders" do
173
+ test "global width renders" do
167
174
  expected_table = <<-TABLE.unindent
168
- +--------------------------+---+------------+
169
- | a | b | c |
170
- +--------------------------+---+------------+
171
- | AAAAAAAAAAAAAAAAAAAAA... | 2 | CCCCCCCCCC |
172
- +--------------------------+---+------------+
175
+ +-----------+---+-----------+
176
+ | a | b | c |
177
+ +-----------+---+-----------+
178
+ | AAAAAA... | 2 | CCCCCC... |
179
+ +-----------+---+-----------+
173
180
  1 row in set
174
181
  TABLE
175
- Hirb::Helpers::Table.max_width = 30
182
+ Hirb::View.load_config
183
+ Hirb::View.resize(30)
176
184
  table([{:a=> "A" * 50, :b=>2, :c=>"C"*10}]).should == expected_table
177
- Hirb::Helpers::Table.max_width = Hirb::Helpers::Table::DEFAULT_MAX_WIDTH
185
+ reset_config
178
186
  end
179
187
 
180
188
  test "headers option and headers longer than fields renders" do
@@ -201,7 +209,7 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
201
209
  table([{:a=> "A", :b=>2}], :headers=>{:a=>"field A"}, :field_lengths=>{:a=>5}).should == expected_table
202
210
  end
203
211
 
204
- test "with headers option as an array renders" do
212
+ test "headers option as an array renders" do
205
213
  expected_table = <<-TABLE.unindent
206
214
  +---+---+
207
215
  | A | B |
@@ -214,11 +222,37 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
214
222
  table([[1,2], [3,4]], :headers=>['A', 'B']).should == expected_table
215
223
  end
216
224
 
225
+ test "filters option renders" do
226
+ expected_table = <<-TABLE.unindent
227
+ +-----------+---+
228
+ | 0 | 1 |
229
+ +-----------+---+
230
+ | s,o,m,e | 2 |
231
+ | t,h,i,n,g | 1 |
232
+ +-----------+---+
233
+ 2 rows in set
234
+ TABLE
235
+ table([['some', {:num=>2}], ['thing', {:num=>1}]], :filters=>{0=>lambda {|e| e.split("").join(",")},
236
+ 1=>[:[], :num]}).should == expected_table
237
+ end
238
+
239
+ test "number option renders" do
240
+ expected_table = <<-TABLE.unindent
241
+ +--------+---+---+
242
+ | number | 0 | 1 |
243
+ +--------+---+---+
244
+ | 1 | a | b |
245
+ | 2 | c | d |
246
+ +--------+---+---+
247
+ 2 rows in set
248
+ TABLE
249
+ table([['a','b'], ['c', 'd']], :number=>true).should == expected_table
250
+ end
217
251
  end
218
252
 
219
253
  context "object table" do
220
254
  before(:all) {
221
- @pets = [stub(:name=>'rufus', :age=>7), stub(:name=>'alf', :age=>101)]
255
+ @pets = [stub(:name=>'rufus', :age=>7, :to_s=>'rufus'), stub(:name=>'alf', :age=>101, :to_s=>'alf')]
222
256
  }
223
257
  test "renders" do
224
258
  expected_table = <<-TABLE.unindent
@@ -233,14 +267,38 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
233
267
  Hirb::Helpers::ObjectTable.render(@pets, :fields=>[:name, :age]).should == expected_table
234
268
  end
235
269
 
236
- test "with no options fields raises ArgumentError" do
237
- assert_raises(ArgumentError) { Hirb::Helpers::ObjectTable.render(@pets) }
270
+ test "with no options defaults to to_s field" do
271
+ expected_table = <<-TABLE.unindent
272
+ +-------+
273
+ | value |
274
+ +-------+
275
+ | rufus |
276
+ | alf |
277
+ +-------+
278
+ 2 rows in set
279
+ TABLE
280
+ Hirb::Helpers::ObjectTable.render(@pets).should == expected_table
281
+ end
282
+
283
+ test "renders simple arrays" do
284
+ expected_table = <<-TABLE.unindent
285
+ +-------+
286
+ | value |
287
+ +-------+
288
+ | 1 |
289
+ | 2 |
290
+ | 3 |
291
+ | 4 |
292
+ +-------+
293
+ 4 rows in set
294
+ TABLE
295
+ Hirb::Helpers::ObjectTable.render([1,2,3,4]).should == expected_table
238
296
  end
239
297
  end
240
298
 
241
299
  context "activerecord table" do
242
300
  before(:all) {
243
- @pets = [stub(:name=>'rufus', :age=>7, :attribute_names=>['age', 'name']), stub(:name=>'alf', :age=>101)]
301
+ @pets = [stub(:name=>'rufus', :age=>7, :class=>mock(:column_names=>[:age, :name])), stub(:name=>'alf', :age=>101)]
244
302
  }
245
303
  test "renders" do
246
304
  expected_table = <<-TABLE.unindent
@@ -255,9 +313,30 @@ class Hirb::Helpers::TableTest < Test::Unit::TestCase
255
313
  Hirb::Helpers::ActiveRecordTable.render(@pets).should == expected_table
256
314
  end
257
315
  end
258
-
259
- test "restrict_field_lengths handles many fields" do
316
+
317
+ test "restrict_field_lengths ensures columns total doesn't exceed max width" do
318
+ @table = Hirb::Helpers::Table.new([{:f1=>'f1', :f2=>'2', :f3=>'3', :f4=>'4'}])
319
+ field_lengths = {:f1=>135, :f2=>45, :f3=>4, :f4=>55}
320
+ width = 195
321
+ @table.restrict_field_lengths(field_lengths, width)
322
+ field_lengths.values.inject {|a,e| a+=e}.should <= width
323
+ end
324
+
325
+ test "restrict_field_lengths sets columns by relative lengths" do
326
+ @table = Hirb::Helpers::Table.new([{:a=>'a', :b=>'b', :c=>'c'}])
327
+ field_lengths = {:a=>30, :b=>30, :c=>40}
328
+ width = 60
329
+ @table.restrict_field_lengths(field_lengths, width)
330
+ field_lengths.values.inject {|a,e| a+=e}.should <= width
331
+ field_lengths.values.uniq.size.should_not == 1
332
+ end
333
+
334
+ test "restrict_field_lengths sets all columns equal when no long_field and relative methods don't work" do
260
335
  @table = Hirb::Helpers::Table.new([{:field1=>'f1', :field2=>'f2', :field3=>'f3'}])
261
- @table.restrict_field_lengths({:field1=>10, :field2=>15, :field3=>100}, 10)
336
+ field_lengths = {:field1=>10, :field2=>15, :field3=>100}
337
+ width = 20
338
+ @table.restrict_field_lengths(field_lengths, width)
339
+ field_lengths.values.inject {|a,e| a+=e}.should <= width
340
+ field_lengths.values.uniq.size.should == 1
262
341
  end
263
342
  end
data/test/test_helper.rb CHANGED
@@ -7,6 +7,26 @@ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
7
  require 'hirb'
8
8
 
9
9
  class Test::Unit::TestCase
10
+ # set these to avoid invoking stty multiple times which doubles test suite running time
11
+ ENV["LINES"] = ENV["COLUMNS"] = "20"
12
+ def reset_terminal_size
13
+ ENV["LINES"] = ENV["COLUMNS"] = "20"
14
+ end
15
+
16
+ def capture_stdout(&block)
17
+ original_stdout = $stdout
18
+ $stdout = fake = StringIO.new
19
+ begin
20
+ yield
21
+ ensure
22
+ $stdout = original_stdout
23
+ end
24
+ fake.string
25
+ end
26
+
27
+ def reset_config
28
+ Hirb::View.instance_eval "@config = nil"
29
+ end
10
30
  end
11
31
 
12
32
  class String
@@ -14,4 +34,14 @@ class String
14
34
  regex = num ? /^\s{#{num}}/ : /^\s*/
15
35
  gsub(regex, '').chomp
16
36
  end
37
+ end
38
+
39
+ # mocks IRB for View + Pager
40
+ module ::IRB
41
+ class Irb
42
+ def initialize(context)
43
+ @context = context
44
+ end
45
+ def output_value; end
46
+ end
17
47
  end
data/test/util_test.rb CHANGED
@@ -1,21 +1,56 @@
1
1
  require File.join(File.dirname(__FILE__), 'test_helper')
2
2
 
3
- class Hirb::UtilTest < Test::Unit::TestCase
4
- test "any_const_get returns nested class" do
5
- Hirb::Util.any_const_get("Test::Unit").should == ::Test::Unit
6
- end
7
-
8
- test "any_const_get returns nil for invalid class" do
9
- Hirb::Util.any_const_get("Basdfr").should == nil
10
- end
11
-
12
- test "any_const_get returns class when given class" do
13
- Hirb::Util.any_const_get(String).should == String
14
- end
15
-
16
- test "recursive_hash_merge merges" do
17
- expected_hash = {:output=>{:fields=>["f1", "f2"], :method=>"blah"}, :key1=>"hash1", :key2=>"hash2"}
18
- Hirb::Util.recursive_hash_merge({:output=>{:fields=>%w{f1 f2}}, :key1=>'hash1'},
19
- {:output=>{:method=>'blah'}, :key2=>'hash2'}).should == expected_hash
3
+ module Hirb
4
+ class UtilTest < Test::Unit::TestCase
5
+ test "any_const_get returns nested class" do
6
+ Util.any_const_get("Test::Unit").should == ::Test::Unit
7
+ end
8
+
9
+ test "any_const_get returns nil for invalid class" do
10
+ Util.any_const_get("Basdfr").should == nil
11
+ end
12
+
13
+ test "any_const_get returns class when given class" do
14
+ Util.any_const_get(String).should == String
15
+ end
16
+
17
+ test "recursive_hash_merge merges" do
18
+ expected_hash = {:output=>{:fields=>["f1", "f2"], :method=>"blah"}, :key1=>"hash1", :key2=>"hash2"}
19
+ Util.recursive_hash_merge({:output=>{:fields=>%w{f1 f2}}, :key1=>'hash1'},
20
+ {:output=>{:method=>'blah'}, :key2=>'hash2'}).should == expected_hash
21
+ end
22
+
23
+ test "choose_from_array specifies range with -" do
24
+ Util.choose_from_array([1,2,3,4], '1-2,4').should == [1,2,4]
25
+ end
26
+
27
+ test "choose_from_array specifies range with .." do
28
+ Util.choose_from_array([1,2,3,4], '1 .. 2,4').should == [1,2,4]
29
+ end
30
+
31
+ test "choose_from_array chooses all with *" do
32
+ Util.choose_from_array([1,2,3,4], '*').should == [1,2,3,4]
33
+ end
34
+
35
+ test "choose_from_array ignores non-numerical input" do
36
+ Util.choose_from_array([1,2,3,4], 'a,2').should == [2]
37
+ end
38
+
39
+ test "choose_from_array ignores 0" do
40
+ Util.choose_from_array([1,2,3,4], '0,2').should == [2]
41
+ end
42
+
43
+ test "choose_from_array returns empty when empty input" do
44
+ Util.choose_from_array([1,2,3,4], "\n").should == []
45
+ end
46
+
47
+ test "choose_from_array returns empty with an invalid range" do
48
+ Util.choose_from_array([1,2,3,4], "5").should == []
49
+ end
50
+
51
+ test "capture_stdout" do
52
+ string = "sweetness man"
53
+ Util.capture_stdout { puts string }.should == string + "\n"
54
+ end
20
55
  end
21
- end
56
+ end