mojombo-erlectricity 0.2.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +14 -1
- data/LICENSE +20 -0
- data/README.md +130 -0
- data/Rakefile +63 -60
- data/VERSION.yml +4 -0
- data/examples/echo/README.md +12 -0
- data/examples/echo/echo.erl +13 -0
- data/examples/echo/echo.rb +11 -0
- data/examples/gruff/gruff.erl +17 -18
- data/examples/gruff/gruff_provider.rb +12 -19
- data/examples/gruff/{gruff_run.erl → gruff_run.sh} +5 -3
- data/examples/gruff/{stat_run.erl → stat_run.sh} +5 -3
- data/examples/gruff/stat_writer.erl +6 -6
- data/examples/simple/README.md +5 -0
- data/examples/simple/rerl.rb +111 -0
- data/examples/simple/rerl.sh +37 -0
- data/examples/tinderl/README.md +14 -0
- data/examples/tinderl/tinderl.erl +19 -21
- data/examples/tinderl/tinderl.rb +11 -10
- data/ext/decoder.c +67 -60
- data/lib/erlectricity/condition.rb +35 -20
- data/lib/erlectricity/conditions/boolean.rb +11 -0
- data/lib/erlectricity/conditions/hash.rb +9 -10
- data/lib/erlectricity/conditions/static.rb +31 -10
- data/lib/erlectricity/conditions/type.rb +14 -14
- data/lib/erlectricity/constants.rb +3 -4
- data/lib/erlectricity/decoder.rb +205 -199
- data/lib/erlectricity/encoder.rb +49 -35
- data/lib/erlectricity/errors/decode_error.rb +1 -1
- data/lib/erlectricity/errors/encode_error.rb +1 -1
- data/lib/erlectricity/errors/erlectricity_error.rb +1 -1
- data/lib/erlectricity/matcher.rb +15 -32
- data/lib/erlectricity/port.rb +11 -11
- data/lib/erlectricity/receiver.rb +54 -64
- data/lib/erlectricity/types/list.rb +3 -1
- data/lib/erlectricity.rb +4 -7
- data/test/condition_spec.rb +8 -9
- data/test/decode_spec.rb +27 -28
- data/test/encode_spec.rb +31 -24
- data/test/matcher_spec.rb +24 -12
- data/test/port_spec.rb +3 -4
- data/test/receiver_spec.rb +18 -20
- data/test/test_helper.rb +9 -5
- metadata +36 -29
- data/CONTRIBUTORS +0 -2
- data/Manifest.txt +0 -45
- data/README.txt +0 -43
- data/setup.rb +0 -1585
- data/test/test_erlectricity.rb +0 -2
data/lib/erlectricity/port.rb
CHANGED
@@ -3,44 +3,44 @@ module Erlectricity
|
|
3
3
|
attr_reader :input, :output
|
4
4
|
attr_reader :skipped
|
5
5
|
attr_reader :queue
|
6
|
-
|
6
|
+
|
7
7
|
def initialize(input=STDIN, output=STDOUT)
|
8
8
|
@input = input
|
9
9
|
@output = output
|
10
|
-
|
10
|
+
|
11
11
|
input.sync = true
|
12
12
|
output.sync = true
|
13
|
-
|
13
|
+
|
14
14
|
@encoder = Erlectricity::Encoder.new(nil)
|
15
15
|
@skipped = []
|
16
16
|
@queue = []
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def receive
|
20
20
|
queue.empty? ? read_from_input : queue.shift
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def send(term)
|
24
24
|
@encoder.out = StringIO.new('', 'w')
|
25
25
|
@encoder.write_any(term)
|
26
26
|
data = @encoder.out.string
|
27
27
|
output.write([data.length].pack("N"))
|
28
|
-
output.write
|
28
|
+
output.write(data)
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def restore_skipped
|
32
32
|
@queue = self.skipped + self.queue
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
private
|
36
|
+
|
36
37
|
def read_from_input
|
37
38
|
raw = input.read(4)
|
38
39
|
return nil unless raw
|
39
|
-
|
40
|
+
|
40
41
|
packet_length = raw.unpack('N').first
|
41
42
|
data = input.read(packet_length)
|
42
|
-
|
43
|
-
result
|
43
|
+
Erlectricity::Decoder.decode(data)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -1,79 +1,69 @@
|
|
1
1
|
module Erlectricity
|
2
|
-
class Receiver
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
NO_MATCH = Object.new
|
10
|
-
|
11
|
-
def initialize(port, parent=nil, &block)
|
12
|
-
@port = port
|
13
|
-
@parent = parent
|
14
|
-
@matchers = []
|
15
|
-
block.call self if block
|
16
|
-
end
|
17
|
-
|
18
|
-
def process(arg)
|
19
|
-
matcher = @matchers.find{|r| r.matches? arg}
|
2
|
+
class Receiver
|
3
|
+
attr_accessor :port
|
4
|
+
attr_accessor :parent
|
5
|
+
attr_accessor :matchers
|
6
|
+
|
7
|
+
RECEIVE_LOOP = Object.new
|
8
|
+
NO_MATCH = Object.new
|
20
9
|
|
21
|
-
|
22
|
-
port
|
23
|
-
|
24
|
-
|
25
|
-
|
10
|
+
def initialize(port, parent = nil, &block)
|
11
|
+
@port = port
|
12
|
+
@parent = parent
|
13
|
+
@matchers = []
|
14
|
+
block.call(self) if block
|
26
15
|
end
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
else
|
16
|
+
|
17
|
+
def process(arg)
|
18
|
+
matcher = @matchers.find { |r| r.matches?(arg) }
|
19
|
+
|
20
|
+
if matcher
|
21
|
+
port.restore_skipped
|
22
|
+
matcher.run(arg)
|
23
|
+
else
|
24
|
+
NO_MATCH
|
35
25
|
end
|
36
26
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
27
|
+
|
28
|
+
def when(arg, &block)
|
29
|
+
condition = Condition.for(arg)
|
30
|
+
@matchers << Matcher.new(self, condition, block)
|
31
|
+
end
|
32
|
+
|
33
|
+
def run
|
34
|
+
loop do
|
35
|
+
msg = port.receive
|
36
|
+
return if msg.nil?
|
37
|
+
|
38
|
+
case result = process(msg)
|
39
|
+
when RECEIVE_LOOP then next
|
40
|
+
when NO_MATCH
|
41
|
+
port.skipped << msg
|
42
|
+
next
|
43
|
+
else
|
44
|
+
break result
|
45
|
+
end
|
55
46
|
end
|
56
47
|
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def receive(&block)
|
60
|
-
Receiver.new(port, self, &block).run
|
61
|
-
end
|
62
48
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
49
|
+
def receive(&block)
|
50
|
+
Receiver.new(port, self, &block).run
|
51
|
+
end
|
52
|
+
|
53
|
+
def receive_loop
|
54
|
+
RECEIVE_LOOP
|
55
|
+
end
|
56
|
+
|
57
|
+
def send!(term)
|
58
|
+
port.send(term)
|
59
|
+
end
|
70
60
|
end
|
71
61
|
end
|
72
|
-
end
|
73
|
-
|
74
62
|
|
75
63
|
module Kernel
|
76
|
-
def receive(input=
|
64
|
+
def receive(input = nil, output = nil, &block)
|
65
|
+
input ||= IO.new(3)
|
66
|
+
output ||= IO.new(4)
|
77
67
|
Erlectricity::Receiver.new(Erlectricity::Port.new(input, output), nil, &block).run
|
78
68
|
end
|
79
69
|
end
|
data/lib/erlectricity.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
$:.unshift File.join(File.dirname(__FILE__), *%w[.. ext])
|
2
2
|
|
3
|
+
require 'stringio'
|
3
4
|
|
4
5
|
require 'erlectricity/constants'
|
5
|
-
|
6
6
|
require 'erlectricity/types/new_reference'
|
7
7
|
require 'erlectricity/types/pid'
|
8
8
|
require 'erlectricity/types/function'
|
9
9
|
require 'erlectricity/types/list'
|
10
10
|
|
11
|
-
|
12
11
|
begin
|
13
|
-
#try to load the decoder C extension
|
12
|
+
# try to load the decoder C extension
|
14
13
|
require 'decoder'
|
15
14
|
rescue LoadError
|
16
|
-
#
|
15
|
+
# fall back on the pure ruby version
|
17
16
|
require 'erlectricity/decoder'
|
18
17
|
end
|
19
18
|
|
@@ -21,14 +20,12 @@ require 'erlectricity/encoder'
|
|
21
20
|
|
22
21
|
require 'erlectricity/port'
|
23
22
|
require 'erlectricity/matcher'
|
24
|
-
|
25
23
|
require 'erlectricity/condition'
|
24
|
+
require 'erlectricity/conditions/boolean'
|
26
25
|
require 'erlectricity/conditions/hash'
|
27
26
|
require 'erlectricity/conditions/static'
|
28
27
|
require 'erlectricity/conditions/type'
|
29
|
-
|
30
28
|
require 'erlectricity/receiver'
|
31
|
-
|
32
29
|
require 'erlectricity/errors/erlectricity_error'
|
33
30
|
require 'erlectricity/errors/decode_error'
|
34
31
|
require 'erlectricity/errors/encode_error'
|
data/test/condition_spec.rb
CHANGED
@@ -6,14 +6,14 @@ context "Erlectricity::StaticConditions" do
|
|
6
6
|
Erlectricity::StaticCondition.new([:foo]).satisfies?([:foo]).should == true
|
7
7
|
Erlectricity::StaticCondition.new(3).satisfies?(3).should == true
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
specify "should not satisfy on different values" do
|
11
11
|
Erlectricity::StaticCondition.new(:foo).satisfies?("foo").should == false
|
12
12
|
Erlectricity::StaticCondition.new([:foo]).satisfies?(:foo).should == false
|
13
13
|
Erlectricity::StaticCondition.new(Object.new).satisfies?(Object.new).should == false
|
14
14
|
Erlectricity::StaticCondition.new(3).satisfies?(3.0).should == false
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
specify "should not produce any bindings" do
|
18
18
|
s = Erlectricity::StaticCondition.new(:foo)
|
19
19
|
s.binding_for(:foo).should == nil
|
@@ -29,25 +29,24 @@ context "Erlectricity::TypeConditions" do
|
|
29
29
|
Erlectricity::TypeCondition.new(Array).satisfies?([]).should == true
|
30
30
|
Erlectricity::TypeCondition.new(Fixnum).satisfies?(3).should == true
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
specify "should be satisfied when the arg is of a descendent class" do
|
34
34
|
Erlectricity::TypeCondition.new(Object).satisfies?(:foo).should == true
|
35
35
|
Erlectricity::TypeCondition.new(Object).satisfies?("foo").should == true
|
36
36
|
Erlectricity::TypeCondition.new(Object).satisfies?(3).should == true
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
specify "should not be satisfied when the arg is of a different class" do
|
40
40
|
Erlectricity::TypeCondition.new(String).satisfies?(:foo).should == false
|
41
41
|
Erlectricity::TypeCondition.new(Symbol).satisfies?("foo").should == false
|
42
42
|
Erlectricity::TypeCondition.new(Fixnum).satisfies?(3.0).should == false
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
specify "should bind the arg with no transormations" do
|
46
46
|
s = Erlectricity::TypeCondition.new(Symbol)
|
47
47
|
s.binding_for(:foo).should == :foo
|
48
48
|
s.binding_for(:bar).should == :bar
|
49
49
|
end
|
50
|
-
|
51
50
|
end
|
52
51
|
|
53
52
|
context "Erlectricity::HashConditions" do
|
@@ -55,17 +54,17 @@ context "Erlectricity::HashConditions" do
|
|
55
54
|
Erlectricity::HashCondition.new.satisfies?([[:foo, 3], [:bar, Object.new]]).should == true
|
56
55
|
Erlectricity::HashCondition.new.satisfies?([[:foo, 3]]).should == true
|
57
56
|
end
|
58
|
-
|
57
|
+
|
59
58
|
specify "should satisfy on empty arrays" do
|
60
59
|
Erlectricity::HashCondition.new.satisfies?([]).should == true
|
61
60
|
end
|
62
|
-
|
61
|
+
|
63
62
|
specify "should nat satisfy other args" do
|
64
63
|
Erlectricity::HashCondition.new.satisfies?(:foo).should == false
|
65
64
|
Erlectricity::HashCondition.new.satisfies?("foo").should == false
|
66
65
|
Erlectricity::HashCondition.new.satisfies?(3.0).should == false
|
67
66
|
end
|
68
|
-
|
67
|
+
|
69
68
|
specify "should bind to a Hash" do
|
70
69
|
s = Erlectricity::HashCondition.new()
|
71
70
|
s.binding_for([[:foo, 3], [:bar, [3,4,5]]]).should == {:foo => 3, :bar => [3,4,5] }
|
data/test/decode_spec.rb
CHANGED
@@ -3,127 +3,126 @@ require File.dirname(__FILE__) + '/test_helper.rb'
|
|
3
3
|
context "When unpacking from a binary stream" do
|
4
4
|
setup do
|
5
5
|
end
|
6
|
-
|
6
|
+
|
7
7
|
specify "an erlang atom should decode to a ruby symbol" do
|
8
8
|
get("haha").should == :haha
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
specify "an erlang number encoded as a small_int (< 255) should decode to a fixnum" do
|
12
12
|
get("0").should == 0
|
13
13
|
get("255").should == 255
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
specify "an erlang number encoded as a int (signed 27-bit number) should decode to a fixnum" do
|
17
17
|
get("256").should == 256
|
18
18
|
get("#{(1 << 27) -1}").should == (1 << 27) -1
|
19
19
|
get("-1").should == -1
|
20
20
|
get("#{-(1 << 27)}").should == -(1 << 27)
|
21
21
|
end
|
22
|
-
|
23
|
-
|
22
|
+
|
24
23
|
specify "an erlang number encoded as a small bignum (1 byte length) should decode to fixnum if it can" do
|
25
24
|
get("#{(1 << 27)}").should == (1 << 27)
|
26
25
|
get("#{-(1 << 27) - 1}").should == -(1 << 27) - 1
|
27
26
|
get("#{(1 << word_length) - 1}").should == (1 << word_length) - 1
|
28
27
|
get("#{-(1 << word_length)}").should == -(1 << word_length)
|
29
28
|
end
|
30
|
-
|
29
|
+
|
31
30
|
specify "an erlang number encoded as a small bignum (1 byte length) should decode to bignum if it can't be a fixnum" do
|
32
31
|
get("#{(1 << word_length)}").should == (1 << word_length)
|
33
32
|
get("#{-(1 << word_length) - 1}").should == -(1 << word_length) - 1
|
34
33
|
get("#{(1 << (255 * 8)) - 1}").should == (1 << (255 * 8)) - 1
|
35
34
|
get("#{-((1 << (255 * 8)) - 1)}").should == -((1 << (255 * 8)) - 1)
|
36
35
|
end
|
37
|
-
|
38
|
-
|
36
|
+
|
39
37
|
specify "an erlang number encoded as a big bignum (4 byte length) should decode to bignum" do
|
40
38
|
get("#{(1 << (255 * 8)) }").should == (1 << (255 * 8))
|
41
39
|
get("#{-(1 << (255 * 8))}").should == -(1 << (255 * 8))
|
42
40
|
get("#{(1 << (512 * 8)) }").should == (1 << (512 * 8))
|
43
41
|
get("#{-(1 << (512 * 8))}").should == -(1 << (512 * 8))
|
44
42
|
end
|
45
|
-
|
43
|
+
|
46
44
|
specify "an erlang float should decode to a Float" do
|
47
45
|
get("#{1.0}").should == 1.0
|
48
46
|
get("#{-1.0}").should == -1.0
|
49
47
|
get("#{123.456}").should == 123.456
|
50
48
|
get("#{123.456789012345}").should == 123.456789012345
|
51
49
|
end
|
52
|
-
|
53
|
-
|
50
|
+
|
54
51
|
specify "an erlang reference should decode to a Reference object" do
|
55
52
|
ref = get("make_ref()")
|
56
53
|
ref.should.be.instance_of Erlectricity::NewReference
|
57
54
|
ref.node.should.be.instance_of Symbol
|
58
55
|
end
|
59
|
-
|
56
|
+
|
60
57
|
specify "an erlang pid should decode to a Pid object" do
|
61
58
|
pid = get("spawn(fun() -> 3 end)")
|
62
59
|
pid.should.be.instance_of Erlectricity::Pid
|
63
60
|
pid.node.should.be.instance_of Symbol
|
64
61
|
end
|
65
|
-
|
66
|
-
|
62
|
+
|
67
63
|
specify "an erlang tuple encoded as a small tuple (1-byte length) should decode to an array" do
|
68
64
|
ref = get("{3}")
|
69
65
|
ref.length.should == 1
|
70
66
|
ref.first.should == 3
|
71
|
-
|
67
|
+
|
72
68
|
ref = get("{3, a, make_ref()}")
|
73
69
|
ref.length.should == 3
|
74
70
|
ref[0].should == 3
|
75
71
|
ref[1].should == :a
|
76
72
|
ref[2].class.should == Erlectricity::NewReference
|
77
|
-
|
73
|
+
|
78
74
|
tuple_meat = (['3'] * 255).join(', ')
|
79
75
|
ref = get("{#{tuple_meat}}")
|
80
76
|
ref.length.should == 255
|
81
77
|
ref.each{|r| r.should == 3}
|
82
78
|
end
|
83
|
-
|
84
|
-
|
79
|
+
|
85
80
|
specify "an erlang tuple encoded as a large tuple (4-byte length) should decode to an array" do
|
86
81
|
tuple_meat = (['3'] * 256).join(', ')
|
87
82
|
ref = get("{#{tuple_meat}}")
|
88
83
|
ref.length.should == 256
|
89
84
|
ref.each{|r| r.should == 3}
|
90
|
-
|
85
|
+
|
91
86
|
tuple_meat = (['3'] * 512).join(', ')
|
92
87
|
ref = get("{#{tuple_meat}}")
|
93
88
|
ref.length.should == 512
|
94
89
|
ref.each{|r| r.should == 3}
|
95
90
|
end
|
96
|
-
|
97
|
-
|
91
|
+
|
98
92
|
specify "an empty erlang list encoded as a nil should decode to an array" do
|
99
93
|
get("[]").should == []
|
100
94
|
end
|
101
|
-
|
95
|
+
|
102
96
|
specify "an erlang list encoded as a string should decode to an array of bytes (less than ideal, but consistent)" do
|
103
97
|
get("\"asdasd\"").should == "asdasd".split('').map{|c| c[0]}
|
104
98
|
get("\"#{'a' * 65534}\"").should == ['a'[0]] * 65534
|
105
99
|
end
|
106
|
-
|
100
|
+
|
107
101
|
specify "an erlang list encoded as a list should decode to a array" do
|
108
102
|
get("[3,4,256]").should == [3,4,256]
|
109
103
|
get("\"#{'a' * 65535 }\"").should == [97] * 65535
|
110
104
|
get("[3,4, foo, {3,4,5,bar}, 256]").should == [3,4, :foo, [3,4,5,:bar], 256]
|
111
105
|
end
|
112
|
-
|
113
|
-
|
106
|
+
|
114
107
|
specify "an erlang binary should decode to a string" do
|
115
108
|
get("<< 3,4,255 >>").should == "\003\004\377"
|
116
109
|
get("<< \"whatup\" >>").should == "whatup"
|
117
110
|
end
|
118
|
-
|
111
|
+
|
112
|
+
specify "erlang atomic booleans should decode to ruby booleans" do
|
113
|
+
get("true").should == true
|
114
|
+
get("false").should == false
|
115
|
+
get("falsereio").should == :falsereio
|
116
|
+
end
|
117
|
+
|
119
118
|
specify "a good thing should be awesome" do
|
120
119
|
get(%Q-[{options,{struct,[{test,<<"I'm chargin' mah lazer">>}]}},{passage,<<"Why doesn't this work?">>}]-).should ==
|
121
120
|
[[:options, [:struct, [[:test, "I'm chargin' mah lazer"]]]], [:passage, "Why doesn't this work?"]]
|
122
121
|
end
|
123
|
-
|
122
|
+
|
124
123
|
def get(str)
|
125
124
|
x = "term_to_binary(#{str.gsub(/"/, '\\\"')})"
|
126
125
|
bin = run_erl(x)
|
127
|
-
Erlectricity::Decoder.
|
126
|
+
Erlectricity::Decoder.decode(bin)
|
128
127
|
end
|
129
128
|
end
|
data/test/encode_spec.rb
CHANGED
@@ -5,19 +5,26 @@ context "When packing to a binary stream" do
|
|
5
5
|
@out = StringIO.new('', 'w')
|
6
6
|
@encoder = Erlectricity::Encoder.new(@out)
|
7
7
|
end
|
8
|
+
|
8
9
|
specify "A symbol should be encoded to an erlang atom" do
|
9
10
|
get{@encoder.write_symbol :haha}.should == get_erl("haha")
|
10
11
|
write_any(:haha).should == get_erl_with_magic("haha")
|
11
12
|
end
|
12
|
-
|
13
|
+
|
14
|
+
specify "A boolean should be encoded to an erlang atom" do
|
15
|
+
get{@encoder.write_boolean true}.should == get_erl("true")
|
16
|
+
get{@encoder.write_boolean false}.should == get_erl("false")
|
17
|
+
write_any(true).should == get_erl_with_magic("true")
|
18
|
+
write_any(false).should == get_erl_with_magic("false")
|
19
|
+
end
|
20
|
+
|
13
21
|
specify "A number should be encoded as an erlang number would be" do
|
14
|
-
|
15
22
|
#SMALL_INTS
|
16
23
|
get{@encoder.write_fixnum 0}.should == get_erl("0")
|
17
24
|
get{@encoder.write_fixnum 255}.should == get_erl("255")
|
18
25
|
write_any(0).should == get_erl_with_magic("0")
|
19
26
|
write_any(255).should == get_erl_with_magic("255")
|
20
|
-
|
27
|
+
|
21
28
|
#INTS
|
22
29
|
get{@encoder.write_fixnum 256}.should == get_erl("256")
|
23
30
|
get{@encoder.write_fixnum((1 << 27) - 1)}.should == get_erl("#{(1 << 27) - 1}")
|
@@ -27,105 +34,105 @@ context "When packing to a binary stream" do
|
|
27
34
|
write_any((1 << 27) - 1).should == get_erl_with_magic("#{(1 << 27) - 1}")
|
28
35
|
write_any(-1).should == get_erl_with_magic("-1")
|
29
36
|
write_any(-(1 << 27)).should == get_erl_with_magic("#{-(1 << 27)}")
|
30
|
-
|
37
|
+
|
31
38
|
# #SMALL_BIGNUMS
|
32
39
|
# get{@encoder.write_fixnum((1 << word_length))}.should == get_erl("#{(1 << word_length)}")
|
33
40
|
# get{@encoder.write_fixnum(-(1 << word_length) - 1)}.should == get_erl("#{-(1 << word_length) - 1}")
|
34
41
|
# get{@encoder.write_fixnum((1 << (255 * 8)) - 1)}.should == get_erl("#{(1 << (255 * 8)) - 1}")
|
35
42
|
# get{@encoder.write_fixnum(-((1 << (255 * 8)) - 1))}.should == get_erl("#{-((1 << (255 * 8)) - 1)}")
|
36
|
-
#
|
43
|
+
#
|
37
44
|
# write_any((1 << word_length)).should == get_erl_with_magic("#{(1 << word_length)}")
|
38
45
|
# write_any(-(1 << word_length) - 1).should == get_erl_with_magic("#{-(1 << word_length) - 1}")
|
39
46
|
# write_any((1 << (255 * 8)) - 1).should == get_erl_with_magic("#{(1 << (255 * 8)) - 1}")
|
40
47
|
# write_any(-((1 << (255 * 8)) - 1)).should == get_erl_with_magic("#{-((1 << (255 * 8)) - 1)}")
|
41
|
-
#
|
48
|
+
#
|
42
49
|
# #LARG_BIGNUMS
|
43
50
|
# get{@encoder.write_fixnum((1 << (255 * 8)))}.should == get_erl("#{(1 << (255 * 8))}")
|
44
51
|
# get{@encoder.write_fixnum(-(1 << (255 * 8))}.should == get_erl("#{-(1 << (255 * 8)}")
|
45
52
|
# get{@encoder.write_fixnum((1 << (512 * 8))}.should == get_erl("#{(1 << (512 * 8))}")
|
46
53
|
# get{@encoder.write_fixnum(-((1 << (512 * 8)) - 1))}.should == get_erl("#{-((1 << (512 * 8)) - 1)}")
|
47
|
-
#
|
54
|
+
#
|
48
55
|
# write_any((1 << (255 * 8))).should == get_erl_with_magic("#{(1 << (255 * 8))}")
|
49
56
|
# write_any(-(1 << (255 * 8)).should == get_erl_with_magic("#{-(1 << (255 * 8)}")
|
50
57
|
# write_any((1 << (512 * 8))).should == get_erl_with_magic("#{(1 << (512 * 8))}")
|
51
58
|
# write_any(-((1 << (512 * 8)) - 1)).should == get_erl_with_magic("#{-((1 << (512 * 8)) - 1)}")
|
52
59
|
end
|
53
|
-
|
60
|
+
|
54
61
|
# specify "A float (that is within the truncated precision of ruby compared to erlang) should encode as erlang does" do
|
55
62
|
# get{@encoder.write_float 1.0}.should == get_erl("1.0")
|
56
63
|
# get{@encoder.write_float -1.0}.should == get_erl("-1.0")
|
57
64
|
# get{@encoder.write_float 123.456}.should == get_erl("123.456")
|
58
65
|
# get{@encoder.write_float 123.456789012345}.should == get_erl("123.456789012345")
|
59
66
|
# end
|
60
|
-
|
67
|
+
|
61
68
|
specify "An Erlectiricity::NewReference should encode back to its original form" do
|
62
69
|
ref_bin = run_erl("term_to_binary(make_ref())")
|
63
|
-
ruby_ref = Erlectricity::Decoder.
|
64
|
-
|
70
|
+
ruby_ref = Erlectricity::Decoder.decode(ref_bin)
|
71
|
+
|
65
72
|
get{@encoder.write_new_reference(ruby_ref)}.should == ref_bin[1..-1]
|
66
73
|
write_any(ruby_ref).should == ref_bin
|
67
74
|
end
|
68
|
-
|
75
|
+
|
69
76
|
specify "An Erlectiricity::Pid should encode back to its original form" do
|
70
77
|
pid_bin = run_erl("term_to_binary(spawn(fun() -> 3 end))")
|
71
|
-
ruby_pid = Erlectricity::Decoder.
|
72
|
-
|
78
|
+
ruby_pid = Erlectricity::Decoder.decode(pid_bin)
|
79
|
+
|
73
80
|
get{@encoder.write_pid(ruby_pid)}.should == pid_bin[1..-1]
|
74
81
|
write_any(ruby_pid).should == pid_bin
|
75
82
|
end
|
76
|
-
|
83
|
+
|
77
84
|
specify "An array written with write_tuple should encode as erlang would a tuple" do
|
78
85
|
get{@encoder.write_tuple [1,2,3]}.should == get_erl("{1,2,3}")
|
79
86
|
get{@encoder.write_tuple [3] * 255}.should == get_erl("{#{([3] * 255).join(',')}}")
|
80
87
|
get{@encoder.write_tuple [3] * 256}.should == get_erl("{#{([3] * 256).join(',')}}")
|
81
88
|
get{@encoder.write_tuple [3] * 512}.should == get_erl("{#{([3] * 512).join(',')}}")
|
82
89
|
end
|
83
|
-
|
90
|
+
|
84
91
|
specify "An array should by default be written as a tuple" do
|
85
92
|
write_any([1,2,3]).should == get_erl_with_magic("{1,2,3}")
|
86
93
|
write_any([3] * 255).should == get_erl_with_magic("{#{([3] * 255).join(',')}}")
|
87
94
|
write_any([3] * 256).should == get_erl_with_magic("{#{([3] * 256).join(',')}}")
|
88
95
|
write_any([3] * 512).should == get_erl_with_magic("{#{([3] * 512).join(',')}}")
|
89
96
|
end
|
90
|
-
|
97
|
+
|
91
98
|
specify "An Erlectricity::List should by default be written as a list" do
|
92
99
|
write_any(Erl::List.new([1,2,300])).should == get_erl_with_magic("[1,2,300]")
|
93
100
|
write_any(Erl::List.new([300] * 255)).should == get_erl_with_magic("[#{([300] * 255).join(',')}]")
|
94
101
|
write_any(Erl::List.new([300] * 256)).should == get_erl_with_magic("[#{([300] * 256).join(',')}]")
|
95
102
|
write_any(Erl::List.new([300] * 512)).should == get_erl_with_magic("[#{([300] * 512).join(',')}]")
|
96
103
|
end
|
97
|
-
|
104
|
+
|
98
105
|
specify "An array written with write_list should encode as erlang would a list" do
|
99
106
|
get{@encoder.write_list [1,2,300]}.should == get_erl("[1,2,300]")
|
100
107
|
get{@encoder.write_list [300] * 255}.should == get_erl("[#{([300] * 255).join(',')}]")
|
101
108
|
get{@encoder.write_list [300] * 256}.should == get_erl("[#{([300] * 256).join(',')}]")
|
102
109
|
get{@encoder.write_list [300] * 512}.should == get_erl("[#{([300] * 512).join(',')}]")
|
103
110
|
end
|
104
|
-
|
111
|
+
|
105
112
|
specify "a string should be encoded as a erlang binary would be" do
|
106
113
|
get{@encoder.write_binary "hey who"}.should == get_erl("<< \"hey who\" >>")
|
107
114
|
get{@encoder.write_binary ""}.should == get_erl("<< \"\" >>")
|
108
|
-
|
115
|
+
|
109
116
|
write_any("hey who").should == get_erl_with_magic("<< \"hey who\" >>")
|
110
117
|
write_any("").should == get_erl_with_magic("<< \"\" >>")
|
111
118
|
end
|
112
|
-
|
119
|
+
|
113
120
|
def get
|
114
121
|
@encoder.out = StringIO.new('', 'w')
|
115
122
|
yield
|
116
123
|
@encoder.out.string
|
117
124
|
end
|
118
|
-
|
125
|
+
|
119
126
|
def write_any(term)
|
120
127
|
@encoder.out = StringIO.new('', 'w')
|
121
128
|
@encoder.write_any term
|
122
129
|
@encoder.out.string
|
123
130
|
end
|
124
|
-
|
131
|
+
|
125
132
|
def get_erl(str)
|
126
133
|
get_erl_with_magic(str)[1..-1] #[1..-1] to chop off the magic number
|
127
134
|
end
|
128
|
-
|
135
|
+
|
129
136
|
def get_erl_with_magic(str)
|
130
137
|
run_erl("term_to_binary(#{str.gsub(/"/, '\\\"')})")
|
131
138
|
end
|