iso8583 0.1.1 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/8583/util.rb ADDED
@@ -0,0 +1,94 @@
1
+ # Copyright 2009 by Tim Becker (tim.becker@kuriostaet.de)
2
+ # MIT License, for details, see the LICENSE file accompaning
3
+ # this distribution
4
+
5
+ module ISO8583
6
+
7
+ # general utilities
8
+ #
9
+ # Convert a String of bytes to their hex representation
10
+ # E.g.:
11
+ #
12
+ # b2hex "\x12\x34\xab" => "1234AB"
13
+ #
14
+ def b2hex(byte_string)
15
+ r = byte_string.unpack("H*")[0]
16
+ r.length > 1 ? r : " "
17
+ end
18
+
19
+ #
20
+ # Convert a String containing hex data to
21
+ # a String containing the corresponding bytes:
22
+ #
23
+ # hex2b "abcd12" => "\xa\cd\12"
24
+ #
25
+ def hex2b(hex_string)
26
+ string = hex_string.gsub(/\s+/, "")
27
+ raise ISO8583Exception.new("Invalid Hex chars: #{hex_string}") unless string =~ /^[A-Fa-f0-9]*$/
28
+ raise ISO8583Exception.new("Uneven number of Hex chars #{hex_string}") unless ( (string.length % 2) == 0)
29
+ [string].pack("H*")
30
+ end
31
+
32
+ def _conv(str, mapping)
33
+ _str = ""
34
+ str.each_byte{|byte|
35
+ _str << mapping[byte]
36
+ }
37
+ _str
38
+ end
39
+
40
+ #
41
+ # Convert a String of ASCII chars to EBCDIC
42
+ #
43
+ def ascii2ebcdic(ascii)
44
+ _conv(ascii, US_ASCII2IBM037)
45
+ end
46
+
47
+ #
48
+ # Convert an EBCDIC String to ASCII
49
+ #
50
+ def ebcdic2ascii(ebcdic)
51
+ _conv(ebcdic, IBM0372US_ASCII)
52
+ end
53
+
54
+ # The charsets supported by iconv aren't guranteed. At the very least MACs don't support ebcdic,
55
+ # so providing rudimentary mappings here.
56
+ US_ASCII2IBM037 = [
57
+ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x15, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
58
+ 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
59
+ 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
60
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
61
+ 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
62
+ 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xba, 0xe0, 0xbb, 0xb0, 0x6d,
63
+ 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
64
+ 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x4f, 0xd0, 0xa1, 0x07,
65
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
66
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
67
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
68
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
69
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
70
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
71
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
72
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
73
+ ]
74
+
75
+ IBM0372US_ASCII = [
76
+ 0x00, 0x01, 0x02, 0x03, 0x3f, 0x09, 0x3f, 0x7f, 0x3f, 0x3f, 0x3f, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
77
+ 0x10, 0x11, 0x12, 0x13, 0x3f, 0x0a, 0x08, 0x3f, 0x18, 0x19, 0x3f, 0x3f, 0x1c, 0x1d, 0x1e, 0x1f,
78
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x0a, 0x17, 0x1b, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x05, 0x06, 0x07,
79
+ 0x3f, 0x3f, 0x16, 0x3f, 0x3f, 0x3f, 0x3f, 0x04, 0x3f, 0x3f, 0x3f, 0x3f, 0x14, 0x15, 0x3f, 0x1a,
80
+ 0x20, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x2e, 0x3c, 0x28, 0x2b, 0x7c,
81
+ 0x26, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x3f,
82
+ 0x2d, 0x2f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x2c, 0x25, 0x5f, 0x3e, 0x3f,
83
+ 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22,
84
+ 0x3f, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
85
+ 0x3f, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
86
+ 0x3f, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
87
+ 0x5e, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x5b, 0x5d, 0x3f, 0x3f, 0x3f, 0x3f,
88
+ 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
89
+ 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
90
+ 0x5c, 0x3f, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
91
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,
92
+ ]
93
+
94
+ end
data/lib/iso8583.rb CHANGED
@@ -1,9 +1,5 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
- require "field"
5
- require "codec"
6
- require "fields"
7
- require "exception"
8
- require "bitmap"
9
- require "message"
4
+
5
+ require '8583'
data/test/BitmapTests.rb CHANGED
@@ -1,68 +1,80 @@
1
1
  require 'lib/iso8583'
