opal 0.3.43 → 0.3.44

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.
Files changed (98) hide show
  1. data/CHANGELOG.md +19 -0
  2. data/README.md +1 -0
  3. data/Rakefile +29 -19
  4. data/examples/native/Gemfile +3 -0
  5. data/examples/native/README.md +17 -0
  6. data/examples/native/app/app.rb +38 -0
  7. data/examples/native/config.ru +8 -0
  8. data/examples/native/index.html.erb +12 -0
  9. data/lib/opal/lexer.rb +5 -1
  10. data/lib/opal/parser.rb +36 -10
  11. data/lib/opal/processor.rb +10 -9
  12. data/lib/opal/server.rb +17 -7
  13. data/lib/opal/target_scope.rb +2 -2
  14. data/lib/opal/version.rb +1 -1
  15. data/opal/opal-browser/script_loader.rb +8 -13
  16. data/opal/opal.rb +23 -5
  17. data/opal/opal/array.rb +128 -14
  18. data/opal/opal/boolean.rb +1 -1
  19. data/opal/opal/class.rb +92 -18
  20. data/opal/opal/enumerable.rb +90 -0
  21. data/opal/opal/error.rb +1 -1
  22. data/opal/opal/hash.rb +2 -2
  23. data/opal/opal/kernel.rb +3 -3
  24. data/opal/opal/numeric.rb +1 -1
  25. data/opal/opal/proc.rb +1 -1
  26. data/opal/opal/regexp.rb +31 -31
  27. data/opal/opal/runtime.js +181 -69
  28. data/opal/opal/string.rb +561 -40
  29. data/opal/opal/time.rb +1 -1
  30. data/opal/rbconfig.rb +17 -3
  31. data/opal/strscan.rb +41 -5
  32. data/spec/opal/class/new_spec.rb +27 -0
  33. data/spec/opal/native_spec.rb +127 -0
  34. data/spec/ospec/runner.rb +0 -2
  35. data/spec/parser/strscan/get_byte_spec.rb +29 -0
  36. data/spec/parser/strscan/skip_spec.rb +40 -0
  37. data/spec/rubyspec/core/array/each_spec.rb +1 -1
  38. data/spec/rubyspec/core/array/intersection_spec.rb +5 -0
  39. data/spec/rubyspec/core/array/max_spec.rb +32 -0
  40. data/spec/rubyspec/core/array/min_spec.rb +32 -0
  41. data/spec/rubyspec/core/array/minus_spec.rb +7 -5
  42. data/spec/rubyspec/core/array/multiply_spec.rb +1 -1
  43. data/spec/rubyspec/core/array/plus_spec.rb +1 -1
  44. data/spec/rubyspec/core/array/pop_spec.rb +1 -1
  45. data/spec/rubyspec/core/array/push_spec.rb +1 -1
  46. data/spec/rubyspec/core/array/rassoc_spec.rb +1 -1
  47. data/spec/rubyspec/core/array/reject_spec.rb +2 -2
  48. data/spec/rubyspec/core/array/reverse_each_spec.rb +2 -2
  49. data/spec/rubyspec/core/array/rindex_spec.rb +2 -2
  50. data/spec/rubyspec/core/array/select_spec.rb +1 -1
  51. data/spec/rubyspec/core/array/shift_spec.rb +1 -1
  52. data/spec/rubyspec/core/array/slice_spec.rb +1 -1
  53. data/spec/rubyspec/core/array/sort_spec.rb +15 -15
  54. data/spec/rubyspec/core/array/to_a_spec.rb +1 -1
  55. data/spec/rubyspec/core/array/to_ary_spec.rb +1 -1
  56. data/spec/rubyspec/core/array/uniq_spec.rb +1 -1
  57. data/spec/rubyspec/core/array/unshift_spec.rb +1 -1
  58. data/spec/rubyspec/core/array/zip_spec.rb +1 -1
  59. data/spec/rubyspec/core/enumerable/select_spec.rb +4 -1
  60. data/spec/rubyspec/core/module/const_defined_spec.rb +86 -0
  61. data/spec/rubyspec/core/module/const_get_spec.rb +55 -3
  62. data/spec/rubyspec/core/module/const_set_spec.rb +2 -2
  63. data/spec/rubyspec/core/module/constants_spec.rb +49 -0
  64. data/spec/rubyspec/core/regexp/match_spec.rb +66 -1
  65. data/spec/rubyspec/core/string/center_spec.rb +71 -0
  66. data/spec/rubyspec/core/string/chomp_spec.rb +6 -1
  67. data/spec/rubyspec/core/string/clone_spec.rb +8 -0
  68. data/spec/rubyspec/core/string/dup_spec.rb +8 -0
  69. data/spec/rubyspec/core/string/end_with_spec.rb +5 -1
  70. data/spec/rubyspec/core/string/gsub_spec.rb +15 -1
  71. data/spec/rubyspec/core/string/lines_spec.rb +9 -0
  72. data/spec/rubyspec/core/string/ljust_spec.rb +17 -0
  73. data/spec/rubyspec/core/string/match_spec.rb +25 -3
  74. data/spec/rubyspec/core/string/rindex_spec.rb +50 -0
  75. data/spec/rubyspec/core/string/rjust_spec.rb +17 -0
  76. data/spec/rubyspec/core/string/scan_spec.rb +66 -0
  77. data/spec/rubyspec/core/string/sub_spec.rb +17 -1
  78. data/spec/rubyspec/core/string/tr_s_spec.rb +31 -0
  79. data/spec/rubyspec/core/string/tr_spec.rb +31 -0
  80. data/spec/rubyspec/fixtures/constants.rb +6 -0
  81. data/spec/rubyspec/language/class_spec.rb +4 -8
  82. data/spec/rubyspec/language/numbers_spec.rb +10 -4
  83. data/spec/rubyspec/language/predefined_spec.rb +69 -2
  84. data/spec/rubyspec/library/rbconfig/config_spec.rb +47 -0
  85. data/spec/rubyspec/spec_helper.rb +6 -0
  86. metadata +46 -25
  87. data/opal/opal-eventable.rb +0 -26
  88. data/opal/opal/native.rb +0 -115
  89. data/spec/opal/eventable_spec.rb +0 -75
  90. data/spec/opal/native/element_reference_spec.rb +0 -40
  91. data/spec/opal/native/equal_spec.rb +0 -17
  92. data/spec/opal/native/fixtures/classes.rb +0 -27
  93. data/spec/opal/native/global_spec.rb +0 -12
  94. data/spec/opal/native/initialize_spec.rb +0 -8
  95. data/spec/opal/native/method_missing_spec.rb +0 -53
  96. data/spec/opal/native/to_native_spec.rb +0 -8
  97. data/spec/rubyspec/core/string/demodulize_spec.rb +0 -10
  98. data/spec/rubyspec/core/string/underscore_spec.rb +0 -17
