codec 0.0.12 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|