opal-spec 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ ## 0.2.11 2013-02-20
2
+
3
+ * Added TestCase class to allow unit tests. OpalTest::Spec now inherits from
4
+ OpalTest::TestCase.
5
+
6
+ * Added Spec#let and Spec#subject.
7
+
8
+ ## 0.2.7
9
+
10
+ * Can be built using asset pipeline/sprockets.
11
+ * BrowserFormatter is now default.
12
+
13
+ ## 0.0.3
14
+
15
+ * Allow group names to be non-strings.
16
+ * Nested groups now have outer group name as prefix.
17
+ * Nested groups should inherit `before` and `after` blocks.
18
+
19
+ ## 0.0.2
20
+
21
+ * Added seperate BrowserFormatter class for cleaner output.
22
+ * Update Rake tasks to use new Opal::Builder class.
23
+
24
+ ## 0.0.1
25
+
26
+ * Initial Release.
data/Gemfile CHANGED
@@ -2,5 +2,3 @@ source :rubygems
2
2
  gemspec
3
3
 
4
4
  gem 'rake'
5
- gem 'opal'
6
- gem 'sprockets'
data/README.md CHANGED
@@ -38,17 +38,17 @@ Opal::Spec::Runner.autorun
38
38
  Examples can be async, and need to be defined as so:
39
39
 
40
40
  ```ruby
41
- describe 'MyClass' do
42
- # normal, sync example
43
- it 'does something' do
44
- # ...
45
- end
41
+ describe 'MyClass' do
42
+ # normal, sync example
43
+ it 'does something' do
44
+ #...
45
+ end
46
46
 
47
- # async example
48
- async 'does something else too' do
49
- # ...
50
- end
47
+ # async example
48
+ async 'does something else too' do
49
+ #...
51
50
  end
51
+ end
52
52
  ```
53
53
 
54
54
  This just marks the example as being async. To actually handle the async
@@ -66,26 +66,3 @@ end
66
66
 
67
67
  The end of the block passed to `run_async` informs opal-spec that you are
68
68
  done with this test, so it can move on.
69
-
70
- Change Log
71
- ----------
72
-
73
- ### 0.2.7
74
-
75
- * Can be built using asset pipeline/sprockets
76
- * BrowserFormatter is now default
77
-
78
- ### 0.0.3
79
-
80
- * Allow group names to be non-strings
81
- * Nested groups now have outer group name as prefix
82
- * Nested groups should inherit `before` and `after` blocks
83
-
84
- ### 0.0.2
85
-
86
- * Added seperate BrowserFormatter class for cleaner output
87
- * Update Rake tasks to use new Opal::Builder class
88
-
89
- ### 0.0.1
90
-
91
- Initial release
@@ -1,7 +1,7 @@
1
1
  require 'opal'
2
2
 
3
- require 'opal/spec/example'
4
- require 'opal/spec/example_group'
3
+ require 'opal/spec/test_case'
4
+ require 'opal/spec/spec'
5
5
  require 'opal/spec/matchers'
6
6
  require 'opal/spec/runner'
7
7
  require 'opal/spec/scratch_pad'
@@ -11,5 +11,5 @@ require 'opal/spec/phantom_formatter'
11
11
  require 'opal/spec/kernel'
12
12
 
13
13
  module Opal
14
- Spec = ::Spec # Compatibility with older versions
14
+ Spec = ::OpalTest # compatibility
15
15
  end
@@ -1,4 +1,4 @@
1
- module Spec
1
+ module OpalTest
2
2
  class BrowserFormatter
3
3
  CSS = <<-EOS
4
4
 
@@ -1,5 +1,4 @@
1
-
2
- module Spec
1
+ module OpalTest
3
2
  class ExpectationNotMetError < StandardError; end
4
3
 
5
4
  module Expectations
@@ -7,7 +6,7 @@ module Spec
7
6
  if matcher
8
7
  matcher.match self
9
8
  else
10
- Spec::PositiveOperatorMatcher.new self
9
+ PositiveOperatorMatcher.new self
11
10
  end
12
11
  end
13
12
 
@@ -15,40 +14,40 @@ module Spec
15
14
  if matcher
