File: value_encoder_spec.rb

package info (click to toggle)
ruby-amq-protocol 2.5.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 572 kB
  • sloc: ruby: 5,975; python: 248; makefile: 4
file content (161 lines) | stat: -rw-r--r-- 5,632 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
require 'time'
require "amq/protocol/table_value_encoder"
require "amq/protocol/float_32bit"

module AMQ
  module Protocol
    RSpec.describe TableValueEncoder do

      it "calculates size of string field values" do
        expect(described_class.field_value_size("amqp")).to eq(9)
        expect(described_class.encode("amqp").bytesize).to eq(9)

        expect(described_class.field_value_size("amq-protocol")).to eq(17)
        expect(described_class.encode("amq-protocol").bytesize).to eq(17)

        expect(described_class.field_value_size("à bientôt")).to eq(16)
        expect(described_class.encode("à bientôt").bytesize).to eq(16)
      end

      it "calculates size of integer field values" do
        expect(described_class.field_value_size(10)).to eq(9)
        expect(described_class.encode(10).bytesize).to eq(9)
      end

      it "calculates size of float field values (considering them to be 64-bit)" do
        expect(described_class.field_value_size(10.0)).to eq(9)
        expect(described_class.encode(10.0).bytesize).to eq(9)

        expect(described_class.field_value_size(120000.0)).to eq(9)
        expect(described_class.encode(120000.0).bytesize).to eq(9)
      end

      it "calculates size of float field values (boxed as 32-bit)" do
        expect(described_class.encode(AMQ::Protocol::Float32Bit.new(10.0)).bytesize).to eq(5)
        expect(described_class.encode(AMQ::Protocol::Float32Bit.new(120000.0)).bytesize).to eq(5)
      end

      it "calculates size of boolean field values" do
        expect(described_class.field_value_size(true)).to eq(2)
        expect(described_class.encode(true).bytesize).to eq(2)

        expect(described_class.field_value_size(false)).to eq(2)
        expect(described_class.encode(false).bytesize).to eq(2)
      end

      it "calculates size of void field values" do
        expect(described_class.field_value_size(nil)).to eq(1)
        expect(described_class.encode(nil).bytesize).to eq(1)
      end

      it "calculates size of time field values" do
        t = Time.parse("2011-07-14 01:17:46 +0400")

        expect(described_class.field_value_size(t)).to eq(9)
        expect(described_class.encode(t).bytesize).to eq(9)
      end


      it "calculates size of basic table field values" do
        input1   = { "key" => "value" }
        expect(described_class.field_value_size(input1)).to eq(19)
        expect(described_class.encode(input1).bytesize).to eq(19)


        input2   = { "intval" => 1 }
        expect(described_class.field_value_size(input2)).to eq(21)
        expect(described_class.encode(input2).bytesize).to eq(21)


        input3   = { "intval" => 1, "key" => "value" }
        expect(described_class.field_value_size(input3)).to eq(35)
        expect(described_class.encode(input3).bytesize).to eq(35)
      end


      it "calculates size of table field values" do
        input1   = {
          "hashval"    => {
            "protocol" => {
              "name"  => "AMQP",
              "major" => 0,
              "minor" => "9",
              "rev"   => 1.0,
              "spec"  => {
                "url"  => "http://bit.ly/hw2ELX",
                "utf8" => "à bientôt".force_encoding(::Encoding::ASCII_8BIT)
              }
            },
            "true"     => true,
            "false"    => false,
            "nil"      => nil
          }
        }

        expect(described_class.field_value_size(input1)).to eq(166)
        # puts(described_class.encode(input1).inspect)
        expect(described_class.encode(input1).bytesize).to eq(166)



        input2   = {
          "boolval"      => true,
          "intval"       => 1,
          "strval"       => "Test",
          "timestampval" => Time.parse("2011-07-14 01:17:46 +0400"),
          "floatval"     => 3.14,
          "longval"      => 912598613,
          "hashval"      => { "protocol" => "AMQP091", "true" => true, "false" => false, "nil" => nil }
        }

        expect(described_class.field_value_size(input2)).to eq(158)
        expect(described_class.encode(input2).bytesize).to eq(158)
      end

      it "calculates size of basic array field values" do
        input1 = [1, 2, 3]

        expect(described_class.field_value_size(input1)).to eq(32)
        expect(described_class.encode(input1).bytesize).to eq(32)


        input2 = ["one", "two", "three"]
        expect(described_class.field_value_size(input2)).to eq(31)
        expect(described_class.encode(input2).bytesize).to eq(31)


        input3 = ["one", 2, "three"]
        expect(described_class.field_value_size(input3)).to eq(32)
        expect(described_class.encode(input3).bytesize).to eq(32)


        input4 = ["one", 2, "three", ["four", 5, [6.0]]]
        expect(described_class.field_value_size(input4)).to eq(69)
        expect(described_class.encode(input4).bytesize).to eq(69)
      end

      it "encodes symbols as strings" do
        encoded = described_class.encode(:test_symbol)
        expect(encoded).to start_with("S")
        expect(encoded).to include("test_symbol")
      end

      it "encodes BigDecimal values" do
        bd = BigDecimal("123.45")
        encoded = described_class.encode(bd)
        expect(encoded).to start_with("D")
      end

      it "encodes BigDecimal with zero exponent" do
        bd = BigDecimal("100")
        encoded = described_class.encode(bd)
        expect(encoded).to start_with("D")
      end

      it "raises ArgumentError for unsupported types" do
        expect { described_class.encode(Object.new) }.to raise_error(ArgumentError)
      end

    end # TableValueEncoder
  end # Protocol
end # AMQ