opal 0.6.3 → 0.7.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.spectator +2 -0
  4. data/.spectator-mspec +3 -0
  5. data/.travis.yml +8 -11
  6. data/CHANGELOG.md +33 -0
  7. data/CONTRIBUTING.md +8 -43
  8. data/Gemfile +15 -4
  9. data/Guardfile +77 -0
  10. data/README.md +15 -9
  11. data/Rakefile +36 -12
  12. data/benchmarks/operators.rb +11 -0
  13. data/bin/opal +10 -13
  14. data/bin/opal-build +4 -4
  15. data/bin/opal-mspec +10 -0
  16. data/bin/opal-repl +4 -3
  17. data/examples/sinatra/Gemfile +1 -1
  18. data/examples/sinatra/config.ru +3 -3
  19. data/lib/mspec/opal/main.rb.erb +2 -2
  20. data/lib/mspec/opal/rake_task.rb +31 -24
  21. data/lib/mspec/opal/runner.rb +18 -1
  22. data/lib/mspec/opal/sprockets.js +17 -0
  23. data/lib/opal.rb +1 -34
  24. data/lib/opal/builder.rb +92 -58
  25. data/lib/opal/builder_processors.rb +165 -0
  26. data/lib/opal/cli.rb +85 -144
  27. data/lib/opal/cli_options.rb +136 -90
  28. data/lib/opal/cli_runners.rb +10 -0
  29. data/lib/opal/cli_runners/nodejs.rb +56 -0
  30. data/lib/opal/cli_runners/phantom.js +35 -0
  31. data/lib/opal/cli_runners/phantomjs.rb +28 -0
  32. data/lib/opal/cli_runners/server.rb +54 -0
  33. data/lib/opal/compiler.rb +35 -16
  34. data/lib/opal/erb.rb +29 -15
  35. data/lib/opal/hike_path_finder.rb +18 -0
  36. data/lib/opal/nodes.rb +1 -0
  37. data/lib/opal/nodes/call.rb +107 -26
  38. data/lib/opal/nodes/call_special.rb +31 -6
  39. data/lib/opal/nodes/class.rb +2 -2
  40. data/lib/opal/nodes/constants.rb +5 -20
  41. data/lib/opal/nodes/def.rb +4 -4
  42. data/lib/opal/nodes/defined.rb +3 -3
  43. data/lib/opal/nodes/definitions.rb +1 -1
  44. data/lib/opal/nodes/for.rb +35 -0
  45. data/lib/opal/nodes/helpers.rb +2 -2
  46. data/lib/opal/nodes/iter.rb +3 -3
  47. data/lib/opal/nodes/literal.rb +10 -2
  48. data/lib/opal/nodes/masgn.rb +2 -2
  49. data/lib/opal/nodes/module.rb +2 -2
  50. data/lib/opal/nodes/scope.rb +1 -0
  51. data/lib/opal/nodes/singleton_class.rb +2 -2
  52. data/lib/opal/nodes/super.rb +2 -2
  53. data/lib/opal/nodes/top.rb +30 -3
  54. data/lib/opal/parser.rb +15 -1
  55. data/lib/opal/parser/grammar.rb +2571 -2452
  56. data/lib/opal/parser/grammar.y +37 -5
  57. data/lib/opal/parser/keywords.rb +2 -0
  58. data/lib/opal/parser/lexer.rb +21 -11
  59. data/lib/opal/path_reader.rb +28 -0
  60. data/lib/opal/paths.rb +38 -0
  61. data/lib/opal/source_map.rb +32 -15
  62. data/lib/opal/sprockets/environment.rb +9 -2
  63. data/lib/opal/sprockets/erb.rb +1 -2
  64. data/lib/opal/sprockets/path_reader.rb +34 -0
  65. data/lib/opal/sprockets/processor.rb +40 -39
  66. data/lib/opal/sprockets/server.rb +47 -33
  67. data/lib/opal/version.rb +1 -1
  68. data/opal.gemspec +10 -5
  69. data/opal/README.md +6 -0
  70. data/opal/corelib/array.rb +36 -4
  71. data/opal/corelib/array/inheritance.rb +6 -6
  72. data/opal/corelib/basic_object.rb +9 -9
  73. data/opal/corelib/boolean.rb +1 -1
  74. data/opal/corelib/class.rb +12 -12
  75. data/opal/corelib/dir.rb +20 -0
  76. data/opal/corelib/enumerable.rb +42 -42
  77. data/opal/corelib/enumerator.rb +1 -1
  78. data/opal/corelib/error.rb +2 -2
  79. data/opal/corelib/file.rb +56 -0
  80. data/opal/corelib/hash.rb +5 -5
  81. data/opal/corelib/helpers.rb +3 -3
  82. data/opal/corelib/io.rb +13 -10
  83. data/opal/corelib/kernel.rb +44 -68
  84. data/opal/corelib/method.rb +1 -1
  85. data/opal/corelib/module.rb +89 -114
  86. data/opal/corelib/nil_class.rb +1 -1
  87. data/opal/corelib/numeric.rb +27 -23
  88. data/opal/corelib/proc.rb +5 -5
  89. data/opal/corelib/range.rb +8 -4
  90. data/opal/corelib/regexp.rb +5 -5
  91. data/opal/corelib/runtime.js +589 -272
  92. data/opal/corelib/string.rb +52 -37
  93. data/opal/corelib/string/inheritance.rb +5 -5
  94. data/opal/corelib/time.rb +102 -52
  95. data/opal/corelib/variables.rb +3 -3
  96. data/opal/opal.rb +2 -0
  97. data/package.json +9 -0
  98. data/spec/filters/bugs/array.rb +0 -6
  99. data/spec/filters/bugs/language.rb +4 -0
  100. data/spec/filters/bugs/numeric.rb +7 -6
  101. data/spec/filters/bugs/opal.rb +2 -0
  102. data/spec/filters/bugs/regexp.rb +4 -0
  103. data/spec/filters/bugs/string.rb +0 -7
  104. data/spec/filters/bugs/stringscanner.rb +4 -1
  105. data/spec/filters/unsupported/private_methods.rb +2 -0
  106. data/spec/lib/builder_processors_spec.rb +27 -0
  107. data/spec/lib/builder_spec.rb +66 -0
  108. data/spec/{cli → lib}/cli_spec.rb +60 -5
  109. data/spec/{cli → lib}/compiler_spec.rb +66 -5
  110. data/spec/{cli → lib}/dependency_resolver_spec.rb +1 -1
  111. data/spec/lib/fixtures/no_requires.rb +1 -0
  112. data/spec/{cli → lib}/fixtures/opal_file.rb +0 -0
  113. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  114. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  115. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  116. data/spec/lib/fixtures/requires.rb +7 -0
  117. data/spec/{cli → lib}/fixtures/sprockets_file.js.rb +0 -0
  118. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  119. data/spec/lib/hike_path_finder_spec.rb +23 -0
  120. data/spec/{cli → lib}/lexer_spec.rb +1 -1
  121. data/spec/{cli → lib}/parser/alias_spec.rb +1 -1
  122. data/spec/{cli → lib}/parser/and_spec.rb +1 -1
  123. data/spec/{cli → lib}/parser/attrasgn_spec.rb +1 -1
  124. data/spec/{cli → lib}/parser/begin_spec.rb +1 -1
  125. data/spec/{cli → lib}/parser/block_spec.rb +1 -1
  126. data/spec/{cli → lib}/parser/break_spec.rb +1 -1
  127. data/spec/{cli → lib}/parser/call_spec.rb +1 -1
  128. data/spec/{cli → lib}/parser/class_spec.rb +1 -1
  129. data/spec/{cli → lib}/parser/comments_spec.rb +1 -1
  130. data/spec/{cli → lib}/parser/def_spec.rb +1 -1
  131. data/spec/{cli → lib}/parser/if_spec.rb +1 -1
  132. data/spec/{cli → lib}/parser/iter_spec.rb +1 -1
  133. data/spec/{cli → lib}/parser/lambda_spec.rb +1 -1
  134. data/spec/{cli → lib}/parser/literal_spec.rb +1 -1
  135. data/spec/{cli → lib}/parser/masgn_spec.rb +1 -1
  136. data/spec/{cli → lib}/parser/module_spec.rb +1 -1
  137. data/spec/{cli → lib}/parser/not_spec.rb +1 -1
  138. data/spec/{cli → lib}/parser/op_asgn1_spec.rb +1 -1
  139. data/spec/{cli → lib}/parser/op_asgn2_spec.rb +1 -1
  140. data/spec/{cli → lib}/parser/or_spec.rb +1 -1
  141. data/spec/{cli → lib}/parser/return_spec.rb +1 -1
  142. data/spec/{cli → lib}/parser/sclass_spec.rb +1 -1
  143. data/spec/{cli → lib}/parser/string_spec.rb +8 -1
  144. data/spec/{cli → lib}/parser/super_spec.rb +1 -1
  145. data/spec/lib/parser/unary_spec.rb +48 -0
  146. data/spec/{cli → lib}/parser/undef_spec.rb +1 -1
  147. data/spec/{cli → lib}/parser/unless_spec.rb +1 -1
  148. data/spec/{cli → lib}/parser/variables_spec.rb +1 -1
  149. data/spec/{cli → lib}/parser/while_spec.rb +1 -1
  150. data/spec/{cli → lib}/parser/yield_spec.rb +1 -1
  151. data/spec/lib/path_reader_spec.rb +24 -0
  152. data/spec/lib/shared/path_finder_shared.rb +19 -0
  153. data/spec/lib/shared/path_reader_shared.rb +31 -0
  154. data/spec/lib/spec_helper.rb +9 -0
  155. data/spec/lib/sprockets/environment_spec.rb +30 -0
  156. data/spec/{cli → lib}/sprockets/erb_spec.rb +1 -1
  157. data/spec/lib/sprockets/path_reader_spec.rb +25 -0
  158. data/spec/{cli → lib}/sprockets/processor_spec.rb +9 -2
  159. data/spec/lib/sprockets/server_spec.rb +20 -0
  160. data/spec/opal/compiler/irb_spec.rb +11 -11
  161. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  162. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  163. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  164. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  165. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  166. data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
  167. data/spec/opal/core/kernel/respond_to_spec.rb +2 -2
  168. data/spec/opal/core/runtime/method_missing_spec.rb +19 -0
  169. data/spec/opal/core/source_map_spec.rb +2 -2
  170. data/spec/opal/core/string_spec.rb +11 -0
  171. data/spec/opal/stdlib/erb/erb_spec.rb +0 -1
  172. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  173. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  174. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  175. data/spec/rubyspecs +54 -11
  176. data/spec/spec_helper.rb +18 -3
  177. data/spec/support/mspec_rspec_adapter.rb +33 -0
  178. data/spec/{cli/spec_helper.rb → support/parser_helpers.rb} +10 -10
  179. data/stdlib/README.md +3 -0
  180. data/stdlib/benchmark.rb +10 -0
  181. data/stdlib/date.rb +2 -2
  182. data/stdlib/dir.rb +1 -5
  183. data/stdlib/file.rb +1 -7
  184. data/stdlib/json.rb +10 -1
  185. data/stdlib/native.rb +5 -5
  186. data/stdlib/nodejs.rb +5 -0
  187. data/stdlib/nodejs/dir.rb +13 -0
  188. data/stdlib/nodejs/file.rb +98 -0
  189. data/stdlib/nodejs/fileutils.rb +26 -0
  190. data/stdlib/nodejs/io.rb +2 -0
  191. data/stdlib/nodejs/irb.rb +45 -0
  192. data/stdlib/nodejs/process.rb +16 -0
  193. data/stdlib/nodejs/require.rb +32 -0
  194. data/stdlib/nodejs/rubygems.rb +68 -0
  195. data/stdlib/nodejs/runtime.rb +25 -0
  196. data/stdlib/nodejs/yaml.rb +11 -0
  197. data/stdlib/opal-parser.rb +1 -2
  198. data/stdlib/opal-source-maps.rb +2 -0
  199. data/stdlib/phantomjs.rb +8 -0
  200. data/stdlib/process.rb +10 -0
  201. data/stdlib/promise.rb +12 -4
  202. data/stdlib/set.rb +27 -0
  203. data/stdlib/source_map.rb +5 -63
  204. data/stdlib/source_map/map.rb +220 -0
  205. data/stdlib/source_map/mapping.rb +26 -0
  206. data/stdlib/source_map/offset.rb +88 -0
  207. data/stdlib/source_map/version.rb +3 -0
  208. data/stdlib/source_map/vlq.rb +77 -101
  209. data/stdlib/sourcemap.rb +1 -0
  210. data/stdlib/strscan.rb +7 -1
  211. data/stdlib/template.rb +1 -1
  212. data/stdlib/thread.rb +147 -7
  213. metadata +238 -104
  214. data/lib/mspec/opal/mspec_fixes.rb +0 -87
  215. data/spec/cli/sprockets/environment_spec.rb +0 -14
  216. data/spec/filters/bugs/symbol.rb +0 -5
  217. data/spec/opal/core/kernel/warn_spec.rb +0 -83
  218. data/spec/opal/core/language/numbers_spec.rb +0 -60
  219. data/stdlib/opal-source-maps.js.erb +0 -2
  220. data/stdlib/source_map/generator.rb +0 -251
  221. data/stdlib/source_map/parser.rb +0 -102