@@ -53,7 +53,7 @@ describe "Array#* with an integer" do
53
53
  (ary * 1).should_not equal(ary)
54
54
  end
55
55
 
56
- pending "properly handles recursive arrays" do
56
+ it "properly handles recursive arrays" do
57
57
  empty = ArraySpecs.empty_recursive_array
58
58
  (empty * 0).should == []
59
59
  (empty * 1).should == empty
@@ -20,7 +20,7 @@ describe "Array#+" do
20
20
  ([1, 2, 3] + obj).should == [1, 2, 3, "x", "y"]
21
21
  end
22
22
 
23
- pending "properly handles recursive arrays" do
23
+ it "properly handles recursive arrays" do
24
24
  empty = ArraySpecs.empty_recursive_array
25
25
  (empty + empty).should == [empty, empty]
26
26
 
@@ -22,7 +22,7 @@ describe "Array#pop" do
22
22
  [].pop.should == nil
23
23
  end
24
24
 
25
- pending "properly handles recursive arrays" do
25
+ it "properly handles recursive arrays" do
26
26
  empty = ArraySpecs.empty_recursive_array
27
27
  empty.pop.should == []
28
28
 
@@ -17,7 +17,7 @@ describe "Array#push" do
17
17
  a.should == ["b", "c", "foo"]
18
18
  end
19
19
 
20
- pending "properly handles recursive arrays" do
20
+ it "properly handles recursive arrays" do
21
21
  empty = ArraySpecs.empty_recursive_array
22
22
  empty.push(:last).should == [empty, :last]
23
23
 
@@ -10,7 +10,7 @@ describe "Array#rassoc" do
10
10
  ary.rassoc("z").should == nil
11
11
  end
12
12
 
