rserve-client 0.1.5 → 0.1.6
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.
- data.tar.gz.sig +1 -2
- data/.gitignore +1 -0
- data/History.txt +15 -2
- data/Manifest.txt +8 -0
- data/README.txt +41 -19
- data/lib/rserve.rb +1 -1
- data/lib/rserve/connection.rb +152 -69
- data/lib/rserve/engine.rb +9 -9
- data/lib/rserve/packet.rb +2 -2
- data/lib/rserve/protocol.rb +51 -46
- data/lib/rserve/protocol/rexpfactory.rb +659 -366
- data/lib/rserve/rexp.rb +175 -156
- data/lib/rserve/rexp/double.rb +45 -38
- data/lib/rserve/rexp/environment.rb +40 -0
- data/lib/rserve/rexp/expressionvector.rb +9 -0
- data/lib/rserve/rexp/genericvector.rb +5 -3
- data/lib/rserve/rexp/integer.rb +38 -38
- data/lib/rserve/rexp/language.rb +2 -2
- data/lib/rserve/rexp/list.rb +3 -0
- data/lib/rserve/rexp/logical.rb +17 -4
- data/lib/rserve/rexp/null.rb +20 -14
- data/lib/rserve/rexp/raw.rb +19 -0
- data/lib/rserve/rexp/reference.rb +42 -0
- data/lib/rserve/rexp/s4.rb +10 -0
- data/lib/rserve/rexp/string.rb +5 -3
- data/lib/rserve/rexp/symbol.rb +3 -0
- data/lib/rserve/rexp/vector.rb +30 -15
- data/lib/rserve/rexp/wrapper.rb +58 -0
- data/lib/rserve/rfactor.rb +10 -10
- data/lib/rserve/rlist.rb +129 -100
- data/lib/rserve/talk.rb +61 -61
- data/spec/rserve_connection_spec.rb +99 -33
- data/spec/rserve_double_spec.rb +28 -15
- data/spec/rserve_integer_spec.rb +24 -15
- data/spec/rserve_logical_spec.rb +21 -12
- data/spec/rserve_protocol_spec.rb +7 -7
- data/spec/rserve_rexp_spec.rb +3 -3
- data/spec/rserve_rexp_wrapper_spec.rb +36 -0
- data/spec/rserve_rexpfactory_spec.rb +86 -20
- data/spec/rserve_rfactor_spec.rb +2 -2
- data/spec/rserve_rlist_spec.rb +53 -0
- data/spec/rserve_spec.rb +8 -5
- data/spec/rserve_talk_spec.rb +7 -7
- data/spec/spec_helper.rb +1 -0
- metadata +13 -3
- metadata.gz.sig +0 -0
data/spec/rserve_double_spec.rb
CHANGED
@@ -12,11 +12,29 @@ describe Rserve::REXP::Double do
|
|
12
12
|
a=Rserve::REXP::Double.new(payload)
|
13
13
|
a.payload.should==[1.1]
|
14
14
|
end
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
end
|
19
|
+
describe "NA management" do
|
20
|
+
before do
|
21
|
+
@payload=[3,5,Rserve::REXP::Double::NA, 10,20]
|
22
|
+
@a=Rserve::REXP::Double.new(@payload)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "method na? should return coherent answer" do
|
26
|
+
@a.na?(@a.as_integers[0]).should be_false
|
27
|
+
@a.na?(@a.as_integers[2]).should be_true
|
28
|
+
@a.na?.should==[false,false,true,false,false]
|
29
|
+
end
|
30
|
+
it "to_a should return correct values with NA" do
|
31
|
+
@a.to_a.should==[3,5, nil, 10, 20]
|
32
|
+
end
|
33
|
+
it "to_ruby should return correct values with NA" do
|
34
|
+
@a.to_ruby.should==[3,5, nil, 10, 20]
|
35
|
+
end
|
18
36
|
end
|
19
|
-
|
37
|
+
describe "common methods" do
|
20
38
|
before do
|
21
39
|
@n=rand(10)+10
|
22
40
|
@payload=@n.times.map {rand(10).to_f}
|
@@ -37,19 +55,14 @@ describe Rserve::REXP::Double do
|
|
37
55
|
it "method as_strings should return strings" do
|
38
56
|
@a.as_strings.should==@payload.map(&:to_s)
|
39
57
|
end
|
40
|
-
|
41
|
-
|
42
|
-
a=Rserve::REXP::Double.new(payload)
|
43
|
-
a.na?(a.as_integers[0]).should be_false
|
44
|
-
a.na?(a.as_integers[2]).should be_true
|
45
|
-
a.na?.should==[false,false,true,false,false]
|
46
|
-
end
|
58
|
+
|
59
|
+
|
47
60
|
it "method to_debug_string and to_s returns a coherent response" do
|
48
61
|
@a.to_debug_string.size.should>0
|
49
62
|
@a.to_s.size.should>0
|
50
|
-
|
51
|
-
end
|
63
|
+
|
52
64
|
end
|
53
|
-
|
54
|
-
|
65
|
+
end
|
66
|
+
|
67
|
+
|
55
68
|
end
|
data/spec/rserve_integer_spec.rb
CHANGED
@@ -12,11 +12,26 @@ describe Rserve::REXP::Integer do
|
|
12
12
|
a=Rserve::REXP::Integer.new(payload)
|
13
13
|
a.payload.should==[1]
|
14
14
|
end
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
end
|
19
|
+
describe "NA management" do
|
20
|
+
before do
|
21
|
+
@payload=[3,5,Rserve::REXP::Integer::NA, 10,20]
|
22
|
+
@a=Rserve::REXP::Integer.new(@payload)
|
23
|
+
|
24
|
+
end
|
25
|
+
it "method is_NA should return coherent answer" do
|
26
|
+
@a.na?(@a.as_integers[0]).should be_false
|
27
|
+
@a.na?(@a.as_integers[2]).should be_true
|
28
|
+
@a.na?.should==[false,false,true,false,false]
|
29
|
+
end
|
30
|
+
it "to_a should return correct values with NA" do
|
31
|
+
@a.to_a.should==[3,5, nil, 10, 20]
|
32
|
+
end
|
18
33
|
end
|
19
|
-
|
34
|
+
describe "common methods" do
|
20
35
|
before do
|
21
36
|
@n=rand(10)+10
|
22
37
|
@payload=@n.times.map {rand(10)}
|
@@ -37,19 +52,13 @@ describe Rserve::REXP::Integer do
|
|
37
52
|
it "method as_string should return string" do
|
38
53
|
@a.as_strings.should==@payload.map(&:to_s)
|
39
54
|
end
|
40
|
-
|
41
|
-
payload=[3,5,Rserve::REXP::Integer::NA, 10,20]
|
42
|
-
a=Rserve::REXP::Integer.new(payload)
|
43
|
-
a.na?(a.as_integers[0]).should be_false
|
44
|
-
a.na?(a.as_integers[2]).should be_true
|
45
|
-
a.na?.should==[false,false,true,false,false]
|
46
|
-
end
|
55
|
+
|
47
56
|
it "method to_debug_string and to_s returns a coherent response" do
|
48
57
|
@a.to_debug_string.size.should>0
|
49
58
|
@a.to_s.size.should>0
|
50
|
-
|
51
|
-
end
|
59
|
+
|
52
60
|
end
|
53
|
-
|
54
|
-
|
61
|
+
end
|
62
|
+
|
63
|
+
|
55
64
|
end
|
data/spec/rserve_logical_spec.rb
CHANGED
@@ -13,7 +13,22 @@ describe Rserve::REXP::Integer do
|
|
13
13
|
a.payload.should==[ Rserve::REXP::Logical::TRUE ]
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
describe "NA management" do
|
17
|
+
before do
|
18
|
+
@payload=[1,Rserve::REXP::Logical::NA, 0]
|
19
|
+
@a=Rserve::REXP::Logical.new(@payload)
|
20
|
+
|
21
|
+
end
|
22
|
+
it "method is_NA should return coherent answer" do
|
23
|
+
@a.na?.should==[false,true,false]
|
24
|
+
@a.na?(@a.as_bytes[0]).should be_false
|
25
|
+
@a.na?(@a.as_bytes[1]).should be_true
|
26
|
+
end
|
27
|
+
it "method to_a should return correct answer" do
|
28
|
+
@a.to_a.should==[true,nil,false]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
describe "common methods" do
|
17
32
|
before do
|
18
33
|
@n=rand(100)
|
19
34
|
@payload=@n.times.map {rand(2)}
|
@@ -43,19 +58,13 @@ describe Rserve::REXP::Integer do
|
|
43
58
|
@a.false?.should==@payload.map {|v| v==Rserve::REXP::Logical::FALSE ? true :false}
|
44
59
|
end
|
45
60
|
|
46
|
-
|
47
|
-
payload=[1,Rserve::REXP::Logical::NA, 0]
|
48
|
-
a=Rserve::REXP::Logical.new(payload)
|
49
|
-
a.na?.should==[false,true,false]
|
50
|
-
a.na?(a.as_bytes[0]).should be_false
|
51
|
-
a.na?(a.as_bytes[1]).should be_true
|
52
|
-
end
|
61
|
+
|
53
62
|
it "method to_debug_string and to_s returns a coherent response" do
|
54
63
|
@a.to_debug_string.size.should>0
|
55
64
|
@a.to_s.size.should>0
|
56
|
-
|
57
|
-
end
|
65
|
+
|
58
66
|
end
|
59
|
-
|
60
|
-
|
67
|
+
end
|
68
|
+
|
69
|
+
|
61
70
|
end
|
@@ -24,15 +24,15 @@ describe Rserve::Protocol do
|
|
24
24
|
end
|
25
25
|
it "set_hdr method should set correctly the header for len>0xFFFFFF" do
|
26
26
|
bytes=[0]*8
|
27
|
-
cmd=Rserve::Protocol::CMD_login
|
27
|
+
cmd=Rserve::Protocol::CMD_login
|
28
28
|
len=0x12345678
|
29
29
|
offset=0
|
30
30
|
expected=[cmd|Rserve::Protocol::DT_LARGE,0x78,0x56,0x34,0x12,0,0,0]
|
31
31
|
@t.set_hdr(cmd,len,bytes,offset)
|
32
32
|
bytes.should==expected
|
33
|
-
end
|
33
|
+
end
|
34
34
|
it "new_hdr method should return a correct header for different lengths" do
|
35
|
-
cmd=Rserve::Protocol::CMD_login
|
35
|
+
cmd=Rserve::Protocol::CMD_login
|
36
36
|
len=0x123456
|
37
37
|
expected=[cmd,0x56,0x34,0x12]
|
38
38
|
@t.new_hdr(cmd,len).should==expected
|
@@ -44,15 +44,15 @@ describe Rserve::Protocol do
|
|
44
44
|
buffer=[0xFF,0x78,0x56,0x34,0x12]
|
45
45
|
expected=0x12345678
|
46
46
|
@t.get_int(buffer,1).should==expected
|
47
|
-
|
47
|
+
|
48
48
|
# Version with errors
|
49
|
-
|
49
|
+
|
50
50
|
buffer=[0xFF,0xFF78,0xFF56,0xFF34,0xFF12]
|
51
51
|
expected=0x12345678
|
52
52
|
@t.get_int(buffer,1).should==expected
|
53
53
|
end
|
54
54
|
it "get_len method should return correct length from a header" do
|
55
|
-
|
55
|
+
cmd=Rserve::Protocol::CMD_login
|
56
56
|
len=0x12345678
|
57
57
|
header=@t.new_hdr(cmd,len)
|
58
58
|
@t.get_len(header,0).should==len
|
@@ -71,5 +71,5 @@ describe Rserve::Protocol do
|
|
71
71
|
expected=[0x45,0xDF,0xBC,0x9A,0x78,0x56,0x34,0x12]
|
72
72
|
buffer.slice(1,8).should==expected
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
end
|
data/spec/rserve_rexp_spec.rb
CHANGED
@@ -43,10 +43,10 @@ describe Rserve::REXP do
|
|
43
43
|
it "method has_attribute? should return false for non existing value" do
|
44
44
|
@l.has_attribute?('at2').should be_false
|
45
45
|
end
|
46
|
-
it "method
|
46
|
+
it "method get_attribute should return correct value for attribute" do
|
47
47
|
@l.get_attribute('names').as_strings.should==['at']
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__)+"/spec_helper.rb"
|
2
|
+
|
3
|
+
describe Rserve::REXP::Wrapper do
|
4
|
+
it "should wrap single value" do
|
5
|
+
Rserve::REXP::Wrapper.wrap(1).should==Rserve::REXP::Integer.new(1)
|
6
|
+
Rserve::REXP::Wrapper.wrap(1.0).should==Rserve::REXP::Double.new(1.0)
|
7
|
+
Rserve::REXP::Wrapper.wrap(true).should==Rserve::REXP::Logical.new(1)
|
8
|
+
Rserve::REXP::Wrapper.wrap("a").should==Rserve::REXP::String.new("a")
|
9
|
+
end
|
10
|
+
it "should wrap arrays of a single type" do
|
11
|
+
Rserve::REXP::Wrapper.wrap([1,2]).should==Rserve::REXP::Integer.new([1,2])
|
12
|
+
Rserve::REXP::Wrapper.wrap([1.0,2]).should==Rserve::REXP::Double.new([1.0,2.0])
|
13
|
+
Rserve::REXP::Wrapper.wrap([true,false]).should==Rserve::REXP::Logical.new([1,0])
|
14
|
+
Rserve::REXP::Wrapper.wrap(["a","b"]).should==Rserve::REXP::String.new(["a","b"])
|
15
|
+
end
|
16
|
+
it "should wrap on a list mixed values" do
|
17
|
+
r=Rserve::Connection.new
|
18
|
+
Rserve::REXP::Wrapper.wrap([1,2.0,false,"a"]).should==
|
19
|
+
Rserve::REXP::GenericVector.new(
|
20
|
+
Rserve::Rlist.new([
|
21
|
+
Rserve::REXP::Integer.new(1),
|
22
|
+
Rserve::REXP::Double.new(2.0),
|
23
|
+
Rserve::REXP::Logical.new(0),
|
24
|
+
Rserve::REXP::String.new("a"),
|
25
|
+
|
26
|
+
])
|
27
|
+
)
|
28
|
+
end
|
29
|
+
it "should wrap arrays with nil values using NA values of specific type" do
|
30
|
+
Rserve::REXP::Wrapper.wrap([1,nil]).should==Rserve::REXP::Integer.new([1,Rserve::REXP::Integer::NA])
|
31
|
+
Rserve::REXP::Wrapper.wrap([1.0,nil]).should==Rserve::REXP::Double.new([1.0,Rserve::REXP::Double::NA])
|
32
|
+
Rserve::REXP::Wrapper.wrap([true,nil]).should==Rserve::REXP::Logical.new([1,Rserve::REXP::Logical::NA])
|
33
|
+
Rserve::REXP::Wrapper.wrap(["a",nil]).should==Rserve::REXP::String.new(["a", Rserve::REXP::String::NA])
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -6,11 +6,20 @@ describe Rserve::Protocol::REXPFactory do
|
|
6
6
|
before do
|
7
7
|
@r=Rserve::Connection.new
|
8
8
|
end
|
9
|
+
it "should process null" do
|
10
|
+
la=@r.eval("NULL")
|
11
|
+
la.should be_instance_of(Rserve::REXP::Null)
|
12
|
+
end
|
9
13
|
it "should process single logical" do
|
10
14
|
la=@r.eval("TRUE")
|
11
15
|
la.should be_instance_of(Rserve::REXP::Logical)
|
12
16
|
la.true?.should==[true]
|
13
17
|
end
|
18
|
+
it "should process array" do
|
19
|
+
@r.void_eval("a<-c(1,2,3,4,5,6,7,8); attr(a,'dim')<-c(2,2,2)")
|
20
|
+
la=@r.eval("a")
|
21
|
+
la.dim.should==[2,2,2]
|
22
|
+
end
|
14
23
|
it "should process logical vector" do
|
15
24
|
la=@r.eval("c(TRUE,FALSE,TRUE)")
|
16
25
|
la.should be_instance_of(Rserve::REXP::Logical)
|
@@ -19,7 +28,7 @@ describe Rserve::Protocol::REXPFactory do
|
|
19
28
|
it "should process logical vectors with NA" do
|
20
29
|
la=@r.eval("c(TRUE,NA)")
|
21
30
|
la.should be_instance_of(Rserve::REXP::Logical)
|
22
|
-
la.na?.should==[false,true]
|
31
|
+
la.na?.should==[false,true]
|
23
32
|
end
|
24
33
|
it "should process single double" do
|
25
34
|
la=@r.eval("1.5")
|
@@ -30,7 +39,7 @@ describe Rserve::Protocol::REXPFactory do
|
|
30
39
|
a=100.times.map{|i| rand()}
|
31
40
|
la=@r.eval("c("+a.map(&:to_s).join(",")+")")
|
32
41
|
la.should be_instance_of(Rserve::REXP::Double)
|
33
|
-
|
42
|
+
la.dim.should be_nil
|
34
43
|
la.as_doubles.map(&:to_f).each_with_index {|v,i|
|
35
44
|
v.should be_close(a[i],1e-10)
|
36
45
|
}
|
@@ -39,7 +48,7 @@ describe Rserve::Protocol::REXPFactory do
|
|
39
48
|
la=@r.eval("c(1,NA)")
|
40
49
|
la.should be_instance_of(Rserve::REXP::Double)
|
41
50
|
la.na?.should==[false,true]
|
42
|
-
|
51
|
+
|
43
52
|
end
|
44
53
|
it "should process string vector" do
|
45
54
|
la=@r.eval("c('abc','def','ghi')")
|
@@ -52,27 +61,84 @@ describe Rserve::Protocol::REXPFactory do
|
|
52
61
|
la.na?.should==[false,false,true]
|
53
62
|
|
54
63
|
end
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
la.as_factor.contains?("tas").should be_true
|
67
|
-
la.as_factor.contains?("nn").should be_false
|
64
|
+
describe "factor processing" do
|
65
|
+
it "should process factor without NA" do
|
66
|
+
la=@r.eval <<-EOF
|
67
|
+
state <- c("tas", "sa", "qld", "nsw", "nsw", "nt", "wa", "wa",
|
68
|
+
"qld", "vic", "nsw", "vic", "qld", "qld", "sa", "tas",
|
69
|
+
"sa", "nt", "wa", "vic", "qld", "nsw", "nsw", "wa",
|
70
|
+
"sa", "act", "nsw", "vic", "vic", "act");
|
71
|
+
statef <- factor(state)
|
72
|
+
EOF
|
73
|
+
la.should be_factor
|
74
|
+
la.as_factor.levels.sort.should==%w{act nsw nt qld sa tas vic wa}.sort
|
68
75
|
|
76
|
+
la.as_factor.contains?("tas").should be_true
|
77
|
+
la.as_factor.contains?("nn").should be_false
|
78
|
+
@r.void_eval("rm(state, statef)")
|
79
|
+
end
|
80
|
+
it "should process factors with NA" do
|
81
|
+
@r.void_eval "other<-c('a','a','b','b',NA)"
|
82
|
+
la=@r.eval("factor(other)")
|
83
|
+
la.as_strings.should==['a','a','b','b',nil]
|
84
|
+
la.as_factor.levels.sort.should==['a','b']
|
85
|
+
end
|
69
86
|
end
|
70
|
-
it "should process list" do
|
71
|
-
|
72
|
-
la=@r.eval("list(name='Fred',age=30,10,20,kids=c(1,2,3))")
|
87
|
+
it "should process basic list" do
|
88
|
+
la=@r.eval("list(first.name='Fred')")
|
73
89
|
la.should be_list
|
74
90
|
la.should be_recursive
|
75
|
-
la.
|
91
|
+
la.should==Rserve::REXP::GenericVector.new(
|
92
|
+
Rserve::Rlist.new([Rserve::REXP::String.new('Fred')], ["first.name"]),
|
93
|
+
Rserve::REXP::List.new(
|
94
|
+
Rserve::Rlist.new([Rserve::REXP::String.new('first.name')],['names'])
|
95
|
+
)
|
96
|
+
)
|
97
|
+
la.as_list.names.should==['first.name']
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should process list with booleans and NA" do
|
101
|
+
la=@r.eval("list(TRUE)")
|
102
|
+
la.should be_true
|
103
|
+
la=@r.eval("list(2,NA)")
|
104
|
+
la.should be_true
|
105
|
+
end
|
106
|
+
it "should retrieve correct lenght for string" do
|
107
|
+
Rserve::Protocol::REXPFactory.new(Rserve::REXP::String.new("a")).get_binary_length.should==8
|
108
|
+
Rserve::Protocol::REXPFactory.new(Rserve::REXP::String.new(["a","b"])).get_binary_length.should==8
|
109
|
+
Rserve::Protocol::REXPFactory.new(Rserve::REXP::String.new(["aaaa"])).get_binary_length.should==12
|
110
|
+
|
111
|
+
end
|
112
|
+
it "should retrieve correct representation for string" do
|
113
|
+
buf=[nil]*8
|
114
|
+
off=0
|
115
|
+
Rserve::Protocol::REXPFactory.new(Rserve::REXP::String.new("a")).get_binary_representation(buf,off)
|
116
|
+
buf[4,4].should==[97,0,1,1]
|
117
|
+
buf.size.should==8
|
118
|
+
buf=[nil]*8
|
119
|
+
Rserve::Protocol::REXPFactory.new(Rserve::REXP::String.new(["a","b"])).get_binary_representation(buf,off)
|
120
|
+
buf[4,8].should==[97,0,98,0]
|
121
|
+
buf.size.should==8
|
122
|
+
|
123
|
+
buf=[nil]*12
|
124
|
+
Rserve::Protocol::REXPFactory.new(Rserve::REXP::String.new("aaaa")).get_binary_representation(buf,off)
|
125
|
+
buf[4,8].should==[97,97,97,97,0,1,1,1]
|
126
|
+
buf.size.should==12
|
127
|
+
end
|
128
|
+
it "should retrieve correct binary representation for Symbol" do
|
129
|
+
rexp=Rserve::REXP::Symbol.new('names')
|
130
|
+
buf=Array.new(Rserve::Protocol::REXPFactory.new(rexp).get_binary_length)
|
131
|
+
Rserve::Protocol::REXPFactory.new(rexp).get_binary_representation(buf,0)
|
132
|
+
buf.should_not include(nil)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should retrieve correct binary representation for List" do
|
136
|
+
|
137
|
+
rexp=Rserve::REXP::List.new(Rserve::Rlist.new([Rserve::REXP::String.new("a")], ["names"]));
|
138
|
+
buf=Array.new(Rserve::Protocol::REXPFactory.new(rexp).get_binary_length)
|
139
|
+
|
140
|
+
Rserve::Protocol::REXPFactory.new(rexp).get_binary_representation(buf,0)
|
141
|
+
buf.should_not include(nil)
|
76
142
|
end
|
77
143
|
|
78
144
|
end
|
data/spec/rserve_rfactor_spec.rb
CHANGED
@@ -16,7 +16,7 @@ describe Rserve::RFactor do
|
|
16
16
|
@factor[1].should=='a'
|
17
17
|
@factor[3].should=='b'
|
18
18
|
@factor[5].should=='c'
|
19
|
-
|
19
|
+
|
20
20
|
}
|
21
21
|
end
|
22
22
|
it "methods contains? should work with integers and strings" do
|
@@ -41,5 +41,5 @@ describe Rserve::RFactor do
|
|
41
41
|
it "method as_strings should return correct values" do
|
42
42
|
@factor.as_strings==%w{a a b b c c d}
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require File.dirname(__FILE__)+"/spec_helper.rb"
|
2
|
+
|
3
|
+
describe Rserve::Rlist do
|
4
|
+
before do
|
5
|
+
@r=Rserve::Connection.new
|
6
|
+
@l=@r.eval("list(name='Fred',age=30,10,20,kids=c(1,2,3))").as_list
|
7
|
+
end
|
8
|
+
it "method names return correct names" do
|
9
|
+
@l.names.should==['name','age',"","","kids"]
|
10
|
+
end
|
11
|
+
it "method == should return true for rlist with equal data and names" do
|
12
|
+
a=Rserve::Rlist.new([1,2,3],%w{a b c})
|
13
|
+
b=Rserve::Rlist.new([1,2,3],%w{a b c})
|
14
|
+
(a==b).should be_true
|
15
|
+
a=Rserve::Rlist.new([1,2,3],%w{a b c})
|
16
|
+
b=Rserve::Rlist.new([1,2,3])
|
17
|
+
(a==b).should be_false
|
18
|
+
a=Rserve::Rlist.new([1,2,3],%w{a b c})
|
19
|
+
b=Rserve::Rlist.new([4,5,6],%w{c d e})
|
20
|
+
(a==b).should be_false
|
21
|
+
|
22
|
+
end
|
23
|
+
it "method [] return correct values for strings" do
|
24
|
+
@l['name'].to_ruby.should=='Fred'
|
25
|
+
@l['age'].to_ruby.should==30
|
26
|
+
@l['kids'].to_ruby.should==[1,2,3]
|
27
|
+
end
|
28
|
+
it "method [] return correct values for integers (0-based)" do
|
29
|
+
@l[2].to_ruby.should==10
|
30
|
+
@l[3].to_ruby.should==20
|
31
|
+
end
|
32
|
+
it "method to_a return an array with best ruby representation of data" do
|
33
|
+
@l.to_a.should==['Fred',30,10,20,[1,2,3]]
|
34
|
+
end
|
35
|
+
it "method to_ruby returns a hash when all names are set" do
|
36
|
+
list=@r.eval("list(name='Fred', age=30)")
|
37
|
+
list.to_ruby.should=={'name'=>'Fred','age'=>30}
|
38
|
+
end
|
39
|
+
it "method to_ruby returns a hash with numbers (1-based) replacing empty names" do
|
40
|
+
list=@r.eval("list(name='Fred', age=30,'aaaa')")
|
41
|
+
list.to_ruby.should=={'name'=>'Fred','age'=>30,3=>'aaaa'}
|
42
|
+
end
|
43
|
+
it "method to_ruby returns an array when no names are set" do
|
44
|
+
list=@r.eval("list(10,20,30)")
|
45
|
+
list.to_ruby.should==[10,20,30]
|
46
|
+
end
|
47
|
+
it "should allow recursive list" do
|
48
|
+
list=@r.eval("list(l1=list(l11=1,l22=2),l2=list(3,4))").as_list
|
49
|
+
list['l1'].to_ruby.should=={'l11'=>1,'l22'=>2}
|
50
|
+
list['l2'].to_ruby.should==[3,4]
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|