@@ -1,4 +1,4 @@
1
- require 'cli/spec_helper'
1
+ require 'lib/spec_helper'
2
2
  require 'opal/sprockets/erb'
3
3
 
4
4
  describe Opal::ERB::Processor do
@@ -0,0 +1,25 @@
1
+ require 'lib/spec_helper'
2
+ require 'lib/shared/path_reader_shared'
3
+ require 'opal/sprockets/path_reader'
4
+
5
+ describe Opal::Sprockets::PathReader do
6
+ subject(:path_reader) { described_class.new(env, context) }
7
+
8
+ let(:env) { Opal::Environment.new }
9
+ let(:context) { double('context', depend_on: nil, depend_on_asset: nil) }
10
+
11
+ let(:logical_path) { 'sprockets_file' }
12
+ let(:fixtures_dir) { File.expand_path('../../fixtures/', __FILE__) }
13
+ let(:full_path) { File.join(fixtures_dir, logical_path+'.js.rb') }
14
+ let(:contents) { File.read(full_path) }
15
+
16
+ before { env.append_path fixtures_dir }
17
+
18
+ include_examples :path_reader do
19
+ let(:path) { logical_path }
20
+ end
21
+
22
+ it 'can read stuff from sprockets env' do
23
+ expect(path_reader.read(logical_path)).to eq(contents)
24
+ end
25
+ end
@@ -1,9 +1,16 @@
1
- require 'cli/spec_helper'
1
+ require 'lib/spec_helper'
2
2
  require 'opal/sprockets/processor'