2
2
  require 'test/unit'
3
3
 
4
+ include ISO8583
5
+
4
6
  class BitmapTests < Test::Unit::TestCase
5
- def test_create_empty
6
- b = Bitmap.new
7
- assert_equal(b.to_s.size, 64, "proper length: 64")
8
- b.set(112)
9
- assert_equal(b.to_s.size, 128, "proper length: 128")
10
- assert_equal(b.to_s, "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000")
11
- b.unset(112)
12
- 5.step(20,2){|i| b.set(i)}
13
- assert(b.to_s.size==64, "proper length: 64")
14
- assert_equal(b.to_s, "0000101010101010101000000000000000000000000000000000000000000000")
15
- assert b[5]
16
- assert b[7]
17
- assert b[11]
18
- assert !b[12]
19
- assert !b[199]
7
+ def test_create_empty
8
+ b = Bitmap.new
9
+ assert_equal(b.to_s.size, 64, "proper length: 64")
10
+ b.set(112)
11
+ assert_equal(b.to_s.size, 128, "proper length: 128")
12
+ assert_equal(b.to_s, "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000")
13
+ b.unset(112)
14
+ 5.step(20,2){|i| b.set(i)}
15
+ assert(b.to_s.size==64, "proper length: 64")
16
+ assert_equal(b.to_s, "0000101010101010101000000000000000000000000000000000000000000000")
17
+ assert b[5]
18
+ assert b[7]
19
+ assert b[11]
20
+ assert !b[12]
21
+ assert !b[199]
20
22
 
21
- assert_raises(ISO8583Exception) {b.set 1000 }
22
- assert_raises(ISO8583Exception) { b.set 1 }
23
- assert_raises(ISO8583Exception) { b.set -1 }
24
-
25
-
26
-
27
- end
23
+ assert_raises(ISO8583Exception) {b.set 1000 }
24
+ assert_raises(ISO8583Exception) { b.set 1 }
25
+ assert_raises(ISO8583Exception) { b.set -1 }
26
+ end
28
27
 
29
- def test_out_of_bounds_errors
30
- b = Bitmap.new
31
- assert_raises(ISO8583Exception) {b.set 1000 }
32
- assert_raises(ISO8583Exception) { b.set 1 }
33
- assert_raises(ISO8583Exception) { b.set -1 }
34
- end
28
+ def test_out_of_bounds_errors
29
+ b = Bitmap.new
30
+ assert_raises(ISO8583Exception) {b.set 1000 }
31
+ assert_raises(ISO8583Exception) { b.set 1 }
32
+ assert_raises(ISO8583Exception) { b.set -1 }
33
+ end
35
34
 
36
- def test_parse_bmp
37
- # 0000000001001001001001001001001001001001001001001001001001000000
38
- # generated by: 10.step(60,3) {|i| mp.set(i)}
35
+ def test_parse_bmp
36
+ # 0000000001001001001001001001001001001001001001001001001001000000
37
+ # generated by: 10.step(60,3) {|i| mp.set(i)}
39
38
 
40
- tst = "\x00\x49\x24\x92\x49\x24\x92\x40"
41
- b = Bitmap.new tst
42
- 10.step(60,3) {|i|
43
- assert(b[i], "bit #{i} is not set.")
44
- assert(!b[i+i], "bit #{i+i} is set.")
45
- }
39
+ tst = "\x00\x49\x24\x92\x49\x24\x92\x40"
40
+ b = Bitmap.new tst
41
+ 10.step(60,3) {|i|
42
+ assert(b[i], "bit #{i} is not set.")
43
+ assert(!b[i+i], "bit #{i+i} is set.")
44
+ }
46
45
 
