code-spec 0.1.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/.document +5 -0
- data/.gitignore +21 -0
- data/.rspec +1 -0
- data/LICENSE +20 -0
- data/README.markdown +43 -0
- data/Rakefile +18 -0
- data/VERSION +1 -0
- data/lib/code-spec.rb +15 -0
- data/lib/code_spec/matchers/content_matcher.rb +110 -0
- data/lib/code_spec/matchers/have_block.rb +57 -0
- data/lib/code_spec/matchers/have_call.rb +62 -0
- data/lib/code_spec/matchers/have_calls.rb +60 -0
- data/lib/code_spec/matchers/have_class_self.rb +40 -0
- data/lib/code_spec/matchers/have_comment.rb +42 -0
- data/lib/code_spec/matchers/have_method.rb +66 -0
- data/lib/code_spec/matchers/have_module.rb +50 -0
- data/lib/code_spec/matchers/have_region.rb +48 -0
- data/lib/code_spec/matchers/have_subclass.rb +40 -0
- data/lib/code_spec/matchers/include_module.rb +34 -0
- data/lib/code_spec/matchers/inherit_from.rb +35 -0
- data/spec/code-spec/matchers/class_self_spec.rb +28 -0
- data/spec/code-spec/matchers/have_block_spec.rb +49 -0
- data/spec/code-spec/matchers/have_call_spec.rb +48 -0
- data/spec/code-spec/matchers/have_calls_spec.rb +41 -0
- data/spec/code-spec/matchers/have_class_spec.rb +34 -0
- data/spec/code-spec/matchers/have_method_spec.rb +56 -0
- data/spec/code-spec/matchers/have_module_spec.rb +33 -0
- data/spec/code-spec/matchers/have_region_spec.rb +52 -0
- data/spec/code-spec/matchers/have_subclass_spec.rb +32 -0
- data/spec/code-spec/matchers/include_module_spec.rb +34 -0
- data/spec/code-spec/matchers/inherit_from_spec.rb +32 -0
- data/spec/spec_helper.rb +4 -0
- metadata +154 -0
data/.document
ADDED
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2010 Kristian Mandrup
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# Code spec
|
2
|
+
|
3
|
+
RSpec 2 matchers to facilitate making specs regarding Ruby code files, f.ex as generated or modified/mutated by a code generator.
|
4
|
+
|
5
|
+
## Install
|
6
|
+
|
7
|
+
gem install code-spec
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
See specs for examples on how to use it.
|
12
|
+
|
13
|
+
Example: Nested DSL
|
14
|
+
<pre> ...
|
15
|
+
with_subclass = %q{
|
16
|
+
class Hello < Greeting
|
17
|
+
def hello
|
18
|
+
# howdy
|
19
|
+
end
|
20
|
+
end}
|
21
|
+
|
22
|
+
it "should not have subclass Greeting" do
|
23
|
+
with_subclass.should have_subclass :hello, :greeting do |content|
|
24
|
+
content.should have_method :hello do |hello|
|
25
|
+
hello.should have_comment 'howdy'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
</pre>
|
30
|
+
|
31
|
+
## Note on Patches/Pull Requests
|
32
|
+
|
33
|
+
* Fork the project.
|
34
|
+
* Make your feature addition or bug fix.
|
35
|
+
* Add tests for it. This is important so I don't break it in a
|
36
|
+
future version unintentionally.
|
37
|
+
* Commit, do not mess with rakefile, version, or history.
|
38
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
39
|
+
* Send me a pull request. Bonus points for topic branches.
|
40
|
+
|
41
|
+
## Copyright
|
42
|
+
|
43
|
+
Copyright (c) 2010 Kristian Mandrup. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |gem|
|
4
|
+
gem.name = "code-spec"
|
5
|
+
gem.summary = %Q{Code file RSpec 2 matchers}
|
6
|
+
gem.description = %Q{Code file RSpec 2 matchers that make it easy to spec Ruby code files, fx updated or generated by a Thor generator}
|
7
|
+
gem.email = "kmandrup@gmail.com"
|
8
|
+
gem.homepage = "http://github.com/kristianmandrup/code-spec"
|
9
|
+
gem.authors = ["Kristian Mandrup"]
|
10
|
+
gem.add_development_dependency "rspec", ">= 2.0.0.beta.19"
|
11
|
+
gem.add_dependency "require_all", ">= 1.1.0"
|
12
|
+
gem.add_dependency "activesupport", ">= 3.0.0.rc"
|
13
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
|
+
end
|
15
|
+
Jeweler::GemcutterTasks.new
|
16
|
+
rescue LoadError
|
17
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
18
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/lib/code-spec.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'require_all'
|
3
|
+
require 'active_support/inflector'
|
4
|
+
|
5
|
+
module RSpec
|
6
|
+
module RubyContentMatchers
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'code_spec/matchers/content_matcher'
|
11
|
+
require_all File.dirname(__FILE__) + '/code_spec/matchers'
|
12
|
+
|
13
|
+
RSpec.configure do |config|
|
14
|
+
config.include(RSpec::RubyContentMatchers)
|
15
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module RSpec
|
2
|
+
class RubyContentMatcher
|
3
|
+
attr_reader :content, :end_option, :alt_end, :content_matches
|
4
|
+
|
5
|
+
def initialize name
|
6
|
+
@end_option = name
|
7
|
+
end
|
8
|
+
|
9
|
+
def index
|
10
|
+
0
|
11
|
+
end
|
12
|
+
|
13
|
+
def indexes
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def debug?
|
18
|
+
false
|
19
|
+
end
|
20
|
+
|
21
|
+
def matches? content, &block
|
22
|
+
@content = content
|
23
|
+
match = is_match? content
|
24
|
+
content_to_yield = if indexes
|
25
|
+
content_matches[indexes.first] || content_matches[indexes.last]
|
26
|
+
else
|
27
|
+
content_matches[index]
|
28
|
+
end
|
29
|
+
handle_result(content_to_yield, match, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def is_match? content
|
33
|
+
expr = get_expr(content)
|
34
|
+
debug "match expression: #{expr}"
|
35
|
+
match = (content =~ expr)
|
36
|
+
@content_matches = [$1, $2, $3]
|
37
|
+
match
|
38
|
+
end
|
39
|
+
|
40
|
+
def handle_result content, match, &block
|
41
|
+
if block && match && content
|
42
|
+
ruby_content = content.strip
|
43
|
+
yield ruby_content
|
44
|
+
end
|
45
|
+
match
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_expr content
|
49
|
+
expr = /#{main_expr}#{comment_end}/m
|
50
|
+
if (content =~ expr).nil?
|
51
|
+
/#{main_expr}#{end_expr}/m
|
52
|
+
else
|
53
|
+
expr
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
Q_ANY_GROUP = '(.*?)'
|
58
|
+
ANY_GROUP = '(.*)'
|
59
|
+
|
60
|
+
SPACES = '\s+'
|
61
|
+
OPT_SPACES = '\s*'
|
62
|
+
LPAR = '(\()'
|
63
|
+
RPAR = '(\))'
|
64
|
+
OPT_ARGS = '(\(.+\))?'
|
65
|
+
|
66
|
+
def opt expr
|
67
|
+
"#{expr}?"
|
68
|
+
end
|
69
|
+
|
70
|
+
def args_msg
|
71
|
+
args ? " with arguments #{args}" : ''
|
72
|
+
end
|
73
|
+
|
74
|
+
def any_args_expr
|
75
|
+
OPT_SPACES + OPT_ARGS
|
76
|
+
end
|
77
|
+
|
78
|
+
def args_expr
|
79
|
+
args ? OPT_SPACES + opt(LPAR) + OPT_SPACES + "#{args}" + OPT_SPACES + opt(RPAR) : ''
|
80
|
+
end
|
81
|
+
|
82
|
+
def main_expr
|
83
|
+
raise "Must override main_expr"
|
84
|
+
end
|
85
|
+
|
86
|
+
def end_expr
|
87
|
+
"$"
|
88
|
+
end
|
89
|
+
|
90
|
+
def comment_end
|
91
|
+
alt_end != nil ? '#' + SPACES + "(#{end_option}|#{alt_end})" : '#' + SPACES + "#{end_option}"
|
92
|
+
end
|
93
|
+
|
94
|
+
def failure_message
|
95
|
+
debug_content
|
96
|
+
end
|
97
|
+
|
98
|
+
def negative_failure_message
|
99
|
+
debug_content
|
100
|
+
end
|
101
|
+
|
102
|
+
def debug_content
|
103
|
+
debug "Content: #{content}"
|
104
|
+
end
|
105
|
+
|
106
|
+
def debug msg
|
107
|
+
puts msg if debug?
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module RSpec::RubyContentMatchers
|
2
|
+
class HaveBlock < RSpec::RubyContentMatcher
|
3
|
+
attr_reader :name, :args, :block_args, :do_option, :end_option
|
4
|
+
|
5
|
+
def initialize(name, options={})
|
6
|
+
super options[:end] || name
|
7
|
+
@name = name.to_s
|
8
|
+
@args = options[:args]
|
9
|
+
@do_option = options[:do].nil? ? true : options[:do]
|
10
|
+
@block_args = options[:block_args]
|
11
|
+
end
|
12
|
+
|
13
|
+
def failure_message
|
14
|
+
super
|
15
|
+
return "Expected there to be a block #{name}#{args_msg}#{block_args_msg}, but there wasn't"
|
16
|
+
end
|
17
|
+
|
18
|
+
def negative_failure_message
|
19
|
+
super
|
20
|
+
return "Did not expect there to be a block #{name}#{args_msg}, but there was"
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def block_args_msg
|
26
|
+
" and block arguments #{block_args}" if block_args
|
27
|
+
end
|
28
|
+
|
29
|
+
def indexes
|
30
|
+
[0, 2]
|
31
|
+
end
|
32
|
+
|
33
|
+
def main_expr
|
34
|
+
"#{name}" + SPACES + "#{args_expr}#{do_expr}" + ANY_GROUP
|
35
|
+
end
|
36
|
+
|
37
|
+
def do_expr
|
38
|
+
do_option == false ? '' : 'do' + SPACES + "#{block_args_expr}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def args_expr
|
42
|
+
args ? '(\()?\s*' + args + '\s*(\))?\s+' : ''
|
43
|
+
end
|
44
|
+
|
45
|
+
def block_args_expr
|
46
|
+
block_args ? '\|\s*' + block_args + '\s*\|' : ''
|
47
|
+
end
|
48
|
+
|
49
|
+
def alt_end
|
50
|
+
'do'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def have_block(name, options={})
|
55
|
+
HaveBlock.new(name, options)
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# This method tries to see if a specific method is contained in the generated file.
|
2
|
+
# It can operate (should) on either a file name or the raw content
|
3
|
+
#
|
4
|
+
# generated_file_name.should have_method "hello" # 'my/path/say_hello.rb'.should have_method "hello"
|
5
|
+
#
|
6
|
+
# say_hello_file_content.should have_method "hello"
|
7
|
+
#
|
8
|
+
module RSpec::RubyContentMatchers
|
9
|
+
class HaveCall < RSpec::RubyContentMatcher
|
10
|
+
attr_reader :method, :args, :dot
|
11
|
+
|
12
|
+
def initialize(method, options = {})
|
13
|
+
@method = method.to_s
|
14
|
+
@args = options[:args] || options if !options.kind_of? Hash
|
15
|
+
@dot = options[:dot]
|
16
|
+
end
|
17
|
+
|
18
|
+
def matches?(content)
|
19
|
+
@content = content
|
20
|
+
has_def = (content =~ /def(.*)#{method}/)
|
21
|
+
expr = if has_def
|
22
|
+
/#{dot_expr}#{method}#{args_expr}/m
|
23
|
+
else
|
24
|
+
/#{dot_expr}?#{method}#{args_expr}/m
|
25
|
+
end
|
26
|
+
debug "expr = #{expr}"
|
27
|
+
debug "content = %{#{content}}"
|
28
|
+
debug "content =~ #{expr}"
|
29
|
+
(content =~ expr)
|
30
|
+
end
|
31
|
+
|
32
|
+
def failure_message
|
33
|
+
super
|
34
|
+
"Expected there to be a call to #{method}#{args_msg}, but there wasn't"
|
35
|
+
end
|
36
|
+
|
37
|
+
def negative_failure_message
|
38
|
+
super
|
39
|
+
"Did not expect there to be a call to #{method}#{args_msg}, but there was"
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
def not_def
|
45
|
+
'[^def\s]'
|
46
|
+
end
|
47
|
+
|
48
|
+
def dot_expr
|
49
|
+
return Regexp.escape(dot) if dot.kind_of?(String)
|
50
|
+
dot == true ? "#{not_def}\." : not_def
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
def have_call(method, options = {})
|
56
|
+
HaveCall.new(method, options)
|
57
|
+
end
|
58
|
+
|
59
|
+
def have_dot_call(method, options = {})
|
60
|
+
HaveCall.new(method, options.merge(:dot => true))
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module RSpec::RubyContentMatchers
|
2
|
+
class HaveCalls < HaveCall
|
3
|
+
attr_reader :calls, :method, :args
|
4
|
+
|
5
|
+
def initialize(*calls)
|
6
|
+
case calls.first
|
7
|
+
when Array, Hash
|
8
|
+
@calls = calls.first
|
9
|
+
else
|
10
|
+
@calls = calls
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def matches?(content)
|
15
|
+
super
|
16
|
+
case calls
|
17
|
+
when Array
|
18
|
+
do_list
|
19
|
+
when Hash
|
20
|
+
do_hash
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def do_list
|
27
|
+
calls.each do |method|
|
28
|
+
@method = method.to_s
|
29
|
+
expr =
|
30
|
+
has_def = (content =~ /def(.*)#{method}/)
|
31
|
+
expr = if has_def
|
32
|
+
/#{not_def}\s*#{method}/m
|
33
|
+
else
|
34
|
+
/#{not_def}?\s*#{method}/m
|
35
|
+
end
|
36
|
+
return false if (content =~ expr) == nil
|
37
|
+
end
|
38
|
+
true
|
39
|
+
end
|
40
|
+
|
41
|
+
def do_hash
|
42
|
+
calls.each_pair do |method, args|
|
43
|
+
@method = method.to_s
|
44
|
+
@args = args
|
45
|
+
has_def = (content =~ /def(.*)#{method}/)
|
46
|
+
expr = if has_def
|
47
|
+
/#{not_def}\s*#{method}\s*#{args_expr}/m
|
48
|
+
else
|
49
|
+
/#{not_def}?\s*#{method}\s*#{args_expr}/m
|
50
|
+
end
|
51
|
+
return false if (content =~ expr) == nil
|
52
|
+
end
|
53
|
+
true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def have_calls(*calls)
|
58
|
+
HaveCalls.new(*calls)
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# This method tries to see if a specific method is contained in the generated file.
|
2
|
+
# It can operate (should) on either a file name or the raw content
|
3
|
+
#
|
4
|
+
# generated_file_name.should have_method "hello" # 'my/path/say_hello.rb'.should have_method "hello"
|
5
|
+
#
|
6
|
+
# say_hello_file_content.should have_method "hello"
|
7
|
+
#
|
8
|
+
module RSpec::RubyContentMatchers
|
9
|
+
class HaveClassSelf < RSpec::RubyContentMatcher
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@end_option = 'class'
|
13
|
+
end
|
14
|
+
|
15
|
+
def failure_message
|
16
|
+
super
|
17
|
+
return "Expected there to be a: class << self"
|
18
|
+
end
|
19
|
+
|
20
|
+
def negative_failure_message
|
21
|
+
super
|
22
|
+
"Did not expect there to be a: class << self"
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def main_expr
|
28
|
+
'class\s*<<\s*self' + ANY_GROUP
|
29
|
+
end
|
30
|
+
|
31
|
+
def alt_end
|
32
|
+
'class self'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def have_class_self
|
37
|
+
HaveClassSelf.new
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# This method tries to see if a specific method is contained in the generated file.
|
2
|
+
# It can operate (should) on either a file name or the raw content
|
3
|
+
#
|
4
|
+
# generated_file_name.should have_method "hello" # 'my/path/say_hello.rb'.should have_method "hello"
|
5
|
+
#
|
6
|
+
# say_hello_file_content.should have_method "hello"
|
7
|
+
#
|
8
|
+
module RSpec::RubyContentMatchers
|
9
|
+
class HaveComment < RSpec::RubyContentMatcher
|
10
|
+
attr_accessor :comment
|
11
|
+
|
12
|
+
def initialize comment
|
13
|
+
@comment = comment
|
14
|
+
end
|
15
|
+
|
16
|
+
def matches?(content)
|
17
|
+
@content = content
|
18
|
+
(content =~ /#{main_expr}/)
|
19
|
+
end
|
20
|
+
|
21
|
+
def failure_message
|
22
|
+
super
|
23
|
+
"Expected there to be the comment '# #{comment}'"
|
24
|
+
end
|
25
|
+
|
26
|
+
def negative_failure_message
|
27
|
+
super
|
28
|
+
"Did not expect there to be the comment '# #{comment}'"
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def main_expr
|
34
|
+
'\s*#\s*' + "#{comment}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def have_comment comment
|
39
|
+
HaveComment.new comment
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# This method tries to see if a specific method is contained in the generated file.
|
2
|
+
# It can operate (should) on either a file name or the raw content
|
3
|
+
#
|
4
|
+
# generated_file_name.should have_method "hello" # 'my/path/say_hello.rb'.should have_method "hello"
|
5
|
+
#
|
6
|
+
# say_hello_file_content.should have_method "hello"
|
7
|
+
#
|
8
|
+
module RSpec::RubyContentMatchers
|
9
|
+
class HaveMethod < RSpec::RubyContentMatcher
|
10
|
+
attr_reader :method, :type, :args
|
11
|
+
|
12
|
+
def initialize(method, type=nil, options = {})
|
13
|
+
@method = method.to_s
|
14
|
+
super method
|
15
|
+
@type = type
|
16
|
+
@args = options[:args]
|
17
|
+
end
|
18
|
+
|
19
|
+
def index
|
20
|
+
1
|
21
|
+
end
|
22
|
+
|
23
|
+
def failure_message
|
24
|
+
super
|
25
|
+
"Expected there to be the #{class_msg} method #{method}, but there wasn't"
|
26
|
+
end
|
27
|
+
|
28
|
+
def negative_failure_message
|
29
|
+
super
|
30
|
+
"Did not expect there to be the #{class_msg} method #{method}, but there was"
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def class_msg
|
36
|
+
(type == :class) ? 'class' : ''
|
37
|
+
end
|
38
|
+
|
39
|
+
def main_expr
|
40
|
+
'def' + SPACES + "#{self_expr}#{method}#{args_expr}" + ANY_GROUP
|
41
|
+
end
|
42
|
+
|
43
|
+
def args_expr
|
44
|
+
return super if args
|
45
|
+
any_args_expr
|
46
|
+
end
|
47
|
+
|
48
|
+
def self_expr
|
49
|
+
type == :class ? 'self.' : ''
|
50
|
+
end
|
51
|
+
|
52
|
+
def alt_end
|
53
|
+
'def'
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def have_method(method, type = nil)
|
59
|
+
HaveMethod.new(method, type)
|
60
|
+
end
|
61
|
+
|
62
|
+
def have_args_method(method, options = {})
|
63
|
+
HaveMethod.new(method, options[:type], options)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module RSpec::RubyContentMatchers
|
2
|
+
class HaveModule < RSpec::RubyContentMatcher
|
3
|
+
attr_reader :name, :type, :postfix
|
4
|
+
|
5
|
+
def initialize(name, postfix=nil)
|
6
|
+
@name = name.to_s.camelize
|
7
|
+
super @name
|
8
|
+
@postfix = postfix.to_s.camelize if postfix
|
9
|
+
@type = :module
|
10
|
+
end
|
11
|
+
|
12
|
+
def failure_message
|
13
|
+
super
|
14
|
+
"Expected there to be the #{type} #{name}"
|
15
|
+
end
|
16
|
+
|
17
|
+
def negative_failure_message
|
18
|
+
super
|
19
|
+
"Did not expected there to be the #{type} #{name}"
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def main_expr
|
25
|
+
"#{type}" + SPACES + "#{name}#{postfix}" + SPACES + ANY_GROUP
|
26
|
+
end
|
27
|
+
|
28
|
+
def alt_end
|
29
|
+
type
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class HaveClass < HaveModule
|
34
|
+
|
35
|
+
def initialize(name, postfix)
|
36
|
+
super name, postfix
|
37
|
+
@type = :class
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def have_module(module_name, postfix=nil)
|
42
|
+
HaveModule.new(module_name, postfix)
|
43
|
+
end
|
44
|
+
alias_method :be_module, :have_module
|
45
|
+
|
46
|
+
def have_class(klass, postfix = nil)
|
47
|
+
HaveClass.new(klass, postfix)
|
48
|
+
end
|
49
|
+
alias_method :be_class, :have_class
|
50
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module RSpec::RubyContentMatchers
|
2
|
+
class HaveRegion < RSpec::RubyContentMatcher
|
3
|
+
attr_reader :region
|
4
|
+
|
5
|
+
def initialize(region)
|
6
|
+
@region = region.to_s
|
7
|
+
super @region
|
8
|
+
end
|
9
|
+
|
10
|
+
def failure_message
|
11
|
+
super
|
12
|
+
"Expected there to be a #{region} region"
|
13
|
+
end
|
14
|
+
|
15
|
+
def negative_failure_message
|
16
|
+
super
|
17
|
+
"Did no expected there to be a #{region} region"
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def main_expr
|
23
|
+
"#{region}" + ANY_GROUP
|
24
|
+
end
|
25
|
+
|
26
|
+
def end_expr
|
27
|
+
'(private|protected|public|$)'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def have_region name
|
32
|
+
HaveRegion.new name
|
33
|
+
end
|
34
|
+
|
35
|
+
def have_public
|
36
|
+
HaveRegion.new :public
|
37
|
+
end
|
38
|
+
|
39
|
+
def have_protected
|
40
|
+
HaveRegion.new :protected
|
41
|
+
end
|
42
|
+
|
43
|
+
def have_private
|
44
|
+
HaveRegion.new :private
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|