3
3
 
4
4
  describe Opal::Processor do
5
5
  let(:pathname) { Pathname("/Code/app/mylib/opal/foo.#{ext}") }
6
- let(:_context) { double('_context', :logical_path => "foo.#{ext}", :pathname => pathname, :resolve => pathname.expand_path) }
6
+ let(:_context) { double('_context', :logical_path => "foo.#{ext}", :pathname => pathname) }
7
+ let(:env) { double('env') }
8
+
9
+ before do
10
+ env.stub(:resolve) { pathname.expand_path.to_s }
11
+ env.stub(:[])
12
+ _context.stub(:environment) { env }
13
+ end
7
14
 
8
15
  %w[rb js.rb opal js.opal].each do |ext|
9
16
  let(:ext) { ext }
@@ -0,0 +1,20 @@
1
+ require 'lib/spec_helper'
2
+ require 'rack/test'
3
+
4
+ describe Opal::Server do
5
+ include Rack::Test::Methods
6
+
7
+ def app
8
+ described_class.new { |s|
9
+ s.main = 'opal'
10
+ s.debug = false
11
+ s.sprockets.logger = Logger.new('/dev/null')
12
+ }
13
+ end
14
+
15
+ it 'serves assets from /assets' do
16
+ get '/assets/opal.js'
17
+ expect(last_response).to be_ok
18
+ end
19
+
20
+ end
@@ -3,42 +3,42 @@ require 'native'
3
3
 