47
- #10000000000000000001000000100000010000001000000100000010000001000000100000010000001000000100000010000001000000100000010000001000
48
- # generated by: 20.step(128,7) {|i| mp.set(i)}
49
- tst = "\x80\x00\x10\x20\x40\x81\x02\x04\x08\x10\x20\x40\x81\x02\x04\x08"
50
- b = Bitmap.new tst
51
- 20.step(128,7) {|i|
52
- assert(b[i], "bit #{i} is not set. (128 bit map)")
53
- assert(!b[i+i], "bit #{i+i} is set. (128 bit map)")
54
- }
55
- end
46
+ #10000000000000000001000000100000010000001000000100000010000001000000100000010000001000000100000010000001000000100000010000001000
47
+ # generated by: 20.step(128,7) {|i| mp.set(i)}
48
+ tst = "\x80\x00\x10\x20\x40\x81\x02\x04\x08\x10\x20\x40\x81\x02\x04\x08"
49
+ b = Bitmap.new tst
50
+ 20.step(128,7) {|i|
51
+ assert(b[i], "bit #{i} is not set. (128 bit map)")
52
+ assert(!b[i+i], "bit #{i+i} is set. (128 bit map)")
53
+ }
54
+ end
56
55
 
57
56
  def test_parse_rest
58
57
  tst = "\x00\x49\x24\x92\x49\x24\x92\x40\x31\x32\x33\x34"
59
- b, rest = Bitmap.parse tst
60
- 10.step(60,3) {|i|
61
- assert(b[i], "bit #{i} is not set.")
62
- assert(!b[i+i], "bit #{i+i} is set.")
63
- }
58
+ b, rest = Bitmap.parse tst
59
+ 10.step(60,3) {|i|
60
+ assert(b[i], "bit #{i} is not set.")
61
+ assert(!b[i+i], "bit #{i+i} is set.")
62
+ }
64
63
  assert_equal("1234", rest)
65
64
  end
66
65
 
66
+ def test_each
67
+ bmp = Bitmap.new
68
+ bmp.set(2)
69
+ bmp.set(3)
70
+ bmp.set(5)
71
+ bmp.set(6)
72
+ arr = []
73
+ bmp.each{|bit|
74
+ arr.push bit
75
+ }
76
+ assert_equal [2,3,5,6], arr
77
+ end
78
+
67
79
  end
68
-
80
+
data/test/message_test.rb CHANGED
@@ -1,10 +1,12 @@
1
- require 'lib/iso8583'
2
- require 'lib/berlin'
1
+ require 'lib/8583'
2
+ require 'lib/8583/berlin'
3
3
  require 'test/unit'
4
4
 
5
+ include ISO8583
6
+
5
7
  class MessageTest < Test::Unit::TestCase
6
- def test_create_empty
7
- mes = BerlinMessage.new
8
+ def test_create_empty
9
+ mes = BerlinMessage.new
8
10
  mes.mti = 1100
9
11
  pan = 474747474747
10
12
  mes.pan = pan
@@ -30,15 +32,15 @@ class MessageTest < Test::Unit::TestCase
30
32
  assert_equal pan, mes[2]
31
33
  assert_equal pan, mes["Primary Account Number (PAN)"]
32
34
  assert_equal "1420@\000\000\000\000\000\000\00012474747474747", mes.to_b
33
- end
35
+ end
34
36
 
35
- def test_parse
37
+ def test_parse
36
38
  pan = 474747474747
37
39
 