13
- pending "properly handles recursive arrays" do
13
+ it "properly handles recursive arrays" do
14
14
  empty = ArraySpecs.empty_recursive_array
15
15
  empty.rassoc([]).should be_nil
16
16
  [[empty, empty]].rassoc(empty).should == [empty, empty]
@@ -21,7 +21,7 @@ describe "Array#reject" do
21
21
  array.reject { |x| true }.should == []
22
22
  end
23
23
 
24
- pending "properly handles recursive arrays" do
24
+ it "properly handles recursive arrays" do
25
25
  empty = ArraySpecs.empty_recursive_array
26
26
  empty.reject { false }.should == [empty]
27
27
  empty.reject { true }.should == []
@@ -79,7 +79,7 @@ describe "Array#reject!" do
79
79
  a.should == []
80
80
  end
81
81
 
82
- pending "properly handles recursive arrays" do
82
+ it "properly handles recursive arrays" do
83
83
  empty = ArraySpecs.empty_recursive_array
84
84
  empty_dup = empty.dup
85
85
  empty.reject! { false }.should == nil
@@ -21,13 +21,13 @@ describe "Array#reverse_each" do
21
21
  a.reverse_each { |x| }.should equal(a)
22
22
  end
23
23
 
24
- pending "yields only the top level element of an empty recursive arrays" do
24
+ it "yields only the top level element of an empty recursive arrays" do
25
25
  empty = ArraySpecs.empty_recursive_array
26
26
  empty.reverse_each { |i| ScratchPad << i }
27
27
  ScratchPad.recorded.should == [empty]
28
28
  end
29
29
 
30
- pending "yields only the top level element of a recursive array" do
30
+ it "yields only the top level element of a recursive array" do
31
31
  array = ArraySpecs.recursive_array
32
32
  array.reverse_each { |i| ScratchPad << i }
33
33
  ScratchPad.recorded.should == [array, array, array, array, array, 3.0, 'two', 1]
@@ -31,13 +31,13 @@ describe "Array#rindex" do
31
31
  [1, 1, 3, 2, 1, 3].rindex(4).should == nil
32
32
  end
33
33
 
34
- pending "properly handles empty recursive arrays" do
34
+ it "properly handles empty recursive arrays" do
35
35
  empty = ArraySpecs.empty_recursive_array
36
36
  empty.rindex(empty).should == 0
37
37
  empty.rindex(1).should be_nil
38
38
  end
39
39
 
40
- pending "properly handles recursive arrays" do
40
+ it "properly handles recursive arrays" do
41
41
  array = ArraySpecs.recursive_array
42
42
  array.rindex(1).should == 0
43
43
  array.rindex(array).should == 7
@@ -16,7 +16,7 @@ describe "Array#select" do
16
16
  ArraySpecs::MyArray[1, 2, 3].select { true }.should be_kind_of(Array)
17
17
  end
18
18
 
19
- pending "properly handles recursive arrays" do
19
+ it "properly handles recursive arrays" do
20
20
  empty = ArraySpecs.empty_recursive_array
21
21
  empty.select { true }.should == empty
22
22
  empty.select { false }.should == []
@@ -20,7 +20,7 @@ describe "Array#shift" do
20
20
  [].shift.should == nil
21
21
  end
22
22
 
23
- pending "properly handles recursive arrays" do
23
+ it "properly handles recursive arrays" do
24
24
  empty = ArraySpecs.empty_recursive_array
25
25
  empty.shift.should == []
26
26
  empty.should == []
@@ -39,7 +39,7 @@ describe "Array#slice!" do
39
39
  a.should == []
40
40
  end
41
41
 
42
- pending "properly handles recursive arrays" do
42
+ it "properly handles recursive arrays" do
43
43
  empty = ArraySpecs.empty_recursive_array
44
44
  empty.slice(0).should == empty
45
45
 
@@ -2,23 +2,23 @@ require File.expand_path('../../../spec_helper', __FILE__)
2
2
  require File.expand_path('../fixtures/classes', __FILE__)
3
3
 
4
4
  describe "Array#sort" do
5
- pending "returns a new array sorted based on comparing elements with <=>" do
5
+ it "returns a new array sorted based on comparing elements with <=>" do
6
6
  a = [1, -2, 3, 9, 1, 5, -5, 1000, -5, 2, -10, 14, 6, 23, 0]
