minispec-given 3.0.0.beta.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,73 @@
1
+ require 'example_helper'
2
+
3
+ describe "Running Givens before Whens" do
4
+ Given(:info) { [] }
5
+ Given { info << "outer1" }
6
+ Given { info << "outer2" }
7
+
8
+ context "using a when without result" do
9
+ When { info << "when" }
10
+
11
+ context "inner with When" do
12
+ Given { info << "inner1" }
13
+ Given { info << "inner2" }
14
+ Then { given_assert_equal ["outer1", "outer2", "inner1", "inner2", "when"], info }
15
+
16
+ context "using a nested When" do
17
+ When { info << "when2" }
18
+ Then { given_assert_equal ["outer1", "outer2", "inner1", "inner2", "when", "when2"], info}
19
+ end
20
+
21
+ context "using two nested When" do
22
+ When { info << "when2a" }
23
+ When { info << "when2b" }
24
+ Then {
25
+ given_assert_equal ["outer1", "outer2", "inner1", "inner2", "when", "when2a", "when2b"], info
26
+ }
27
+ end
28
+ end
29
+ end
30
+
31
+ context "using a when with a result" do
32
+ When(:result) { info << "when" }
33
+
34
+ context "inner with when" do
35
+ Given { info << "inner1" }
36
+ Given { info << "inner2" }
37
+ Then { given_assert_equal ["outer1", "outer2", "inner1", "inner2", "when"], info }
38
+ end
39
+ end
40
+
41
+ context "using no whens" do
42
+ Given { info << "inner1" }
43
+ Given { info << "inner2" }
44
+ Then { given_assert_equal ["outer1", "outer2", "inner1", "inner2"], info }
45
+ end
46
+ end
47
+
48
+ describe "Lazy Givens" do
49
+ Given(:bomb) { fail StandardError, "SHOULD NEVER BE CALLED" }
50
+
51
+ context "when called" do
52
+ Then {
53
+ given_assert_raises(StandardError, /NEVER/) { bomb }
54
+ }
55
+ end
56
+
57
+ context "when not called" do
58
+ Given(:value) { :ok }
59
+ Then { given_assert_equal :ok, value }
60
+ end
61
+ end
62
+
63
+ describe "Non-Lazy Givens" do
64
+ Given(:info) { [] }
65
+
66
+ When { info << :when }
67
+
68
+ context "inner" do
69
+ Given!(:a) { info << :given; "A VALUE" }
70
+ Then { given_assert_equal [:given, :when], info }
71
+ end
72
+
73
+ end
@@ -0,0 +1,31 @@
1
+ require 'example_helper'
2
+
3
+ describe "Invariants" do
4
+ Given(:info) { [] }
5
+
6
+ Invariant { info << "I1" }
7
+
8
+ Then { given_assert_equal ["I1"], info }
9
+
10
+ context "with nested invariants" do
11
+ Invariant { info << "I2" }
12
+
13
+ Then { given_assert_equal ["I1", "I2"], info }
14
+ end
15
+
16
+ context "with multiple invariants" do
17
+ Invariant { info << "I2a" }
18
+ Invariant { info << "I2b" }
19
+
20
+ Then { given_assert_equal ["I1", "I2a", "I2b"], info }
21
+ end
22
+
23
+ context "with a when" do
24
+ Invariant { info << "I2" }
25
+
26
+ When(:when_info) { info.dup }
27
+
28
+ Then { given_assert_equal ["I1", "I2"], info }
29
+ Then { given_assert_equal [], when_info }
30
+ end
31
+ end
@@ -0,0 +1,8 @@
1
+ require 'example_helper'
2
+
3
+ describe "Then" do
4
+ context "empty thens with natural assertions" do
5
+ use_natural_assertions_if_supported
6
+ Then { }
7
+ end
8
+ end
@@ -0,0 +1,4 @@
1
+ ARGV.each do |fn|
2
+ puts "Loading #{fn} ..."
3
+ load fn
4
+ end
@@ -0,0 +1,38 @@
1
+
2
+ module GivenAssertions
3
+ def given_assert(cond)
4
+ assert cond
5
+ end
6
+
7
+ def given_assert_equal(expected, actual)
8
+ actual.must_equal(expected)
9
+ end
10
+
11
+ def given_assert_match(pattern, actual)
12
+ actual.must_match(pattern)
13
+ end
14
+
15
+ def given_assert_not_match(pattern, actual)
16
+ actual.wont_match(pattern)
17
+ end
18
+
19
+ def given_assert_raises(error, pattern=//, &block)
20
+ ex = assert_raises(error, &block)
21
+ ex.message.must_match(pattern)
22
+ end
23
+ end
24
+
25
+ module NaturalAssertionControl
26
+ def use_natural_assertions_if_supported(enabled=true)
27
+ if enabled && ! Given::NATURAL_ASSERTIONS_SUPPORTED
28
+ Given {
29
+ skip "Natural assertions are not supported in JRuby"
30
+ }
31
+ else
32
+ use_natural_assertions(enabled)
33
+ end
34
+ end
35
+ end
36
+
37
+ Minitest::Spec.send(:include, GivenAssertions)
38
+ include NaturalAssertionControl
@@ -0,0 +1,9 @@
1
+ require 'example_helper'
2
+
3
+ describe "Line Spec" do
4
+
5
+ Then { puts "FIRST" }
6
+
7
+ Then { puts "SECOND" }
8
+
9
+ end
@@ -0,0 +1,29 @@
1
+ class Stack
2
+ class StackError < StandardError; end
3
+ class UnderflowError < StackError; end
4
+
5
+ def initialize
6
+ @items = []
7
+ end
8
+
9
+ def depth
10
+ @items.size
11
+ end
12
+
13
+ def empty?
14
+ @items.empty?
15
+ end
16
+
17
+ def top
18
+ @items.last
19
+ end
20
+
21
+ def push(item)
22
+ @items << item
23
+ end
24
+
25
+ def pop
26
+ fail UnderflowError, "Cannot pop an empty stack" if empty?
27
+ @items.pop
28
+ end
29
+ end
@@ -0,0 +1,60 @@
1
+ require 'example_helper'
2
+ require 'stack'
3
+
4
+ Given.use_natural_assertions
5
+
6
+ describe Stack do
7
+ Given(:stack) { Stack.new }
8
+ Given(:initial_contents) { [] }
9
+ Given { initial_contents.each do |item| stack.push(item) end }
10
+
11
+ Invariant { stack.empty? == (stack.depth == 0) }
12
+
13
+ context "with an empty stack" do
14
+ Given(:initial_contents) { [] }
15
+ Then { stack.depth == 0 }
16
+
17
+ context "when pushing" do
18
+ When { stack.push(:an_item) }
19
+
20
+ Then { stack.depth == 1 }
21
+ Then { stack.top == :an_item }
22
+ end
23
+
24
+ context "when popping" do
25
+ When(:result) { stack.pop }
26
+ Then { result == Failure(Stack::UnderflowError, /empty/) }
27
+ end
28
+ end
29
+
30
+ context "with one item" do
31
+ Given(:initial_contents) { [:an_item] }
32
+
33
+ context "when popping" do
34
+ When(:pop_result) { stack.pop }
35
+
36
+ Then { pop_result == :an_item }
37
+ Then { stack.depth == 0 }
38
+ end
39
+ end
40
+
41
+ context "with several items" do
42
+ Given(:initial_contents) { [:second_item, :top_item] }
43
+ Given!(:original_depth) { stack.depth }
44
+
45
+ context "when pushing" do
46
+ When { stack.push(:new_item) }
47
+
48
+ Then { stack.top == :new_item }
49
+ Then { stack.depth == original_depth + 1 }
50
+ end
51
+
52
+ context "when popping" do
53
+ When(:pop_result) { stack.pop }
54
+
55
+ Then { pop_result == :top_item }
56
+ Then { stack.top == :second_item }
57
+ Then { stack.depth == original_depth - 1 }
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,3 @@
1
+
2
+ $:.unshift File.dirname(__FILE__) + "/.."
3
+ require 'stack/stack_spec'
@@ -0,0 +1,2 @@
1
+
2
+ require 'given/core'
@@ -0,0 +1,9 @@
1
+ # This file file is to make bundler happy when auto-requiring files
2
+ # based on gem name. If you are manually requiring rspec/given,
3
+ # please use the canonical require file, ie.
4
+ #
5
+ # require 'minispec/given'
6
+ #
7
+ # Thanks.
8
+
9
+ require 'given/minispec/all'
@@ -0,0 +1 @@
1
+ require 'given/minispec/all'
@@ -0,0 +1 @@
1
+ require 'given/minispec/all'
@@ -0,0 +1,17 @@
1
+ module Rake
2
+ module DSL
3
+
4
+ # Define run so that it will run in a bundle clean environment.
5
+
6
+ if defined?(Bundler)
7
+ def nobundle
8
+ Bundler.with_clean_env { yield }
9
+ end
10
+ else
11
+ def nobundle
12
+ yield
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,161 @@
1
+ require 'rubygems/package_task'
2
+ require './lib/given/version'
3
+
4
+ if ! defined?(Gem)
5
+ puts "Package Target requires RubyGEMs"
6
+ else
7
+ PKG_FILES = FileList[
8
+ '[A-Z]*',
9
+ 'lib/*.rb',
10
+ 'lib/**/*.rb',
11
+ 'rakelib/**/*',
12
+ 'test/**/*.rb',
13
+ 'spec/**/*.rb',
14
+ 'examples/**/*',
15
+ 'doc/**/*',
16
+ ]
17
+ PKG_FILES.exclude('TAGS')
18
+ GIVEN_CORE_FILES = FileList[*PKG_FILES].
19
+ exclude("lib/*-given.rb").
20
+ exclude("lib/rspec/**/*").
21
+ exclude("lib/mini*/**/*").
22
+ exclude("spec/**/*").
23
+ exclude("examples/**/*")
24
+ RSPEC_GIVEN_FILES = FileList[*PKG_FILES].
25
+ exclude("lib/mini*/**/*").
26
+ exclude("lib/mini*-given.rb").
27
+ exclude("lib/given/**/*")
28
+ MINISPEC_GIVEN_FILES = FileList[*PKG_FILES].
29
+ exclude("spec/**/*").
30
+ exclude("lib/rspec-given.rb").
31
+ exclude("lib/rspec*/**/*").
32
+ exclude("lib/given/**/*")
33
+
34
+ RSPEC_GIVEN_SPEC = Gem::Specification.new do |s|
35
+ s.name = 'rspec-given'
36
+ s.version = Given::VERSION
37
+ s.summary = "Given/When/Then Specification Extensions for RSpec."
38
+ s.description = <<EOF
39
+ Given is an RSpec extension that allows the use of Given/When/Then
40
+ terminology when defining specifications.
41
+ EOF
42
+ s.files = RSPEC_GIVEN_FILES.to_a
43
+ s.require_path = 'lib' # Use these for libraries.
44
+ s.rdoc_options = [
45
+ '--line-numbers', '--inline-source',
46
+ '--main' , 'doc/main.rdoc',
47
+ '--title', 'RSpec Given Extensions'
48
+ ]
49
+
50
+ s.add_dependency("given_core", "= #{Given::VERSION}")
51
+ s.add_dependency("rspec", ">= 2.12")
52
+
53
+ s.required_ruby_version = '>= 1.9.2'
54
+ s.license = "MIT"
55
+
56
+ s.author = "Jim Weirich"
57
+ s.email = "jim.weirich@gmail.com"
58
+ s.homepage = "http://github.com/jimweirich/rspec-given"
59
+ s.rubyforge_project = "given"
60
+ end
61
+
62
+ MINISPEC_GIVEN_SPEC = Gem::Specification.new do |s|
63
+ s.name = 'minispec-given'
64
+ s.version = Given::VERSION
65
+ s.summary = "Given/When/Then Specification Extensions for Minispec::Spec."
66
+ s.description = <<EOF
67
+ Given is a Minitest::Spec extension that allows the use of Given/When/Then
68
+ terminology when defining specifications.
69
+ EOF
70
+ s.files = MINISPEC_GIVEN_FILES.to_a
71
+ s.require_path = 'lib' # Use these for libraries.
72
+ s.rdoc_options = [
73
+ '--line-numbers', '--inline-source',
74
+ '--main' , 'doc/main.rdoc',
75
+ '--title', 'Minitest::Spec Given Extensions'
76
+ ]
77
+
78
+ s.add_dependency("given_core", "= #{Given::VERSION}")
79
+ s.add_dependency("minitest", "> 4.3")
80
+
81
+ s.required_ruby_version = '>= 1.9.2'
82
+ s.license = "MIT"
83
+
84
+ s.author = "Jim Weirich"
85
+ s.email = "jim.weirich@gmail.com"
86
+ s.homepage = "http://github.com/jimweirich/rspec-given"
87
+ s.rubyforge_project = "given"
88
+ end
89
+
90
+ GIVEN_CORE_SPEC = Gem::Specification.new do |s|
91
+ s.name = 'given_core'
92
+ s.version = Given::VERSION
93
+ s.summary = "Core engine for RSpec::Given and Minitest::Given."
94
+ s.description = <<EOF
95
+ Given_core is the basic functionality behind rspec-given and minispec-given,
96
+ extensions that allow the use of Given/When/Then terminology when defining
97
+ specifications.
98
+ EOF
99
+ s.files = GIVEN_CORE_FILES.to_a
100
+ s.require_path = 'lib' # Use these for libraries.
101
+ s.rdoc_options = [
102
+ '--line-numbers', '--inline-source',
103
+ '--main' , 'doc/main.rdoc',
104
+ '--title', 'RSpec Given Extensions'
105
+ ]
106
+
107
+ s.add_dependency("sorcerer", ">= 0.3.7")
108
+
109
+ s.required_ruby_version = '>= 1.9.2'
110
+ s.license = "MIT"
111
+
112
+ s.author = "Jim Weirich"
113
+ s.email = "jim.weirich@gmail.com"
114
+ s.homepage = "http://github.com/jimweirich/rspec-given"
115
+ s.rubyforge_project = "given"
116
+ end
117
+
118
+ Gem::PackageTask.new(MINISPEC_GIVEN_SPEC) do |pkg|
119
+ pkg.need_zip = false
120
+ pkg.need_tar = false
121
+ end
122
+
123
+ Gem::PackageTask.new(RSPEC_GIVEN_SPEC) do |pkg|
124
+ pkg.need_zip = false
125
+ pkg.need_tar = false
126
+ end
127
+
128
+ Gem::PackageTask.new(GIVEN_CORE_SPEC) do |pkg|
129
+ pkg.need_zip = false
130
+ pkg.need_tar = false
131
+ end
132
+
133
+ file "rspec-given.gemspec" => ["rakelib/gemspec.rake"] do |t|
134
+ require 'yaml'
135
+ open(t.name, "w") { |f| f.puts RSPEC_GIVEN_SPEC.to_yaml }
136
+ end
137
+
138
+ file "minispec-given.gemspec" => ["rakelib/gemspec.rake"] do |t|
139
+ require 'yaml'
140
+ open(t.name, "w") { |f| f.puts MINISPEC_GIVEN_SPEC.to_yaml }
141
+ end
142
+
143
+ file "given_core.gemspec" => ["rakelib/gemspec.rake"] do |t|
144
+ require 'yaml'
145
+ open(t.name, "w") { |f| f.puts GIVEN_CORE_SPEC.to_yaml }
146
+ end
147
+
148
+ desc "Create a stand-alone gemspec"
149
+ task :gemspec => ["rspec-given.gemspec", "minispec-given.gemspec", "given_core.gemspec"]
150
+
151
+ desc "Check Filelists"
152
+ task :filelists do
153
+ puts "==============="
154
+ puts "GIVEN_CORE_FILES=#{GIVEN_CORE_FILES.inspect}"
155
+ puts "==============="
156
+ puts "RSPEC_GIVEN_FILES=#{RSPEC_GIVEN_FILES.inspect}"
157
+ puts "==============="
158
+ puts "MINISPEC_GIVEN_FILES=#{MINISPEC_GIVEN_FILES.inspect}"
159
+ puts "==============="
160
+ end
161
+ end