38
- assert_raises(ISO8583Exception) {
39
- mes = BerlinMessage.parse "@\000\000\000\000\000\000\00012474747474747"
40
+ assert_raises(ISO8583Exception) {
41
+ mes = BerlinMessage.parse "@\000\000\000\000\000\000\00012474747474747"
40
42
  }
41
- mes = BerlinMessage.parse "1430@\000\000\000\000\000\000\00012474747474747"
43
+ mes = BerlinMessage.parse "1430@\000\000\000\000\000\000\00012474747474747"
42
44
  assert_equal pan, mes.pan
43
45
  assert_equal 1430, mes.mti
44
46
  end
@@ -118,7 +120,44 @@ END
118
120
  assert_equal expected, mes.to_s
119
121
  end
120
122
 
123
+ def test_round_trip
124
+ mes = BerlinMessage.new
125
+ mes.mti = "Network Management Request Response Issuer Gateway or Acquirer Gateway"
126
+ mes[2] = 12341234
127
+ mes[3] = 1111
128
+ mes[4] = 100
129
+ mes[6] = 101
130
+ mes[7] = "0808120000"
131
+ mes[10] = 100
132
+ mes[11] = 0
133
+ mes[12] = "740808120000"
134
+ mes[14] = "1010"
135
+ mes[22] = "POSDATACODE"
136
+ mes[23] = 0
137
+ mes[24] = 1
138
+ mes[25] = 90
139
+ mes[26] = 4444
140
+ mes[30] = 150
141
+ mes[32] = 321321
142
+ mes[35] = ";123123123=123?5"
143
+ mes[37] = "123 123"
144
+ mes[38] = "90"
145
+ mes[39] = 90
146
+ mes[41] = "TermLoc!"
147
+ mes[42] = "ID Code!"
148
+ mes[43] = "Card Acceptor Name Location"
149
+ mes[49] = "840"
150
+ mes[51] = 978
151
+ mes[52] = "\x00\x01\x02\x03"
152
+ mes[53] = "\x07\x06\x05\x04"
153
+ mes[54] = "No additional amount"
154
+ mes[55] = '\x07\x06\x05\x04'
155
+ mes[56] = 88888888888
156
+ mes[59] = "I'm you're private data, data for money..."
157
+ mes[64] = "\xF0\xF0\xF0\xF0"
121
158
 
122
-
159
+ bytes = mes.to_b
160
+ mes2 = BerlinMessage.parse(mes.to_b)
161
+ assert_equal(mes.to_b, mes2.to_b)
162
+ end
123
163
  end
124
-
data/test/test_codec.rb CHANGED
@@ -1,10 +1,9 @@
1
1
  require 'test/unit'
2
2
  require 'lib/iso8583'
3
3
 
4
- class FieldTest < Test::Unit::TestCase
5
-
6
-
4
+ include ISO8583
7
5
 
6
+ class FieldTest < Test::Unit::TestCase
8
7
  def test_MMDDhhmmssCodec
9
8
  dt = MMDDhhmmssCodec.decode "1212121212"
10
9
  assert_equal DateTime, dt.class
@@ -14,7 +13,6 @@ class FieldTest < Test::Unit::TestCase
14
13
  assert_equal 12, dt.min
15
14
  assert_equal 12, dt.sec
16
15
 
17
-
18
16
  assert_raise(ISO8583Exception) {
19
17
  dt = MMDDhhmmssCodec.decode "1312121212"
20
18
  }
@@ -36,7 +34,6 @@ class FieldTest < Test::Unit::TestCase
36
34
  assert_equal 12, dt.min
37
35
  assert_equal 12, dt.sec
38
36
 
39
-
40
37
  assert_raise(ISO8583Exception) {
41
38
  dt = YYMMDDhhmmssCodec.decode "091312121212"
42
39
  }
@@ -46,15 +43,14 @@ class FieldTest < Test::Unit::TestCase
46
43
  }
47
44
 
48
45
  assert_equal "091212121212", YYMMDDhhmmssCodec.encode("091212121212")
49
-
50
46
  end
47
+
51
48
  def test_YYMMCodec
52
49
  dt = YYMMCodec.decode "0812"
53
50
  assert_equal DateTime, dt.class
54
51
  assert_equal 2008, dt.year
55
52
  assert_equal 12, dt.month
56
53
 
57
-
58
54
  assert_raise(ISO8583Exception) {
59
55
  dt = YYMMCodec.decode "0913"
60
56
  }
@@ -64,7 +60,6 @@ class FieldTest < Test::Unit::TestCase
64
60
  }
65
61
 
66
62
  assert_equal "0912", YYMMCodec.encode("0912")
67
-
68
63
  end
69
64
 
70
65
  def test_AN_Codec
@@ -86,5 +81,17 @@ class FieldTest < Test::Unit::TestCase
86
81
  assert_equal ";123123123=123?5", Track2.decode(";123123123=123?5")
87
82
  end
88
83
 
89
-
84
+ def test_packed_codec
85
+ assert_equal "\x12", Packed_Number.encode(12)
86
+ assert_equal "\x12", Packed_Number.encode("12")
87
+ assert_equal "\x02", Packed_Number.encode("2")
88
+ assert_equal "\x02", Packed_Number.encode(2)
89
+ assert_equal "\x02\x55", Packed_Number.encode(0xff)
90
+ assert_raise(ISO8583Exception) {
91
+ dt = Packed_Number.encode ";12312312=123?5"
92
+ }
93
+ assert_raise(ISO8583Exception) {
94
+ dt = Packed_Number.encode "F"
95
+ }
96
+ end
90
97
  end
data/test/test_fields.rb CHANGED
@@ -1,10 +1,9 @@
1
1
  require 'test/unit'
2
2
  require 'lib/iso8583'
3
3
 
4
- class FieldTest < Test::Unit::TestCase
5
-
6
-
4
+ include ISO8583
7
5
 
6
+ class FieldTest < Test::Unit::TestCase
8
7
  def test_LLL
9
8
  value, rest = LLL.parse "123456"
10
9
  assert_equal 123, value
@@ -34,9 +33,12 @@ class FieldTest < Test::Unit::TestCase
34
33
  assert_raise(ISO8583Exception) {
35
34
  enc = LLL.encode "1234"
36
35
  }
37
-
38
-
36
+ end
39
37
 
38
+ def test_LL_BCD
39
+ value, rest = LL_BCD.parse "\x123456"
40
+ assert_equal 12, value
41
+ assert_equal "3456", rest
40
42
  end
41
43
 
42
44
  def test_LLVAR_N
@@ -70,9 +72,9 @@ class FieldTest < Test::Unit::TestCase
70
72
  assert_raise(ISO8583Exception) {
71
73
  enc = LLLVAR_N.encode "1234ABCD"
72
74
  }
73
-
74
75
  end
75
- def test_LLVAR_Z
76
+
77
+ def test_LLVAR_Z
76
78
  value, rest = LLVAR_Z.parse "16;123123123=123?5"+"021234"
77
79
  assert_equal ";123123123=123?5", value
78
80
  assert_equal "021234", rest
@@ -94,10 +96,6 @@ class FieldTest < Test::Unit::TestCase
94
96
  assert_raise(ISO8583Exception) {
95
97
  enc = LLVAR_Z.encode "1234ABCD"
96
98
  }
97
-
98
-
99
-
100
-
101
99
  end
102
100
 
103
101
  def test_AN
@@ -144,6 +142,7 @@ class FieldTest < Test::Unit::TestCase
144
142
  assert_equal "10 ", fld.encode("10")
145
143
  assert_equal ["1!", "a"], fld.parse("1! a")
146
144
  end
145
+
147
146
  def test_B
148
147
  fld = B.dup
149
148
  fld.length = 3
@@ -159,6 +158,31 @@ class FieldTest < Test::Unit::TestCase
159
158
  assert_equal ["1! ", "a"], fld.parse("1! a")
160
159
  assert_equal ["1!", ""], fld.parse("1!\000")
161
160
  end
162
-
163
-
161
+
162
+ def test_N_BCD
163
+ fld = N_BCD.dup
164
+ fld.length=3
165
+ value, rest = fld.parse "\x01\x23\x45"
166
+ assert_equal 123, value
167
+
168
+ assert_equal "\x01\x23", fld.encode(123)
169
+ assert_equal "\x01\x23", fld.encode("123")
170
+ assert_equal "\x01\x23", fld.encode("0123")
171
+
172
+ assert_raise(ISO8583Exception) {
173
+ fld.encode 12345
174
+ }
175
+
176
+ # There's a bug here. A 4 digit value encodes to 2 digits encoded,
177
+ # which passes the test for length ... This test doesn't pass:
178
+
179
+ #asssert_raise (ISO8583Exception) {
180
+ # fld.encode 1234
181
+ #}
182
+ end
183
+
184
+ def test_YYMMDDhhmmss
185
+ fld = YYMMDDhhmmss
186
+ assert_equal "740808120000", fld.encode("740808120000")
187
+ end
164
188
  end