16
15
  matcher.not_match self
17
16
  else
18
- Spec::NegativeOperatorMatcher.new self
17
+ NegativeOperatorMatcher.new self
19
18
  end
20
19
  end
21
20
 
22
21
  def be_kind_of expected
23
- Spec::BeKindOfMatcher.new expected
22
+ BeKindOfMatcher.new expected
24
23
  end
25
24
 
26
25
  def be_nil
27
- Spec::BeNilMatcher.new nil
26
+ BeNilMatcher.new nil
28
27
  end
29
28
 
30
29
  def be_true
31
- Spec::BeTrueMatcher.new true
30
+ BeTrueMatcher.new true
32
31
  end
33
32
 
34
33
  def be_false
35
- Spec::BeFalseMatcher.new false
34
+ BeFalseMatcher.new false
36
35
  end
37
36
 
38
37
  def eq(expected)
39
- Spec::EqlMatcher.new expected
38
+ EqlMatcher.new expected
40
39
  end
41
40
 
42
41
  def equal expected
43
- Spec::EqualMatcher.new expected
42
+ EqualMatcher.new expected
44
43
  end
45
44
 
46
45
  def raise_error expected
47
- Spec::RaiseErrorMatcher.new expected
46
+ RaiseErrorMatcher.new expected
48
47
  end
49
48
  end
50
49
  end
51
50
 
52
51
  class Object
53
- include Spec::Expectations
52
+ include OpalTest::Expectations
54
53
  end
@@ -1,6 +1,11 @@
1
1
  module Kernel
2
2
  def describe(desc, &block)
3
- Spec::ExampleGroup.create desc, block
3
+ group = OpalTest::Spec.create(desc, block)
4
+
5
+ stack = OpalTest::Spec.stack
6
+ stack << group
7
+ group.class_eval &block
8
+ stack.pop
4
9
  end
5
10
 
6
11
  def mock(obj)
@@ -1,4 +1,4 @@
1
- module Spec
1
+ module OpalTest
2
2
  class Matcher
3
3
  def initialize(actual)
4
4
  @actual = actual
@@ -62,7 +62,7 @@ module Spec
62
62
  class EqlMatcher < Matcher
63
63
  def match(expected)
64
64
  unless expected == @actual
65
- failure "expected: #{expected.inspect}, got: #{@actual.inspect} (using ==)."
65
+ failure "expected: #{@actual.inspect}, got: #{expected.inspect} (using ==)."
66
66
  end
67
67
  end
68
68
 
@@ -1,4 +1,4 @@
1
- module Spec
1
+ module OpalTest
2
2
  class PhantomFormatter
3
3
  def initialize
4
4
  @examples = []
@@ -1,4 +1,4 @@
1
- module Spec
1
+ module OpalTest
2
2
  class Runner
3
3
  def self.in_browser?
