opal-spec 0.2.15 → 0.2.16
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +6 -0
- data/Gemfile +1 -1
- data/lib/opal/spec/version.rb +1 -1
- data/opal/opal/spec.rb +3 -5
- data/opal/opal/spec/browser_formatter.rb +52 -69
- data/opal/opal/spec/expectations.rb +106 -31
- data/opal/opal/spec/matchers.rb +33 -70
- data/opal/opal/spec/object.rb +21 -0
- data/opal/opal/spec/phantom_formatter.rb +8 -11
- data/opal/opal/spec/runner.rb +5 -21
- data/opal/opal/spec/spec.rb +117 -23
- data/opal/opal/spec/sprockets_runner.rb.erb +1 -1
- data/spec/specs_spec.rb +33 -1
- metadata +4 -11
- data/opal/opal/spec/assertions.rb +0 -12
- data/opal/opal/spec/kernel.rb +0 -14
- data/opal/opal/spec/matchers/base.rb +0 -11
- data/opal/opal/spec/matchers/be_empty.rb +0 -15
- data/opal/opal/spec/matchers/respond_to.rb +0 -19
- data/opal/opal/spec/scratch_pad.rb +0 -17
- data/opal/opal/spec/test_case.rb +0 -123
- data/spec/tests_spec.rb +0 -17
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/lib/opal/spec/version.rb
CHANGED
data/opal/opal/spec.rb
CHANGED
@@ -1,15 +1,13 @@
|
|
1
1
|
require 'opal'
|
2
2
|
|
3
|
-
require 'opal/spec/test_case'
|
4
|
-
require 'opal/spec/spec'
|
5
3
|
require 'opal/spec/matchers'
|
6
4
|
require 'opal/spec/runner'
|
7
|
-
require 'opal/spec/scratch_pad'
|
8
5
|
require 'opal/spec/expectations'
|
6
|
+
require 'opal/spec/spec'
|
9
7
|
require 'opal/spec/browser_formatter'
|
10
8
|
require 'opal/spec/phantom_formatter'
|
11
|
-
require 'opal/spec/
|
9
|
+
require 'opal/spec/object'
|
12
10
|
|
13
11
|
module Opal
|
14
|
-
Spec =
|
12
|
+
Spec = OpalSpec # compatibility
|
15
13
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module OpalSpec
|
2
2
|
class BrowserFormatter
|
3
3
|
CSS = <<-CSS
|
4
4
|
|
@@ -56,79 +56,66 @@ module OpalTest
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def start
|
59
|
-
|
60
|
-
if (!document || !document.body) {
|
61
|
-
#{ raise "Not running in browser." };
|
62
|
-
}
|
59
|
+
raise "Not running in browser" unless $global[:document]
|
63
60
|
|
64
|
-
|
65
|
-
|
66
|
-
|
61
|
+
@summary_element = $global.document.createElement 'p'
|
62
|
+
@summary_element.className = 'summary'
|
63
|
+
@summary_element.innerHTML = "Running..."
|
67
64
|
|
68
|
-
|
69
|
-
|
65
|
+
@groups_element = $global.document.createElement 'ul'
|
66
|
+
@groups_element.className = 'example_groups'
|
70
67
|
|
71
|
-
|
68
|
+
target = $global.document.getElementById 'opal-spec-output'
|
72
69
|
|
73
|
-
|
74
|
-
target = document.body;
|
75
|
-
}
|
70
|
+
target ||= $global.document.body
|
76
71
|
|
77
|
-
|
78
|
-
|
72
|
+
target.appendChild @summary_element
|
73
|
+
target.appendChild @groups_element
|
79
74
|
|
80
|
-
|
81
|
-
|
75
|
+
styles = $global.document.createElement 'style'
|
76
|
+
styles.type = "text/css"
|
82
77
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
}
|
78
|
+
if styles[:styleSheet]
|
79
|
+
styles.styleSheet.cssText = CSS
|
80
|
+
else
|
81
|
+
styles.appendChild $global.document.createTextNode CSS
|
82
|
+
end
|
89
83
|
|
90
|
-
|
91
|
-
}
|
84
|
+
$global.document.getElementsByTagName('head')[0].appendChild styles
|
92
85
|
|
93
86
|
@start_time = Time.now.to_f
|
94
|
-
@groups_element = `groups_element`
|
95
|
-
@summary_element = `summary_element`
|
96
87
|
end
|
97
88
|
|
98
89
|
def finish
|
99
90
|
time = Time.now.to_f - @start_time
|
100
91
|
text = "\n#{example_count} examples, #{@failed_examples.size} failures (time taken: #{time})"
|
101
|
-
|
92
|
+
|
93
|
+
@summary_element.innerHTML = text
|
102
94
|
end
|
103
95
|
|
104
96
|
def example_group_started group
|
105
97
|
@example_group = group
|
106
98
|
@example_group_failed = false
|
107
99
|
|
108
|
-
|
109
|
-
var group_element = document.createElement('li');
|
100
|
+
@group_element = $global.document.createElement 'li'
|
110
101
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
102
|
+
description = $global.document.createElement 'span'
|
103
|
+
description.className = 'group_description'
|
104
|
+
description.innerHTML = group.description.to_s
|
105
|
+
@group_element.appendChild description
|
115
106
|
|
116
|
-
|
117
|
-
|
118
|
-
|
107
|
+
@example_list = $global.document.createElement 'ul'
|
108
|
+
@example_list.className = 'examples'
|
109
|
+
@group_element.appendChild @example_list
|
119
110
|
|
120
|
-
|
121
|
-
}
|
122
|
-
|
123
|
-
@group_element = `group_element`
|
124
|
-
@example_list = `example_list`
|
111
|
+
@groups_element.appendChild @group_element
|
125
112
|
end
|
126
113
|
|
127
114
|
def example_group_finished group
|
128
115
|
if @example_group_failed
|
129
|
-
|
116
|
+
@group_element.className = 'group failed'
|
130
117
|
else
|
131
|
-
|
118
|
+
@group_element.className = 'group passed'
|
132
119
|
end
|
133
120
|
end
|
134
121
|
|
@@ -144,45 +131,41 @@ module OpalTest
|
|
144
131
|
exception = example.exception
|
145
132
|
|
146
133
|
case exception
|
147
|
-
when
|
134
|
+
when OpalSpec::ExpectationNotMetError
|
148
135
|
output = exception.message
|
149
136
|
else
|
150
137
|
output = "#{exception.class.name}: #{exception.message}\n"
|
151
138
|
output += " #{exception.backtrace.join "\n "}\n"
|
152
139
|
end
|
153
140
|
|
154
|
-
|
155
|
-
|
156
|
-
wrapper.className = 'example failed';
|
141
|
+
wrapper = $global.document.createElement 'li'
|
142
|
+
wrapper.className = 'example failed'
|
157
143
|
|
158
|
-
|
159
|
-
|
160
|
-
|
144
|
+
description = $global.document.createElement 'span'
|
145
|
+
description.className = 'example_description'
|
146
|
+
description.innerHTML = example.description
|
161
147
|
|
162
|
-
|
163
|
-
|
164
|
-
|
148
|
+
exception = $global.document.createElement 'pre'
|
149
|
+
exception.className = 'exception'
|
150
|
+
exception.innerHTML = output
|
165
151
|
|
166
|
-
|
167
|
-
|
152
|
+
wrapper.appendChild description
|
153
|
+
wrapper.appendChild exception
|
168
154
|
|
169
|
-
|
170
|
-
|
171
|
-
}
|
155
|
+
@example_list.appendChild wrapper
|
156
|
+
@example_list.style.display = 'list-item'
|
172
157
|
end
|
173
158
|
|
174
159
|
def example_passed example
|
175
|
-
|
176
|
-
|
177
|
-
wrapper.className = 'example passed';
|
160
|
+
wrapper = $global.document.createElement 'li'
|
161
|
+
wrapper.className = 'example passed'
|
178
162
|
|
179
|
-
|
180
|
-
|
181
|
-
|
163
|
+
description = $global.document.createElement 'span'
|
164
|
+
description.className = 'example_description'
|
165
|
+
description.innerHTML = example.description
|
182
166
|
|
183
|
-
|
184
|
-
|
185
|
-
}
|
167
|
+
wrapper.appendChild description
|
168
|
+
@example_list.appendChild wrapper
|
186
169
|
end
|
187
170
|
|
188
171
|
def example_count
|
@@ -1,53 +1,128 @@
|
|
1
|
-
module
|
1
|
+
module OpalSpec
|
2
2
|
class ExpectationNotMetError < StandardError; end
|
3
3
|
|
4
|
-
module Expectations
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
module Expectations; end
|
5
|
+
|
6
|
+
def self.matcher name, &block
|
7
|
+
klass = Class.new(Matcher, &block)
|
8
|
+
|
9
|
+
klass.define_method(:matcher_name) do
|
10
|
+
name
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
matcher.not_match self
|
16
|
-
else
|
17
|
-
NegativeOperatorMatcher.new self
|
18
|
-
end
|
13
|
+
Expectations.define_method(name) do |*args|
|
14
|
+
klass.new(*args)
|
19
15
|
end
|
16
|
+
end
|
20
17
|
|
21
|
-
|
22
|
-
|
18
|
+
matcher :be_nil do
|
19
|
+
def match expected, actual
|
20
|
+
actual.nil?
|
23
21
|
end
|
24
22
|
|
25
|
-
def
|
26
|
-
|
23
|
+
def failure_message_for_should
|
24
|
+
"expected #{expected.inspect} to be nil."
|
27
25
|
end
|
26
|
+
end
|
28
27
|
|
29
|
-
|
30
|
-
|
28
|
+
matcher :be_true do
|
29
|
+
def match expected, actual
|
30
|
+
actual == true
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
34
|
-
|
33
|
+
def failure_message_for_should
|
34
|
+
"expected #{actual.inspect} to be true."
|
35
35
|
end
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
-
|
38
|
+
matcher :be_false do
|
39
|
+
def match expected, actual
|
40
|
+
actual == false
|
39
41
|
end
|
40
42
|
|
41
|
-
def
|
42
|
-
|
43
|
+
def failure_message_for_should
|
44
|
+
"expected #{actual.inspect} to be false."
|
43
45
|
end
|
46
|
+
end
|
44
47
|
|
45
|
-
|
46
|
-
|
48
|
+
matcher :be_kind_of do
|
49
|
+
def match expected, actual
|
50
|
+
actual.kind_of? expected
|
51
|
+
end
|
52
|
+
|
53
|
+
def failure_message_for_should
|
54
|
+
"expected #{actual.inspect} to be a kind of #{expected.name}, not #{actual.class.name}."
|
47
55
|
end
|
48
56
|
end
|
49
|
-
end
|
50
57
|
|
51
|
-
|
52
|
-
|
58
|
+
matcher :eq do
|
59
|
+
def match expected, actual
|
60
|
+
expected == actual
|
61
|
+
end
|
62
|
+
|
63
|
+
def failure_message_for_should
|
64
|
+
"expected #{expected.inspect}, got: #{actual.inspect} (using ==)."
|
65
|
+
end
|
66
|
+
|
67
|
+
def failure_message_for_should_not
|
68
|
+
"expected #{expected.inspect}, not to be: #{actual.inspect} (using ==)."
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
matcher :equal do
|
73
|
+
def match expected, actual
|
74
|
+
expected.equal? actual
|
75
|
+
end
|
76
|
+
|
77
|
+
def failure_message_for_should
|
78
|
+
"expected #{actual.inspect} to be the same as #{expected.inspect}."
|
79
|
+
end
|
80
|
+
|
81
|
+
def failure_message_for_should_not
|
82
|
+
"expected #{actual.inspect} to not be equal to #{expected.inspect}."
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
matcher :raise_error do
|
87
|
+
def initialize(&block)
|
88
|
+
@block = block
|
89
|
+
end
|
90
|
+
|
91
|
+
def match expected, actual
|
92
|
+
ok = true
|
93
|
+
|
94
|
+
begin
|
95
|
+
@block.call
|
96
|
+
ok = false
|
97
|
+
rescue => e
|
98
|
+
@error = e
|
99
|
+
end
|
100
|
+
|
101
|
+
ok
|
102
|
+
end
|
103
|
+
|
104
|
+
def failure_message_for_should
|
105
|
+
"expected #{actual} to be raised, but nothing was."
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
matcher :be_empty do
|
110
|
+
def match expected, actual
|
111
|
+
actual.empty?
|
112
|
+
end
|
113
|
+
|
114
|
+
def failure_message_for_should
|
115
|
+
"expected #{actual.inspect} to be empty"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
matcher :respond_to do
|
120
|
+
def match expected, actual
|
121
|
+
actual.respond_to? expected
|
122
|
+
end
|
123
|
+
|
124
|
+
def failure_message_for_should
|
125
|
+
"expected #{actual.inspect} (#{actual.class}) to respond to #{expected}."
|
126
|
+
end
|
127
|
+
end
|
53
128
|
end
|
data/opal/opal/spec/matchers.rb
CHANGED
@@ -1,98 +1,61 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
module OpalSpec
|
2
|
+
class Matcher
|
3
|
+
attr_reader :actual, :expected
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
def == expected
|
8
|
-
if @actual == expected
|
9
|
-
true
|
10
|
-
else
|
11
|
-
failure "expected: #{expected.inspect}, got: #{@actual.inspect} (using ==)."
|
12
|
-
end
|
5
|
+
def initialize expected = nil
|
6
|
+
@expected = expected
|
13
7
|
end
|
14
|
-
end
|
15
8
|
|
16
|
-
|
17
|
-
|
18
|
-
if @actual == expected
|
19
|
-
failure "expected: #{expected.inspect} not to be #{@actual.inspect} (using ==)."
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
9
|
+
def positive_match? actual
|
10
|
+
@actual = actual
|
23
11
|
|
24
|
-
|
25
|
-
|
26
|
-
unless expected.kind_of? @actual
|
27
|
-
failure "expected #{expected.inspect} to be a kind of #{@actual.name}, not #{expected.class.name}."
|
12
|
+
unless match expected, actual
|
13
|
+
raise OpalSpec::ExpectationNotMetError, failure_message_for_should
|
28
14
|
end
|
29
15
|
end
|
30
|
-
end
|
31
16
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
17
|
+
def negative_match? actual
|
18
|
+
@actual = actual
|
19
|
+
|
20
|
+
if match expected, actual
|
21
|
+
raise OpalSpec::ExpectationNotMetError, failure_message_for_should_not
|
36
22
|
end
|
37
23
|
end
|
38
|
-
end
|
39
24
|
|
40
|
-
|
41
|
-
|
42
|
-
unless expected == true
|
43
|
-
failure "expected #{expected.inspect} to be true."
|
44
|
-
end
|
25
|
+
def failure_message_for_should
|
26
|
+
"expected: #{expected.inspect}, actual: #{actual.inspect} (#{matcher_name}) [should]."
|
45
27
|
end
|
46
|
-
end
|
47
28
|
|
48
|
-
|
49
|
-
|
50
|
-
unless expected == false
|
51
|
-
failure "expected #{expected.inspect} to be false."
|
52
|
-
end
|
29
|
+
def failure_message_for_should_not
|
30
|
+
"expected: #{expected.inspect}, actual: #{actual.inspect} (#{matcher_name}) [should_not]."
|
53
31
|
end
|
54
32
|
end
|
55
33
|
|
56
|
-
class
|
57
|
-
def
|
58
|
-
|
59
|
-
|
34
|
+
class PositiveOperatorMatcher < Matcher
|
35
|
+
def == actual
|
36
|
+
@actual = actual
|
37
|
+
|
38
|
+
unless expected == actual
|
39
|
+
raise Opal::Spec::ExpectationNotMetError, failure_message_for_should
|
60
40
|
end
|
61
41
|
end
|
62
42
|
|
63
|
-
def
|
64
|
-
|
65
|
-
failure "expected: #{expected.inspect} not to be #{@actual.inspect} (using ==)."
|
66
|
-
end
|
43
|
+
def failure_message_for_should
|
44
|
+
"expected #{expected.inspect}, but got: #{actual.inspect} (using ==)."
|
67
45
|
end
|
68
46
|
end
|
69
47
|
|
70
|
-
class
|
71
|
-
def
|
72
|
-
|
73
|
-
failure "expected #{@actual.inspect} to be the same as #{expected.inspect}."
|
74
|
-
end
|
75
|
-
end
|
48
|
+
class NegativeOperatorMatcher < Matcher
|
49
|
+
def == actual
|
50
|
+
@actual = actual
|
76
51
|
|
77
|
-
|
78
|
-
|
79
|
-
failure "expected #{@actual.inspect} not to be equal to #{expected.inspect}."
|
52
|
+
if expected == actual
|
53
|
+
raise Opal::Spec::ExpectationNotMetError, failure_message_for_should_not
|
80
54
|
end
|
81
55
|
end
|
82
|
-
end
|
83
56
|
|
84
|
-
|
85
|
-
|
86
|
-
should_raise = false
|
87
|
-
begin
|
88
|
-
block.call
|
89
|
-
should_raise = true
|
90
|
-
rescue => e
|
91
|
-
end
|
92
|
-
|
93
|
-
if should_raise
|
94
|
-
failure "expected #{@actual} to be raised, but nothing was."
|
95
|
-
end
|
57
|
+
def failure_message_for_should_not
|
58
|
+
"expected #{expected.inspect} not to be: #{actual.inspect} (using ==)."
|
96
59
|
end
|
97
60
|
end
|
98
61
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Object
|
2
|
+
def describe desc, &block
|
3
|
+
OpalSpec::Example.create desc, block
|
4
|
+
end
|
5
|
+
|
6
|
+
def should matcher = nil
|
7
|
+
if matcher
|
8
|
+
matcher.positive_match? self
|
9
|
+
else
|
10
|
+
OpalSpec::PositiveOperatorMatcher.new self
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def should_not matcher = nil
|
15
|
+
if matcher
|
16
|
+
matcher.negative_match? self
|
17
|
+
else
|
18
|
+
OpalSpec::NegativeOperatorMatcher.new self
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module OpalSpec
|
2
2
|
class PhantomFormatter
|
3
3
|
def initialize
|
4
4
|
@examples = []
|
@@ -34,7 +34,7 @@ module OpalTest
|
|
34
34
|
|
35
35
|
exception = example.exception
|
36
36
|
case exception
|
37
|
-
when
|
37
|
+
when OpalSpec::ExpectationNotMetError
|
38
38
|
output = exception.message
|
39
39
|
else
|
40
40
|
output = "#{exception.class.name}: #{exception.message}\n"
|
@@ -48,16 +48,13 @@ module OpalTest
|
|
48
48
|
finish_with_code(1)
|
49
49
|
end
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
def finish_with_code(code)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
window.OPAL_SPEC_CODE = code;
|
59
|
-
}
|
60
|
-
}
|
53
|
+
if $global[:phantom]
|
54
|
+
$global[:phantom].exit code
|
55
|
+
else
|
56
|
+
$global.OPAL_SPEC_CODE = code
|
57
|
+
end
|
61
58
|
end
|
62
59
|
|
63
60
|
def example_group_started group
|
data/opal/opal/spec/runner.rb
CHANGED
@@ -1,32 +1,16 @@
|
|
1
|
-
module
|
1
|
+
module OpalSpec
|
2
2
|
class Runner
|
3
3
|
def self.in_browser?
|
4
|
-
|
5
|
-
if (typeof(window) !== 'undefined' && typeof(document) !== 'undefined') {
|
6
|
-
return true;
|
7
|
-
}
|
8
|
-
|
9
|
-
return false;
|
10
|
-
}
|
4
|
+
$global[:document]
|
11
5
|
end
|
12
6
|
|
13
7
|
def self.in_phantom?
|
14
|
-
|
15
|
-
if (typeof(phantom) !== 'undefined' || typeof(OPAL_SPEC_PHANTOM) !== 'undefined') {
|
16
|
-
return true;
|
17
|
-
}
|
18
|
-
|
19
|
-
return false;
|
20
|
-
}
|
8
|
+
$global[:phantom] or $global[:OPAL_SPEC_PHANTOM]
|
21
9
|
end
|
22
10
|
|
23
11
|
def self.autorun
|
24
12
|
if in_browser?
|
25
|
-
|
26
|
-
setTimeout(function() {
|
27
|
-
#{ Runner.new.run };
|
28
|
-
}, 0);
|
29
|
-
}
|
13
|
+
$global.setTimeout -> { Runner.new.run }, 0
|
30
14
|
else
|
31
15
|
Runner.new.run
|
32
16
|
end
|
@@ -41,7 +25,7 @@ module OpalTest
|
|
41
25
|
end
|
42
26
|
|
43
27
|
def run
|
44
|
-
@groups =
|
28
|
+
@groups = Example.groups.dup
|
45
29
|
@formatter.start
|
46
30
|
run_next_group
|
47
31
|
end
|
data/opal/opal/spec/spec.rb
CHANGED
@@ -1,30 +1,41 @@
|
|
1
|
-
module
|
2
|
-
class
|
1
|
+
module OpalSpec
|
2
|
+
class Example
|
3
|
+
include Expectations
|
4
|
+
|
5
|
+
def self.groups
|
6
|
+
@groups ||= []
|
7
|
+
end
|
3
8
|
|
4
9
|
def self.stack
|
5
10
|
@stack ||= []
|
6
11
|
end
|
7
12
|
|
8
13
|
def self.create(desc, block)
|
9
|
-
|
14
|
+
stack = Example.stack
|
15
|
+
parent = stack.last
|
10
16
|
|
11
|
-
Class.new(parent ||
|
17
|
+
group = Class.new(parent || Example) do
|
12
18
|
@desc = desc
|
13
19
|
@parent = parent
|
20
|
+
@examples = []
|
21
|
+
@before_hooks = []
|
22
|
+
@after_hooks = []
|
14
23
|
end
|
15
|
-
end
|
16
24
|
|
17
|
-
|
18
|
-
|
25
|
+
Example.groups << group
|
26
|
+
stack << group
|
27
|
+
group.class_eval(&block)
|
28
|
+
stack.pop
|
29
|
+
|
30
|
+
group
|
19
31
|
end
|
20
32
|
|
21
33
|
def self.description
|
22
34
|
@parent ? "#{@parent.description} #{@desc}" : @desc
|
23
35
|
end
|
24
36
|
|
25
|
-
def self.it
|
26
|
-
@
|
27
|
-
define_method("test_#{@specs += 1}_#{desc}", &block)
|
37
|
+
def self.it desc, &block
|
38
|
+
@examples << [desc, block]
|
28
39
|
end
|
29
40
|
|
30
41
|
def self.async(desc, &block)
|
@@ -34,10 +45,7 @@ module OpalTest
|
|
34
45
|
end
|
35
46
|
end
|
36
47
|
|
37
|
-
def self.pending(
|
38
|
-
@pending ||= []
|
39
|
-
@pending << [desc, block]
|
40
|
-
end
|
48
|
+
def self.pending(*); end
|
41
49
|
|
42
50
|
def self.let(name, &block)
|
43
51
|
define_method(name) do
|
@@ -50,17 +58,58 @@ module OpalTest
|
|
50
58
|
let(:subject, &block)
|
51
59
|
end
|
52
60
|
|
53
|
-
def self.it_behaves_like(*objs)
|
54
|
-
end
|
55
|
-
|
56
|
-
# type is ignored (is always :each)
|
57
61
|
def self.before(type = nil, &block)
|
58
|
-
@
|
62
|
+
@before_hooks << block
|
59
63
|
end
|
60
64
|
|
61
|
-
# type is ignored (is always :each)
|
62
65
|
def self.after(type = nil, &block)
|
63
|
-
@
|
66
|
+
@after_hooks << block
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.run runner
|
70
|
+
@runner = runner
|
71
|
+
@runner.example_group_started self
|
72
|
+
|
73
|
+
@running_examples = @examples ? @examples.dup : []
|
74
|
+
run_next_example
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.run_next_example
|
78
|
+
if @running_examples.empty?
|
79
|
+
@runner.example_group_finished self
|
80
|
+
else
|
81
|
+
new(@running_examples.shift).run @runner
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.example_started example
|
86
|
+
@runner.example_started example
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.example_passed example
|
90
|
+
@runner.example_passed example
|
91
|
+
run_next_example
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.example_failed example
|
95
|
+
@runner.example_failed example
|
96
|
+
run_next_example
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.after_hooks
|
100
|
+
@parent ? @parent.after_hooks + @after_hooks : @after_hooks
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.before_hooks
|
104
|
+
@parent ? @parent.before_hooks + @before_hooks : @before_hooks
|
105
|
+
end
|
106
|
+
|
107
|
+
attr_reader :example_group, :exception
|
108
|
+
|
109
|
+
def initialize info
|
110
|
+
@description = info[0]
|
111
|
+
@__block__ = info[1]
|
112
|
+
@example_group = self.class
|
64
113
|
end
|
65
114
|
|
66
115
|
def description
|
@@ -71,6 +120,51 @@ module OpalTest
|
|
71
120
|
@asynchronous = true
|
72
121
|
end
|
73
122
|
|
123
|
+
def run runner
|
124
|
+
@runner = runner
|
125
|
+
begin
|
126
|
+
@example_group.example_started self
|
127
|
+
run_before_hooks
|
128
|
+
instance_eval(&@__block__)
|
129
|
+
rescue => e
|
130
|
+
@exception = e
|
131
|
+
ensure
|
132
|
+
unless @asynchronous
|
133
|
+
run_after_hooks
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
if @asynchronous
|
138
|
+
# must wait..
|
139
|
+
else
|
140
|
+
finish_running
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def finish_running
|
145
|
+
if @exception
|
146
|
+
@example_group.example_failed self
|
147
|
+
else
|
148
|
+
@example_group.example_passed self
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def run_before_hooks
|
153
|
+
@example_group.before_hooks.each do |before|
|
154
|
+
instance_eval(&before)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def run_after_hooks
|
159
|
+
begin
|
160
|
+
@example_group.after_hooks.each do |after|
|
161
|
+
instance_eval(&after)
|
162
|
+
end
|
163
|
+
rescue => e
|
164
|
+
@exception = e
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
74
168
|
def run_async(&block)
|
75
169
|
begin
|
76
170
|
block.call
|
@@ -79,12 +173,12 @@ module OpalTest
|
|
79
173
|
ensure
|
80
174
|
run_after_hooks
|
81
175
|
end
|
82
|
-
|
176
|
+
|
83
177
|
finish_running
|
84
178
|
end
|
85
179
|
|
86
180
|
def set_timeout(duration, &block)
|
87
|
-
`setTimeout(#{block}, #{duration})`
|
181
|
+
`setTimeout(#{block}, #{duration})`
|
88
182
|
self
|
89
183
|
end
|
90
184
|
end
|
data/spec/specs_spec.rb
CHANGED
@@ -1,10 +1,20 @@
|
|
1
|
+
describe "PositiveOperatorMatcher" do
|
2
|
+
it "matches should operators" do
|
3
|
+
1.should == 1
|
4
|
+
end
|
5
|
+
|
6
|
+
it "matches negative operators" do
|
7
|
+
1.should_not == 2
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
1
11
|
describe 'Normal group' do
|
2
12
|
it 'exceptions can be thrown' do
|
3
13
|
err = nil
|
4
14
|
|
5
15
|
begin
|
6
16
|
1.should == 2
|
7
|
-
rescue => e
|
17
|
+
rescue Exception => e
|
8
18
|
err = e
|
9
19
|
end
|
10
20
|
|
@@ -115,3 +125,25 @@ describe "A nested group" do
|
|
115
125
|
end
|
116
126
|
end
|
117
127
|
end
|
128
|
+
|
129
|
+
OpalSpec.matcher :custom_matcher do
|
130
|
+
def match expected
|
131
|
+
unless expected == 42
|
132
|
+
failure "foo"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "Custom Matchers" do
|
138
|
+
it "is defined in spec scope" do
|
139
|
+
respond_to?(:custom_matcher).should be_true
|
140
|
+
end
|
141
|
+
|
142
|
+
it "passes the expected value to the matcher" do
|
143
|
+
42.should custom_matcher
|
144
|
+
end
|
145
|
+
|
146
|
+
it "can raise error when not maching expectation" do
|
147
|
+
lambda { 43.should custom_matcher }.should raise_error(Exception)
|
148
|
+
end
|
149
|
+
end if false
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opal-spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.16
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-09 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Opal compatible spec library
|
15
15
|
email: adam.beynon@gmail.com
|
@@ -30,24 +30,17 @@ files:
|
|
30
30
|
- opal-spec.gemspec
|
31
31
|
- opal/opal-spec.rb
|
32
32
|
- opal/opal/spec.rb
|
33
|
-
- opal/opal/spec/assertions.rb
|
34
33
|
- opal/opal/spec/browser_formatter.rb
|
35
34
|
- opal/opal/spec/expectations.rb
|
36
|
-
- opal/opal/spec/kernel.rb
|
37
35
|
- opal/opal/spec/matchers.rb
|
38
|
-
- opal/opal/spec/
|
39
|
-
- opal/opal/spec/matchers/be_empty.rb
|
40
|
-
- opal/opal/spec/matchers/respond_to.rb
|
36
|
+
- opal/opal/spec/object.rb
|
41
37
|
- opal/opal/spec/phantom_formatter.rb
|
42
38
|
- opal/opal/spec/runner.rb
|
43
|
-
- opal/opal/spec/scratch_pad.rb
|
44
39
|
- opal/opal/spec/spec.rb
|
45
40
|
- opal/opal/spec/sprockets_runner.rb.erb
|
46
|
-
- opal/opal/spec/test_case.rb
|
47
41
|
- spec/matchers/be_empty_spec.rb
|
48
42
|
- spec/matchers/respond_to_spec.rb
|
49
43
|
- spec/specs_spec.rb
|
50
|
-
- spec/tests_spec.rb
|
51
44
|
- vendor/spec_runner.js
|
52
45
|
homepage: http://opalrb.org
|
53
46
|
licenses: []
|
@@ -69,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
69
62
|
version: '0'
|
70
63
|
requirements: []
|
71
64
|
rubyforge_project:
|
72
|
-
rubygems_version: 1.8.
|
65
|
+
rubygems_version: 1.8.23
|
73
66
|
signing_key:
|
74
67
|
specification_version: 3
|
75
68
|
summary: Opal compatible spec
|
data/opal/opal/spec/kernel.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
module OpalTest
|
2
|
-
class RespondToMatcher < Matcher
|
3
|
-
def initialize(expected)
|
4
|
-
@expected = expected
|
5
|
-
end
|
6
|
-
|
7
|
-
def match(actual)
|
8
|
-
unless actual.respond_to?(@expected)
|
9
|
-
failure "Expected #{actual.inspect} (#{actual.class}) to respond to #{@expected}"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class Object
|
16
|
-
def respond_to(expected)
|
17
|
-
OpalTest::RespondToMatcher.new expected
|
18
|
-
end
|
19
|
-
end
|
data/opal/opal/spec/test_case.rb
DELETED
@@ -1,123 +0,0 @@
|
|
1
|
-
require 'opal/spec/assertions'
|
2
|
-
|
3
|
-
module OpalTest
|
4
|
-
class TestCase
|
5
|
-
include Assertions
|
6
|
-
|
7
|
-
def self.test_cases
|
8
|
-
@test_cases ||= []
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.inherited(klass)
|
12
|
-
TestCase.test_cases << klass
|
13
|
-
klass.instance_eval { @setup_hooks = []; @teardown_hooks = [] }
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.description
|
17
|
-
to_s
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.run(runner)
|
21
|
-
@runner = runner
|
22
|
-
@runner.example_group_started self
|
23
|
-
|
24
|
-
@running_examples = self.instance_methods.grep(/^test_/)
|
25
|
-
run_next_example
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.run_next_example
|
29
|
-
if @running_examples.empty?
|
30
|
-
@runner.example_group_finished self
|
31
|
-
else
|
32
|
-
self.new(@running_examples.shift).run(@runner)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.example_started(example)
|
37
|
-
@runner.example_started(example)
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.example_passed(example)
|
41
|
-
@runner.example_passed(example)
|
42
|
-
run_next_example
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.example_failed(example)
|
46
|
-
@runner.example_failed(example)
|
47
|
-
run_next_example
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.setup_hooks
|
51
|
-
@parent ? [].concat(@parent.setup_hooks).concat(@setup_hooks) : @setup_hooks
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.teardown_hooks
|
55
|
-
@parent ? [].concat(@parent.teardown_hooks).concat(@teardown_hooks) : @teardown_hooks
|
56
|
-
end
|
57
|
-
|
58
|
-
def initialize(name)
|
59
|
-
@__name__ = name
|
60
|
-
@example_group = self.class
|
61
|
-
@description = name.sub(/^test_(\d)+_/, '')
|
62
|
-
end
|
63
|
-
|
64
|
-
def description
|
65
|
-
@__name__
|
66
|
-
end
|
67
|
-
|
68
|
-
attr_reader :example_group, :exception
|
69
|
-
|
70
|
-
def finish_running
|
71
|
-
if @exception
|
72
|
-
@example_group.example_failed self
|
73
|
-
else
|
74
|
-
@example_group.example_passed self
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def run(runner)
|
79
|
-
@runner = runner
|
80
|
-
begin
|
81
|
-
@example_group.example_started self
|
82
|
-
run_before_hooks
|
83
|
-
setup
|
84
|
-
__send__ @__name__
|
85
|
-
rescue => e
|
86
|
-
@exception = e
|
87
|
-
ensure
|
88
|
-
unless @asynchronous
|
89
|
-
teardown
|
90
|
-
run_after_hooks
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
if @asynchronous
|
95
|
-
# must wait ...
|
96
|
-
else
|
97
|
-
finish_running
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def run_after_hooks
|
102
|
-
begin
|
103
|
-
@example_group.teardown_hooks.each do |after|
|
104
|
-
instance_eval &after
|
105
|
-
end
|
106
|
-
rescue => e
|
107
|
-
@exception = e
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def run_before_hooks
|
112
|
-
@example_group.setup_hooks.each do |before|
|
113
|
-
instance_eval &before
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def setup
|
118
|
-
end
|
119
|
-
|
120
|
-
def teardown
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
data/spec/tests_spec.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
class SimpleTest < OpalTest::TestCase
|
2
|
-
def test_this_should_be_tested
|
3
|
-
:pass.should eq(:pass)
|
4
|
-
end
|
5
|
-
|
6
|
-
def test_should_also_pass
|
7
|
-
1.should == 1
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_simple_assertion
|
11
|
-
assert true
|
12
|
-
assert 42
|
13
|
-
|
14
|
-
lambda { assert nil }.should raise_error(Exception)
|
15
|
-
lambda { assert false }.should raise_error(Exception)
|
16
|
-
end
|
17
|
-
end
|