7
7
  a.sort.should == [-10, -5, -5, -2, 0, 1, 1, 2, 3, 5, 6, 9, 14, 23, 1000]
8
8
  end
9
9
 
10
- pending "does not affect the original Array" do
10
+ it "does not affect the original Array" do
11
11
  a = [0, 15, 2, 3, 4, 6, 14, 5, 7, 12, 8, 9, 1, 10, 11, 13]
12
12
  b = a.sort
13
13
  a.should == [0, 15, 2, 3, 4, 6, 14, 5, 7, 12, 8, 9, 1, 10, 11, 13]
14
14
  b.should == (0..15).to_a
15
15
  end
16
16
 
17
- pending "sorts already-sorted Arrays" do
17
+ it "sorts already-sorted Arrays" do
18
18
  (0..15).to_a.sort.should == (0..15).to_a
19
19
  end
20
20
 
21
- pending "sorts reverse-sorted Arrays" do
21
+ it "sorts reverse-sorted Arrays" do
22
22
  (0..15).to_a.reverse.sort.should == (0..15).to_a
23
23
  end
24
24
 
@@ -41,7 +41,7 @@ describe "Array#sort" do
41
41
  sorted.should_not equal(a)
42
42
  end
43
43
 
44
- pending "properly handles recursive arrays" do
44
+ it "properly handles recursive arrays" do
45
45
  empty = ArraySpecs.empty_recursive_array
46
46
  empty.sort.should == empty
47
47
 
@@ -49,7 +49,7 @@ describe "Array#sort" do
49
49
  array.sort.should == [[], array]
50
50
  end
51
51
 
52
- pending "uses #<=> of elements in order to sort" do
52
+ it "uses #<=> of elements in order to sort" do
53
53
  a = ArraySpecs::MockForCompared.new
54
54
  b = ArraySpecs::MockForCompared.new
55
55
  c = ArraySpecs::MockForCompared.new
@@ -59,7 +59,7 @@ describe "Array#sort" do
59
59
  ArraySpecs::MockForCompared.compared?.should == true
60
60
  end
61
61
 
62
- pending "does not deal with exceptions raised by unimplemented or incorrect #<=>" do
62
+ it "does not deal with exceptions raised by unimplemented or incorrect #<=>" do
63
63
  o = Object.new
64
64
 
65
65
  lambda { [o, 1].sort }.should raise_error
@@ -71,7 +71,7 @@ describe "Array#sort" do
71
71
  a.sort {|x, y| y <=> x}.should == [5, 4, 3, 2, 1]
72
72
  end
73
73
 
74
- pending "raises an error when a given block returns nil" do
74
+ it "raises an error when a given block returns nil" do
75
75
  lambda { [1, 2].sort {} }.should raise_error(ArgumentError)
76
76
  end
77
77
 
@@ -101,7 +101,7 @@ describe "Array#sort" do
101
101
  a.sort { |x,y| a.frozen?.should == false; x <=> y }
102
102
  end
103
103
 
104
- pending "returns the specified value when it would break in the given block" do
104
+ it "returns the specified value when it would break in the given block" do
105
105
  [1, 2, 3].sort{ break :a }.should == :a
106
106
  end
107
107
 
@@ -122,7 +122,7 @@ describe "Array#sort" do
122
122
  end
123
123
  end
124
124
 
125
- pending "compares values returned by block with 0" do
125
+ it "compares values returned by block with 0" do
126
126
  a = [1, 2, 5, 10, 7, -4, 12]
127
127
  a.sort { |n, m| n - m }.should == [-4, 1, 2, 5, 7, 10, 12]