4
4
  %x{
@@ -41,7 +41,7 @@ module Spec
41
41
  end
42
42
 
43
43
  def run
44
- @groups = ExampleGroup.example_groups.dup
44
+ @groups = TestCase.test_cases.dup
45
45
  @formatter.start
46
46
  run_next_group
47
47
  end
@@ -0,0 +1,86 @@
1
+ module OpalTest
2
+ class Spec < TestCase
3
+
4
+ def self.stack
5
+ @stack ||= []
6
+ end
7
+
8
+ def self.create(desc, block)
9
+ parent = Spec.stack.last
10
+
11
+ Class.new(parent || Spec) do
12
+ @desc = desc
13
+ @parent = parent
14
+ end
15
+ end
16
+
17
+ def self.to_s
18
+ "<OpalTest::Spec #{@desc.inspect}>"
19
+ end
20
+
21
+ def self.description
22
+ @parent ? "#{@parent.description} #{@desc}" : @desc
23
+ end
24
+
25
+ def self.it(desc, &block)
26
+ @specs ||= 0
27
+ define_method("test_#{@specs += 1}_#{desc}", &block)
28
+ end
29
+
30
+ def self.async(desc, &block)
31
+ self.it desc do
32
+ self.async!
33
+ instance_eval(&block)
34
+ end
35
+ end
36
+
37
+ def self.let(name, &block)
38
+ define_method(name) do
39
+ @_memoized ||= {}
40
+ @_memoized.fetch(name) { |n| @_memoized[n] = instance_eval(&block) }
41
+ end
42
+ end
43
+
44
+ def self.subject(&block)
45
+ let(:subject, &block)
46
+ end
47
+
48
+ def self.it_behaves_like(*objs)
49
+ end
50
+
51
+ # type is ignored (is always :each)
52
+ def self.before(type = nil, &block)
53
+ @setup_hooks << block
54
+ end
55
+
56
+ # type is ignored (is always :each)
57
+ def self.after(type = nil, &block)
58
+ @teardown_hooks << block
59
+ end
60
+
61
+ def description
62
+ @description
63
+ end
64
+
65
+ def async!
66
+ @asynchronous = true
67
+ end
68
+
69
+ def run_async(&block)
70
+ begin
71
+ block.call
72
+ rescue => e
73
+ @exception = e
74
+ ensure
75
+ run_after_hooks
76
+ end
77
+
78
+ finish_running
79
+ end
80
+
81
+ def set_timeout(duration, &block)
82
+ `setTimeout(#{block}, #{duration})`
83
+ self
84
+ end
85
+ end
86
+ end
@@ -8,4 +8,4 @@
8
8
  <% require_asset s.sub(/^spec\//, '').sub(/\.(rb|opal)$/, '') %>
9
9
  <% end %>
10
10
 
11
- Spec::Runner.autorun
11
+ OpalTest::Runner.autorun
@@ -0,0 +1,120 @@
1
+ module OpalTest
2
+ class TestCase
3
+
4
+ def self.test_cases
5
+ @test_cases ||= []
6
+ end
7
+
8
+ def self.inherited(klass)
9
+ TestCase.test_cases << klass
10
+ klass.instance_eval { @setup_hooks = []; @teardown_hooks = [] }
11
+ end
12
+
13
+ def self.description
14
+ to_s
15
+ end
16
+
17
+ def self.run(runner)
18
+ @runner = runner
19
+ @runner.example_group_started self
20
+
21
+ @running_examples = self.instance_methods.grep(/^test_/)
22
+ run_next_example
23
+ end
24
+
25
+ def self.run_next_example
26
+ if @running_examples.empty?
27
+ @runner.example_group_finished self
28
+ else
29
+ self.new(@running_examples.shift).run(@runner)
30
+ end
31
+ end
32
+
33
+ def self.example_started(example)
34
+ @runner.example_started(example)
35
+ end
36
+
37
+ def self.example_passed(example)
38
+ @runner.example_passed(example)
39
+ run_next_example
40
+ end
41
+
42
+ def self.example_failed(example)
43
+ @runner.example_failed(example)
44
+ run_next_example
45
+ end
46
+
47
+ def self.setup_hooks
48
+ @parent ? [].concat(@parent.setup_hooks).concat(@setup_hooks) : @setup_hooks
49
+ end
50
+
51
+ def self.teardown_hooks
52
+ @parent ? [].concat(@parent.teardown_hooks).concat(@teardown_hooks) : @teardown_hooks
53
+ end
54
+
55
+ def initialize(name)
56
+ @__name__ = name
57
+ @example_group = self.class
58
+ @description = name.sub(/^test_(\d)+_/, '')
59
+ end
60
+
61
+ def description
62
+ @__name__
63
+ end
64
+
65
+ attr_reader :example_group, :exception
66
+
67
+ def finish_running
68
+ if @exception
69
+ @example_group.example_failed self
70
+ else
71
+ @example_group.example_passed self
72
+ end
73
+ end
74
+
75
+ def run(runner)
76
+ @runner = runner
77
+ begin
78
+ @example_group.example_started self
79
+ run_before_hooks
80
+ setup
81
+ __send__ @__name__
82
+ rescue => e
83
+ @exception = e
84
+ ensure
85
+ unless @asynchronous
86
+ teardown
87
+ run_after_hooks
88
+ end
89
+ end
90
+
91
+ if @asynchronous
92
+ # must wait ...
93
+ else
94
+ finish_running
95
+ end
96
+ end
97
+
98
+ def run_after_hooks
99
+ begin
100
+ @example_group.teardown_hooks.each do |after|
101
+ instance_eval &after
102
+ end
103
+ rescue => e
104
+ @exception = e
105
+ end
106
+ end
107
+
108
+ def run_before_hooks
109
+ @example_group.setup_hooks.each do |before|
110
+ instance_eval &before
111
+ end
112
+ end
113
+
114
+ def setup
115
+ end
116
+
117
+ def teardown
118
+ end
119
+ end
120
+ end
@@ -1,5 +1,5 @@
1
1
  module Opal
2
2
  module Spec
3
- VERSION = '0.2.10'
3
+ VERSION = '0.2.11'
4
4
  end
5
5
  end
@@ -12,4 +12,6 @@ Gem::Specification.new do |s|
12
12
 
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.require_paths = ['lib']
15
+
16
+ s.add_runtime_dependency 'opal', '~> 0.3.38'
15
17
  end
@@ -1,21 +1,14 @@
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
1
+ describe 'Normal group' do
2
+ it 'exceptions can be thrown' do
3
+ err = nil
11
4
 
12
- def assert_equal(got, expected, message='Not equal')
13
- assert(got == expected, message)
14
- end
5
+ begin
6
+ 1.should == 2
7
+ rescue => e
8
+ err = e
9
+ end
15
10
 
16
- describe 'Normal group' do
17
- it 'this should fail' do
18
- 1.should == 2
11
+ raise "exception not thrown" unless err
19
12
  end
20
13
  end
21
14
 
@@ -26,7 +19,7 @@ describe "New eql" do
26
19
  end
27
20
 
28
21
  it "and this should fail" do
29
- 1.should eq(:adam)
22
+ lambda { 1.should eq(:adam) }.should raise_error(Exception)
30
23
  end
31
24
  end
32
25
 
@@ -41,10 +34,6 @@ describe 'Another group' do
41
34
  1.should == 1
42
35
  end
43
36
 
44
- it 'this should fail' do
45
- raise "whatever error you like"
46
- end
47
-
48
37
  it 'this should pass' do
49
38
  true.should be_true
50
39
  false.should be_false
@@ -62,12 +51,41 @@ describe 'Another group' do
62
51
  async 'this should fail (in 0.1 second time)' do
63
52
  set_timeout(100) do
64
53
  run_async {
65
- 1.should == 5
54
+ lambda { 1.should == 5 }.should raise_error(Exception)
66
55
  }
67
56
  end
68
57
  end
69
58
  end
70
59
 
71
- Opal::Spec::Runner.autorun
60
+ describe "let" do
61
+ $opal_spec_let_count = 0
62
+
63
+ let(:count) { $opal_spec_let_count = $opal_spec_let_count + 1 }
64
+
65
+ it "caches the method for the example" do
66
+ count.should eq(1)
67
+ count.should eq(1)
68
+ end
69
+
70
+ it "does not cache values between different examples" do
71
+ count.should eq(2)
72
+ end
73
+ end
74
+
75
+ describe "before" do
76
+ before do
77
+ @foo = 100
78
+ end
72
79
 
73
- puts "Assertions: #{@passed + @failures.length}, Passed: #{@passed}, Failures: #{@failures.length}"
80
+ before do
81
+ @bar = 200
82
+ end
83
+
84
+ it "should be run before each group" do
85
+ @foo.should == 100
86
+ end
87
+
88
+ it "should run multiple before blocks" do
89
+ @bar.should == 200
90
+ end
91
+ end
@@ -0,0 +1,9 @@
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
+ end
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.10
4
+ version: 0.2.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-16 00:00:00.000000000 Z
13
- dependencies: []
12
+ date: 2013-02-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: opal
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 0.3.38
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.3.38
14
30
  description: Opal compatible spec library
15
31
  email: adam.beynon@gmail.com
16
32
  executables: []
@@ -18,6 +34,7 @@ extensions: []
18
34
  extra_rdoc_files: []
19
35
  files:
20
36
  - .gitignore
37
+ - CHANGELOG.md
21
38
  - Gemfile
22
39
  - README.md
23
40
  - Rakefile
@@ -25,15 +42,15 @@ files:
25
42
  - lib/assets/javascripts/opal-spec.rb
26
43
  - lib/assets/javascripts/opal/spec.rb
27
44
  - lib/assets/javascripts/opal/spec/browser_formatter.rb
28
- - lib/assets/javascripts/opal/spec/example.rb
29
- - lib/assets/javascripts/opal/spec/example_group.rb
30
45
  - lib/assets/javascripts/opal/spec/expectations.rb
31
46
  - lib/assets/javascripts/opal/spec/kernel.rb
32
47
  - lib/assets/javascripts/opal/spec/matchers.rb
33
48
  - lib/assets/javascripts/opal/spec/phantom_formatter.rb
34
49
  - lib/assets/javascripts/opal/spec/runner.rb
35
50
  - lib/assets/javascripts/opal/spec/scratch_pad.rb
51
+ - lib/assets/javascripts/opal/spec/spec.rb
36
52
  - lib/assets/javascripts/opal/spec/sprockets_runner.rb.erb
53
+ - lib/assets/javascripts/opal/spec/test_case.rb
37
54
  - lib/opal-spec.rb
38
55
  - lib/opal/spec.rb
39
56
  - lib/opal/spec/rake_task.rb
@@ -41,6 +58,7 @@ files:
41
58
  - lib/opal/spec/version.rb
42
59
  - opal-spec.gemspec
43
60
  - spec/specs.rb
61
+ - spec/tests.rb
44
62
  - vendor/spec_runner.html.erb
45
63
  - vendor/spec_runner.js
46
64
  homepage: http://opalrb.org
@@ -1,76 +0,0 @@
1
- module Spec
2
- class Example
3
- attr_reader :description, :example_group, :exception
4
- attr_accessor :asynchronous
5
-
6
- def initialize(group, desc, block)
7
- @example_group = group
8
- @description = desc
9
- @__block__ = block
10
- end
11
-
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
35
- end
36
- end
37
-
38
- def run_after_hooks
39
- begin
40
- @example_group.after_hooks.each do |after|
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
51
- end
52
- end
53
-
54
- def run_async(&block)
55
- begin
56
- block.call
57
- rescue => e
58
- @exception = e
59
- ensure
60
- run_after_hooks
61
- end
62
-
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
74
- end
75
- end
76
- end
@@ -1,92 +0,0 @@
1
- module Spec
2
- class ExampleGroup
3
- @example_groups = []
4
- def self.example_groups
5
- @example_groups
6
- end
7
-
8
- @stack = []
9
- def self.create desc, block
10
- group = self.new desc, @stack.last
11
- @example_groups << group
12
-
13
- @stack << group
14
- group.instance_eval &block
15
- @stack.pop
16
- end
17
-
18
- def initialize desc, parent
19
- @desc = desc.to_s
20
- @parent = parent
21
- @examples = []
22
-
23
- @before_hooks = []
24
- @after_hooks = []
25
- end
26
-
27
- def it(desc, &block)
28
- @examples << Example.new(self, desc, block)
29
- end
30
-
31
- def async(desc, &block)
32
- example = Example.new(self, desc, block)
33
- example.asynchronous = true
34
- @examples << example
35
- end
36
-
37
- def it_behaves_like(*objs)
38
- end
39
-
40
- def before type = :each, &block
41
- raise "unsupported before type: #{type}" unless type == :each
42
- @before_hooks << block
43
- end
44
-
45
- def after type = :each, &block
46
- raise "unsupported after type: #{type}" unless type == :each
47
- @after_hooks << block
48
- end
49
-
50
- def before_hooks
51
- @parent ? [].concat(@parent.before_hooks).concat(@before_hooks) : @before_hooks
52
- end
53
-
54
- def after_hooks
55
- @parent ? [].concat(@parent.after_hooks).concat(@after_hooks) : @after_hooks
56
- end
57
-
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
86
- end
87
-
88
- def description
89
- @parent ? "#{@parent.description} #{@desc}" : @desc
90
- end
91
- end
92
- end