4
4
  describe Opal::Compiler do
5
5
  describe "irb parser option" do
6
- before do
7
- @compiler = Opal::Compiler.new
8
- end
9
-
10
6
  it "creates Opal.irb_vars if it does not exist" do
11
7
  $global["Opal"].irb_vars = nil
12
- eval_js(@compiler.compile "nil", :irb => true)
8
+ eval_js compile("nil", :irb => true)
13
9
 
14
10
  ($global["Opal"].irb_vars == nil).should be_false
15
11
  end
16
12
 
17
13
  it "does not create Opal.irb_vars if :irb option not passed" do
18
14
  $global["Opal"].irb_vars = nil
19
- eval_js(@compiler.compile "nil")
15
+ eval_js compile("nil")
20
16
 
21
17
  ($global["Opal"].irb_vars == nil).should be_true
22
18
  end
23
19
 
24
20
  it "sets each s(:lasgn) in the top level onto irb_vars" do
25
- eval_js @compiler.compile "foo = 42", :irb => true
21
+ eval_js compile("foo = 42", :irb => true)
26
22
  $global["Opal"].irb_vars.foo.should == 42
27
23
  end
28
24
 
29
25
  it "gets each s(:lvar) in the top level from irb_vars" do
30
- eval_js @compiler.compile "foo = 3.142; bar = foo", :irb => true
26
+ eval_js compile("foo = 3.142; bar = foo", :irb => true)
31
27
  $global["Opal"].irb_vars.bar.should == 3.142
