codec 0.0.12 → 1.0.0
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/.gitignore +1 -0
- data/Rakefile +6 -0
- data/codec.gemspec +1 -1
- data/lib/codec.rb +8 -0
- data/lib/codec/base.rb +8 -47
- data/lib/codec/bitmap.rb +42 -36
- data/lib/codec/composed.rb +39 -66
- data/lib/codec/field.rb +1 -1
- data/lib/codec/fix.rb +83 -65
- data/lib/codec/logger.rb +2 -2
- data/lib/codec/packed.rb +40 -91
- data/lib/codec/prefix.rb +71 -71
- data/lib/codec/tlv.rb +116 -111
- data/lib/codec/version.rb +1 -1
- data/test/lib/codec/bitmap_test.rb +29 -20
- data/test/lib/codec/composed_test.rb +37 -23
- data/test/lib/codec/eightbits_test.rb +18 -14
- data/test/lib/codec/fix_test.rb +47 -35
- data/test/lib/codec/pckd_test.rb +33 -37
- data/test/lib/codec/prefix_test.rb +45 -67
- data/test/lib/codec/tlv_test.rb +41 -36
- data/test/test_helper.rb +3 -0
- metadata +14 -14
data/lib/codec/version.rb
CHANGED
@@ -2,43 +2,45 @@ require_relative '../../test_helper'
|
|
2
2
|
|
3
3
|
describe Codec::Bitmap do
|
4
4
|
|
5
|
-
subject { Codec::Bitmap.new(
|
5
|
+
subject { Codec::Bitmap.new(2) }
|
6
6
|
|
7
7
|
before do
|
8
|
-
subject.add_sub_codec('1',Codec::Numasc.new(
|
9
|
-
subject.add_sub_codec('2', Codec::String.new(
|
10
|
-
subject.add_sub_codec('3', Codec::String.new(
|
11
|
-
subject.add_sub_codec('15', Codec::Numbin.new(
|
8
|
+
subject.add_sub_codec('1',Codec::Numasc.new(3))
|
9
|
+
subject.add_sub_codec('2', Codec::String.new(5))
|
10
|
+
subject.add_sub_codec('3', Codec::String.new(3))
|
11
|
+
subject.add_sub_codec('15', Codec::Numbin.new(2))
|
12
12
|
@buffer = ["1100000000000010","012ABCDE","0012"].pack("B*A*H*")
|
13
13
|
@field = Codec::Field.from_array('Bitmap',[['1',12],['2','ABCDE'],['15',18]])
|
14
14
|
end
|
15
15
|
|
16
|
-
it "must be a
|
16
|
+
it "must be a Bitmap codec" do
|
17
17
|
subject.must_be_instance_of(Codec::Bitmap)
|
18
18
|
end
|
19
19
|
|
20
20
|
it "must generate composed field from buffer" do
|
21
|
-
|
21
|
+
f = Codec::Field.new('Bitmap')
|
22
|
+
subject.decode(@buffer, f)
|
23
|
+
f.must_equal(@field)
|
22
24
|
end
|
23
25
|
|
24
26
|
end
|
25
27
|
|
26
28
|
describe Codec::Bitmap do
|
27
29
|
|
28
|
-
subject { Codec::Bitmap.new(
|
30
|
+
subject { Codec::Bitmap.new(2) }
|
29
31
|
|
30
32
|
before do
|
31
33
|
subject.add_extended_bitmap('1')
|
32
|
-
subject.add_sub_codec('2',Codec::Numasc.new(
|
33
|
-
subject.add_sub_codec('3', Codec::String.new(
|
34
|
-
subject.add_sub_codec('4', Codec::String.new(
|
35
|
-
subject.add_sub_codec('18', Codec::Numbin.new(
|
36
|
-
subject.add_sub_codec('21', Codec::String.new(
|
34
|
+
subject.add_sub_codec('2',Codec::Numasc.new(3))
|
35
|
+
subject.add_sub_codec('3', Codec::String.new(5))
|
36
|
+
subject.add_sub_codec('4', Codec::String.new(3))
|
37
|
+
subject.add_sub_codec('18', Codec::Numbin.new(2))
|
38
|
+
subject.add_sub_codec('21', Codec::String.new(5))
|
37
39
|
@buffer_1 = ["11000000000000000100100000000000","012","0012","ABCDE"].pack("B*A*H*A*")
|
38
40
|
@buffer_2 = ["0110000000000000","012","ABCDE"].pack("B*A3A5")
|
39
|
-
@field_1 = Codec::Field.from_array('
|
40
|
-
@field_2 = Codec::Field.from_array('
|
41
|
-
@field_3 = Codec::Field.from_array('
|
41
|
+
@field_1 = Codec::Field.from_array('test1',[['2',12],['18',18],['21',"ABCDE"]])
|
42
|
+
@field_2 = Codec::Field.from_array('test2',[['2',12],['3','ABCDE']])
|
43
|
+
@field_3 = Codec::Field.from_array('test3',[['2',12],['41',18],['21',"ABCDE"]])
|
42
44
|
end
|
43
45
|
|
44
46
|
it "must be a Bitmap codec" do
|
@@ -46,19 +48,26 @@ describe Codec::Bitmap do
|
|
46
48
|
end
|
47
49
|
|
48
50
|
it "must generate composed field from buffer with extended bitmap" do
|
49
|
-
|
51
|
+
f1 = Codec::Field.new('test1')
|
52
|
+
subject.decode(@buffer_1,f1)
|
53
|
+
f1.must_equal(@field_1)
|
50
54
|
end
|
51
55
|
|
52
56
|
it "must generate composed field from buffer without extended bitmap" do
|
53
|
-
|
57
|
+
f2 = Codec::Field.new('test2')
|
58
|
+
subject.decode(@buffer_2,f2)
|
59
|
+
f2.must_equal(@field_2)
|
54
60
|
end
|
55
61
|
|
56
62
|
it "must generate buffer from composed field" do
|
57
|
-
|
63
|
+
buf1 = ""
|
64
|
+
subject.encode(buf1, @field_1)
|
65
|
+
buf1.unpack("H*").first.must_equal(@buffer_1.unpack("H*").first)
|
58
66
|
end
|
59
67
|
|
60
68
|
it "must raise Encoding exception if subfield is unknown" do
|
61
|
-
|
69
|
+
buf = ""
|
70
|
+
proc { subject.encode(buf, @field_3) }.must_raise(Codec::EncodingException)
|
62
71
|
end
|
63
72
|
|
64
73
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
require_relative '../../test_helper'
|
2
2
|
|
3
3
|
describe Codec::BaseComposed do
|
4
|
-
subject { Codec::BaseComposed.new
|
4
|
+
subject { Codec::BaseComposed.new }
|
5
5
|
|
6
6
|
before do
|
7
|
-
subject.add_sub_codec('CHP1', Codec::Numasc.new(
|
8
|
-
subject.add_sub_codec('CHP2', Codec::String.new(
|
9
|
-
subject.add_sub_codec('CHP3', Codec::String.new(
|
10
|
-
subject.add_sub_codec('CHP4', Codec::Numasc.new(
|
7
|
+
subject.add_sub_codec('CHP1', Codec::Numasc.new(3))
|
8
|
+
subject.add_sub_codec('CHP2', Codec::String.new(5))
|
9
|
+
subject.add_sub_codec('CHP3', Codec::String.new(4))
|
10
|
+
subject.add_sub_codec('CHP4', Codec::Numasc.new(4))
|
11
11
|
field_array = [['CHP1',12],['CHP2','ABCDE'],['CHP3','WXYZ'],['CHP4',23]]
|
12
12
|
@buffer_test1 = "012ABCDEWXYZ0023"
|
13
13
|
@field_test1 = Codec::Field.from_array('BaseComposed', field_array)
|
@@ -20,29 +20,38 @@ describe Codec::BaseComposed do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "must generate a field with computed value" do
|
23
|
-
|
23
|
+
f1 = Codec::Field.new("BaseComposed")
|
24
|
+
subject.decode(@buffer_test1,f1)
|
25
|
+
f1.must_equal(@field_test1)
|
24
26
|
end
|
25
27
|
|
26
28
|
it "must encode buffer with composed field" do
|
27
|
-
|
29
|
+
buf1 = ""
|
30
|
+
subject.encode(buf1, @field_test1)
|
31
|
+
buf1.must_equal(@buffer_test1)
|
28
32
|
end
|
29
33
|
|
30
34
|
it "must encode buffer with composed field without codec's last field " do
|
31
|
-
|
35
|
+
buf = ""
|
36
|
+
subject.encode(buf, @field_test2)
|
37
|
+
buf.must_equal(@buffer_test2)
|
32
38
|
end
|
33
39
|
|
34
40
|
it "must handle remaining data" do
|
35
|
-
|
41
|
+
buf = "012ABCDEWXYZ0023123"
|
42
|
+
f = Codec::Field.new
|
43
|
+
subject.decode(buf,f)
|
44
|
+
buf.must_equal("123")
|
36
45
|
end
|
37
46
|
end
|
38
47
|
|
39
|
-
describe Codec::
|
40
|
-
subject { Codec::
|
48
|
+
describe Codec::BaseComposed do
|
49
|
+
subject { Codec::BaseComposed.new(true) }
|
41
50
|
|
42
51
|
before do
|
43
|
-
test_1 = [['CHP1',Codec::Numasc.new(
|
44
|
-
['CHP2',Codec::String.new(
|
45
|
-
['CHP3',Codec::String.new(
|
52
|
+
test_1 = [['CHP1',Codec::Numasc.new(3),12],
|
53
|
+
['CHP2',Codec::String.new(5),"ABCDE"],
|
54
|
+
['CHP3',Codec::String.new(4),"WXYZ"]]
|
46
55
|
field_array = test_1.collect{|id,codec,value| [id,value]}
|
47
56
|
@field_1 = Codec::Field.from_array('CompleteComposed',field_array)
|
48
57
|
test_1.each { |id,codec,value| subject.add_sub_codec(id,codec) }
|
@@ -51,29 +60,34 @@ describe Codec::CompleteComposed do
|
|
51
60
|
@buffer_3 = "012ABCDE"
|
52
61
|
@field_2 = Codec::Field.from_array('CompleteComposed',field_array[0,2])
|
53
62
|
end
|
54
|
-
|
55
|
-
it "must be a CompleteComposed codec" do
|
56
|
-
subject.must_be_instance_of(Codec::CompleteComposed)
|
57
|
-
end
|
58
63
|
|
59
64
|
it "must generate a field with computed value" do
|
60
|
-
|
65
|
+
f = Codec::Field.new("CompleteComposed")
|
66
|
+
subject.decode(@buffer_1,f)
|
67
|
+
f.must_equal(@field_1)
|
61
68
|
end
|
62
69
|
|
63
70
|
it "must handle remaining data" do
|
64
|
-
|
71
|
+
buf = @buffer_1
|
72
|
+
f = Codec::Field.new("CompleteComposed")
|
73
|
+
subject.decode(buf, f)
|
74
|
+
buf.must_equal("123")
|
65
75
|
end
|
66
76
|
|
67
77
|
it "must raise BufferUnderflow if missing field" do
|
68
|
-
|
78
|
+
f = Codec::Field.new("CompleteComposed")
|
79
|
+
proc { subject.decode(@buffer_3,f) }.must_raise(Codec::BufferUnderflow)
|
69
80
|
end
|
70
81
|
|
71
82
|
it "must encode expected buffer" do
|
72
|
-
|
83
|
+
buf = ""
|
84
|
+
subject.encode(buf, @field_1)
|
85
|
+
buf.must_equal(@buffer_2)
|
73
86
|
end
|
74
87
|
|
75
88
|
it "must raise EncodingException if missing field" do
|
76
|
-
|
89
|
+
buf = ""
|
90
|
+
proc { subject.encode(buf, @field_2)}.must_raise(Codec::EncodingException)
|
77
91
|
end
|
78
92
|
|
79
93
|
end
|
@@ -3,36 +3,40 @@ require_relative '../../test_helper'
|
|
3
3
|
|
4
4
|
describe Codec::Ascii do
|
5
5
|
|
6
|
-
subject { Codec::Ascii.new(
|
7
|
-
|
8
|
-
it "must be a Codec::Ascii" do
|
9
|
-
subject.must_be_instance_of(Codec::Ascii)
|
10
|
-
end
|
6
|
+
subject { Codec::Ascii.new(3) }
|
11
7
|
|
12
8
|
it "must encode field from utf-8 to ascii" do
|
13
|
-
|
9
|
+
f = Codec::Field.new('test','été')
|
10
|
+
buff =""
|
11
|
+
subject.encode(buff, f)
|
12
|
+
buff.must_equal(["827482"].pack("H*"))
|
14
13
|
end
|
15
14
|
|
16
15
|
it "must decode from ascii stream to utf-8 field" do
|
17
|
-
|
16
|
+
buff = ["827482"].pack("H*")
|
17
|
+
f = Codec::Field.new('test')
|
18
|
+
subject.decode(buff,f)
|
19
|
+
f.must_equal(Codec::Field.new('test','été'))
|
18
20
|
end
|
19
21
|
|
20
22
|
end
|
21
23
|
|
22
24
|
describe Codec::Ebcdic do
|
23
25
|
|
24
|
-
subject { Codec::Ebcdic.new(
|
25
|
-
|
26
|
-
it "must be a Codec::Ebcdic" do
|
27
|
-
subject.must_be_instance_of(Codec::Ebcdic)
|
28
|
-
end
|
26
|
+
subject { Codec::Ebcdic.new(3) }
|
29
27
|
|
30
28
|
it "must encode field from utf-8 to Ebcdic" do
|
31
|
-
|
29
|
+
f = Codec::Field.new('test','été')
|
30
|
+
buff =""
|
31
|
+
subject.encode(buff, f)
|
32
|
+
buff.must_equal(["85A385"].pack("H*"))
|
32
33
|
end
|
33
34
|
|
34
35
|
it "must decode from Ebcdic stream to utf-8 field" do
|
35
|
-
|
36
|
+
buff = ["85A385"].pack("H*")
|
37
|
+
f = Codec::Field.new('test')
|
38
|
+
subject.decode(buff, f)
|
39
|
+
f.must_equal(Codec::Field.new('test','ete'))
|
36
40
|
end
|
37
41
|
|
38
42
|
end
|
data/test/lib/codec/fix_test.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative '../../test_helper'
|
2
2
|
|
3
3
|
describe Codec::Numbin do
|
4
|
-
subject { Codec::Numbin.new(
|
4
|
+
subject { Codec::Numbin.new(4) }
|
5
5
|
|
6
6
|
before do
|
7
7
|
@f256 = Codec::Field.new
|
@@ -13,89 +13,101 @@ describe Codec::Numbin do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "must generate a field with computed value" do
|
16
|
-
|
16
|
+
f = Codec::Field.new
|
17
|
+
subject.decode(["00000100"].pack("H*"),f)
|
18
|
+
f.get_value.to_i.must_equal(256)
|
17
19
|
end
|
18
20
|
|
19
|
-
it "
|
20
|
-
|
21
|
+
it "remaining buffer must be empty" do
|
22
|
+
f = Codec::Field.new
|
23
|
+
buf = ["00000100"].pack("H*")
|
24
|
+
subject.decode(buf,f)
|
25
|
+
buf.must_be_empty
|
21
26
|
end
|
22
27
|
|
23
28
|
it "must generate a field with computed value" do
|
24
|
-
|
29
|
+
buf = ""
|
30
|
+
subject.encode(buf, @f256)
|
31
|
+
buf.must_equal(["00000100"].pack("H*"))
|
25
32
|
end
|
26
33
|
end
|
27
34
|
|
28
35
|
describe Codec::Numasc do
|
29
|
-
subject { Codec::Numasc.new(
|
36
|
+
subject { Codec::Numasc.new(4) }
|
30
37
|
|
31
38
|
before do
|
32
39
|
@f12 = Codec::Field.new
|
33
40
|
@f12.set_value(12)
|
34
41
|
end
|
35
42
|
|
36
|
-
it "must be a codec" do
|
37
|
-
subject.must_be_instance_of(Codec::Numasc)
|
38
|
-
end
|
39
|
-
|
40
43
|
it "must generate a field with computed value" do
|
41
|
-
|
44
|
+
f = Codec::Field.new
|
45
|
+
subject.decode("0012",f)
|
46
|
+
f.get_value.must_equal(12)
|
42
47
|
end
|
43
48
|
|
44
|
-
it "
|
45
|
-
|
49
|
+
it "remaining buffer must be empty" do
|
50
|
+
buf = "0012"
|
51
|
+
f = Codec::Field.new
|
52
|
+
subject.decode(buf,f)
|
53
|
+
buf.must_be_empty
|
46
54
|
end
|
47
55
|
|
48
56
|
it "must generate a field with computed value" do
|
49
|
-
|
57
|
+
buf = ""
|
58
|
+
subject.encode(buf, @f12)
|
59
|
+
buf.must_equal("0012")
|
50
60
|
end
|
51
61
|
end
|
52
62
|
|
53
63
|
describe Codec::String do
|
54
|
-
subject { Codec::String.new(
|
55
|
-
before do
|
56
|
-
@fstring = Codec::Field.new
|
57
|
-
@fstring.set_value("TEST")
|
58
|
-
end
|
59
|
-
|
60
|
-
it "must be a codec" do
|
61
|
-
subject.must_be_instance_of(Codec::String)
|
62
|
-
end
|
64
|
+
subject { Codec::String.new(10) }
|
63
65
|
|
64
66
|
it "must generate a field with computed value" do
|
65
|
-
|
67
|
+
f = Codec::Field.new
|
68
|
+
subject.decode("Testing string",f)
|
69
|
+
f.get_value.must_equal("Testing st")
|
66
70
|
end
|
67
71
|
|
68
72
|
it "must also return remaining data" do
|
69
|
-
|
73
|
+
buf = "Testing string"
|
74
|
+
f = Codec::Field.new
|
75
|
+
subject.decode(buf, f)
|
76
|
+
buf.must_equal("ring")
|
70
77
|
end
|
71
78
|
|
72
79
|
it "must generate a buffer with corresponding value padded with space" do
|
73
|
-
|
80
|
+
f = Codec::Field.new
|
81
|
+
f.set_value("TEST")
|
82
|
+
buf = ""
|
83
|
+
subject.encode(buf, f)
|
84
|
+
buf.must_equal("TEST ")
|
74
85
|
end
|
75
86
|
end
|
76
87
|
|
77
88
|
describe Codec::Binary do
|
78
|
-
subject { Codec::Binary.new(
|
89
|
+
subject { Codec::Binary.new(8) }
|
79
90
|
before do
|
80
91
|
@unpack_buffer = "ABCDEF0123456789"
|
81
92
|
@bin_buffer = [@unpack_buffer].pack("H*")
|
93
|
+
@computed_f = Codec::Field.new
|
82
94
|
@fbin = Codec::Field.new
|
83
95
|
@fbin.set_value(@unpack_buffer)
|
84
96
|
end
|
85
97
|
|
86
|
-
it "must be a codec" do
|
87
|
-
subject.must_be_instance_of(Codec::Binary)
|
88
|
-
end
|
89
|
-
|
90
98
|
it "must generate a field with computed value" do
|
91
|
-
subject.decode(@bin_buffer)
|
99
|
+
subject.decode(@bin_buffer,@computed_f)
|
100
|
+
@computed_f.get_value.must_equal(@unpack_buffer)
|
92
101
|
end
|
93
102
|
|
94
|
-
it "
|
95
|
-
subject.decode(@bin_buffer)
|
103
|
+
it "remaining buffer must be empty" do
|
104
|
+
subject.decode(@bin_buffer,@computed_f)
|
105
|
+
@bin_buffer.must_be_empty
|
96
106
|
end
|
97
107
|
|
98
108
|
it "must regenerate corresponding buffer" do
|
99
|
-
|
109
|
+
buf = ""
|
110
|
+
subject.encode(buf, @fbin)
|
111
|
+
buf.must_equal(@bin_buffer)
|
100
112
|
end
|
101
113
|
end
|
data/test/lib/codec/pckd_test.rb
CHANGED
@@ -1,71 +1,67 @@
|
|
1
1
|
require_relative '../../test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
# No more required encode return the field length for upper codec layer
|
4
|
+
# describe Codec::Packed do
|
5
|
+
# subject { Codec::Packed.new(6) }
|
6
|
+
#
|
7
|
+
# it "must retrieve field length" do
|
8
|
+
# f_pck = Codec::Field.new
|
9
|
+
# f_pck.set_value(123)
|
10
|
+
# subject.get_length(@f_pck).must_equal(6)
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# end
|
5
14
|
|
6
|
-
|
7
|
-
|
8
|
-
@f_pck.set_value("123")
|
9
|
-
end
|
10
|
-
|
11
|
-
it "must be a codec" do
|
12
|
-
subject.must_be_instance_of(Codec::Packed)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "must retrieve field length" do
|
16
|
-
subject.get_length(@f_pck).must_equal(6)
|
17
|
-
end
|
18
|
-
|
19
|
-
end
|
20
|
-
|
21
|
-
describe Codec::Numpck do
|
22
|
-
subject { Codec::Numpck.new('Test',5) }
|
15
|
+
describe "Numeric packed" do
|
16
|
+
subject { Codec::Packed.new(5) }
|
23
17
|
|
24
18
|
before do
|
25
19
|
@f12 = Codec::Field.new
|
26
20
|
@f12.set_value(12)
|
21
|
+
@f = Codec::Field.new
|
27
22
|
@pck_buff = ["000012"].pack("H*")
|
28
23
|
end
|
29
24
|
|
30
|
-
it "must be a codec" do
|
31
|
-
subject.must_be_instance_of(Codec::Numpck)
|
32
|
-
end
|
33
|
-
|
34
25
|
it "must generate a field with computed value" do
|
35
|
-
subject.decode(@pck_buff)
|
26
|
+
subject.decode(@pck_buff,@f)
|
27
|
+
@f.get_value.must_equal(12)
|
36
28
|
end
|
37
29
|
|
38
|
-
it "must
|
39
|
-
subject.decode(@pck_buff)
|
30
|
+
it "remaining buffer must be empty" do
|
31
|
+
subject.decode(@pck_buff,@f)
|
32
|
+
@pck_buff.must_be_empty
|
40
33
|
end
|
41
34
|
|
42
35
|
it "must generate a field with computed value" do
|
43
|
-
|
36
|
+
buf=""
|
37
|
+
subject.encode(buf, @f12)
|
38
|
+
buf.must_equal(@pck_buff)
|
44
39
|
end
|
45
40
|
end
|
46
41
|
|
47
|
-
describe
|
48
|
-
subject { Codec::
|
42
|
+
describe "Packed rigth padded with F" do
|
43
|
+
subject { Codec::Packed.new(11,false,true,true) }
|
49
44
|
before do
|
50
45
|
@unpack_buffer = "497011D9010"
|
51
46
|
@bin_buffer = [@unpack_buffer + "F"].pack("H*")
|
52
47
|
@fbin = Codec::Field.new
|
53
48
|
@fbin.set_value(@unpack_buffer)
|
54
|
-
|
55
|
-
|
56
|
-
it "must be a codec" do
|
57
|
-
subject.must_be_instance_of(Codec::Strpck)
|
49
|
+
@f = Codec::Field.new
|
58
50
|
end
|
59
51
|
|
60
52
|
it "must generate a field with computed value" do
|
61
|
-
subject.decode(@bin_buffer)
|
53
|
+
subject.decode(@bin_buffer,@f)
|
54
|
+
@f.get_value.upcase.must_equal(@unpack_buffer)
|
62
55
|
end
|
63
56
|
|
64
|
-
it "
|
65
|
-
subject.decode(@bin_buffer)
|
57
|
+
it "remaining buffer must be empty" do
|
58
|
+
subject.decode(@bin_buffer,@f)
|
59
|
+
@bin_buffer.must_be_empty
|
66
60
|
end
|
67
61
|
|
68
62
|
it "must regenerate corresponding buffer" do
|
69
|
-
|
63
|
+
buf = ""
|
64
|
+
subject.encode(buf, @fbin)
|
65
|
+
buf.must_equal(@bin_buffer)
|
70
66
|
end
|
71
67
|
end
|