clive 0.8.1 → 1.0.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.
- data/LICENSE +1 -1
- data/README.md +328 -227
- data/lib/clive.rb +130 -50
- data/lib/clive/argument.rb +170 -0
- data/lib/clive/arguments.rb +139 -0
- data/lib/clive/arguments/parser.rb +210 -0
- data/lib/clive/base.rb +189 -0
- data/lib/clive/command.rb +342 -444
- data/lib/clive/error.rb +66 -0
- data/lib/clive/formatter.rb +57 -141
- data/lib/clive/formatter/colour.rb +37 -0
- data/lib/clive/formatter/plain.rb +172 -0
- data/lib/clive/option.rb +185 -75
- data/lib/clive/option/runner.rb +163 -0
- data/lib/clive/output.rb +141 -16
- data/lib/clive/parser.rb +180 -87
- data/lib/clive/struct_hash.rb +109 -0
- data/lib/clive/type.rb +117 -0
- data/lib/clive/type/definitions.rb +170 -0
- data/lib/clive/type/lookup.rb +23 -0
- data/lib/clive/version.rb +3 -3
- data/spec/clive/a_cli_spec.rb +245 -0
- data/spec/clive/argument_spec.rb +148 -0
- data/spec/clive/arguments/parser_spec.rb +35 -0
- data/spec/clive/arguments_spec.rb +191 -0
- data/spec/clive/command_spec.rb +276 -209
- data/spec/clive/formatter/colour_spec.rb +129 -0
- data/spec/clive/formatter/plain_spec.rb +129 -0
- data/spec/clive/option/runner_spec.rb +92 -0
- data/spec/clive/option_spec.rb +149 -23
- data/spec/clive/output_spec.rb +86 -2
- data/spec/clive/parser_spec.rb +201 -81
- data/spec/clive/struct_hash_spec.rb +82 -0
- data/spec/clive/type/definitions_spec.rb +312 -0
- data/spec/clive/type_spec.rb +107 -0
- data/spec/clive_spec.rb +60 -0
- data/spec/extras/expectations.rb +86 -0
- data/spec/extras/focus.rb +22 -0
- data/spec/helper.rb +35 -0
- metadata +56 -36
- data/lib/clive/bool.rb +0 -67
- data/lib/clive/exceptions.rb +0 -54
- data/lib/clive/flag.rb +0 -199
- data/lib/clive/switch.rb +0 -31
- data/lib/clive/tokens.rb +0 -141
- data/spec/clive/bool_spec.rb +0 -54
- data/spec/clive/flag_spec.rb +0 -117
- data/spec/clive/formatter_spec.rb +0 -108
- data/spec/clive/switch_spec.rb +0 -14
- data/spec/clive/tokens_spec.rb +0 -38
- data/spec/shared_specs.rb +0 -16
- data/spec/spec_helper.rb +0 -12
@@ -0,0 +1,129 @@
|
|
1
|
+
$: << File.dirname(__FILE__) + '/../..'
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
describe Clive::Formatter::Colour do
|
5
|
+
|
6
|
+
let :clive do
|
7
|
+
Clive.new {
|
8
|
+
|
9
|
+
header 'Usage: clive_test.rb [command] [options]'
|
10
|
+
footer 'Further help is available online'
|
11
|
+
|
12
|
+
opt :version, :tail => true
|
13
|
+
|
14
|
+
opt :S, :super_size, :head => true
|
15
|
+
bool :a, :auto
|
16
|
+
opt :s, :size, 'Size of thing', :arg => '<size>'
|
17
|
+
|
18
|
+
|
19
|
+
desc 'A super long description for a super stupid option, this should test the _extreme_ wrapping abilities as it should all be aligned. Maybe I should go for another couple of lines just for good measure. That\'s all'
|
20
|
+
opt :complex, :arg => '[<one>] <two> [<three>]'
|
21
|
+
|
22
|
+
command :new, 'Creates new things', :arg => '<dir>' do
|
23
|
+
opt :type, :in => %w(post page blog), :default => :page
|
24
|
+
opt :force, 'Force overwrite'
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
subject { Clive::Formatter::Colour }
|
30
|
+
|
31
|
+
describe '#to_s' do
|
32
|
+
|
33
|
+
it 'builds the help string' do
|
34
|
+
this {
|
35
|
+
clive.run s('help'), :formatter => subject.new(:width => 80)
|
36
|
+
}.must_output <<EOS
|
37
|
+
Usage: clive_test.rb [command] [options]
|
38
|
+
|
39
|
+
Commands:
|
40
|
+
new <dir> \e[90m# \e[0m\e[90mCreates new things\e[0m
|
41
|
+
help [<command>] \e[90m# \e[0m\e[90mDisplay help\e[0m
|
42
|
+
|
43
|
+
Options:
|
44
|
+
-S, --super-size
|
45
|
+
-a, --[no-]auto
|
46
|
+
--complex [<one>] <two> [<three>] \e[90m# \e[0m\e[90mA super long description for a
|
47
|
+
super stupid option, this should
|
48
|
+
test the _extreme_ wrapping
|
49
|
+
abilities as it should all be
|
50
|
+
aligned. Maybe I should go for
|
51
|
+
another couple of lines just for
|
52
|
+
good measure. That's all\e[0m
|
53
|
+
-s, --size <size> \e[90m# \e[0m\e[90mSize of thing\e[0m
|
54
|
+
-h, --help \e[90m# \e[0m\e[90mDisplay this help message\e[0m
|
55
|
+
--version
|
56
|
+
|
57
|
+
Further help is available online
|
58
|
+
EOS
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'obeys minimum ratio' do
|
62
|
+
this {
|
63
|
+
clive.run s('help'), :formatter => subject.new(:width => 80, :min_ratio => 0.7)
|
64
|
+
}.must_output r = <<EOS
|
65
|
+
Usage: clive_test.rb [command] [options]
|
66
|
+
|
67
|
+
Commands:
|
68
|
+
new <dir> \e[90m# \e[0m\e[90mCreates new things\e[0m
|
69
|
+
help [<command>] \e[90m# \e[0m\e[90mDisplay help\e[0m
|
70
|
+
|
71
|
+
Options:
|
72
|
+
-S, --super-size
|
73
|
+
-a, --[no-]auto
|
74
|
+
--complex [<one>] <two> [<three>] \e[90m# \e[0m\e[90mA super long
|
75
|
+
description for a
|
76
|
+
super stupid option,
|
77
|
+
this should test the
|
78
|
+
_extreme_ wrapping
|
79
|
+
abilities as it
|
80
|
+
should all be
|
81
|
+
aligned. Maybe I
|
82
|
+
should go for
|
83
|
+
another couple of
|
84
|
+
lines just for good
|
85
|
+
measure. That's all\e[0m
|
86
|
+
-s, --size <size> \e[90m# \e[0m\e[90mSize of thing\e[0m
|
87
|
+
-h, --help \e[90m# \e[0m\e[90mDisplay this help
|
88
|
+
message\e[0m
|
89
|
+
--version
|
90
|
+
|
91
|
+
Further help is available online
|
92
|
+
EOS
|
93
|
+
#------------------------------------------------------------------------------| 80
|
94
|
+
# |======================| 24
|
95
|
+
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'obeys the maximum ratio' do
|
100
|
+
this {
|
101
|
+
clive.run s('help'), :formatter => subject.new(:width => 80, :min_ratio => 0, :max_ratio => 0.3)
|
102
|
+
}.must_output <<EOS
|
103
|
+
Usage: clive_test.rb [command] [options]
|
104
|
+
|
105
|
+
Commands:
|
106
|
+
new <dir> \e[90m# \e[0m\e[90mCreates new things\e[0m
|
107
|
+
help [<command>] \e[90m# \e[0m\e[90mDisplay help\e[0m
|
108
|
+
|
109
|
+
Options:
|
110
|
+
-S, --super-size
|
111
|
+
-a, --[no-]auto
|
112
|
+
--complex [<one>] <two> [<three>]
|
113
|
+
\e[90m# \e[0m\e[90mA super long description for a super stupid option,
|
114
|
+
this should test the _extreme_ wrapping abilities as
|
115
|
+
it should all be aligned. Maybe I should go for
|
116
|
+
another couple of lines just for good measure.
|
117
|
+
That's all\e[0m
|
118
|
+
-s, --size <size> \e[90m# \e[0m\e[90mSize of thing\e[0m
|
119
|
+
-h, --help \e[90m# \e[0m\e[90mDisplay this help message\e[0m
|
120
|
+
--version
|
121
|
+
|
122
|
+
Further help is available online
|
123
|
+
EOS
|
124
|
+
#======================| #
|
125
|
+
#------------------------------------------------------------------------------|
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
$: << File.dirname(__FILE__) + '/../..'
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
describe Clive::Formatter::Plain do
|
5
|
+
|
6
|
+
let :clive do
|
7
|
+
Clive.new {
|
8
|
+
|
9
|
+
header 'Usage: clive_test.rb [command] [options]'
|
10
|
+
footer 'Further help is available online'
|
11
|
+
|
12
|
+
opt :version, :tail => true
|
13
|
+
|
14
|
+
opt :S, :super_size, :head => true
|
15
|
+
bool :a, :auto
|
16
|
+
opt :s, :size, 'Size of thing', :arg => '<size>'
|
17
|
+
|
18
|
+
|
19
|
+
desc 'A super long description for a super stupid option, this should test the _extreme_ wrapping abilities as it should all be aligned. Maybe I should go for another couple of lines just for good measure. That\'s all'
|
20
|
+
opt :complex, :arg => '[<one>] <two> [<three>]'
|
21
|
+
|
22
|
+
command :new, 'Creates new things', :arg => '<dir>' do
|
23
|
+
opt :type, :in => %w(post page blog), :default => :page
|
24
|
+
opt :force, 'Force overwrite'
|
25
|
+
end
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
subject { Clive::Formatter::Plain }
|
30
|
+
|
31
|
+
describe '#to_s' do
|
32
|
+
|
33
|
+
it 'builds the help string' do
|
34
|
+
this {
|
35
|
+
clive.run s('help'), :formatter => subject.new(:width => 80)
|
36
|
+
}.must_output <<EOS
|
37
|
+
Usage: clive_test.rb [command] [options]
|
38
|
+
|
39
|
+
Commands:
|
40
|
+
new <dir> # Creates new things
|
41
|
+
help [<command>] # Display help
|
42
|
+
|
43
|
+
Options:
|
44
|
+
-S, --super-size
|
45
|
+
-a, --[no-]auto
|
46
|
+
--complex [<one>] <two> [<three>] # A super long description for a
|
47
|
+
super stupid option, this should
|
48
|
+
test the _extreme_ wrapping
|
49
|
+
abilities as it should all be
|
50
|
+
aligned. Maybe I should go for
|
51
|
+
another couple of lines just for
|
52
|
+
good measure. That's all
|
53
|
+
-s, --size <size> # Size of thing
|
54
|
+
-h, --help # Display this help message
|
55
|
+
--version
|
56
|
+
|
57
|
+
Further help is available online
|
58
|
+
EOS
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'obeys minimum ratio' do
|
62
|
+
this {
|
63
|
+
clive.run s('help'), :formatter => subject.new(:width => 80, :min_ratio => 0.7)
|
64
|
+
}.must_output r = <<EOS
|
65
|
+
Usage: clive_test.rb [command] [options]
|
66
|
+
|
67
|
+
Commands:
|
68
|
+
new <dir> # Creates new things
|
69
|
+
help [<command>] # Display help
|
70
|
+
|
71
|
+
Options:
|
72
|
+
-S, --super-size
|
73
|
+
-a, --[no-]auto
|
74
|
+
--complex [<one>] <two> [<three>] # A super long
|
75
|
+
description for a
|
76
|
+
super stupid option,
|
77
|
+
this should test the
|
78
|
+
_extreme_ wrapping
|
79
|
+
abilities as it
|
80
|
+
should all be
|
81
|
+
aligned. Maybe I
|
82
|
+
should go for
|
83
|
+
another couple of
|
84
|
+
lines just for good
|
85
|
+
measure. That's all
|
86
|
+
-s, --size <size> # Size of thing
|
87
|
+
-h, --help # Display this help
|
88
|
+
message
|
89
|
+
--version
|
90
|
+
|
91
|
+
Further help is available online
|
92
|
+
EOS
|
93
|
+
#------------------------------------------------------------------------------| 80
|
94
|
+
# |======================| 24
|
95
|
+
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'obeys the maximum ratio' do
|
100
|
+
this {
|
101
|
+
clive.run s('help'), :formatter => subject.new(:width => 80, :min_ratio => 0, :max_ratio => 0.3)
|
102
|
+
}.must_output <<EOS
|
103
|
+
Usage: clive_test.rb [command] [options]
|
104
|
+
|
105
|
+
Commands:
|
106
|
+
new <dir> # Creates new things
|
107
|
+
help [<command>] # Display help
|
108
|
+
|
109
|
+
Options:
|
110
|
+
-S, --super-size
|
111
|
+
-a, --[no-]auto
|
112
|
+
--complex [<one>] <two> [<three>]
|
113
|
+
# A super long description for a super stupid option,
|
114
|
+
this should test the _extreme_ wrapping abilities as
|
115
|
+
it should all be aligned. Maybe I should go for
|
116
|
+
another couple of lines just for good measure.
|
117
|
+
That's all
|
118
|
+
-s, --size <size> # Size of thing
|
119
|
+
-h, --help # Display this help message
|
120
|
+
--version
|
121
|
+
|
122
|
+
Further help is available online
|
123
|
+
EOS
|
124
|
+
#======================| #
|
125
|
+
#------------------------------------------------------------------------------|
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
$: << File.dirname(__FILE__) + '/../..'
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
describe Clive::Option::Runner do
|
5
|
+
subject { Clive::Option::Runner }
|
6
|
+
|
7
|
+
describe '#_run' do
|
8
|
+
it 'executes the function passed within it' do
|
9
|
+
this {
|
10
|
+
subject._run({}, {}, proc { puts self.name })
|
11
|
+
}.must_output "Clive::Option::Runner\n"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#get' do
|
16
|
+
it 'gets a value from state' do
|
17
|
+
this {
|
18
|
+
subject._run({}, {:a => 1}, proc { puts get(:a) })
|
19
|
+
}.must_output "1\n"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#set' do
|
24
|
+
it 'sets a value to state' do
|
25
|
+
state = {}
|
26
|
+
subject._run({}, state, proc { set(:a, 1) })
|
27
|
+
state[:a].must_equal 1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#update' do
|
32
|
+
it 'updates a state value using a method' do
|
33
|
+
state = {:name => 'John Doe'}
|
34
|
+
subject._run({}, state, proc {
|
35
|
+
update :name, :upcase
|
36
|
+
})
|
37
|
+
state[:name].must_equal "JOHN DOE"
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'updates a state value using a method with arguments' do
|
41
|
+
state = {:line => "A man a plan a canal"}
|
42
|
+
subject._run({}, state, proc {
|
43
|
+
update :line, :gsub, /[Aa]/, 'i'
|
44
|
+
})
|
45
|
+
state[:line].must_equal "i min i plin i cinil"
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'updates a state value using a block' do
|
49
|
+
state = {:list => []}
|
50
|
+
subject._run({}, state, proc {
|
51
|
+
update(:list) {|l| l << 1 }
|
52
|
+
})
|
53
|
+
state[:list].must_equal [1]
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'raises an exception if arguments are missing' do
|
57
|
+
this {
|
58
|
+
subject._run({}, {}, proc { update(:a) })
|
59
|
+
}.must_raise ArgumentError
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#has?' do
|
64
|
+
it 'is true if the state contains the key' do
|
65
|
+
this {
|
66
|
+
subject._run({}, {:key => nil}, proc { puts has?(:key) })
|
67
|
+
}.must_output "true\n"
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'is false if the state does not have the key' do
|
71
|
+
this {
|
72
|
+
subject._run({}, {}, proc { puts has?(:key) })
|
73
|
+
}.must_output "false\n"
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
describe '#method_missing' do
|
79
|
+
it 'makes the arguments available by name' do
|
80
|
+
this {
|
81
|
+
subject._run({:a => 1}, {}, proc { puts a })
|
82
|
+
}.must_output "1\n"
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'passes unknown calls to super' do
|
86
|
+
this {
|
87
|
+
subject.run({}, {}, proc { puts z })
|
88
|
+
}.must_raise NoMethodError
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
data/spec/clive/option_spec.rb
CHANGED
@@ -1,34 +1,160 @@
|
|
1
|
-
|
1
|
+
$: << File.dirname(__FILE__) + '/..'
|
2
|
+
require 'helper'
|
2
3
|
|
3
4
|
describe Clive::Option do
|
4
|
-
subject { Clive::Option
|
5
|
+
subject { Clive::Option }
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
def option_with(config, &block)
|
8
|
+
Clive::Option.new [:o, :opt], "", config, &block
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#initialize' do
|
12
|
+
it 'sorts names by size' do
|
13
|
+
subject.new([:zz, :a]).names.must_equal [:a, :zz]
|
14
|
+
subject.new([:aa, :z]).names.must_equal [:z, :aa]
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:opt) { option_with :head => true, :args => '<a> <b>', :as => [String, Integer] }
|
18
|
+
|
19
|
+
it 'finds all options' do
|
20
|
+
opt.config.must_include :head
|
21
|
+
opt.config.wont_include :args
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'uses default options when not set' do
|
25
|
+
opt.config.must_include :runner
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'setting :head' do
|
29
|
+
it 'is true if head is set to true' do
|
30
|
+
option_with(:head => true).config.must_contain :head => true
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'is false otherwise' do
|
34
|
+
option_with({}).config.must_contain :head => false
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'setting :tail' do
|
39
|
+
it 'is true if tail is set to true' do
|
40
|
+
option_with(:tail => true).config.must_contain :tail => true
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'is false otherwise' do
|
44
|
+
option_with({}).config.must_contain :tail => false
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'setting :boolean' do
|
49
|
+
it 'is true if boolean is set to true' do
|
50
|
+
option_with(:boolean => true).config.must_contain :boolean => true
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'is false otherwise' do
|
54
|
+
option_with({}).config.must_contain :boolean => false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'creates the args list' do
|
59
|
+
opt.args.first.must_be_argument :name => :a, :type => Clive::Type::String
|
60
|
+
opt.args.last.must_be_argument :name => :b, :type => Clive::Type::Integer
|
12
61
|
end
|
13
62
|
end
|
14
|
-
|
15
|
-
describe
|
16
|
-
it
|
17
|
-
subject.
|
63
|
+
|
64
|
+
describe '#name' do
|
65
|
+
it 'returns the long name' do
|
66
|
+
opt = subject.new [:opt, :o]
|
67
|
+
opt.name.must_equal :opt
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'returns the short name if no long name exists' do
|
71
|
+
opt = subject.new [:o]
|
72
|
+
opt.name.must_equal :o
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#to_s' do
|
77
|
+
it 'returns a string representation of the option' do
|
78
|
+
opt = subject.new [:o, :opt]
|
79
|
+
opt.to_s.must_equal "-o, --opt"
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'adds a --[no-] prefix to boolean options' do
|
83
|
+
opt = subject.new [:o, :opt], "", :boolean => true
|
84
|
+
opt.to_s.must_equal "-o, --[no-]opt"
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'uses dashes instead of underscores' do
|
88
|
+
opt = subject.new [:S, :super_long_option_name]
|
89
|
+
opt.to_s.must_equal "-S, --super-long-option-name"
|
18
90
|
end
|
19
91
|
end
|
20
|
-
|
21
|
-
describe
|
22
|
-
|
23
|
-
|
24
|
-
|
92
|
+
|
93
|
+
describe '#run' do
|
94
|
+
let(:block) { proc {} }
|
95
|
+
|
96
|
+
it 'calls Runner#_run with true if #boolean?' do
|
97
|
+
t = mock
|
98
|
+
t.expects(:_run).with([[:truth, true]], {}, block)
|
99
|
+
ot = option_with :boolean => true, :runner => t, &block
|
100
|
+
ot.run({}, [true])
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'calls Runner#_run with false if #boolean?' do
|
104
|
+
f = mock
|
105
|
+
f.expects(:_run).with([[:truth, false]], {}, block)
|
106
|
+
of = option_with :boolean => true, :runner => f, &block
|
107
|
+
of.run({}, [false])
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'calls Runner#_run with mapped args' do
|
111
|
+
r = mock
|
112
|
+
r.expects(:_run).with([[:a, 'a'], [:b, 'b']], {}, block)
|
113
|
+
o = option_with :args => '<a> <b>', :runner => r, &block
|
114
|
+
o.run({}, ['a', 'b'])
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'sets state if no block exists' do
|
118
|
+
o = option_with :args => '<a> <b>'
|
119
|
+
state = Clive::StructHash.new
|
120
|
+
o.run state, ['a', 'b']
|
121
|
+
state[:opt].must_equal ['a', 'b']
|
25
122
|
end
|
26
123
|
end
|
27
|
-
|
28
|
-
describe
|
29
|
-
|
30
|
-
|
31
|
-
|
124
|
+
|
125
|
+
describe '#<=>' do
|
126
|
+
let(:heada) { subject.new [:a], "", :head => true }
|
127
|
+
let(:headz) { subject.new [:z], "", :head => true }
|
128
|
+
let(:taila) { subject.new [:a], "", :tail => true }
|
129
|
+
let(:tailz) { subject.new [:z], "", :tail => true }
|
130
|
+
let(:aaa) { subject.new [:aaa] }
|
131
|
+
let(:zzz) { subject.new [:zzz] }
|
132
|
+
|
133
|
+
it 'puts head?s first' do
|
134
|
+
heada.must_be :<, aaa
|
135
|
+
heada.must_be :<, zzz
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'compares 2 head?s alphabetically' do
|
139
|
+
heada.must_be :<, headz
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'puts tail?s last' do
|
143
|
+
taila.must_be :>, aaa
|
144
|
+
taila.must_be :>, zzz
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'compares 2 tail?s alphabetically' do
|
148
|
+
taila.must_be :<, tailz
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'compares options based on #name' do
|
152
|
+
aaa.must_be :<, zzz
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'sorts options properly' do
|
156
|
+
[taila, headz, tailz, zzz, heada, aaa].sort.
|
157
|
+
must_equal [heada, headz, aaa, zzz, taila, tailz]
|
32
158
|
end
|
33
159
|
end
|
34
|
-
end
|
160
|
+
end
|