32
28
  end
33
29
 
34
30
  it "persists local vars between parses" do
35
- eval_js @compiler.compile "foo = 'hello world'", :irb => true
36
- eval_js @compiler.compile "bar = foo.upcase", :irb => true
31
+ eval_js compile("foo = 'hello world'", :irb => true)
32
+ eval_js compile("bar = foo.upcase", :irb => true)
37
33
  $global["Opal"].irb_vars.bar.should == "HELLO WORLD"
38
34
  end
39
35
 
40
36
  it "can still call top level methods" do
41
- eval_js(@compiler.compile("to_s", :irb => true)).should == "main"
37
+ eval_js(compile("to_s", :irb => true)).should == "main"
38
+ end
39
+
40
+ def compile *args
41
+ Opal::Compiler.new(*args).compile
42
42
  end
43
43
  end
44
44
  end
@@ -0,0 +1 @@
1
+ $ScratchPad << File.basename(__FILE__)
@@ -0,0 +1 @@
1
+ $ScratchPad << File.basename(__FILE__)
@@ -0,0 +1 @@
1
+ $ScratchPad << File.basename(__FILE__)
@@ -0,0 +1 @@
1
+ $ScratchPad << File.basename(__FILE__)
@@ -0,0 +1 @@
1
+ $ScratchPad << File.basename(__FILE__)
@@ -0,0 +1,7 @@
1
+ describe 'Kernel.require_tree' do
2
+ it 'loads all the files in a directory' do
3
+ $ScratchPad = []
4
+ require_tree '../fixtures/require_tree_files'
5
+ $ScratchPad.sort.should == ['file 1', 'file 2', 'file 3', 'file 4', 'file 5']
6
+ end
7
+ end
@@ -34,8 +34,8 @@ describe "Kernel#respond_to?" do
34
34
  @a.respond_to?(:undefed_method).should be_false
35
35
  end
36
36
 
37
- it "returns false if a method exists, but is marked with a 'rb_stub' property" do
38
- `#{@a}.$some_method.rb_stub = true`
37
+ it "returns false if a method exists, but is marked with a '$$stub' property" do
38
+ `#{@a}.$some_method.$$stub = true`
39
39
  @a.respond_to?(:some_method).should be_false
40
40
  end
41
41
  end
@@ -14,6 +14,9 @@ module MethodMissingSpecs
14
14
  end
15
15
  end
16
16
 
17
+ class BridgedClass < `(function NativeConstructor(){})`
18
+ end
19
+
17
20
  describe "method_missing" do
18
21
  before do
19
22
  @obj = MethodMissingSpecs::A.new
@@ -41,3 +44,19 @@ describe "BasicObject#method_missing" do
41
44
  }.should raise_error(Exception)
42
45
  end
43
46
  end
47
+
48
+ describe "Array#method_missing" do
49
+ it "raises an error for the missing method" do
50
+ lambda {
51
+ BasicObject.new.foo_bar_baz
52
+ }.should raise_error(Exception)
53
+ end
54
+ end
55
+
56
+ describe "<BridgedClass>#method_missing" do
57
+ it "raises an error for the missing method" do
58
+ lambda {
59
+ BridgedClass.new.foo_bar_baz
60
+ }.should raise_error(Exception)
61
+ end
62
+ end
@@ -4,8 +4,8 @@ require 'opal-source-maps'
4
4
  describe Opal::SourceMap do
5
5
  before do
6
6
  pathname = 'foo.rb'
7
- compiler = Opal::Compiler.new
8
- @source = compiler.compile("1 + 1", :file => pathname)
7
+ compiler = Opal::Compiler.new("1 + 1", :file => pathname)
8
+ @source = compiler.compile
9
9
  @map = Opal::SourceMap.new(compiler.fragments, pathname)
10
10
  end
11
11
 
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe "String" do
4
+ it "handles contiguous parts correctly" do
5
+ str = "a" "b"
6
+ str.should == "ab"
7
+
8
+ str2 = "d" "#{str}"
9
+ str2.should == "dab"
10
+ end
11
+ end
@@ -1,5 +1,4 @@
1
1
  require 'erb'
2
-
3
2
  require File.expand_path('../simple', __FILE__)
4
3
  require File.expand_path('../quoted', __FILE__)
