ruby-beautify 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,89 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ describe RBeautify::BlockMatcher do
4
+
5
+ describe 'class' do
6
+ describe '#parse' do
7
+ before(:each) do
8
+ @ruby = RBeautify::Language.language(:ruby)
9
+ end
10
+
11
+ it 'should not match de' do
12
+ RBeautify::BlockMatcher.parse(@ruby, nil, 0, 'de foo', 0).should be_nil
13
+ end
14
+
15
+ it 'should match def' do
16
+ block = RBeautify::BlockMatcher.parse(@ruby, nil, 0, 'def foo', 0)
17
+ block.should_not be_nil
18
+ block.name.should == :standard
19
+ end
20
+
21
+ it 'should be nested block' do
22
+ block = RBeautify::BlockMatcher.parse(@ruby, nil, 0, 'if {', 0)
23
+ block.should_not be_nil
24
+ block.name.should == :curly_bracket
25
+ block.parent.should_not be_nil
26
+ block.parent.name.should == :if
27
+ end
28
+
29
+ it 'should be nested block (taking into account ends)' do
30
+ block = RBeautify::BlockMatcher.parse(@ruby, nil, 0, 'if {}', 0)
31
+ block.should_not be_nil
32
+ block.name.should == :if
33
+ end
34
+
35
+ it 'should be deeply nested block (taking into account ends)' do
36
+ block = RBeautify::BlockMatcher.parse(@ruby, nil, 0, 'def foo(bar = {})', 0)
37
+ block.should_not be_nil
38
+ block.name.should == :standard
39
+ block.parent.should be_nil
40
+ end
41
+
42
+ it 'should current block if no started or ended blocks' do
43
+ block = RBeautify::BlockStart.new(@ruby.matcher(:standard), nil, 0, 0, 'def', ' foo')
44
+ RBeautify::BlockMatcher.parse(@ruby, block, 0, 'a = 3', 0).should == block
45
+ end
46
+
47
+ it 'should be newly started block if ends and starts' do
48
+ current_block = RBeautify::BlockStart.new(@ruby.matcher(:if), nil, 0, 0, 'if', ' foo')
49
+ block = RBeautify::BlockMatcher.parse(@ruby, current_block, 0, 'else', 0)
50
+ block.should_not be_nil
51
+ block.name.should == :if
52
+ block.parent.should be_nil
53
+ end
54
+
55
+ it 'should be parent block if current block ends' do
56
+ parent_block = RBeautify::BlockStart.new(@ruby.matcher(:standard), nil, 0, 0, 'class', ' Foo')
57
+ child_block = RBeautify::BlockStart.new(@ruby.matcher(:standard), parent_block, 0, 0, 'def', ' foo')
58
+ RBeautify::BlockMatcher.parse(@ruby, child_block, 0, 'end', 0).should == parent_block
59
+ end
60
+
61
+ it 'should remove two blocks if top of stack ends implicitly' do
62
+ parent_block = RBeautify::BlockStart.new(@ruby.matcher(:case), nil, 0, 0, 'case', ' foo')
63
+ child_block = RBeautify::BlockStart.new(@ruby.matcher(:inner_case), parent_block, 0, 0, 'when', '2')
64
+ RBeautify::BlockMatcher.parse(@ruby, child_block, 0, 'end', 0).should be_nil
65
+ end
66
+ end
67
+ end
68
+
69
+ describe '#can_nest?' do
70
+ before(:each) do
71
+ @language = mock(RBeautify::Language)
72
+ end
73
+
74
+ it { RBeautify::BlockMatcher.new(@language, :foo, /foo/, /bar/).should be_can_nest(nil) }
75
+
76
+ it { RBeautify::BlockMatcher.new(@language, :foo, /foo/, /bar/).should be_can_nest(mock('block_start', :parse_content? => true)) }
77
+
78
+ it { RBeautify::BlockMatcher.new(@language, :foo, /foo/, /bar/).should_not be_can_nest(mock('block_start', :parse_content? => false)) }
79
+
80
+ it { RBeautify::BlockMatcher.new(@language, :foo, /foo/, /bar/, :nest_except => [:bar]).should be_can_nest(nil) }
81
+
82
+ it { RBeautify::BlockMatcher.new(@language, :foo, /foo/, /bar/, :nest_except => [:foo]).should be_can_nest(mock('block_start', :name => :bar, :parse_content? => true)) }
83
+
84
+ it { RBeautify::BlockMatcher.new(@language, :foo, /foo/, /bar/, :nest_except => [:foo]).should_not be_can_nest(mock('block_start', :name => :bar, :parse_content? => false)) }
85
+
86
+ it { RBeautify::BlockMatcher.new(@language, :foo, /foo/, /bar/, :nest_except => [:bar]).should_not be_can_nest(mock('block_start', :name => :bar, :parse_content? => true)) }
87
+ end
88
+
89
+ end
@@ -0,0 +1,51 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ describe RBeautify::BlockStart do
4
+ before(:each) do
5
+ @ruby = RBeautify::Language.language(:ruby)
6
+ end
7
+
8
+ describe 'class' do
9
+ describe '#first_common_ancestor' do
10
+ before(:each) do
11
+ @grand_parent = RBeautify::BlockStart.new(@ruby.matcher(:standard), nil, 0, 0, 'class', ' Foo')
12
+ @parent = RBeautify::BlockStart.new(@ruby.matcher(:standard), @grand_parent, 0, 0, 'def', ' foo')
13
+ @first = RBeautify::BlockStart.new(@ruby.matcher(:standard), @parent, 0, 0, 'def', ' foo')
14
+ @second = RBeautify::BlockStart.new(@ruby.matcher(:standard), @parent, 0, 0, 'def', ' bar')
15
+ @unrelated = RBeautify::BlockStart.new(@ruby.matcher(:standard), nil, 0, 0, 'class', ' Bar')
16
+ end
17
+
18
+ it { RBeautify::BlockStart.first_common_ancestor(@grand_parent, nil).should be_nil }
19
+ it { RBeautify::BlockStart.first_common_ancestor(@grand_parent, @unrelated).should be_nil }
20
+ it { RBeautify::BlockStart.first_common_ancestor(@grand_parent, @parent).should == @grand_parent }
21
+ it { RBeautify::BlockStart.first_common_ancestor(@grand_parent, @first).should == @grand_parent }
22
+ it { RBeautify::BlockStart.first_common_ancestor(@first, @second).should == @parent }
23
+ end
24
+ end
25
+
26
+ describe '#strict_ancestor_of?' do
27
+ before(:each) do
28
+ @block = RBeautify::BlockStart.new(@ruby.matcher(:standard), nil, 0, 'def', ' foo', 0)
29
+ end
30
+
31
+ it { @block.should_not be_strict_ancestor_of(nil) }
32
+ it { @block.should_not be_strict_ancestor_of(@block) }
33
+ it { @block.should_not be_strict_ancestor_of(RBeautify::BlockStart.new(@ruby.matcher(:if), nil, 0, 0, 'if', ' foo') ) }
34
+ it { @block.should be_strict_ancestor_of(RBeautify::BlockStart.new(@ruby.matcher(:if), @block, 0, 0, 'if', ' foo') ) }
35
+
36
+ end
37
+
38
+ describe '#total_indent_size' do
39
+ before(:each) do
40
+ @block = RBeautify::BlockStart.new(@ruby.matcher(:standard), nil, 0, 'def', ' foo', 0)
41
+ end
42
+
43
+ it { RBeautify::BlockStart.new(@ruby.matcher(:standard), nil, 0, 0, 'def', ' foo') .total_indent_size.should == 2 }
44
+
45
+ it 'should sum with parents total indent size' do
46
+ parent = mock('parent_start_block', :total_indent_size => 4)
47
+ RBeautify::BlockStart.new(@ruby.matcher(:standard), parent, 0, 0, 'def', ' foo') .total_indent_size.should == 6
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,183 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ run_fixtures_for_language(:ruby)
4
+
5
+ describe 'Ruby' do
6
+
7
+ describe 'matchers' do
8
+ before(:each) do
9
+ @ruby = RBeautify::Language.language(:ruby)
10
+ end
11
+
12
+ describe 'standard' do
13
+ before(:each) do
14
+ @matcher = @ruby.matcher(:standard)
15
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 0, '', '')
16
+ end
17
+
18
+ it { @matcher.parse_block_start('class Foo; end', nil, 0, 0).should be_block_start_like(:standard, 0, 'class', ' Foo; end') }
19
+ it { @matcher.parse_block_start('module Foo', nil, 0, 0).should be_block_start_like(:standard, 0, 'module', ' Foo') }
20
+ it { @matcher.parse_block_start('def foo()', nil, 0, 0).should be_block_start_like(:standard, 0, 'def', ' foo()') }
21
+ it { @matcher.parse_block_start('end Foo', nil, 0, 0).should be_nil }
22
+
23
+ it { @current_block.parse_block_end('end', 0).should be_block_end_like(@current_block, 0, 'end', '') }
24
+ it { @current_block.parse_block_end(';end', 0).should be_block_end_like(@current_block, 0, ';end', '') }
25
+ it { @current_block.parse_block_end('; end', 0).should be_block_end_like(@current_block, 1, ' end', '') }
26
+ it { @current_block.parse_block_end('rescue', 0).should be_block_end_like(@current_block, 0, 'rescue', '') }
27
+ it { @current_block.parse_block_end('ensure', 0).should be_block_end_like(@current_block, 0, 'ensure', '') }
28
+ it { @current_block.parse_block_end('}', 0).should be_nil }
29
+ end
30
+
31
+ describe 'if' do
32
+ before(:each) do
33
+ @matcher = @ruby.matcher(:if)
34
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 0, 'if', ' foo')
35
+ end
36
+
37
+ it { @matcher.should be_end_can_also_be_start}
38
+
39
+ it { @matcher.parse_block_start('if foo', nil, 0, 0).should be_block_start_like(:if, 0, 'if', ' foo') }
40
+ it { @matcher.parse_block_start('then foo = bar', nil, 0, 0).should be_block_start_like(:if, 0, 'then', ' foo = bar') }
41
+ it { @matcher.parse_block_start('if_foo', nil, 0, 0).should be_nil }
42
+
43
+ it { @current_block.parse_block_end('end', 0).should be_block_end_like(@current_block, 0, 'end', '') }
44
+ it { @current_block.parse_block_end('then', 0).should be_block_end_like(@current_block, 0, 'then', '') }
45
+ it { @current_block.parse_block_end('else', 0).should be_block_end_like(@current_block, 0, 'else', '') }
46
+ it { @current_block.parse_block_end('a = 3', 0).should be_nil }
47
+ end
48
+
49
+ describe 'curly_bracket' do
50
+ before(:each) do
51
+ @matcher = @ruby.matcher(:curly_bracket)
52
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 0, '{', '')
53
+ end
54
+
55
+ it { @matcher.parse_block_start('{', nil, 0, 0).should be_block_start_like(:curly_bracket, 0, '{', '') }
56
+ it { @matcher.parse_block_start('end', nil, 0, 0).should be_nil }
57
+
58
+ it { @current_block.parse_block_end('}', 0).should be_block_end_like(@current_block, 0, '}', '') }
59
+ it { @current_block.parse_block_end('end', 0).should be_nil }
60
+
61
+ end
62
+
63
+ describe 'double_quote' do
64
+ before(:each) do
65
+ @matcher = @ruby.matcher(:double_quote)
66
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 0, '"', 'foo"')
67
+ end
68
+
69
+ it { @matcher.parse_block_start('a = "foo"', nil, 0, 0).should be_block_start_like(:double_quote, 4, '"', 'foo"') }
70
+ it { @matcher.parse_block_start('a = 2', nil, 0, 0).should be_nil }
71
+
72
+ it { @current_block.parse_block_end(' bar"', 0).should be_block_end_like(@current_block, 4, '"', '') }
73
+ it { @current_block.parse_block_end(' " + bar + "', 0).should be_block_end_like(@current_block, 1, '"', ' + bar + "') }
74
+ it { @current_block.parse_block_end('\\\\"', 0).should be_block_end_like(@current_block, 2, '"', '') }
75
+ it { @current_block.parse_block_end('\\" more string"', 0).should be_block_end_like(@current_block, 14, '"', '') }
76
+ it { @current_block.parse_block_end('a = 2', 0).should be_nil }
77
+ it { @current_block.parse_block_end('\\"', 0).should be_nil }
78
+ it { @current_block.parse_block_end('\\\\\\"', 0).should be_nil }
79
+ end
80
+
81
+ describe 'single_quote' do
82
+ before(:each) do
83
+ @matcher = @ruby.matcher(:single_quote)
84
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 0, "'", "foo'")
85
+ end
86
+
87
+ it { @matcher.should_not be_end_can_also_be_start}
88
+ it { @matcher.parse_block_start("describe '#foo?' do", nil, 0, 0).should be_block_start_like(:single_quote, 9, "'", "#foo?' do") }
89
+ it { @matcher.parse_block_start('a = 2', nil, 0, 0).should be_nil }
90
+
91
+ it { @current_block.parse_block_end("#foo?' do", 9).should be_block_end_like(@current_block, 14, "'", ' do')}
92
+ it { @current_block.parse_block_end('a = 2', 0).should be_nil }
93
+ end
94
+
95
+ describe 'continuing_line' do
96
+ before(:each) do
97
+ @matcher = @ruby.matcher(:continuing_line)
98
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 8, ',', '')
99
+ end
100
+
101
+ it { @matcher.parse_block_start('foo :bar,', nil, 0, 0).should be_block_start_like(:continuing_line, 8, ',', '') }
102
+ it { @matcher.parse_block_start('a = 3 &&', nil, 0, 0).should be_block_start_like(:continuing_line, 6, '&&', '') }
103
+ it { @matcher.parse_block_start('a = 3 ||', nil, 0, 0).should be_block_start_like(:continuing_line, 6, '||', '') }
104
+ it { @matcher.parse_block_start('a = 3 +', nil, 0, 0).should be_block_start_like(:continuing_line, 6, '+', '') }
105
+ it { @matcher.parse_block_start('a = 3 -', nil, 0, 0).should be_block_start_like(:continuing_line, 6, '-', '') }
106
+ it { @matcher.parse_block_start("a \\", nil, 0, 0).should be_block_start_like(:continuing_line, 2, '\\', '') }
107
+ it { @matcher.parse_block_start('a ?', nil, 0, 0).should be_block_start_like(:continuing_line, 1, ' ?', '') }
108
+ it { @matcher.parse_block_start('a ? # some comment', nil, 0, 0).should be_block_start_like(:continuing_line, 1, ' ? # some comment', '') }
109
+ it { @matcher.parse_block_start('a = 3', nil, 0, 0).should be_nil }
110
+ it { @matcher.parse_block_start('a = foo.bar?', nil, 0, 0).should be_nil }
111
+ it { @matcher.parse_block_start('# just a comment', nil, 0, 0).should be_nil }
112
+
113
+ it { @current_block.parse_block_end('a = 3', 0).should be_block_end_like(@current_block, 0, '', 'a = 3') }
114
+ it { @current_block.parse_block_end('foo :bar,', 0).should be_nil }
115
+ it { @current_block.parse_block_end('a = 3 &&', 0).should be_nil }
116
+ it { @current_block.parse_block_end('a = 3 +', 0).should be_nil }
117
+ it { @current_block.parse_block_end("a \\", 0).should be_nil }
118
+ it { @current_block.parse_block_end('# just a comment', 0).should be_nil }
119
+ it { @current_block.parse_block_end('#', 0).should be_nil }
120
+ end
121
+
122
+ describe 'round_bracket' do
123
+ before(:each) do
124
+ @matcher = @ruby.matcher(:round_bracket)
125
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 0, '(', '')
126
+ end
127
+
128
+ it { @matcher.parse_block_start('a = (foo,', nil, 0, 0).should be_block_start_like(:round_bracket, 4, '(', 'foo,') }
129
+ it { @matcher.parse_block_start('anything else', nil, 0, 0).should be_nil }
130
+
131
+ it { @current_block.parse_block_end('foo)', 0).should be_block_end_like(@current_block, 3, ')', '') }
132
+ it { @current_block.parse_block_end('a = 3', 0).should be_nil }
133
+ end
134
+
135
+ describe 'comment' do
136
+ before(:each) do
137
+ @matcher = @ruby.matcher(:comment)
138
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 8, '#', ' comment')
139
+ end
140
+
141
+ it { @matcher.parse_block_start('anything # comment', nil, 0, 0).should be_block_start_like(:comment, 8, ' #', ' comment') }
142
+ it { @matcher.parse_block_start('#', nil, 0, 0).should be_block_start_like(:comment, 0, '#', '') }
143
+ it { @matcher.parse_block_start('anything else', nil, 0, 0).should be_nil }
144
+
145
+ it { @current_block.parse_block_end('anything', 0).should be_block_end_like(@current_block, 8, '', '') }
146
+ it { @current_block.parse_block_end('', 0).should be_block_end_like(@current_block, 0, '', '') }
147
+ end
148
+
149
+ describe 'begin' do
150
+ before(:each) do
151
+ @matcher = @ruby.matcher(:begin)
152
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 0, 'begin', '')
153
+ end
154
+
155
+ it { @matcher.parse_block_start('begin', nil, 0, 0).should be_block_start_like(:begin, 0, 'begin', '') }
156
+ it { @matcher.parse_block_start('beginning', nil, 0, 0).should be_nil }
157
+
158
+ it { @current_block.parse_block_end('rescue', 0).should be_block_end_like(@current_block, 0, 'rescue', '') }
159
+ it { @current_block.parse_block_end('ensure', 0).should be_block_end_like(@current_block, 0, 'ensure', '') }
160
+ it { @current_block.parse_block_end('else', 0).should be_block_end_like(@current_block, 0, 'else', '') }
161
+ it { @current_block.parse_block_end('end', 0).should be_block_end_like(@current_block, 0, 'end', '') }
162
+ end
163
+
164
+ describe 'regex' do
165
+ before(:each) do
166
+ @matcher = @ruby.matcher(:regex)
167
+ @current_block = RBeautify::BlockStart.new(@matcher, nil, 0, 0, '/', 'foo/')
168
+ end
169
+
170
+ it { @matcher.parse_block_start('/foo/', nil, 0, 0).should be_block_start_like(:regex, 0, '/', 'foo/') }
171
+ it { @matcher.parse_block_start(', /foo/', nil, 0, 0).should be_block_start_like(:regex, 0, ', /', 'foo/') }
172
+ it { @matcher.parse_block_start('foo = /bar/', nil, 0, 0).should be_block_start_like(:regex, 4, '= /', 'bar/') }
173
+ it { @matcher.parse_block_start('foo =~ /bar/', nil, 0, 0).should be_block_start_like(:regex, 5, '~ /', 'bar/') }
174
+ it { @matcher.parse_block_start('1/2', nil, 0, 0).should be_nil }
175
+ it { @matcher.parse_block_start('anything else', nil, 0, 0).should be_nil }
176
+
177
+ it { @current_block.parse_block_end('foo/', 0).should be_block_end_like(@current_block, 3, '/', '') }
178
+ it { @current_block.parse_block_end('foo/', 0).should be_block_end_like(@current_block, 3, '/', '') }
179
+ it { @current_block.parse_block_end('', 0).should be_nil }
180
+
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,73 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+
3
+ describe RBeautify::Line do
4
+
5
+ describe '#format' do
6
+
7
+ before(:each) do
8
+ @language = mock(RBeautify::Language)
9
+ end
10
+
11
+ it 'should just strip with empty stack' do
12
+ RBeautify::BlockMatcher.stub!(:parse => nil)
13
+ RBeautify::Line.new(@language, ' a = 3 ', 0).format.should == "a = 3"
14
+ end
15
+
16
+ it 'should indent with existing indent' do
17
+ current_block = mock('block_start', :total_indent_size => 2, :format_content? => true, :strict_ancestor_of? => false)
18
+ RBeautify::BlockStart.stub(:first_common_ancestor => current_block)
19
+ RBeautify::BlockMatcher.stub!(:parse => current_block)
20
+ RBeautify::Line.new(@language, ' a = 3 ', 0, current_block).format.should == ' a = 3'
21
+ end
22
+
23
+ it 'leave empty lines blank' do
24
+ current_block = mock('block_start', :format_content? => true)
25
+ RBeautify::BlockMatcher.stub!(:parse => current_block)
26
+ RBeautify::Line.new(@language, ' ', 0, current_block).format.should == ''
27
+ end
28
+
29
+ it 'should remove indent with match to end of block' do
30
+ current_block = mock('block_start', :format_content? => true, :indent_end_line? => false)
31
+ RBeautify::BlockStart.stub(:first_common_ancestor => nil)
32
+ RBeautify::BlockMatcher.stub!(:parse => nil)
33
+ RBeautify::Line.new(@language, ' end ', 0, current_block).format.should == 'end'
34
+ end
35
+
36
+ it 'should not remove indent with match to end of block if indent_end_line? is true' do
37
+ current_block = mock('block_start', :total_indent_size => 2, :format_content? => true, :indent_end_line? => true)
38
+ RBeautify::BlockMatcher.stub!(:parse => nil)
39
+ RBeautify::Line.new(@language, ' end ', 0, current_block).format.should == ' end'
40
+ end
41
+
42
+ it 'should leave indent at old stack level with match of new block' do
43
+ current_block = mock('current_block_start', :total_indent_size => 2, :format_content? => true)
44
+ new_block = mock('new_block_start', :format_content? => true, :strict_ancestor_of? => false)
45
+ RBeautify::BlockStart.stub(:first_common_ancestor => current_block)
46
+ RBeautify::BlockMatcher.stub!(:parse => new_block)
47
+ RBeautify::Line.new(@language, 'class Foo', 0, current_block).format.should == ' class Foo'
48
+ end
49
+
50
+ it 'should remove indent if a block ends and starts' do
51
+ current_block = mock('current_block_start', :format_content? => true)
52
+ new_block = mock('new_block_start', :format_content? => true, :strict_ancestor_of? => false)
53
+ RBeautify::BlockStart.stub(:first_common_ancestor => nil)
54
+ RBeautify::BlockMatcher.stub!(:parse => new_block)
55
+ RBeautify::Line.new(@language, ' else ', 0, current_block).format.should == 'else'
56
+ end
57
+
58
+ it 'should not change when format is false' do
59
+ current_block = mock('block_start', :format_content? => false)
60
+ RBeautify::BlockMatcher.stub!(:parse => current_block)
61
+ RBeautify::Line.new(@language, ' some content after program has finished. ', 0, current_block).format.should ==
62
+ " some content after program has finished. "
63
+ end
64
+
65
+ it 'should leave indent with match to end of block (but no format)' do
66
+ current_block = mock('block_start', :format_content? => false)
67
+ RBeautify::BlockMatcher.stub!(:parse => nil)
68
+ RBeautify::Line.new(@language, ' "', 0, current_block).format.should == ' "'
69
+ end
70
+
71
+ end
72
+
73
+ end
@@ -0,0 +1 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
@@ -0,0 +1,124 @@
1
+ begin
2
+ require 'rspec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'rspec'
6
+ end
7
+ require 'yaml'
8
+ require File.dirname(__FILE__) + '/../lib/rbeautify.rb'
9
+
10
+ module RBeautifyMatchers
11
+ # Adds more descriptive failure messages to the dynamic be_valid matcher
12
+ class BeBlockStartLike #:nodoc:
13
+ def initialize(block_matcher_name, offset, match, after_match)
14
+ # triggers the standard Spec::Matchers::Be magic, as if the original Spec::Matchers#method_missing had fired
15
+ @block_matcher_name = block_matcher_name
16
+ @offset = offset
17
+ @match = match
18
+ @after_match = after_match
19
+ end
20
+
21
+ def matches?(target_block)
22
+ @target_block = target_block
23
+ return !target_block.nil? &&
24
+ (expected_string == got_string)
25
+ end
26
+
27
+ def failure_message
28
+ "expected\n#{expected_string} but got\n#{got_string}"
29
+ end
30
+
31
+ def negative_failure_message
32
+ "expected to be different from #{expected_string}"
33
+ end
34
+
35
+ def expected_string
36
+ "name: #{@block_matcher_name}, offset: #{@offset}, match: '#{@match}', after_match: '#{@after_match}'"
37
+ end
38
+
39
+ def got_string
40
+ "name: #{@target_block.block_matcher.name}, offset: #{@target_block.offset}, match: '#{@target_block.match}', after_match: '#{@target_block.after_match}'"
41
+ end
42
+
43
+ def description
44
+ "block start with"
45
+ end
46
+ end
47
+
48
+ class BeBlockEndLike #:nodoc:
49
+ def initialize(block_start, offset, match, after_match)
50
+ # triggers the standard Spec::Matchers::Be magic, as if the original Spec::Matchers#method_missing had fired
51
+ @block_start = block_start
52
+ @offset = offset
53
+ @match = match
54
+ @after_match = after_match
55
+ end
56
+
57
+ def matches?(target_block)
58
+ @target_block = target_block
59
+ expected_string == got_string
60
+ end
61
+
62
+ def failure_message
63
+ "expected\n#{expected_string} but got\n#{got_string}"
64
+ end
65
+
66
+ def negative_failure_message
67
+ "expected to be different from #{expected_string}"
68
+ end
69
+
70
+ def expected_string
71
+ "block_end: #{@block_start.name}, offset: #{@offset}, match: '#{@match}', after_match: '#{@after_match}'"
72
+ end
73
+
74
+ def got_string
75
+ if @target_block.nil?
76
+ 'nil'
77
+ else
78
+ "block_end: #{@target_block.block_start.name}, offset: #{@target_block.offset}, match: '#{@target_block.match}', after_match: '#{@target_block.after_match}'"
79
+ end
80
+ end
81
+
82
+ def description
83
+ "block end with"
84
+ end
85
+
86
+ end
87
+
88
+ def be_block_start_like(block_matcher, offset, match, after_match)
89
+ BeBlockStartLike.new(block_matcher, offset, match, after_match)
90
+ end
91
+
92
+ def be_block_end_like(block_start, offset, match, after_match)
93
+ BeBlockEndLike.new(block_start, offset, match, after_match)
94
+ end
95
+ end
96
+
97
+ RSpec.configure do |config|
98
+ config.include(RBeautifyMatchers)
99
+ end
100
+
101
+
102
+ def run_fixtures_for_language(language)
103
+ fixtures = YAML.load_file(File.dirname(__FILE__) + "/fixtures/#{language}.yml")
104
+
105
+ describe language do
106
+ fixtures.each do |fixture|
107
+ it "should #{fixture['name']}" do
108
+ input = fixture['input']
109
+ output = fixture['output'] || input
110
+ debug = fixture['debug'] || false
111
+
112
+ if fixture['pending']
113
+ pending fixture['pending'] do
114
+ RBeautify.beautify_string(language, input).should == output
115
+ end
116
+ else
117
+ RBeautify::BlockMatcher.debug = debug
118
+ RBeautify.beautify_string(language, input).should == output
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ end