opal-spec 0.2.6 → 0.2.7

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.
@@ -0,0 +1,80 @@
1
+ module Opal
2
+ module Spec
3
+ class Runner
4
+ def self.in_browser?
5
+ %x{
6
+ if (typeof(window) !== 'undefined' && typeof(document) !== 'undefined') {
7
+ return true;
8
+ }
9
+
10
+ return false;
11
+ }
12
+ end
13
+
14
+ def self.in_phantom?
15
+ %x{
16
+ if (typeof(phantom) !== 'undefined' || typeof(OPAL_SPEC_PHANTOM) !== 'undefined') {
17
+ return true;
18
+ }
19
+
20
+ return false;
21
+ }
22
+ end
23
+
24
+ def self.autorun
25
+ if in_browser?
26
+ %x{
27
+ setTimeout(function() {
28
+ #{ Runner.new.run };
29
+ }, 0);
30
+ }
31
+ else
32
+ Runner.new.run
33
+ end
34
+ end
35
+
36
+ def initialize
37
+ if Runner.in_phantom?
38
+ @formatter = PhantomFormatter.new
39
+ elsif Runner.in_browser?
40
+ @formatter = BrowserFormatter.new
41
+ end
42
+ end
43
+
44
+ def run
45
+ @groups = ExampleGroup.example_groups.dup
46
+ @formatter.start
47
+ run_next_group
48
+ end
49
+
50
+ def run_next_group
51
+ if @groups.empty?
52
+ @formatter.finish
53
+ else
54
+ @groups.shift.run self
55
+ end
56
+ end
57
+
58
+ def example_group_started group
59
+ @formatter.example_group_started group
60
+ end
61
+
62
+ def example_group_finished group
63
+ @formatter.example_group_finished group
64
+ run_next_group
65
+ end
66
+
67
+ def example_started example
68
+ @formatter.example_started example
69
+ end
70
+
71
+ def example_passed example
72
+ @formatter.example_passed example
73
+ end
74
+
75
+ def example_failed example
76
+ @formatter.example_failed example
77
+ end
78
+ end
79
+ end
80
+ end
@@ -14,4 +14,4 @@ module ScratchPad
14
14
  def self.recorded
15
15
  @record
16
16
  end
17
- end
17
+ end
@@ -0,0 +1,13 @@
1
+ #= require opal
2
+ #= require opal/spec/example
3
+ #= require opal/spec/example_group
4
+ #= require opal/spec/matchers
5
+ #= require opal/spec/runner
6
+ #= require opal/spec/scratch_pad
7
+ #= require opal/spec/expectations
8
+ #= require opal/spec/browser_formatter
9
+ #= require opal/spec/phantom_formatter
10
+ #= require opal/spec/kernel
11
+
12
+ # Compatibility with older versions
13
+ OpalSpec = Opal::Spec
@@ -0,0 +1 @@
1
+ #= require opal/spec
@@ -0,0 +1,12 @@
1
+ module Opal
2
+ module Spec
3
+
4
+ # Run tests on the command line using phantomjs. Phantomjs **must** be
5
+ # installed, and the runner assumes you have an HTML file at
6
+ # ./spec/index.html which will be run.
7
+ def self.runner
8
+ runner = File.join File.dirname(__FILE__), '..', '..', '..', 'vendor', 'runner.js'
9
+ system "phantomjs #{runner} spec/index.html"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module Opal
2
+ module Spec
3
+ VERSION = '0.2.7'
4
+ end
5
+ end
data/lib/opal/spec.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'opal'
2
+ require 'opal/spec/runner'
3
+ require 'opal/spec/version'
4
+
5
+ # Compatibility with old namespace
6
+ OpalSpec = Opal::Spec
7
+
8
+ # Just register our opal code path with opal build tools
9
+ Opal.append_path File.join(File.dirname(__FILE__), '..', 'assets', 'javascripts')
data/lib/opal-spec.rb CHANGED
@@ -1,10 +1 @@
1
- require 'opal-spec/example'
2
- require 'opal-spec/example_group'
3
- require 'opal-spec/matchers'
4
- require 'opal-spec/runner'
5
- require 'opal-spec/scratch_pad'
6
- require 'opal-spec/expectations'
7
- require 'opal-spec/browser_formatter'
8
- require 'opal-spec/phantom_formatter'
9
- require 'opal-spec/kernel'
10
- require 'opal-spec/version'
1
+ require 'opal/spec'
data/opal-spec.gemspec CHANGED
@@ -1,15 +1,15 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/opal-spec/version', __FILE__)
2
+ require File.expand_path('../lib/opal/spec/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = 'opal-spec'
6
- s.version = OpalSpec::VERSION
6
+ s.version = Opal::Spec::VERSION
7
7
  s.author = 'Adam Beynon'
8
- s.email = 'adam@adambeynon.com'
8
+ s.email = 'adam.beynon@gmail.com'
9
9
  s.homepage = 'http://opalrb.org'
10
10
  s.summary = 'Opal compatible spec'
11
11
  s.description = 'Opal compatible spec library'
12
12
 
13
13
  s.files = `git ls-files`.split("\n")
14
14
  s.require_paths = ['lib']
15
- end
15
+ end
data/spec/index.html CHANGED
@@ -1,12 +1,9 @@
1
1
  <!DOCTYPE html>
2
-
3
2
  <html>
4
3
  <head>
5
- <title>opal-spec tests</title>
4
+ <title>opal-spec specs</title>
6
5
  </head>
7
6
  <body>
8
- <script src="../build/opal.js"></script>
9
- <script src="../build/opal-spec.js"></script>
10
7
  <script src="../build/specs.js"></script>
11
8
  </body>
12
9
  </html>
@@ -1,3 +1,6 @@
1
+ #= require opal
2
+ #= require opal-spec
3
+
1
4
  @passed = 0
2
5
  @failures = []
3
6
 
@@ -68,6 +71,6 @@ describe 'Another group' do
68
71
  end
69
72
  end
70
73
 
71
- OpalSpec::Runner.autorun
74
+ Opal::Spec::Runner.autorun
72
75
 
73
- puts "Assertions: #{@passed + @failures.length}, Passed: #{@passed}, Failures: #{@failures.length}"
76
+ puts "Assertions: #{@passed + @failures.length}, Passed: #{@passed}, Failures: #{@failures.length}"
data/vendor/runner.js ADDED
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Test runner for phantomjs
3
+ */
4
+ var args = phantom.args;
5
+ var page = require('webpage').create();
6
+
7
+ page.onConsoleMessage = function(msg) {
8
+ console.log(msg);
9
+ };
10
+
11
+ page.onInitialized = function() {
12
+ page.evaluate(function () {
13
+ window.OPAL_SPEC_PHANTOM = true;
14
+ });
15
+ };
16
+
17
+ page.open(args[0], function(status) {
18
+ if (status !== 'success') {
19
+ console.error("Cannot load: " + args[0]);
20
+ phantom.exit(1);
21
+ } else {
22
+ var timeout = parseInt(args[1] || 60000, 10);
23
+ var start = Date.now();
24
+ var interval = setInterval(function() {
25
+ if (Date.now() > start + timeout) {
26
+ console.error("Specs timed out");
27
+ phantom.exit(124);
28
+ } else {
29
+ var code = page.evaluate(function() {
30
+ return window.OPAL_SPEC_CODE;
31
+ });
32
+
33
+ if (code === 0 || code === 1) {
34
+ clearInterval(interval);
35
+ phantom.exit(code);
36
+ }
37
+ }
38
+ }, 500);
39
+ }
40
+ });
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.6
4
+ version: 0.2.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,10 +9,10 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-02 00:00:00.000000000 Z
12
+ date: 2013-02-05 00:00:00.000000000Z
13
13
  dependencies: []
14
14
  description: Opal compatible spec library
15
- email: adam@adambeynon.com
15
+ email: adam.beynon@gmail.com
16
16
  executables: []
17
17
  extensions: []
18
18
  extra_rdoc_files: []
@@ -21,20 +21,25 @@ files:
21
21
  - Gemfile
22
22
  - README.md
23
23
  - Rakefile
24
+ - lib/assets/javascripts/opal-spec.rb
25
+ - lib/assets/javascripts/opal/spec.rb
26
+ - lib/assets/javascripts/opal/spec/browser_formatter.rb
27
+ - lib/assets/javascripts/opal/spec/example.rb
28
+ - lib/assets/javascripts/opal/spec/example_group.rb
29
+ - lib/assets/javascripts/opal/spec/expectations.rb
30
+ - lib/assets/javascripts/opal/spec/kernel.rb
31
+ - lib/assets/javascripts/opal/spec/matchers.rb
32
+ - lib/assets/javascripts/opal/spec/phantom_formatter.rb
33
+ - lib/assets/javascripts/opal/spec/runner.rb
34
+ - lib/assets/javascripts/opal/spec/scratch_pad.rb
24
35
  - lib/opal-spec.rb
25
- - lib/opal-spec/browser_formatter.rb
26
- - lib/opal-spec/example.rb
27
- - lib/opal-spec/example_group.rb
28
- - lib/opal-spec/expectations.rb
29
- - lib/opal-spec/kernel.rb
30
- - lib/opal-spec/matchers.rb
31
- - lib/opal-spec/phantom_formatter.rb
32
- - lib/opal-spec/runner.rb
33
- - lib/opal-spec/scratch_pad.rb
34
- - lib/opal-spec/version.rb
36
+ - lib/opal/spec.rb
37
+ - lib/opal/spec/runner.rb
38
+ - lib/opal/spec/version.rb
35
39
  - opal-spec.gemspec
36
40
  - spec/index.html
37
- - spec/test.rb
41
+ - spec/specs.rb
42
+ - vendor/runner.js
38
43
  homepage: http://opalrb.org
39
44
  licenses: []
40
45
  post_install_message:
@@ -55,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
55
60
  version: '0'
56
61
  requirements: []
57
62
  rubyforge_project:
58
- rubygems_version: 1.8.24
63
+ rubygems_version: 1.8.11
59
64
  signing_key:
60
65
  specification_version: 3
61
66
  summary: Opal compatible spec
@@ -1,192 +0,0 @@
1
- module OpalSpec
2
- class BrowserFormatter
3
- CSS = <<-EOS
4
-
5
- body {
6
- font-size: 14px;
7
- font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
8
- }
9
-
10
- pre {
11
- font-family: "Bitstream Vera Sans Mono", Monaco, "Lucida Console", monospace;
12
- font-size: 12px;
13
- color: #444444;
14
- white-space: pre;
15
- padding: 3px 0px 3px 12px;
16
- margin: 0px 0px 8px;
17
-
18
- background: #FAFAFA;
19
- -webkit-box-shadow: rgba(0,0,0,0.07) 0 1px 2px inset;
20
- -webkit-border-radius: 3px;
21
- -moz-border-radius: 3px;
22
- border-radius: 3px;
23
- border: 1px solid #DDDDDD;
24
- }
25
-
26
- ul.example_groups {
27
- list-style-type: none;
28
- }
29
-
30
- li.group.passed .group_description {
31
- color: #597800;
32
- font-weight: bold;
33
- }
34
-
35
- li.group.failed .group_description {
36
- color: #FF000E;
37
- font-weight: bold;
38
- }
39
-
40
- li.example.passed {
41
- color: #597800;
42
- }
43
-
44
- li.example.failed {
45
- color: #FF000E;
46
- }
47
-
48
- .examples {
49
- list-style-type: none;
50
- }
51
- EOS
52
-
53
- def initialize
54
- @examples = []
55
- @failed_examples = []
56
- end
57
-
58
- def start
59
- %x{
60
- if (!document || !document.body) {
61
- #{ raise "Not running in browser." };
62
- }
63
-
64
- var summary_element = document.createElement('p');
65
- summary_element.className = 'summary';
66
- summary_element.innerHTML = "Running...";
67
-
68
- var groups_element = document.createElement('ul');
69
- groups_element.className = 'example_groups';
70
-
71
- var target = document.getElementById('opal-spec-output');
72
-
73
- if (!target) {
74
- target = document.body;
75
- }
76
-
77
- target.appendChild(summary_element);
78
- target.appendChild(groups_element);
79
-
80
- var styles = document.createElement('style');
81
- styles.type = 'text/css';
82
-
83
- if (styles.styleSheet) {
84
- styles.styleSheet.cssText = __scope.CSS;
85
- }
86
- else {
87
- styles.appendChild(document.createTextNode(__scope.CSS));
88
- }
89
-
90
- document.getElementsByTagName('head')[0].appendChild(styles);
91
- }
92
-
93
- @start_time = Time.now.to_f
94
- @groups_element = `groups_element`
95
- @summary_element = `summary_element`
96
- end
97
-
98
- def finish
99
- time = Time.now.to_f - @start_time
100
- text = "\n#{example_count} examples, #{@failed_examples.size} failures (time taken: #{time})"
101
- `#{@summary_element}.innerHTML = text`
102
- end
103
-
104
- def example_group_started group
105
- @example_group = group
106
- @example_group_failed = false
107
-
108
- %x{
109
- var group_element = document.createElement('li');
110
-
111
- var description = document.createElement('span');
112
- description.className = 'group_description';
113
- description.innerHTML = #{group.description.to_s};
114
- group_element.appendChild(description);
115
-
116
- var example_list = document.createElement('ul');
117
- example_list.className = 'examples';
118
- group_element.appendChild(example_list);
119
-
120
- #@groups_element.appendChild(group_element);
121
- }
122
-
123
- @group_element = `group_element`
124
- @example_list = `example_list`
125
- end
126
-
127
- def example_group_finished group
128
- if @example_group_failed
129
- `#@group_element.className = 'group failed';`
130
- else
131
- `#@group_element.className = 'group passed';`
132
- end
133
- end
134
-
135
- def example_started example
136
- @examples << example
137
- @example = example
138
- end
139
-
140
- def example_failed example
141
- @failed_examples << example
142
- @example_group_failed = true
143
-
144
- exception = example.exception
145
-
146
- case exception
147
- when OpalSpec::ExpectationNotMetError
148
- output = exception.message
149
- else
150
- output = "#{exception.class.name}: #{exception.message}\n"
151
- output += " #{exception.backtrace.join "\n "}\n"
152
- end
153
-
154
- %x{
155
- var wrapper = document.createElement('li');
156
- wrapper.className = 'example failed';
157
-
158
- var description = document.createElement('span');
159
- description.className = 'example_description';
160
- description.innerHTML = #{example.description};
161
-
162
- var exception = document.createElement('pre');
163
- exception.className = 'exception';
164
- exception.innerHTML = output;
165
-
166
- wrapper.appendChild(description);
167
- wrapper.appendChild(exception);
168
-
169
- #@example_list.appendChild(wrapper);
170
- #@example_list.style.display = 'list-item';
171
- }
172
- end
173
-
174
- def example_passed example
175
- %x{
176
- var wrapper = document.createElement('li');
177
- wrapper.className = 'example passed';
178
-
179
- var description = document.createElement('span');
180
- description.className = 'example_description';
181
- description.innerHTML = #{example.description};
182
-
183
- wrapper.appendChild(description);
184
- #@example_list.appendChild(wrapper);
185
- }
186
- end
187
-
188
- def example_count
189
- @examples.size
190
- end
191
- end
192
- end
@@ -1,76 +0,0 @@
1
- module OpalSpec
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 OpalSpec
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