5
4
  require File.expand_path('../inline_block', __FILE__)
@@ -0,0 +1,40 @@
1
+ require 'thread'
2
+
3
+ describe Mutex do
4
+ before do
5
+ @mutex = Mutex.new
6
+ end
7
+
8
+ it "cannot be locked twice" do
9
+ @mutex.lock
10
+ lambda do
11
+ @mutex.lock
12
+ end.should raise_error(ThreadError)
13
+ end
14
+
15
+ it "reports locked? status" do
16
+ @mutex.locked?.should be_false
17
+ @mutex.lock
18
+ @mutex.locked?.should be_true
19
+ end
20
+
21
+ it "reports locked? status with try_lock" do
22
+ @mutex.try_lock.should be_true
23
+ @mutex.locked?.should be_true
24
+ @mutex.try_lock.should be_false
25
+ end
26
+
27
+ it "is locked and unlocked by synchronize" do
28
+ @mutex.synchronize do
29
+ @mutex.locked?.should be_true
30
+ end
31
+ @mutex.locked?.should be_false
32
+ end
33
+
34
+ it "will not be locked by synchronize if already locked" do
35
+ @mutex.lock
36
+ lambda do
37
+ @mutex.synchronize {}
38
+ end.should raise_error(ThreadError)
39
+ end
40
+ end
@@ -0,0 +1,32 @@
1
+ require 'thread'
2
+
3
+ describe Thread::Queue do
4
+ before do
5
+ @queue = Thread::Queue.new
6
+ end
7
+
8
+ it "is aliased as ::Queue" do
9
+ ::Thread::Queue.should == ::Queue
10
+ end
11
+
12
+ it "will not allow deadlock" do
13
+ lambda do
14
+ @queue.pop
15
+ end.should raise_error(ThreadError)
16
+ end
17
+
18
+ it "pops in FIFO order" do
19
+ @queue.push(1)
20
+ @queue.push(2)
21
+
22
+ @queue.pop.should == 1
23
+ @queue.pop.should == 2
24
+ end
25
+
26
+ it "can be cleared by clear" do
27
+ @queue.push(1)
28
+ @queue.clear
29
+ @queue.size.should == 0
30
+ @queue.empty?.should be_true
31
+ end
32
+ end
@@ -0,0 +1,60 @@
1
+ require 'thread'
2
+
3
+ # Our implementation of Thread only supports faux thread-local variables.
4
+ # Since we can't actually create a thread, nothing in rubyspec will run.
5
+ describe Thread do
6
+ it "returns a value for current" do
7
+ Thread.current.should_not be_nil
8
+ end
9
+
10
+ it "only has current in list" do
11
+ Thread.list.should == [Thread.current]
12
+ end
13
+
14
+ it "does not allow creation of new threads" do
15
+ lambda do
16
+ Thread.new {}
17
+ end.should raise_error(NotImplementedError)
18
+ end
19
+
20
+ describe "local storage" do
21
+ before do
22
+ @current = Thread.current
23
+ @current.send(:core_initialize!)
24
+ end
25
+
26
+ it "stores fiber-local variables" do
27
+ @current[:a] = 'hello'
28
+ @current[:a].should == 'hello'
29
+ end
30
+
31
+ it "returns fiber-local keys that are assigned" do
32
+ @current[:a] = 'hello'
33
+ @current.key?(:a).should be_true
34
+ @current.keys.should === ['a']
35
+ end
36
+
37
+ it "considers fiber-local keys, as symbols or strings equal" do
38
+ @current[:a] = 1
39
+ @current['a'] = 2
40
+ @current.keys.size.should == 1
41
+ @current[:a].should == 2
42
+ end
43
+
44
+ it "implements thread-local variables" do
45
+ @current.thread_variable_set('a', 1)
46
+ @current.thread_variable_get('a').should == 1
47
+ @current.thread_variables.should == ['a']
48
+ end
49
+
50
+ it "distinguishes between fiber-local and thread-local variables" do
51
+ @current[:a] = 1
52
+ @current.thread_variables.should == []
53
+
54
+ @current.thread_variable_set(:a, 2)
55
+
56
+ @current[:a].should == 1
57
+ @current.thread_variable_get(:a).should == 2
58
+ end
59
+ end
60
+ end
data/spec/rubyspecs CHANGED
@@ -20,6 +20,7 @@ corelib/core/fixnum/even_spec
20
20
  corelib/core/fixnum/gt_spec
