opal-spec 0.2.0 → 0.2.1
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/Gemfile +1 -1
- data/README.md +63 -0
- data/Rakefile +8 -1
- data/lib/opal-spec/browser_formatter.rb +1 -1
- data/lib/opal-spec/example.rb +50 -19
- data/lib/opal-spec/example_group.rb +35 -5
- data/lib/opal-spec/phantom_formatter.rb +14 -3
- data/lib/opal-spec/runner.rb +12 -4
- data/lib/opal-spec/version.rb +1 -1
- data/spec/index.html +12 -0
- data/spec/test.rb +56 -0
- metadata +4 -2
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
gem "opal", :git => 'git://github/opal/opal.git'
|
1
|
+
gem "opal", :git => 'git://github.com/opal/opal.git'
|
2
2
|
gem "rake"
|
data/README.md
CHANGED
@@ -5,6 +5,69 @@ opal-spec is a minimal spec lib for opal, inspired by RSpec and MSpec.
|
|
5
5
|
It is designed to run on [opal](http://opalrb.org), and provides the
|
6
6
|
bare minimum to get specs running.
|
7
7
|
|
8
|
+
## Writing Specs
|
9
|
+
|
10
|
+
Your specs should go into the `/spec` directory of your app. They take
|
11
|
+
the same form as rspec/mspec:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
describe MyClass do
|
15
|
+
it 'should do some feature' do
|
16
|
+
1.should == 1
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'does something else' do
|
20
|
+
nil.should be_nil
|
21
|
+
false.should be_false
|
22
|
+
true.should be_true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
### Running specs
|
28
|
+
|
29
|
+
Loading these specs in a browser won't just work. You need to run them.
|
30
|
+
The best place to do this is inside `spec/spec_helper.rb`, and with a
|
31
|
+
simple call:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
OpalSpec::Runner.autorun
|
35
|
+
```
|
36
|
+
|
37
|
+
### Async examples
|
38
|
+
|
39
|
+
Examples can be async, and need to be defined as so:
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
describe 'MyClass' do
|
43
|
+
# normal, sync example
|
44
|
+
it 'does something' do
|
45
|
+
# ...
|
46
|
+
end
|
47
|
+
|
48
|
+
# async example
|
49
|
+
async 'does something else too' do
|
50
|
+
# ...
|
51
|
+
end
|
52
|
+
end
|
53
|
+
```
|
54
|
+
|
55
|
+
This just marks the example as being async. To actually handle the async
|
56
|
+
result, you also need to use a `run_async` call inside some future handler:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
async 'HTTP requests should work' do
|
60
|
+
HTTP.get('users/1.json') do |response|
|
61
|
+
run\_async {
|
62
|
+
response.ok?.should be\_true
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
The end of the block passed to `run_async` informs opal-spec that you are
|
69
|
+
done with this test, so it can move on.
|
70
|
+
|
8
71
|
Change Log
|
9
72
|
----------
|
10
73
|
|
data/Rakefile
CHANGED
@@ -138,7 +138,7 @@ module OpalSpec
|
|
138
138
|
when OpalSpec::ExpectationNotMetError
|
139
139
|
output = exception.message
|
140
140
|
else
|
141
|
-
output = "#{exception.class}: #{exception.message}\n"
|
141
|
+
output = "#{exception.class.name}: #{exception.message}\n"
|
142
142
|
output += " #{exception.backtrace.join "\n "}\n"
|
143
143
|
end
|
144
144
|
|
data/lib/opal-spec/example.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module OpalSpec
|
2
2
|
class Example
|
3
3
|
attr_reader :description, :example_group, :exception
|
4
|
+
attr_accessor :asynchronous
|
4
5
|
|
5
6
|
def initialize(group, desc, block)
|
6
7
|
@example_group = group
|
@@ -8,38 +9,68 @@ module OpalSpec
|
|
8
9
|
@__block__ = block
|
9
10
|
end
|
10
11
|
|
11
|
-
def
|
12
|
-
@
|
13
|
-
|
12
|
+
def finish_running
|
13
|
+
if @exception
|
14
|
+
@example_group.example_failed self
|
15
|
+
else
|
16
|
+
@example_group.example_passed self
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
begin
|
22
|
+
@example_group.example_started self
|
23
|
+
run_before_hooks
|
24
|
+
instance_eval(&@__block__)
|
25
|
+
rescue => e
|
26
|
+
@exception = e
|
27
|
+
ensure
|
28
|
+
run_after_hooks unless @asynchronous
|
29
|
+
end
|
30
|
+
|
31
|
+
if @asynchronous
|
32
|
+
# must wait ...
|
33
|
+
else
|
34
|
+
finish_running
|
14
35
|
end
|
15
36
|
end
|
16
37
|
|
17
38
|
def run_after_hooks
|
18
|
-
|
39
|
+
begin
|
40
|
+
@example_group.after_hooks.each do |after|
|
19
41
|
instance_eval &after
|
42
|
+
end
|
43
|
+
rescue => e
|
44
|
+
@exception = e
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def run_before_hooks
|
49
|
+
@example_group.before_hooks.each do |before|
|
50
|
+
instance_eval &before
|
20
51
|
end
|
21
52
|
end
|
22
53
|
|
23
|
-
def
|
54
|
+
def run_async(&block)
|
24
55
|
begin
|
25
|
-
|
26
|
-
run_before_hooks
|
27
|
-
instance_eval &@__block__
|
56
|
+
block.call
|
28
57
|
rescue => e
|
29
58
|
@exception = e
|
30
59
|
ensure
|
31
|
-
|
32
|
-
run_after_hooks
|
33
|
-
rescue => e
|
34
|
-
@exception = e
|
35
|
-
end
|
60
|
+
run_after_hooks
|
36
61
|
end
|
37
62
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
63
|
+
finish_running
|
64
|
+
end
|
65
|
+
|
66
|
+
def set_timeout(duration, &block)
|
67
|
+
%x{
|
68
|
+
setTimeout(function() {
|
69
|
+
#{ block.call };
|
70
|
+
}, duration);
|
71
|
+
}
|
72
|
+
|
73
|
+
self
|
43
74
|
end
|
44
75
|
end
|
45
|
-
end
|
76
|
+
end
|
@@ -24,10 +24,16 @@ module OpalSpec
|
|
24
24
|
@after_hooks = []
|
25
25
|
end
|
26
26
|
|
27
|
-
def it
|
27
|
+
def it(desc, &block)
|
28
28
|
@examples << Example.new(self, desc, block)
|
29
29
|
end
|
30
30
|
|
31
|
+
def async(desc, &block)
|
32
|
+
example = Example.new(self, desc, block)
|
33
|
+
example.asynchronous = true
|
34
|
+
@examples << example
|
35
|
+
end
|
36
|
+
|
31
37
|
def it_behaves_like(*objs)
|
32
38
|
end
|
33
39
|
|
@@ -49,10 +55,34 @@ module OpalSpec
|
|
49
55
|
@parent ? [].concat(@parent.after_hooks).concat(@after_hooks) : @after_hooks
|
50
56
|
end
|
51
57
|
|
52
|
-
def run
|
53
|
-
runner
|
54
|
-
@
|
55
|
-
|
58
|
+
def run(runner)
|
59
|
+
@runner = runner
|
60
|
+
@runner.example_group_started self
|
61
|
+
|
62
|
+
@running_examples = @examples.dup
|
63
|
+
run_next_example
|
64
|
+
end
|
65
|
+
|
66
|
+
def run_next_example
|
67
|
+
if @running_examples.empty?
|
68
|
+
@runner.example_group_finished self
|
69
|
+
else
|
70
|
+
@running_examples.shift.run
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def example_started(example)
|
75
|
+
@runner.example_started(example)
|
76
|
+
end
|
77
|
+
|
78
|
+
def example_passed(example)
|
79
|
+
@runner.example_passed(example)
|
80
|
+
run_next_example
|
81
|
+
end
|
82
|
+
|
83
|
+
def example_failed(example)
|
84
|
+
@runner.example_failed(example)
|
85
|
+
run_next_example
|
56
86
|
end
|
57
87
|
|
58
88
|
def description
|
@@ -24,7 +24,7 @@ module OpalSpec
|
|
24
24
|
if @failed_examples.empty?
|
25
25
|
log "\nFinished"
|
26
26
|
log_green "#{example_count} examples, 0 failures"
|
27
|
-
|
27
|
+
finish_with_code(0)
|
28
28
|
else
|
29
29
|
log "\nFailures:"
|
30
30
|
@failed_examples.each_with_index do |example, idx|
|
@@ -35,7 +35,7 @@ module OpalSpec
|
|
35
35
|
when OpalSpec::ExpectationNotMetError
|
36
36
|
output = exception.message
|
37
37
|
else
|
38
|
-
output = "#{exception.class}: #{exception.message}\n"
|
38
|
+
output = "#{exception.class.name}: #{exception.message}\n"
|
39
39
|
output += " #{exception.backtrace.join "\n "}\n"
|
40
40
|
end
|
41
41
|
log_red " #{output}"
|
@@ -43,9 +43,20 @@ module OpalSpec
|
|
43
43
|
|
44
44
|
log "\nFinished"
|
45
45
|
log_red "#{example_count} examples, #{@failed_examples.size} failures"
|
46
|
-
|
46
|
+
finish_with_code(1)
|
47
47
|
end
|
48
48
|
end
|
49
|
+
|
50
|
+
def finish_with_code(code)
|
51
|
+
%x{
|
52
|
+
if (typeof(phantom) !== 'undefined') {
|
53
|
+
return phantom.exit(code);
|
54
|
+
}
|
55
|
+
else {
|
56
|
+
window.OPAL_SPEC_CODE = code;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
end
|
49
60
|
|
50
61
|
def example_group_started group
|
51
62
|
@example_group = group
|
data/lib/opal-spec/runner.rb
CHANGED
@@ -12,7 +12,7 @@ module OpalSpec
|
|
12
12
|
|
13
13
|
def self.in_phantom?
|
14
14
|
%x{
|
15
|
-
if (typeof(phantom) !== 'undefined'
|
15
|
+
if (typeof(phantom) !== 'undefined' || typeof(OPAL_SPEC_PHANTOM) !== 'undefined') {
|
16
16
|
return true;
|
17
17
|
}
|
18
18
|
|
@@ -41,10 +41,17 @@ module OpalSpec
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def run
|
44
|
-
groups = ExampleGroup.example_groups
|
44
|
+
@groups = ExampleGroup.example_groups.dup
|
45
45
|
@formatter.start
|
46
|
-
|
47
|
-
|
46
|
+
run_next_group
|
47
|
+
end
|
48
|
+
|
49
|
+
def run_next_group
|
50
|
+
if @groups.empty?
|
51
|
+
@formatter.finish
|
52
|
+
else
|
53
|
+
@groups.shift.run self
|
54
|
+
end
|
48
55
|
end
|
49
56
|
|
50
57
|
def example_group_started group
|
@@ -53,6 +60,7 @@ module OpalSpec
|
|
53
60
|
|
54
61
|
def example_group_finished group
|
55
62
|
@formatter.example_group_finished group
|
63
|
+
run_next_group
|
56
64
|
end
|
57
65
|
|
58
66
|
def example_started example
|
data/lib/opal-spec/version.rb
CHANGED
data/spec/index.html
ADDED
data/spec/test.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
@passed = 0
|
2
|
+
@failures = []
|
3
|
+
|
4
|
+
def assert(value, message='Not true')
|
5
|
+
if value
|
6
|
+
@passed += 1
|
7
|
+
else
|
8
|
+
@failures << message
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def assert_equal(got, expected, message='Not equal')
|
13
|
+
assert(got == expected, message)
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'Normal group' do
|
17
|
+
it 'this should fail' do
|
18
|
+
1.should == 2
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'Another group' do
|
23
|
+
it 'this should pass' do
|
24
|
+
1.should == 1
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'this should fail' do
|
28
|
+
raise "whatever error you like"
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'this should pass' do
|
32
|
+
true.should be_true
|
33
|
+
false.should be_false
|
34
|
+
nil.should be_nil
|
35
|
+
end
|
36
|
+
|
37
|
+
async 'this should pass (in 1 second time)' do
|
38
|
+
set_timeout(1000) do
|
39
|
+
run_async {
|
40
|
+
1.should == 1
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
async 'this should fail (in 1 second time)' do
|
46
|
+
set_timeout(1000) do
|
47
|
+
run_async {
|
48
|
+
1.should == 5
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
OpalSpec::Runner.autorun
|
55
|
+
|
56
|
+
puts "Assertions: #{@passed + @failures.length}, Passed: #{@passed}, Failures: #{@failures.length}"
|
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.1
|
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: 2012-09-
|
12
|
+
date: 2012-09-17 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description: Opal compatible spec library
|
15
15
|
email: adam@adambeynon.com
|
@@ -33,6 +33,8 @@ files:
|
|
33
33
|
- lib/opal-spec/scratch_pad.rb
|
34
34
|
- lib/opal-spec/version.rb
|
35
35
|
- opal-spec.gemspec
|
36
|
+
- spec/index.html
|
37
|
+
- spec/test.rb
|
36
38
|
homepage: http://opalrb.org
|
37
39
|
licenses: []
|
38
40
|
post_install_message:
|