micronaut 0.2.9
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/History.txt +15 -0
- data/LICENSE +45 -0
- data/README.markdown +66 -0
- data/RSPEC-LICENSE +23 -0
- data/Rakefile +78 -0
- data/VERSION.yml +4 -0
- data/bin/micronaut +4 -0
- data/examples/example_helper.rb +54 -0
- data/examples/lib/micronaut/behaviour_example.rb +351 -0
- data/examples/lib/micronaut/configuration_example.rb +133 -0
- data/examples/lib/micronaut/example_example.rb +67 -0
- data/examples/lib/micronaut/expectations/extensions/object_example.rb +146 -0
- data/examples/lib/micronaut/expectations/fail_with_example.rb +17 -0
- data/examples/lib/micronaut/expectations/wrap_expectation_example.rb +27 -0
- data/examples/lib/micronaut/formatters/base_formatter_example.rb +117 -0
- data/examples/lib/micronaut/formatters/documentation_formatter_example.rb +5 -0
- data/examples/lib/micronaut/formatters/progress_formatter_example.rb +29 -0
- data/examples/lib/micronaut/kernel_extensions_example.rb +13 -0
- data/examples/lib/micronaut/matchers/be_close_example.rb +52 -0
- data/examples/lib/micronaut/matchers/be_example.rb +298 -0
- data/examples/lib/micronaut/matchers/change_example.rb +360 -0
- data/examples/lib/micronaut/matchers/description_generation_example.rb +175 -0
- data/examples/lib/micronaut/matchers/eql_example.rb +35 -0
- data/examples/lib/micronaut/matchers/equal_example.rb +35 -0
- data/examples/lib/micronaut/matchers/has_example.rb +69 -0
- data/examples/lib/micronaut/matchers/have_example.rb +392 -0
- data/examples/lib/micronaut/matchers/include_example.rb +103 -0
- data/examples/lib/micronaut/matchers/match_example.rb +43 -0
- data/examples/lib/micronaut/matchers/matcher_methods_example.rb +78 -0
- data/examples/lib/micronaut/matchers/operator_matcher_example.rb +193 -0
- data/examples/lib/micronaut/matchers/raise_error_example.rb +348 -0
- data/examples/lib/micronaut/matchers/respond_to_example.rb +54 -0
- data/examples/lib/micronaut/matchers/satisfy_example.rb +36 -0
- data/examples/lib/micronaut/matchers/simple_matcher_example.rb +93 -0
- data/examples/lib/micronaut/matchers/throw_symbol_example.rb +125 -0
- data/examples/lib/micronaut/mocha_example.rb +29 -0
- data/examples/lib/micronaut/runner_example.rb +41 -0
- data/examples/lib/micronaut/world_example.rb +98 -0
- data/examples/lib/micronaut_example.rb +43 -0
- data/examples/resources/example_classes.rb +67 -0
- data/lib/micronaut.rb +40 -0
- data/lib/micronaut/behaviour.rb +217 -0
- data/lib/micronaut/configuration.rb +162 -0
- data/lib/micronaut/example.rb +112 -0
- data/lib/micronaut/expectations.rb +45 -0
- data/lib/micronaut/expectations/extensions/object.rb +92 -0
- data/lib/micronaut/expectations/handler.rb +51 -0
- data/lib/micronaut/expectations/wrap_expectation.rb +52 -0
- data/lib/micronaut/formatters.rb +12 -0
- data/lib/micronaut/formatters/base_formatter.rb +127 -0
- data/lib/micronaut/formatters/base_text_formatter.rb +139 -0
- data/lib/micronaut/formatters/documentation_formatter.rb +78 -0
- data/lib/micronaut/formatters/progress_formatter.rb +30 -0
- data/lib/micronaut/kernel_extensions.rb +11 -0
- data/lib/micronaut/matchers.rb +141 -0
- data/lib/micronaut/matchers/be.rb +204 -0
- data/lib/micronaut/matchers/be_close.rb +37 -0
- data/lib/micronaut/matchers/change.rb +148 -0
- data/lib/micronaut/matchers/eql.rb +26 -0
- data/lib/micronaut/matchers/equal.rb +26 -0
- data/lib/micronaut/matchers/generated_descriptions.rb +36 -0
- data/lib/micronaut/matchers/has.rb +19 -0
- data/lib/micronaut/matchers/have.rb +153 -0
- data/lib/micronaut/matchers/include.rb +80 -0
- data/lib/micronaut/matchers/match.rb +22 -0
- data/lib/micronaut/matchers/method_missing.rb +9 -0
- data/lib/micronaut/matchers/operator_matcher.rb +50 -0
- data/lib/micronaut/matchers/raise_error.rb +128 -0
- data/lib/micronaut/matchers/respond_to.rb +50 -0
- data/lib/micronaut/matchers/satisfy.rb +50 -0
- data/lib/micronaut/matchers/simple_matcher.rb +135 -0
- data/lib/micronaut/matchers/throw_symbol.rb +108 -0
- data/lib/micronaut/mocking/with_absolutely_nothing.rb +11 -0
- data/lib/micronaut/mocking/with_mocha.rb +15 -0
- data/lib/micronaut/mocking/with_rr.rb +24 -0
- data/lib/micronaut/rake_task.rb +84 -0
- data/lib/micronaut/runner.rb +60 -0
- data/lib/micronaut/world.rb +75 -0
- metadata +165 -0
data/History.txt
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
0.0.8
|
2
|
+
=======================
|
3
|
+
- It turns out I'm horrible at updating history files
|
4
|
+
- Added MockWith::AbsolutelyNothing as the default
|
5
|
+
- Added the ability to setup before, after, include, and extend blocks using a extensible API
|
6
|
+
|
7
|
+
0.0.6
|
8
|
+
=======================
|
9
|
+
- MockWith::Mocha autoloads now
|
10
|
+
- Beginnings of the configure block in example helper
|
11
|
+
- Ability to search behaviour groups is in
|
12
|
+
|
13
|
+
0.0.5
|
14
|
+
=======================
|
15
|
+
- Describes are working at any level, befores/afters correctly cascade
|
data/LICENSE
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
Copyright (c) 2008 Chad Humphries
|
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.
|
21
|
+
|
22
|
+
|
23
|
+
The matchers and expectations are licensed:
|
24
|
+
(The MIT License)
|
25
|
+
|
26
|
+
Copyright (c) 2005-2008 The RSpec Development Team
|
27
|
+
|
28
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
29
|
+
a copy of this software and associated documentation files (the
|
30
|
+
"Software"), to deal in the Software without restriction, including
|
31
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
32
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
33
|
+
permit persons to whom the Software is furnished to do so, subject to
|
34
|
+
the following conditions:
|
35
|
+
|
36
|
+
The above copyright notice and this permission notice shall be
|
37
|
+
included in all copies or substantial portions of the Software.
|
38
|
+
|
39
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
40
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
41
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
42
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
43
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
44
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
45
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Micronaut
|
2
|
+
|
3
|
+
* [Codes - http://github.com/spicycode/micronaut](http://github.com/spicycode/micronaut)
|
4
|
+
* [Examples - http://runcoderun.com/spicycode/micronaut](http://runcoderun.com/spicycode/micronaut)
|
5
|
+
* [Rails - http://github.com/spicycode/micronaut-rails](http://github.com/spicycode/micronaut-rails)
|
6
|
+
|
7
|
+
## DESCRIPTION:
|
8
|
+
|
9
|
+
Micronaut is a light-weight BDD test framework.
|
10
|
+
|
11
|
+
## FEATURES:
|
12
|
+
|
13
|
+
* API compatible with RSpec (of course)
|
14
|
+
|
15
|
+
* Slim and light, designed to be readable, compact, and fast. Just over ~1600 LOC in /lib at last count.
|
16
|
+
|
17
|
+
* Each example has its own metadata, and you can add filters or modules to run/disable/enhance examples based on that metadata at run time
|
18
|
+
* A Real-world example of the power the metadata gives you:
|
19
|
+
|
20
|
+
* "Focused examples". Never drop out of Autotest again - just focus on the example(s) and ignore the rest:
|
21
|
+
|
22
|
+
Micronaut.configure do |c| # in your example_helper
|
23
|
+
c.filter_run :focused => true
|
24
|
+
end
|
25
|
+
|
26
|
+
describe Foo do
|
27
|
+
it "this example will run", :focused => true do
|
28
|
+
end
|
29
|
+
|
30
|
+
# equivalent to:
|
31
|
+
focused "so will this one (this is an alias for :focused => true)" do
|
32
|
+
end
|
33
|
+
|
34
|
+
it "this example will not run, until the focused ones are removed" do
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
* Add your own metadata options and customize Micronaut to your hearts content (pending specs are implemented as ':pending => true' metadata, for example)
|
39
|
+
|
40
|
+
* Designed to be formatter compatible with RSpec (though this needs some real-world testing)
|
41
|
+
|
42
|
+
* Rake task for simple setup
|
43
|
+
|
44
|
+
require 'rubygems'
|
45
|
+
require 'micronaut/rake_task'
|
46
|
+
|
47
|
+
desc "Run all micronaut examples"
|
48
|
+
Micronaut::RakeTask.new :examples do |t|
|
49
|
+
t.pattern = "examples/**/*_example.rb"
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "Run all micronaut examples using rcov"
|
53
|
+
Micronaut::RakeTask.new :coverage do |t|
|
54
|
+
t.pattern = "examples/**/*_example.rb"
|
55
|
+
t.rcov = true
|
56
|
+
t.rcov_opts = "--exclude \"examples/*,gems/*,db/*,/Library/Ruby/*,config/*\" --text-summary --sort coverage --no-validator-links"
|
57
|
+
end
|
58
|
+
## REQUIREMENTS:
|
59
|
+
|
60
|
+
+ Ruby 1.8.6+
|
61
|
+
|
62
|
+
## CREDITS:
|
63
|
+
|
64
|
+
* Mini/Unit for the great ideas and runner
|
65
|
+
* RSpec for the great ideas, matchers, expectations and formatter ideas
|
66
|
+
* Matchers are licensed under the MIT license, per RSpec (see RSPEC-LICENSE)
|
data/RSPEC-LICENSE
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2005-2008 The RSpec Development Team
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'lib/micronaut/rake_task'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'jeweler'
|
5
|
+
Jeweler::Tasks.new do |s|
|
6
|
+
s.name = "micronaut"
|
7
|
+
s.executables = "micronaut"
|
8
|
+
s.summary = "An excellent replacement for the wheel..."
|
9
|
+
s.email = "chad@spicycode.com"
|
10
|
+
s.homepage = "http://github.com/spicycode/micronaut"
|
11
|
+
s.description = "An excellent replacement for the wheel..."
|
12
|
+
s.authors = ["Chad Humphries"]
|
13
|
+
s.files = FileList["[A-Z]*", "{bin,lib,examples}/**/*"]
|
14
|
+
s.rubyforge_project = 'spicycode-depot'
|
15
|
+
end
|
16
|
+
rescue => e
|
17
|
+
puts "Jeweler, or one of its dependencies blew right up. #{e}"
|
18
|
+
rescue LoadError
|
19
|
+
puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
20
|
+
end
|
21
|
+
|
22
|
+
# These are new tasks
|
23
|
+
begin
|
24
|
+
require 'rake/contrib/sshpublisher'
|
25
|
+
namespace :rubyforge do
|
26
|
+
|
27
|
+
desc "Release gem and RDoc documentation to RubyForge"
|
28
|
+
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
29
|
+
|
30
|
+
namespace :release do
|
31
|
+
desc "Publish RDoc to RubyForge."
|
32
|
+
task :docs => [:rdoc] do
|
33
|
+
config = YAML.load(
|
34
|
+
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
35
|
+
)
|
36
|
+
|
37
|
+
host = "#{config['username']}@rubyforge.org"
|
38
|
+
remote_dir = "/var/www/gforge-projects/the-perfect-gem/"
|
39
|
+
local_dir = 'rdoc'
|
40
|
+
|
41
|
+
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
rescue LoadError
|
46
|
+
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
desc "List files that don't have examples"
|
51
|
+
task :untested do
|
52
|
+
code = Dir["lib/**/*.rb"].map { |g| Dir.glob(g) }.flatten
|
53
|
+
examples = Dir["examples/**/*_example.rb"].map { |g| Dir.glob(g) }.flatten
|
54
|
+
examples.map! { |f| f =~ /examples\/(.*)_example/; "#{$1}.rb" }
|
55
|
+
puts "\nThe following files seem to be missing their examples:"
|
56
|
+
(code - examples).each do |missing|
|
57
|
+
puts " #{missing}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
puts "Running in Ruby #{RUBY_VERSION}"
|
62
|
+
desc "Run all micronaut examples"
|
63
|
+
Micronaut::RakeTask.new :examples do |t|
|
64
|
+
t.pattern = "examples/**/*_example.rb"
|
65
|
+
end
|
66
|
+
|
67
|
+
namespace :examples do
|
68
|
+
|
69
|
+
desc "Run all micronaut examples using rcov"
|
70
|
+
Micronaut::RakeTask.new :coverage do |t|
|
71
|
+
t.pattern = "examples/**/*_example.rb"
|
72
|
+
t.rcov = true
|
73
|
+
t.rcov_opts = %[--exclude "examples/*,gems/*,db/*,/Library/Ruby/*,config/*" --text-summary --sort coverage]
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
task :default => 'examples:coverage'
|
data/VERSION.yml
ADDED
data/bin/micronaut
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
lib_path = File.expand_path(File.dirname(__FILE__) + "/../lib")
|
2
|
+
$LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
|
3
|
+
|
4
|
+
require 'micronaut'
|
5
|
+
require 'rubygems'
|
6
|
+
|
7
|
+
def with_ruby(version)
|
8
|
+
yield if RUBY_PLATFORM =~ Regexp.compile("^#{version}")
|
9
|
+
end
|
10
|
+
|
11
|
+
with_ruby("1.8") { gem :mocha }
|
12
|
+
|
13
|
+
require File.expand_path(File.dirname(__FILE__) + "/resources/example_classes")
|
14
|
+
|
15
|
+
module Micronaut
|
16
|
+
module Matchers
|
17
|
+
def fail
|
18
|
+
raise_error(::Micronaut::Expectations::ExpectationNotMetError)
|
19
|
+
end
|
20
|
+
|
21
|
+
def fail_with(message)
|
22
|
+
raise_error(::Micronaut::Expectations::ExpectationNotMetError, message)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def remove_last_describe_from_world
|
28
|
+
Micronaut.world.behaviours.pop
|
29
|
+
end
|
30
|
+
|
31
|
+
def isolate_behaviour
|
32
|
+
if block_given?
|
33
|
+
yield
|
34
|
+
Micronaut.world.behaviours.pop
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def use_formatter(new_formatter)
|
39
|
+
original_formatter = Micronaut.configuration.formatter
|
40
|
+
Micronaut.configuration.instance_variable_set(:@formatter, new_formatter)
|
41
|
+
yield
|
42
|
+
ensure
|
43
|
+
Micronaut.configuration.instance_variable_set(:@formatter, original_formatter)
|
44
|
+
end
|
45
|
+
|
46
|
+
def not_in_editor?
|
47
|
+
!(ENV.has_key?('TM_MODE') || ENV.has_key?('EMACS') || ENV.has_key?('VIM'))
|
48
|
+
end
|
49
|
+
|
50
|
+
Micronaut.configure do |c|
|
51
|
+
c.mock_with :mocha
|
52
|
+
c.color_enabled = not_in_editor?
|
53
|
+
c.filter_run :focused => true
|
54
|
+
end
|
@@ -0,0 +1,351 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../example_helper")
|
2
|
+
|
3
|
+
describe Micronaut::Behaviour do
|
4
|
+
|
5
|
+
def empty_behaviour_group
|
6
|
+
group = Micronaut::Behaviour.describe(Object, 'Empty Behaviour Group') { }
|
7
|
+
remove_last_describe_from_world
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "describing behaviour with #describe" do
|
11
|
+
|
12
|
+
example "an ArgumentError is raised if no type or description is given" do
|
13
|
+
lambda { Micronaut::Behaviour.describe() {} }.should raise_error(ArgumentError, "No arguments given. You must a least supply a type or description")
|
14
|
+
end
|
15
|
+
|
16
|
+
example "an ArgumentError is raised if no block is given" do
|
17
|
+
lambda { Micronaut::Behaviour.describe('foo') }.should raise_error(ArgumentError, "You must supply a block when calling describe")
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#name' do
|
21
|
+
|
22
|
+
it "should expose the first parameter as name" do
|
23
|
+
isolate_behaviour do
|
24
|
+
Micronaut::Behaviour.describe("my favorite pony") { }.name.should == 'my favorite pony'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should call to_s on the first parameter in case it is a constant" do
|
29
|
+
isolate_behaviour do
|
30
|
+
Micronaut::Behaviour.describe(Object) { }.name.should == 'Object'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
pending "should build a nested name correctly, including the module, and each nested description in the correct order" do
|
35
|
+
behaviour_to_test = nil
|
36
|
+
|
37
|
+
isolate_behaviour do
|
38
|
+
Micronaut::Behaviour.describe(Micronaut, "test") do
|
39
|
+
Micronaut::Behaviour.describe("nested one") do
|
40
|
+
behaviour_to_test = Micronaut::Behaviour.describe("nested two") { }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
behaviour_to_test.name.should == 'Micronaut - test - nested one - nested two'
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#describes' do
|
51
|
+
|
52
|
+
it "should be the first parameter when it is a constant" do
|
53
|
+
isolate_behaviour do
|
54
|
+
Micronaut::Behaviour.describe(Object) { }.describes.should == Object
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should be nil when the first parameter is a string" do
|
59
|
+
isolate_behaviour do
|
60
|
+
Micronaut::Behaviour.describe("i'm a computer") { }.describes.should be_nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#description' do
|
67
|
+
|
68
|
+
it "should expose the second parameter as description" do
|
69
|
+
isolate_behaviour do
|
70
|
+
Micronaut::Behaviour.describe(Object, "my desc") { }.description.should == 'my desc'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should allow the second parameter to be nil" do
|
75
|
+
isolate_behaviour do
|
76
|
+
Micronaut::Behaviour.describe(Object, nil) { }.description.size.should == 0
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#metadata' do
|
83
|
+
|
84
|
+
it "should add the third parameter to the metadata" do
|
85
|
+
isolate_behaviour do
|
86
|
+
Micronaut::Behaviour.describe(Object, nil, 'foo' => 'bar') { }.metadata.should include({ "foo" => 'bar' })
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should add the caller to metadata" do
|
91
|
+
isolate_behaviour do
|
92
|
+
Micronaut::Behaviour.describe(Object) { }.metadata[:behaviour][:caller][4].should =~ /#{__FILE__}:#{__LINE__}/
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should add the the file_path to metadata" do
|
97
|
+
isolate_behaviour do
|
98
|
+
Micronaut::Behaviour.describe(Object) { }.metadata[:behaviour][:file_path].should == __FILE__
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should have a reader for file_path" do
|
103
|
+
isolate_behaviour do
|
104
|
+
Micronaut::Behaviour.describe(Object) { }.file_path.should == __FILE__
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should add the line_number to metadata" do
|
109
|
+
isolate_behaviour do
|
110
|
+
Micronaut::Behaviour.describe(Object) { }.metadata[:behaviour][:line_number].should == __LINE__
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should add file path and line number metadata for arbitrarily nested describes" do
|
115
|
+
Micronaut::Behaviour.describe(Object) do
|
116
|
+
Micronaut::Behaviour.describe("foo") do
|
117
|
+
Micronaut::Behaviour.describe(Object) { }.metadata[:behaviour][:file_path].should == __FILE__
|
118
|
+
Micronaut::Behaviour.describe(Object) { }.metadata[:behaviour][:line_number].should == __LINE__
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
4.times { remove_last_describe_from_world }
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "adding before and after hooks" do
|
128
|
+
|
129
|
+
it "should expose the before each blocks at before_eachs" do
|
130
|
+
group = empty_behaviour_group
|
131
|
+
group.before(:each) { 'foo' }
|
132
|
+
group.should have(1).before_eachs
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should maintain the before each block order" do
|
136
|
+
group = empty_behaviour_group
|
137
|
+
group.before(:each) { 15 }
|
138
|
+
group.before(:each) { 'A' }
|
139
|
+
group.before(:each) { 33.5 }
|
140
|
+
|
141
|
+
group.before_eachs[0].call.should == 15
|
142
|
+
group.before_eachs[1].call.should == 'A'
|
143
|
+
group.before_eachs[2].call.should == 33.5
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should expose the before all blocks at before_alls" do
|
147
|
+
group = empty_behaviour_group
|
148
|
+
group.before(:all) { 'foo' }
|
149
|
+
group.should have(1).before_alls
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should maintain the before all block order" do
|
153
|
+
group = empty_behaviour_group
|
154
|
+
group.before(:all) { 15 }
|
155
|
+
group.before(:all) { 'A' }
|
156
|
+
group.before(:all) { 33.5 }
|
157
|
+
|
158
|
+
group.before_alls[0].call.should == 15
|
159
|
+
group.before_alls[1].call.should == 'A'
|
160
|
+
group.before_alls[2].call.should == 33.5
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should expose the after each blocks at after_eachs" do
|
164
|
+
group = empty_behaviour_group
|
165
|
+
group.after(:each) { 'foo' }
|
166
|
+
group.should have(1).after_eachs
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should maintain the after each block order" do
|
170
|
+
group = empty_behaviour_group
|
171
|
+
group.after(:each) { 15 }
|
172
|
+
group.after(:each) { 'A' }
|
173
|
+
group.after(:each) { 33.5 }
|
174
|
+
|
175
|
+
group.after_eachs[0].call.should == 15
|
176
|
+
group.after_eachs[1].call.should == 'A'
|
177
|
+
group.after_eachs[2].call.should == 33.5
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should expose the after all blocks at after_alls" do
|
181
|
+
group = empty_behaviour_group
|
182
|
+
group.after(:all) { 'foo' }
|
183
|
+
group.should have(1).after_alls
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should maintain the after each block order" do
|
187
|
+
group = empty_behaviour_group
|
188
|
+
group.after(:all) { 15 }
|
189
|
+
group.after(:all) { 'A' }
|
190
|
+
group.after(:all) { 33.5 }
|
191
|
+
|
192
|
+
group.after_alls[0].call.should == 15
|
193
|
+
group.after_alls[1].call.should == 'A'
|
194
|
+
group.after_alls[2].call.should == 33.5
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
describe "adding examples" do
|
200
|
+
|
201
|
+
it "should allow adding an example using 'it'" do
|
202
|
+
group = empty_behaviour_group
|
203
|
+
group.it("should do something") { }
|
204
|
+
group.examples.size.should == 1
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should expose all examples at examples" do
|
208
|
+
group = empty_behaviour_group
|
209
|
+
group.it("should do something 1") { }
|
210
|
+
group.it("should do something 2") { }
|
211
|
+
group.it("should do something 3") { }
|
212
|
+
group.examples.size.should == 3
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should maintain the example order" do
|
216
|
+
group = empty_behaviour_group
|
217
|
+
group.it("should 1") { }
|
218
|
+
group.it("should 2") { }
|
219
|
+
group.it("should 3") { }
|
220
|
+
group.examples[0].description.should == 'should 1'
|
221
|
+
group.examples[1].description.should == 'should 2'
|
222
|
+
group.examples[2].description.should == 'should 3'
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|
226
|
+
|
227
|
+
end
|
228
|
+
|
229
|
+
describe Object, "describing nested behaviours", :little_less_nested => 'yep' do
|
230
|
+
|
231
|
+
describe "A sample nested describe", :nested_describe => "yep" do
|
232
|
+
|
233
|
+
it "should set the described type to the constant Object" do
|
234
|
+
running_example.behaviour.describes.should == Object
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should set the description to 'A sample nested describe'" do
|
238
|
+
running_example.behaviour.description.should == 'A sample nested describe'
|
239
|
+
end
|
240
|
+
|
241
|
+
it "should have top level metadata from the behaviour and its ancestors" do
|
242
|
+
running_example.behaviour.metadata.should include(:little_less_nested => 'yep', :nested_describe => 'yep')
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should make the parent metadata available on the contained examples" do
|
246
|
+
running_example.metadata.should include(:little_less_nested => 'yep', :nested_describe => 'yep')
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
250
|
+
|
251
|
+
end
|
252
|
+
|
253
|
+
describe "#run_examples" do
|
254
|
+
|
255
|
+
before do
|
256
|
+
@fake_formatter = Micronaut::Formatters::BaseFormatter.new
|
257
|
+
end
|
258
|
+
|
259
|
+
def stub_behaviour
|
260
|
+
stub_everything('behaviour', :metadata => { :behaviour => { :name => 'behaviour_name' }})
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should return true if all examples pass" do
|
264
|
+
use_formatter(@fake_formatter) do
|
265
|
+
passing_example1 = Micronaut::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 1 }))
|
266
|
+
passing_example2 = Micronaut::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 1 }))
|
267
|
+
Micronaut::Behaviour.stubs(:examples_to_run).returns([passing_example1, passing_example2])
|
268
|
+
|
269
|
+
Micronaut::Behaviour.run_examples(stub_behaviour, stub_everything('reporter')).should be_true
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
it "should return false if any of the examples return false" do
|
274
|
+
use_formatter(@fake_formatter) do
|
275
|
+
failing_example = Micronaut::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 2 }))
|
276
|
+
passing_example = Micronaut::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 1 }))
|
277
|
+
Micronaut::Behaviour.stubs(:examples_to_run).returns([failing_example, passing_example])
|
278
|
+
|
279
|
+
Micronaut::Behaviour.run_examples(stub_behaviour, stub_everything('reporter')).should be_false
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
it "should run all examples, regardless of any of them failing" do
|
284
|
+
use_formatter(@fake_formatter) do
|
285
|
+
failing_example = Micronaut::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 2 }))
|
286
|
+
passing_example = Micronaut::Example.new(stub_behaviour, 'description', {}, (lambda { 1.should == 1 }))
|
287
|
+
Micronaut::Behaviour.stubs(:examples_to_run).returns([failing_example, passing_example])
|
288
|
+
|
289
|
+
passing_example.expects(:run)
|
290
|
+
|
291
|
+
Micronaut::Behaviour.run_examples(stub_behaviour, stub_everything('reporter'))
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
end
|
296
|
+
|
297
|
+
describe "how instance variables inherit" do
|
298
|
+
|
299
|
+
before(:all) do
|
300
|
+
@before_all_top_level = 'before_all_top_level'
|
301
|
+
end
|
302
|
+
|
303
|
+
before(:each) do
|
304
|
+
@before_each_top_level = 'before_each_top_level'
|
305
|
+
end
|
306
|
+
|
307
|
+
it "should be able to access a before each ivar at the same level" do
|
308
|
+
@before_each_top_level.should == 'before_each_top_level'
|
309
|
+
end
|
310
|
+
|
311
|
+
it "should be able to access a before all ivar at the same level" do
|
312
|
+
@before_all_top_level.should == 'before_all_top_level'
|
313
|
+
end
|
314
|
+
|
315
|
+
|
316
|
+
it "should be able to access the before all ivars in the before_all_ivars hash" do
|
317
|
+
with_ruby('1.8') do
|
318
|
+
running_example.behaviour.before_all_ivars.should include('@before_all_top_level' => 'before_all_top_level')
|
319
|
+
end
|
320
|
+
with_ruby('1.9') do
|
321
|
+
running_example.behaviour.before_all_ivars.should include(:@before_all_top_level => 'before_all_top_level')
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
describe "but now I am nested" do
|
326
|
+
|
327
|
+
it "should be able to access a parent behaviours before each ivar at a nested level" do
|
328
|
+
@before_each_top_level.should == 'before_each_top_level'
|
329
|
+
end
|
330
|
+
|
331
|
+
it "should be able to access a parent behaviours before all ivar at a nested level" do
|
332
|
+
@before_all_top_level.should == "before_all_top_level"
|
333
|
+
end
|
334
|
+
|
335
|
+
it "changes to before all ivars from within an example do not persist outside the current describe" do
|
336
|
+
@before_all_top_level = "ive been changed"
|
337
|
+
end
|
338
|
+
|
339
|
+
describe "accessing a before_all ivar that was changed in a parent behaviour" do
|
340
|
+
|
341
|
+
it "should have access to the modified version" do
|
342
|
+
@before_all_top_level.should == 'ive been changed'
|
343
|
+
end
|
344
|
+
|
345
|
+
end
|
346
|
+
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
|
351
|
+
end
|