21
21
  corelib/core/fixnum/gte_spec
22
22
  corelib/core/fixnum/left_shift_spec
23
+ corelib/core/fixnum/right_shift_spec
23
24
  corelib/core/fixnum/lt_spec
24
25
  corelib/core/fixnum/lte_spec
25
26
  corelib/core/fixnum/magnitude_spec
@@ -42,11 +43,22 @@ corelib/core/kernel/equal_spec
42
43
  corelib/core/kernel/equal_value_spec
43
44
  corelib/core/kernel/tap_spec
44
45
  corelib/core/kernel/to_s_spec
46
+ corelib/core/kernel/warn_spec
45
47
 
48
+ corelib/core/matchdata/captures_spec
49
+ corelib/core/matchdata/inspect_spec
50
+ corelib/core/matchdata/length_spec
51
+ corelib/core/matchdata/regexp_spec
52
+ corelib/core/matchdata/size_spec
53
+ corelib/core/matchdata/string_spec
46
54
  corelib/core/matchdata/to_a_spec
55
+ corelib/core/matchdata/to_s_spec
56
+ corelib/core/matchdata/values_at_spec
47
57
 
48
58
  corelib/core/range/begin_spec
59
+ corelib/core/range/case_compare_spec
49
60
  corelib/core/range/end_spec
61
+ corelib/core/range/new_spec
50
62
  corelib/core/range/size_spec
51
63
 
52
64
  corelib/core/string/allocate_spec
@@ -77,14 +89,12 @@ corelib/core/string/each_byte_spec
77
89
  corelib/core/string/each_char_spec
78
90
  corelib/core/string/each_codepoint_spec
79
91
  corelib/core/string/each_line_spec
80
- corelib/core/string/each_spec
81
92
  # corelib/core/string/element_reference_spec - fails to find a shared group - "String#[] with Regexp"
82
93
  corelib/core/string/element_set_spec
83
94
  corelib/core/string/empty_spec
84
95
  corelib/core/string/encode_spec
85
96
  corelib/core/string/encoding_spec
86
97
  corelib/core/string/end_with_spec
87
- corelib/core/string/entries_spec
88
98
  corelib/core/string/eql_spec
89
99
  corelib/core/string/equal_value_spec
90
100
  corelib/core/string/force_encoding_spec
@@ -130,7 +140,6 @@ corelib/core/string/sub_spec
130
140
  corelib/core/string/succ_spec
131
141
  corelib/core/string/sum_spec
132
142
  corelib/core/string/swapcase_spec
133
- corelib/core/string/to_a_spec
134
143
  # corelib/core/string/to_c_spec - lots of failing specs
135
144
  corelib/core/string/to_f_spec
136
145
  # corelib/core/string/to_i_spec
@@ -174,7 +183,6 @@ corelib/core/time/sec_spec
174
183
  corelib/core/time/strftime_spec
175
184
  corelib/core/time/sunday_spec
176
185
  corelib/core/time/thursday_spec
177
- corelib/core/time/times_spec
178
186
  corelib/core/time/to_i_spec
179
187
  corelib/core/time/to_s_spec
180
188
  corelib/core/time/tuesday_spec
@@ -185,6 +193,9 @@ corelib/core/time/wednesday_spec
185
193
  corelib/core/time/yday_spec
186
194
  corelib/core/time/year_spec
187
195
 
196
+ corelib/core/regexp/case_compare_spec
197
+ corelib/core/regexp/eql_spec
198
+ corelib/core/regexp/equal_value_spec
188
199
  corelib/core/regexp/escape_spec
189
200
  corelib/core/regexp/match_spec
190
201
  corelib/core/regexp/quote_spec
@@ -204,10 +215,10 @@ corelib/language/defined_spec
204
215
  # corelib/language/encoding_spec - can't parse encodings
205
216
  corelib/language/ensure_spec
206
217
  # corelib/language/execution_spec - can't parse x-strings with shell commands
207
- # corelib/language/file_spec - $LOADED_FEATURES not present
208
- # corelib/language/for_spec - can't parse for-in expressions
218
+ corelib/language/file_spec
219
+ corelib/language/for_spec
209
220
  corelib/language/hash_spec
210
- # corelib/language/if_spec - Can't parse "if expr: value"
221
+ corelib/language/if_spec
211
222
  # corelib/language/line_spec - $LOADED_FEATURES not present
212
223
  # corelib/language/lambda_spec - Can't parse literal {} in parenthesized argument list
213
224
  corelib/language/loop_spec