128
128
  a.sort { |n, m|
@@ -147,7 +147,7 @@ describe "Array#sort" do
147
147
  a.sort {|a, b| a <=> b }.last.should == 2
148
148
  end
149
149
 
150
- pending "raises an error if objects can't be compared" do
150
+ it "raises an error if objects can't be compared" do
151
151
  a=[ArraySpecs::Uncomparable.new, ArraySpecs::Uncomparable.new]
152
152
  lambda {a.sort}.should raise_error(ArgumentError)
153
153
  end
@@ -174,7 +174,7 @@ describe "Array#sort" do
174
174
  end
175
175
 
176
176
  describe "Array#sort!" do
177
- pending "sorts array in place using <=>" do
177
+ it "sorts array in place using <=>" do
178
178
  a = [1, -2, 3, 9, 1, 5, -5, 1000, -5, 2, -10, 14, 6, 23, 0]
179
179
  a.sort!
180
180
  a.should == [-10, -5, -5, -2, 0, 1, 1, 2, 3, 5, 6, 9, 14, 23, 1000]
@@ -197,7 +197,7 @@ describe "Array#sort!" do
197
197
  a.should == [1, 2, 3, 4, 5]
198
198
  end
199
199
 
200
- pending "properly handles recursive arrays" do
200
+ it "properly handles recursive arrays" do
201
201
  empty = ArraySpecs.empty_recursive_array
202
202
  empty.sort!.should == empty
203
203
 
@@ -205,7 +205,7 @@ describe "Array#sort!" do
205
205
  array.sort!.should == array
206
206
  end
207
207
 
208
- pending "uses #<=> of elements in order to sort" do
208
+ it "uses #<=> of elements in order to sort" do
209
209
  a = ArraySpecs::MockForCompared.new
210
210
  b = ArraySpecs::MockForCompared.new
211
211
  c = ArraySpecs::MockForCompared.new
@@ -256,7 +256,7 @@ describe "Array#sort!" do
256
256
  end
257
257
  end
258
258
 
259
- pending "returns the specified value when it would break in the given block" do
259
+ it "returns the specified value when it would break in the given block" do
260
260
  [1, 2, 3].sort{ break :a }.should == :a
261
261
  end
262
262
 
@@ -14,7 +14,7 @@ describe "Array#to_a" do
14
14
  e.to_a.should == [1, 2]
15
15
  end
16
16
 
17
- pending "properly handles recursive arrays" do
17
+ it "properly handles recursive arrays" do
18
18
  empty = ArraySpecs.empty_recursive_array
19
19
  empty.to_a.should == empty
20
20
 
@@ -9,7 +9,7 @@ describe "Array#to_ary" do
9
9
  a.should equal(a.to_ary)
10
10
  end
11
11
 
12
- pending "properly handles recursive arrays" do
12
+ it "properly handles recursive arrays" do
13
13
  empty = ArraySpecs.empty_recursive_array
14
14
  empty.to_ary.should == empty
15
15
 
@@ -7,7 +7,7 @@ describe "Array#uniq" do
7
7
  end
8
8
 
9
9
  ruby_bug "#", "1.8.6.277" do
10
- pending "properly handles recursive arrays" do
10
+ it "properly handles recursive arrays" do
11
11
  empty = ArraySpecs.empty_recursive_array
12
12
  empty.uniq.should == [empty]
13
13
 
@@ -30,7 +30,7 @@ describe "Array#unshift" do
30
30
  [].unshift(*[]).should == []
31
31
  end
32
32
 
33
- pending "properly handles recursive arrays" do
33
+ it "properly handles recursive arrays" do
34
34
  empty = ArraySpecs.empty_recursive_array
35
35
  empty.unshift(:new).should == [:new, empty]
36
36
 
@@ -12,7 +12,7 @@ describe "Array#zip" do
12
12
  [[1, "a"], [2, "b"], [3, "c"], [4, "d"], [5, nil]]
13
13
  end
14
14
 
15
- pending "properly handles recursive arrays" do
15
+ it "properly handles recursive arrays" do
16
16
  a = []; a << a
17
17
  b = [1]; b << b
18
18
 
@@ -1,3 +1,6 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+
1
4
  describe "Enumerable#select" do
2
5
  before :each do
3
6
  ScratchPad.record []
@@ -10,4 +13,4 @@ describe "Enumerable#select" do
10
13
  @numerous.select {|i| true }.should == @elements
11
14
  @numerous.select {|i| false }.should == []
12
15
  end
13
- end
16
+ end
@@ -0,0 +1,86 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+ require File.expand_path('../../../fixtures/constants', __FILE__)
3
+
4
+ CD_CONST1 = :const1
5
+
6
+ module ConstDefinedSpecs
7
+ FOO = 100
8
+
9
+ module Bar
10
+ BAR = 200
11
+
12
+ module Baz
13
+ BAZ = 300
14
+ end
15
+ end
16
+
17
+ class Dog
18
+ LEGS = 4
19
+ end
20
+
21
+ class Bloudhound < Dog
22
+ end
23
+ end
24
+
25
+ describe "Module#const_defined?" do
26
+ it "should consider constants with values that evaluate to false in a JavaScript conditional as defined" do
27
+ Object.const_defined?("CS_NIL").should be_true
28
+ Object.const_defined?("CS_ZERO").should be_true
29
+ Object.const_defined?("CS_BLANK").should be_true
30
+ Object.const_defined?("CS_FALSE").should be_true
31
+ end
32
+
33
+ it "accepts a String or Symbol name" do
34
+ Object.const_defined?(:CD_CONST1).should be_true
35
+ Object.const_defined?("CD_CONST1").should be_true
36
+ end
37
+
38
+ it "should return false if no constant is defined in the search path" do
39
+ Object.const_defined?(:CS_CONSTX_BAD).should be_false
40
+ end
41
+
42
+ it "raises a NameError if the name does not start with a capital letter" do
43
+ lambda { ConstantSpecs.const_defined? "name" }.should raise_error(NameError)
44
+ end
45
+
46
+ it "raises a NameError if the name starts with a non-alphabetic character" do
47
+ lambda { ConstantSpecs.const_defined? "__CONSTX__" }.should raise_error(NameError)
48
+ lambda { ConstantSpecs.const_defined? "@Name" }.should raise_error(NameError)
49
+ lambda { ConstantSpecs.const_defined? "!Name" }.should raise_error(NameError)
50
+ lambda { ConstantSpecs.const_defined? "::Name" }.should raise_error(NameError)
51
+ end
52
+
53
+ it "raises a NameError if the name contains non-word characters" do
54
+ # underscore (i.e., _) is a valid word character
55
+ ConstantSpecs.const_defined?("CD_CONST1").should be_true
56
+ lambda { ConstantSpecs.const_defined? "Name=" }.should raise_error(NameError)
57
+ lambda { ConstantSpecs.const_defined? "Name?" }.should raise_error(NameError)
58
+ end
59
+
60
+ it "searches parent scopes of classes and modules" do
61
+ Module.const_defined?(:ConstDefinedSpecs).should be_true
62
+ ConstDefinedSpecs.const_defined?(:ConstDefinedSpecs).should be_true
63
+ ConstDefinedSpecs::Bar::Baz.const_defined?(:BAZ).should be_true
64
+ ConstDefinedSpecs::Bar::Baz.const_defined?(:CD_CONST1).should be_true
65
+ ConstDefinedSpecs::Bar::Baz.const_defined?(:BAR).should be_false
66
+ ConstDefinedSpecs::Bar::Baz.const_defined?(:FOO).should be_false
67
+ ConstDefinedSpecs::Bar::Baz.const_defined?(:Bar).should be_false
68
+ ConstDefinedSpecs::Bar::Baz.const_defined?(:ConstDefinedSpecs).should be_true
69
+ ConstDefinedSpecs::Dog.const_defined?(:LEGS).should be_true
70
+ ConstDefinedSpecs::Dog.const_defined?(:Dog).should be_false
71
+ ConstDefinedSpecs::Bloudhound.const_defined?(:LEGS).should be_true
72
+ end
73
+
74
+ it "should not search parent scopes of classes and modules if inherit is false" do
75
+ Module.const_defined?(:ConstDefinedSpecs, false).should be_false
76
+ ConstDefinedSpecs.const_defined?(:ConstDefinedSpecs, false).should be_false
77
+ ConstDefinedSpecs::Dog.const_defined?(:LEGS, false).should be_true
78
+ ConstDefinedSpecs::Dog.const_defined?(:Dog, false).should be_false
79
+ ConstDefinedSpecs::Bloudhound.const_defined?(:LEGS, false).should be_false
80
+ end
81
+
82
+ it "should search parent scopes of classes and modules for Object regardless of inherit value" do
83
+ Object.const_defined?(:ConstDefinedSpecs).should be_true
84
+ Object.const_defined?(:ConstDefinedSpecs, false).should be_true
85
+ end
86
+ end
@@ -13,9 +13,23 @@ module ConstGetSpecs
13
13
  BAZ = 300
14
14
  end
15
15
  end
16
+
17
+ class Dog
18
+ LEGS = 4
19
+ end
20
+
21
+ class Bloudhound < Dog
22
+ end
16
23
  end
17
24
 
18
25
  describe "Module#const_get" do
26
+ it "should get constants with values that evaluate to false in a JavaScript conditional" do
27
+ Object.const_get("CS_NIL").should be_nil
28
+ Object.const_get("CS_ZERO").should == 0
29
+ Object.const_get("CS_BLANK").should == ""
30
+ Object.const_get("CS_FALSE").should == false
31
+ end
32
+
19
33
  it "accepts a String or Symbol name" do
20
34
  Object.const_get(:CS_CONST1).should == :const1
21
35
  Object.const_get("CS_CONST1").should == :const1
@@ -25,10 +39,48 @@ describe "Module#const_get" do
25
39
  lambda { Object.const_get :CS_CONSTX_BAD }.should raise_error(NameError)
26
40
  end
27
41
 
42
+ it "raises a NameError if the name does not start with a capital letter" do
43
+ lambda { ConstantSpecs.const_get "name" }.should raise_error(NameError)
44
+ end
45
+
46
+ it "raises a NameError if the name starts with a non-alphabetic character" do
47
+ lambda { ConstantSpecs.const_get "__CONSTX__" }.should raise_error(NameError)
48
+ lambda { ConstantSpecs.const_get "@Name" }.should raise_error(NameError)
49
+ lambda { ConstantSpecs.const_get "!Name" }.should raise_error(NameError)
50
+ lambda { ConstantSpecs.const_get "::Name" }.should raise_error(NameError)
51
+ end
52
+
53
+ it "raises a NameError if the name contains non-word characters" do
54
+ # underscore (i.e., _) is a valid word character
55
+ ConstantSpecs.const_get("CS_CONST1").should == :const1
56
+ lambda { ConstantSpecs.const_get "Name=" }.should raise_error(NameError)
57
+ lambda { ConstantSpecs.const_get "Name?" }.should raise_error(NameError)
58
+ end
59
+
28
60
  it "searches parent scopes of classes and modules" do
61
+ Module.const_get(:ConstGetSpecs).should == ConstGetSpecs
62
+ ConstGetSpecs.const_get(:ConstGetSpecs).should == ConstGetSpecs
29
63
  ConstGetSpecs::Bar::Baz.const_get(:BAZ).should == 300
30
- ConstGetSpecs::Bar::Baz.const_get(:BAR).should == 200
31
- ConstGetSpecs::Bar::Baz.const_get(:FOO).should == 100
32
- ConstGetSpecs::Bar::Baz.const_get(:Bar).should == ConstGetSpecs::Bar
64
+ ConstGetSpecs::Bar::Baz.const_get(:CS_CONST1).should == :const1
65
+ lambda { ConstGetSpecs::Bar::Baz.const_get(:BAR) }.should raise_error(NameError)
66
+ lambda { ConstGetSpecs::Bar::Baz.const_get(:FOO) }.should raise_error(NameError)
67
+ lambda { ConstGetSpecs::Bar::Baz.const_get(:Bar) }.should raise_error(NameError)
68
+ ConstGetSpecs::Bar::Baz.const_get(:ConstGetSpecs).should == ConstGetSpecs
69
+ ConstGetSpecs::Dog.const_get(:LEGS).should == 4
70
+ lambda { ConstGetSpecs::Dog.const_get(:Dog) }.should raise_error(NameError)
71
+ ConstGetSpecs::Bloudhound.const_get(:LEGS).should == 4
72
+ end
73
+
74
+ it "should not search parent scopes of classes and modules if inherit is false" do
75
+ lambda { Module.const_get(:ConstGetSpecs, false) }.should raise_error(NameError)
76
+ lambda { ConstGetSpecs.const_get(:ConstGetSpecs, false) }.should raise_error(NameError)
77
+ ConstGetSpecs::Dog.const_get(:LEGS, false).should == 4
78
+ lambda { ConstGetSpecs::Dog.const_get(:Dog, false) }.should raise_error(NameError)
79
+ lambda { ConstGetSpecs::Bloudhound.const_get(:LEGS, false) }.should raise_error(NameError)
80
+ end
81
+
82
+ it "should search parent scopes of classes and modules for Object regardless of inherit value" do
83
+ Object.const_get(:ConstGetSpecs).should == ConstGetSpecs
84
+ Object.const_get(:ConstGetSpecs, false).should == ConstGetSpecs
33
85
  end
34
86
  end