opal 0.9.0.beta2 → 0.9.0.rc1
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.
- checksums.yaml +4 -4
- data/.jshintrc +2 -1
- data/.travis.yml +8 -4
- data/CHANGELOG.md +270 -251
- data/CONTRIBUTING.md +41 -0
- data/README.md +8 -8
- data/Rakefile +1 -1
- data/lib/opal/cli.rb +1 -0
- data/lib/opal/cli_options.rb +2 -2
- data/lib/opal/cli_runners.rb +1 -0
- data/lib/opal/cli_runners/nashorn.rb +58 -0
- data/lib/opal/cli_runners/phantom.js +11 -9
- data/lib/opal/compiler.rb +2 -0
- data/lib/opal/erb.rb +2 -1
- data/lib/opal/nodes/def.rb +15 -6
- data/lib/opal/nodes/helpers.rb +1 -1
- data/lib/opal/nodes/literal.rb +1 -1
- data/lib/opal/nodes/masgn.rb +79 -29
- data/lib/opal/nodes/module.rb +1 -1
- data/lib/opal/nodes/top.rb +6 -2
- data/lib/opal/parser.rb +1 -0
- data/lib/opal/parser/grammar.rb +3160 -3083
- data/lib/opal/parser/grammar.y +39 -11
- data/lib/opal/parser/lexer.rb +15 -13
- data/lib/opal/parser/sexp.rb +5 -0
- data/lib/opal/version.rb +1 -1
- data/opal/corelib/array.rb +21 -6
- data/opal/corelib/basic_object.rb +17 -4
- data/opal/corelib/class.rb +1 -1
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/enumerator.rb +2 -0
- data/opal/corelib/hash.rb +50 -50
- data/opal/corelib/helpers.rb +1 -1
- data/opal/corelib/io.rb +9 -6
- data/opal/corelib/kernel.rb +37 -9
- data/opal/corelib/module.rb +6 -17
- data/opal/corelib/nil.rb +4 -0
- data/opal/corelib/number.rb +0 -4
- data/opal/corelib/runtime.js +637 -662
- data/opal/corelib/struct.rb +7 -3
- data/spec/filters/bugs/array.rb +4 -9
- data/spec/filters/bugs/basicobject.rb +1 -15
- data/spec/filters/bugs/date.rb +4 -26
- data/spec/filters/bugs/enumerable.rb +26 -1
- data/spec/filters/bugs/enumerator.rb +4 -4
- data/spec/filters/bugs/exception.rb +1 -7
- data/spec/filters/bugs/float.rb +14 -0
- data/spec/filters/bugs/hash.rb +0 -2
- data/spec/filters/bugs/integer.rb +1 -1
- data/spec/filters/bugs/kernel.rb +47 -66
- data/spec/filters/bugs/language.rb +1 -2
- data/spec/filters/bugs/module.rb +11 -14
- data/spec/filters/bugs/numeric.rb +3 -3
- data/spec/filters/bugs/proc.rb +0 -1
- data/spec/filters/bugs/range.rb +2 -3
- data/spec/filters/bugs/regexp.rb +15 -17
- data/spec/filters/bugs/set.rb +2 -2
- data/spec/filters/bugs/string.rb +29 -5
- data/spec/filters/bugs/{strscan.rb → stringscanner.rb} +9 -10
- data/spec/filters/bugs/struct.rb +0 -4
- data/spec/filters/bugs/time.rb +2 -3
- data/spec/filters/bugs/unboundmethod.rb +3 -0
- data/spec/filters/unsupported/freeze.rb +2 -1
- data/spec/filters/unsupported/taint.rb +2 -0
- data/spec/lib/parser/aref_spec.rb +10 -0
- data/spec/lib/parser/lambda_spec.rb +14 -0
- data/spec/lib/parser/op_asgn_spec.rb +17 -0
- data/spec/lib/parser/return_spec.rb +5 -0
- data/spec/lib/parser/unary_spec.rb +4 -0
- data/spec/lib/sprockets/erb_spec.rb +1 -1
- data/spec/mspec/opal/formatters.rb +159 -0
- data/{lib → spec}/mspec/opal/runner.rb +0 -160
- data/spec/opal/core/hash/internals_spec.rb +162 -162
- data/spec/opal/core/kernel/at_exit_spec.rb +70 -0
- data/spec/opal/core/kernel/extend_spec.rb +1 -1
- data/spec/opal/core/kernel/instance_variables_spec.rb +56 -0
- data/spec/opal/core/language/equal_spec.rb +8 -0
- data/spec/opal/core/language/predefined_spec.rb +1 -1
- data/spec/opal/core/language/ternary_operator_spec.rb +14 -0
- data/spec/opal/core/language/versions/{hash_1.9.rb → hash_1_9_spec.rb} +5 -0
- data/spec/opal/core/module/fixtures/classes.rb +11 -1
- data/spec/opal/core/module/method_lookup_spec.rb +13 -0
- data/spec/opal/core/runtime/super_spec.rb +10 -0
- data/spec/opal/stdlib/native/new_spec.rb +84 -0
- data/spec/opal/stdlib/strscan/scan_spec.rb +11 -0
- data/spec/rubyspecs +6 -9
- data/spec/spec_helper.rb +9 -21
- data/stdlib/date.rb +121 -1
- data/stdlib/js.rb +13 -5
- data/stdlib/json.rb +3 -3
- data/stdlib/nashorn.rb +5 -0
- data/stdlib/nashorn/file.rb +13 -0
- data/stdlib/nashorn/io.rb +2 -0
- data/stdlib/native.rb +12 -4
- data/stdlib/nodejs/io.rb +5 -2
- data/stdlib/opal/platform.rb +19 -0
- data/stdlib/phantomjs.rb +4 -0
- data/stdlib/strscan.rb +1 -1
- data/tasks/building.rake +2 -1
- data/tasks/testing.rake +29 -34
- data/tasks/testing/{phantomjs1-sprockets.js → sprockets-phantomjs.js} +2 -20
- data/vendored-minitest/minitest/test.rb +7 -15
- metadata +32 -9
- data/lib/mspec/opal/main.rb.erb +0 -9
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
describe "Kernel#instance_variables" do
|
|
2
|
+
context 'for nil' do
|
|
3
|
+
it 'returns blank array' do
|
|
4
|
+
expect(nil.instance_variables).to eq([])
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
context 'for string' do
|
|
9
|
+
it 'returns blank array' do
|
|
10
|
+
expect(''.instance_variables).to eq([])
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
context 'for hash' do
|
|
15
|
+
it 'returns blank array' do
|
|
16
|
+
expect({}.instance_variables).to eq([])
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context 'for object' do
|
|
21
|
+
it 'returns blank array' do
|
|
22
|
+
expect(Object.new.instance_variables).to eq([])
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'cloned object' do
|
|
27
|
+
it 'returns same vars as source object' do
|
|
28
|
+
object = Object.new
|
|
29
|
+
expect(object.clone.instance_variables).to eq(object.instance_variables)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context 'for object with js keyword as instance variables' do
|
|
34
|
+
reserved_keywords = %w(
|
|
35
|
+
@constructor
|
|
36
|
+
@displayName
|
|
37
|
+
@__proto__
|
|
38
|
+
@__parent__
|
|
39
|
+
@__noSuchMethod__
|
|
40
|
+
@__count__
|
|
41
|
+
@hasOwnProperty
|
|
42
|
+
@valueOf
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
reserved_keywords.each do |ivar|
|
|
46
|
+
context "#{ivar} as instance variable name" do
|
|
47
|
+
it "returns non-escaped #{ivar} in instance_variables list" do
|
|
48
|
+
obj = Object.new
|
|
49
|
+
obj.instance_variable_set(ivar, 'value')
|
|
50
|
+
|
|
51
|
+
expect(obj.instance_variables).to eq([ivar])
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -114,7 +114,7 @@ describe "The predefined global constants" do
|
|
|
114
114
|
|
|
115
115
|
it "includes RUBY_VERSION" do
|
|
116
116
|
Object.const_defined?(:RUBY_VERSION).should == true
|
|
117
|
-
RUBY_VERSION.should == "2.
|
|
117
|
+
RUBY_VERSION.should == "2.2.3"
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
it "includes RUBY_RELEASE_DATE" do
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
describe "Ternary condition operator" do
|
|
2
|
+
it "returns the second argument if the condition is true" do
|
|
3
|
+
(true ? 1 : 2).should == 1
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
it "returns the third argument if the condition is false" do
|
|
7
|
+
(false ? 1 : 2).should == 2
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "doesn't get confused if : follows a string literal" do
|
|
11
|
+
# this could be interpreted as a Ruby 1.9 symbol hash key
|
|
12
|
+
(true ?'str':'another str').should == 'str'
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -14,5 +14,10 @@ describe "Hash literal" do
|
|
|
14
14
|
{rbx: :cool, :specs => 'fail_sometimes'}.should == {:rbx => :cool, :specs => 'fail_sometimes'}
|
|
15
15
|
{'rbx' => :cool, specs: 'fail_sometimes'}.should == {'rbx' => :cool, :specs => 'fail_sometimes'}
|
|
16
16
|
end
|
|
17
|
+
|
|
18
|
+
it "accepts symbol keys using 'string': syntax" do
|
|
19
|
+
{'test': :test}.should == {test: :test}
|
|
20
|
+
{'symbol literal': :test}.should == {:'symbol literal' => :test}
|
|
21
|
+
end
|
|
17
22
|
end
|
|
18
23
|
end
|
|
@@ -431,4 +431,14 @@ module Kernel
|
|
|
431
431
|
private :module_specs_public_method_on_object_for_kernel_private
|
|
432
432
|
end
|
|
433
433
|
|
|
434
|
-
|
|
434
|
+
class Class
|
|
435
|
+
def test_method_overlapping_module_method
|
|
436
|
+
:class
|
|
437
|
+
end
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
class Module
|
|
441
|
+
def test_method_overlapping_module_method
|
|
442
|
+
:module
|
|
443
|
+
end
|
|
444
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require File.expand_path('../fixtures/classes', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe 'Method lookup for instances of Module' do
|
|
4
|
+
it 'takes own method, not the one defined on the Class' do
|
|
5
|
+
Module.new.test_method_overlapping_module_method.should == :module
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe 'Method lookup for instances of Class' do
|
|
10
|
+
it 'takes own method, not the one defined on the Module' do
|
|
11
|
+
Class.new.test_method_overlapping_module_method.should == :class
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -46,6 +46,12 @@ class SingletonMethodSuperSpec
|
|
|
46
46
|
super 2, *[3, 4]
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
|
+
|
|
50
|
+
module M
|
|
51
|
+
def self.foo
|
|
52
|
+
super
|
|
53
|
+
end
|
|
54
|
+
end
|
|
49
55
|
end
|
|
50
56
|
|
|
51
57
|
class MultipleSuperSpec
|
|
@@ -108,6 +114,10 @@ describe "The 'super' keyword" do
|
|
|
108
114
|
lambda { MultipleSuperSpec.new.to_s }.should_not raise_error
|
|
109
115
|
end
|
|
110
116
|
end
|
|
117
|
+
|
|
118
|
+
it "works on module singleton methods (see issue #935)" do
|
|
119
|
+
lambda { SingletonMethodSuperSpec::M.foo }.should raise_error(NoMethodError)
|
|
120
|
+
end
|
|
111
121
|
end
|
|
112
122
|
|
|
113
123
|
|
|
@@ -5,4 +5,88 @@ describe "Native()" do
|
|
|
5
5
|
Native(`null`).should be_nil
|
|
6
6
|
Native(`undefined`).should be_nil
|
|
7
7
|
end
|
|
8
|
+
|
|
9
|
+
it "should return String" do
|
|
10
|
+
Native(`""`).should be_an_instance_of String
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should return Integer" do
|
|
14
|
+
Native(`0`).should be_an_instance_of Number
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should return Float" do
|
|
18
|
+
Native(`0.01`).should be_an_instance_of Float
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should return Array" do
|
|
22
|
+
Native(`[]`).should be_an_instance_of Array
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should return Native::Object" do
|
|
26
|
+
Native(`{}`).instance_of?(Native::Object).should be_true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should return Array of String" do
|
|
30
|
+
Native(`[""]`).first.should be_an_instance_of String
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should return Array of Integer" do
|
|
34
|
+
Native(`[0]`).first.should be_an_instance_of Number
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should return Array of Float" do
|
|
38
|
+
Native(`[0.01]`).first.should be_an_instance_of Float
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should return Array of Array" do
|
|
42
|
+
Native(`[[]]`).first.should be_an_instance_of Array
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should return Array of Native::Object" do
|
|
46
|
+
Native(`[{}]`).first.instance_of?(Native::Object).should be_true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should return Object with String" do
|
|
50
|
+
Native(`{"key": ""}`)["key"].should be_an_instance_of String
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should return Object with Integer" do
|
|
54
|
+
Native(`{"key": 0}`)["key"].should be_an_instance_of Number
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should return Object with Float" do
|
|
58
|
+
Native(`{"key": 0.01}`)["key"].should be_an_instance_of Float
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "should return Object with Array" do
|
|
62
|
+
Native(`{"key": []}`)["key"].should be_an_instance_of Array
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should return Native::Object with Native::Object" do
|
|
66
|
+
Native(`{"key": {}}`)["key"].instance_of?(Native::Object).should be_true
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should return Proc" do
|
|
70
|
+
Native(`function(){}`).should be_an_instance_of Proc
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "should return Proc that return String" do
|
|
74
|
+
Native(`function(){return ""}`).call.should be_an_instance_of String
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should return Proc that return Integer" do
|
|
78
|
+
Native(`function(){return 0}`).call.should be_an_instance_of Integer
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "should return Proc that return Float" do
|
|
82
|
+
Native(`function(){return 0.01}`).call.should be_an_instance_of Float
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "should return Proc that return Array" do
|
|
86
|
+
Native(`function(){return []}`).call.should be_an_instance_of Array
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should return Proc that return Native::Object" do
|
|
90
|
+
Native(`function(){return {}}`).call.instance_of?(Native::Object).should be_true
|
|
91
|
+
end
|
|
8
92
|
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require 'strscan'
|
|
2
|
+
|
|
3
|
+
describe "StringScanner#scan" do
|
|
4
|
+
context "when the regex has multiple alternatives" do
|
|
5
|
+
it "still anchors to the beginning of the remaining text" do
|
|
6
|
+
# regression test; see GH issue 1074
|
|
7
|
+
scanner = StringScanner.new("10\nb = `2E-16`")
|
|
8
|
+
scanner.scan(/[\d_]+\.[\d_]+\b|[\d_]+(\.[\d_]+)?[eE][-+]?[\d_]+\b/).should be_nil
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
data/spec/rubyspecs
CHANGED
|
@@ -31,16 +31,13 @@ rubyspec/core/kernel
|
|
|
31
31
|
!rubyspec/core/kernel/chop_spec
|
|
32
32
|
!rubyspec/core/kernel/exec_spec
|
|
33
33
|
!rubyspec/core/kernel/exit_spec
|
|
34
|
-
!rubyspec/core/kernel/extend_spec
|
|
35
|
-
rubyspec/core/kernel/fail_spec
|
|
36
34
|
!rubyspec/core/kernel/fork_spec
|
|
37
35
|
!rubyspec/core/kernel/gets_spec
|
|
38
36
|
!rubyspec/core/kernel/load_spec
|
|
39
37
|
!rubyspec/core/kernel/open_spec
|
|
40
38
|
!rubyspec/core/kernel/putc_spec
|
|
41
|
-
rubyspec/core/kernel/raise_spec
|
|
42
|
-
!rubyspec/core/kernel/readline_spec
|
|
43
39
|
!rubyspec/core/kernel/readlines_spec
|
|
40
|
+
!rubyspec/core/kernel/readline_spec
|
|
44
41
|
!rubyspec/core/kernel/require_relative_spec
|
|
45
42
|
!rubyspec/core/kernel/require_spec
|
|
46
43
|
!rubyspec/core/kernel/select_spec
|
|
@@ -48,8 +45,8 @@ rubyspec/core/kernel/raise_spec
|
|
|
48
45
|
!rubyspec/core/kernel/spawn_spec
|
|
49
46
|
!rubyspec/core/kernel/syscall_spec
|
|
50
47
|
!rubyspec/core/kernel/system_spec
|
|
51
|
-
!rubyspec/core/kernel/taint_spec
|
|
52
48
|
!rubyspec/core/kernel/tainted_spec
|
|
49
|
+
!rubyspec/core/kernel/taint_spec
|
|
53
50
|
!rubyspec/core/kernel/test_spec
|
|
54
51
|
!rubyspec/core/kernel/throw_spec
|
|
55
52
|
!rubyspec/core/kernel/trace_var_spec
|
|
@@ -57,8 +54,8 @@ rubyspec/core/kernel/raise_spec
|
|
|
57
54
|
!rubyspec/core/kernel/trust_spec
|
|
58
55
|
!rubyspec/core/kernel/untaint_spec
|
|
59
56
|
!rubyspec/core/kernel/untrace_var_spec
|
|
60
|
-
!rubyspec/core/kernel/untrust_spec
|
|
61
57
|
!rubyspec/core/kernel/untrusted_spec
|
|
58
|
+
!rubyspec/core/kernel/untrust_spec
|
|
62
59
|
|
|
63
60
|
rubyspec/core/matchdata
|
|
64
61
|
rubyspec/core/math
|
|
@@ -117,20 +114,18 @@ rubyspec/language
|
|
|
117
114
|
!rubyspec/language/encoding_spec
|
|
118
115
|
!rubyspec/language/execution_spec
|
|
119
116
|
!rubyspec/language/hash_spec
|
|
120
|
-
!rubyspec/language/line_spec
|
|
121
117
|
!rubyspec/language/lambda_spec
|
|
118
|
+
!rubyspec/language/line_spec
|
|
122
119
|
!rubyspec/language/match_spec
|
|
123
120
|
!rubyspec/language/method_spec
|
|
124
121
|
!rubyspec/language/next_spec
|
|
125
122
|
!rubyspec/language/predefined_spec
|
|
126
123
|
!rubyspec/language/proc_spec
|
|
127
124
|
!rubyspec/language/regexp_spec
|
|
128
|
-
rubyspec/language/regexp/modifiers_spec
|
|
129
125
|
!rubyspec/language/return_spec
|
|
130
126
|
!rubyspec/language/send_spec
|
|
131
127
|
!rubyspec/language/string_spec
|
|
132
128
|
!rubyspec/language/symbol_spec
|
|
133
|
-
!rubyspec/language/variables_spec
|
|
134
129
|
!rubyspec/language/while_spec
|
|
135
130
|
!rubyspec/language/yield_spec
|
|
136
131
|
|
|
@@ -142,10 +137,12 @@ rubyspec/library/erb/util/h_spec
|
|
|
142
137
|
rubyspec/library/erb/util/html_escape_spec
|
|
143
138
|
|
|
144
139
|
rubyspec/library/observer
|
|
140
|
+
|
|
145
141
|
rubyspec/library/openstruct
|
|
146
142
|
!rubyspec/library/openstruct/frozen_spec
|
|
147
143
|
!rubyspec/library/openstruct/marshal_load_spec
|
|
148
144
|
!rubyspec/library/openstruct/marshal_dump_spec
|
|
145
|
+
|
|
149
146
|
rubyspec/library/pathname
|
|
150
147
|
rubyspec/library/pp
|
|
151
148
|
rubyspec/library/set
|
data/spec/spec_helper.rb
CHANGED
|
@@ -20,31 +20,19 @@ module Kernel
|
|
|
20
20
|
def eval_js(javascript)
|
|
21
21
|
`eval(javascript)`
|
|
22
22
|
end
|
|
23
|
-
|
|
24
|
-
def at_exit(&block)
|
|
25
|
-
$AT_EXIT_CALLBACKS ||= []
|
|
26
|
-
$AT_EXIT_CALLBACKS << block
|
|
27
|
-
end
|
|
28
23
|
end
|
|
29
24
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
is_phantom = is_browser && `!!window.OPAL_SPEC_PHANTOM`
|
|
33
|
-
|
|
34
|
-
case
|
|
35
|
-
when is_node
|
|
36
|
-
formatter_class = NodeJSFormatter
|
|
37
|
-
when is_phantom
|
|
38
|
-
require 'phantomjs'
|
|
39
|
-
formatter_class = PhantomFormatter
|
|
40
|
-
else
|
|
41
|
-
formatter_class = BrowserFormatter
|
|
42
|
-
end
|
|
25
|
+
require 'mspec/utils/script' # Needed by DottedFormatter
|
|
26
|
+
formatter_class = DottedFormatter
|
|
43
27
|
|
|
44
|
-
|
|
45
|
-
#
|
|
28
|
+
require 'mspec/opal/formatters'
|
|
29
|
+
# Uncomment one of the following to use a different formatter:
|
|
46
30
|
#
|
|
47
|
-
#formatter_class =
|
|
31
|
+
#formatter_class = BrowserFormatter
|
|
32
|
+
#formatter_class = NodeJSFormatter
|
|
33
|
+
#formatter_class = NodeJSDocFormatter
|
|
34
|
+
#formatter_class = PhantomFormatter
|
|
35
|
+
#formatter_class = PhantomDocFormatter
|
|
48
36
|
|
|
49
37
|
# As soon as this file loads, tell the runner the specs are starting
|
|
50
38
|
OSpecRunner.main(formatter_class).will_start
|
data/stdlib/date.rb
CHANGED
|
@@ -1,4 +1,84 @@
|
|
|
1
1
|
class Date
|
|
2
|
+
class Infinity < Numeric
|
|
3
|
+
include Comparable
|
|
4
|
+
|
|
5
|
+
def initialize(d = 1)
|
|
6
|
+
@d = d <=> 0
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def d
|
|
10
|
+
@d
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def zero?
|
|
14
|
+
false
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def finite?
|
|
18
|
+
false
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def infinite?
|
|
22
|
+
d.nonzero?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def nan?
|
|
26
|
+
d.zero?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def abs
|
|
30
|
+
self.class.new
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def -@
|
|
34
|
+
self.class.new(-d)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def +@
|
|
38
|
+
self.class.new(+d)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def <=> (other)
|
|
42
|
+
case other
|
|
43
|
+
when Infinity; return d <=> other.d
|
|
44
|
+
when Numeric; return d
|
|
45
|
+
else
|
|
46
|
+
begin
|
|
47
|
+
l, r = other.coerce(self)
|
|
48
|
+
return l <=> r
|
|
49
|
+
rescue NoMethodError
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
nil
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def coerce(other)
|
|
56
|
+
case other
|
|
57
|
+
when Numeric
|
|
58
|
+
return -d, d
|
|
59
|
+
else
|
|
60
|
+
super
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def to_f
|
|
65
|
+
return 0 if @d == 0
|
|
66
|
+
if @d > 0
|
|
67
|
+
Float::INFINITY
|
|
68
|
+
else
|
|
69
|
+
-Float::INFINITY
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
JULIAN = Infinity.new
|
|
75
|
+
GREGORIAN = -Infinity.new
|
|
76
|
+
ITALY = 2299161 # 1582-10-15
|
|
77
|
+
ENGLAND = 2361222 # 1752-09-14
|
|
78
|
+
MONTHNAMES = [nil] + %w(January February March April May June July August September October November December)
|
|
79
|
+
DAYNAMES = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
|
|
80
|
+
ABBR_DAYNAMES = %w(Sun Mon Tue Wed Thu Fri Sat)
|
|
81
|
+
|
|
2
82
|
class << self
|
|
3
83
|
alias civil new
|
|
4
84
|
|
|
@@ -18,7 +98,7 @@ class Date
|
|
|
18
98
|
end
|
|
19
99
|
end
|
|
20
100
|
|
|
21
|
-
def initialize(year =
|
|
101
|
+
def initialize(year = -4712, month = 1, day = 1, start = ITALY)
|
|
22
102
|
@date = `new Date(year, month - 1, day)`
|
|
23
103
|
end
|
|
24
104
|
|
|
@@ -150,6 +230,46 @@ class Date
|
|
|
150
230
|
wday == 5
|
|
151
231
|
end
|
|
152
232
|
|
|
233
|
+
def jd
|
|
234
|
+
%x{
|
|
235
|
+
//Adapted from http://www.physics.sfasu.edu/astro/javascript/julianday.html
|
|
236
|
+
|
|
237
|
+
var mm = #@date.getMonth() + 1,
|
|
238
|
+
dd = #@date.getDate(),
|
|
239
|
+
yy = #@date.getFullYear(),
|
|
240
|
+
hr = 12, mn = 0, sc = 0,
|
|
241
|
+
ggg, s, a, j1, jd;
|
|
242
|
+
|
|
243
|
+
hr = hr + (mn / 60) + (sc/3600);
|
|
244
|
+
|
|
245
|
+
ggg = 1;
|
|
246
|
+
if (yy <= 1585) {
|
|
247
|
+
ggg = 0;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
jd = -1 * Math.floor(7 * (Math.floor((mm + 9) / 12) + yy) / 4);
|
|
251
|
+
|
|
252
|
+
s = 1;
|
|
253
|
+
if ((mm - 9) < 0) {
|
|
254
|
+
s =- 1;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
a = Math.abs(mm - 9);
|
|
258
|
+
j1 = Math.floor(yy + s * Math.floor(a / 7));
|
|
259
|
+
j1 = -1 * Math.floor((Math.floor(j1 / 100) + 1) * 3 / 4);
|
|
260
|
+
|
|
261
|
+
jd = jd + Math.floor(275 * mm / 9) + dd + (ggg * j1);
|
|
262
|
+
jd = jd + 1721027 + 2 * ggg + 367 * yy - 0.5;
|
|
263
|
+
jd = jd + (hr / 24);
|
|
264
|
+
|
|
265
|
+
return jd;
|
|
266
|
+
}
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def julian?
|
|
270
|
+
`#@date < new Date(1582, 10 - 1, 15, 12)`
|
|
271
|
+
end
|
|
272
|
+
|
|
153
273
|
def monday?
|
|
154
274
|
wday == 1
|
|
155
275
|
end
|