@@ -217,7 +228,7 @@ corelib/language/metaclass_spec
217
228
  corelib/language/module_spec
218
229
  # corelib/language/next_spec - can't parse break expr with block
219
230
  corelib/language/not_spec
220
- # corelib/language/numbers_spec - can't parse numbers using control characters
231
+ corelib/language/numbers_spec
221
232
  corelib/language/or_spec
222
233
  corelib/language/order_spec
223
234
  corelib/language/precedence_spec
@@ -237,7 +248,7 @@ corelib/language/super_spec
237
248
  # corelib/language/symbol_spec - lots fail
238
249
  # corelib/language/throw_spec - unsupported
239
250
  corelib/language/undef_spec
240
- # corelib/language/unless_spec - cant parse 'unless expr: value'
251
+ corelib/language/unless_spec
241
252
  corelib/language/until_spec
242
253
  # corelib/language/variables_spec - can't parse whole file
243
254
  corelib/language/while_spec
@@ -259,21 +270,53 @@ stdlib/rubysl-delegate/spec/delegator/send_spec
259
270
 
260
271
  stdlib/rubysl-erb/spec/util/html_escape_spec
261
272
 
262
- stdlib/rubysl-set/spec/initialize_spec
263
273
  stdlib/rubysl-set/spec/add_spec
264
274
  stdlib/rubysl-set/spec/append_spec
265
275
  stdlib/rubysl-set/spec/clear_spec
266
276
  stdlib/rubysl-set/spec/constructor_spec
277
+ stdlib/rubysl-set/spec/delete_if_spec
278
+ stdlib/rubysl-set/spec/delete_spec
267
279
  stdlib/rubysl-set/spec/each_spec
268
280
  stdlib/rubysl-set/spec/empty_spec
281
+ stdlib/rubysl-set/spec/enumerable/to_set_spec
269
282
  stdlib/rubysl-set/spec/equal_value_spec
270
283
  stdlib/rubysl-set/spec/include_spec
284
+ stdlib/rubysl-set/spec/initialize_spec
271
285
  stdlib/rubysl-set/spec/length_spec
272
286
  stdlib/rubysl-set/spec/member_spec
273
287
  stdlib/rubysl-set/spec/merge_spec
274
288
  stdlib/rubysl-set/spec/size_spec
275
289
  stdlib/rubysl-set/spec/to_a_spec
276
- stdlib/rubysl-set/spec/enumerable/to_set_spec
290
+ # stdlib/rubysl-set/spec/classify_spec
291
+ # stdlib/rubysl-set/spec/collect_spec
292
+ # stdlib/rubysl-set/spec/difference_spec
293
+ # stdlib/rubysl-set/spec/divide_spec
294
+ # stdlib/rubysl-set/spec/eql_spec
295
+ # stdlib/rubysl-set/spec/exclusion_spec
296
+ # stdlib/rubysl-set/spec/flatten_merge_spec
297
+ # stdlib/rubysl-set/spec/flatten_spec
298
+ # stdlib/rubysl-set/spec/hash_spec
299
+ # stdlib/rubysl-set/spec/initialize_copy_spec
300
+ # stdlib/rubysl-set/spec/inspect_spec
301
+ # stdlib/rubysl-set/spec/intersection_spec
302
+ # stdlib/rubysl-set/spec/keep_if_spec
303
+ # stdlib/rubysl-set/spec/map_spec
304
+ # stdlib/rubysl-set/spec/minus_spec
305
+ # stdlib/rubysl-set/spec/plus_spec
306
+ # stdlib/rubysl-set/spec/pretty_print_cycle_spec
307
+ # stdlib/rubysl-set/spec/pretty_print_spec
308
+ # stdlib/rubysl-set/spec/proper_subset_spec
309
+ # stdlib/rubysl-set/spec/proper_superset_spec
310
+ # stdlib/rubysl-set/spec/reject_spec
311
+ # stdlib/rubysl-set/spec/replace_spec
312
+ # stdlib/rubysl-set/spec/select_spec
313
+ # stdlib/rubysl-set/spec/subset_spec
314
+ # stdlib/rubysl-set/spec/subtract_spec
315
+ # stdlib/rubysl-set/spec/superset_spec
316
+ # stdlib/rubysl-set/spec/union_spec
317
+
318
+
319
+
277
320
 
278
321
  stdlib/rubysl-pathname/spec/new_spec
279
322
  stdlib/rubysl-pathname/spec/equal_value_spec