cordawyn-iso8583 0.1.2
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/AUTHORS +2 -0
- data/CHANGELOG +5 -0
- data/LICENSE +21 -0
- data/README +27 -0
- data/Rakefile +127 -0
- data/TODO +10 -0
- data/lib/berlin.rb +82 -0
- data/lib/bitmap.rb +117 -0
- data/lib/codec.rb +189 -0
- data/lib/exception.rb +4 -0
- data/lib/field.rb +90 -0
- data/lib/fields.rb +148 -0
- data/lib/iso8583.rb +12 -0
- data/lib/message.rb +417 -0
- data/lib/util.rb +94 -0
- data/test/BitmapTests.rb +80 -0
- data/test/message_test.rb +163 -0
- data/test/test_codec.rb +97 -0
- data/test/test_fields.rb +188 -0
- data/test/test_util.rb +32 -0
- metadata +91 -0
data/lib/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/test/BitmapTests.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'lib/iso8583'
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
include ISO8583
|
5
|
+
|
6
|
+
class BitmapTests < Test::Unit::TestCase
|
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]
|
22
|
+
|
23
|
+
assert_raises(ISO8583Exception) {b.set 1000 }
|
24
|
+
assert_raises(ISO8583Exception) { b.set 1 }
|
25
|
+
assert_raises(ISO8583Exception) { b.set -1 }
|
26
|
+
end
|
27
|
+
|
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
|
34
|
+
|
35
|
+
def test_parse_bmp
|
36
|
+
# 0000000001001001001001001001001001001001001001001001001001000000
|
37
|
+
# generated by: 10.step(60,3) {|i| mp.set(i)}
|
38
|
+
|
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
|
+
}
|
45
|
+
|
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
|
55
|
+
|
56
|
+
def test_parse_rest
|
57
|
+
tst = "\x00\x49\x24\x92\x49\x24\x92\x40\x31\x32\x33\x34"
|
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
|
+
}
|
63
|
+
assert_equal("1234", rest)
|
64
|
+
end
|
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
|
+
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'lib/iso8583'
|
2
|
+
require 'lib/berlin'
|
3
|
+
require 'test/unit'
|
4
|
+
|
5
|
+
include ISO8583
|
6
|
+
|
7
|
+
class MessageTest < Test::Unit::TestCase
|
8
|
+
def test_create_empty
|
9
|
+
mes = BerlinMessage.new
|
10
|
+
mes.mti = 1100
|
11
|
+
pan = 474747474747
|
12
|
+
mes.pan = pan
|
13
|
+
assert_equal pan, mes.pan
|
14
|
+
assert_equal pan, mes[2]
|
15
|
+
assert_equal pan, mes["Primary Account Number (PAN)"]
|
16
|
+
assert_equal "1100@\000\000\000\000\000\000\00012474747474747", mes.to_b
|
17
|
+
|
18
|
+
mes = BerlinMessage.new
|
19
|
+
mes.mti = "Authorization Request Response Issuer Gateway"
|
20
|
+
pan = 474747474747
|
21
|
+
mes[2] = pan
|
22
|
+
assert_equal pan, mes.pan
|
23
|
+
assert_equal pan, mes[2]
|
24
|
+
assert_equal pan, mes["Primary Account Number (PAN)"]
|
25
|
+
assert_equal "1110@\000\000\000\000\000\000\00012474747474747", mes.to_b
|
26
|
+
|
27
|
+
mes = BerlinMessage.new
|
28
|
+
mes.mti = 1420
|
29
|
+
pan = 474747474747
|
30
|
+
mes["Primary Account Number (PAN)"] = pan
|
31
|
+
assert_equal pan, mes.pan
|
32
|
+
assert_equal pan, mes[2]
|
33
|
+
assert_equal pan, mes["Primary Account Number (PAN)"]
|
34
|
+
assert_equal "1420@\000\000\000\000\000\000\00012474747474747", mes.to_b
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_parse
|
38
|
+
pan = 474747474747
|
39
|
+
|
40
|
+
assert_raises(ISO8583Exception) {
|
41
|
+
mes = BerlinMessage.parse "@\000\000\000\000\000\000\00012474747474747"
|
42
|
+
}
|
43
|
+
mes = BerlinMessage.parse "1430@\000\000\000\000\000\000\00012474747474747"
|
44
|
+
assert_equal pan, mes.pan
|
45
|
+
assert_equal 1430, mes.mti
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_to_s
|
49
|
+
mes = BerlinMessage.new
|
50
|
+
mes.mti = "Network Management Request Response Issuer Gateway or Acquirer Gateway"
|
51
|
+
mes[2] = 12341234
|
52
|
+
mes[3] = 1111
|
53
|
+
mes[4] = 100
|
54
|
+
mes[6] = 101
|
55
|
+
mes[7] = "0808120000"
|
56
|
+
mes[10] = 100
|
57
|
+
mes[11] = 0
|
58
|
+
mes[12] = "740808120000"
|
59
|
+
mes[14] = "1010"
|
60
|
+
mes[22] = "POSDATACODE"
|
61
|
+
mes[23] = 0
|
62
|
+
mes[24] = 1
|
63
|
+
mes[25] = 90
|
64
|
+
mes[26] = 4444
|
65
|
+
mes[30] = 150
|
66
|
+
mes[32] = 321321
|
67
|
+
mes[35] = ";123123123=123?5"
|
68
|
+
mes[37] = "123 123"
|
69
|
+
mes[38] = "90"
|
70
|
+
mes[39] = 90
|
71
|
+
mes[41] = "TermLoc!"
|
72
|
+
mes[42] = "ID Code!"
|
73
|
+
mes[43] = "Card Acceptor Name Location"
|
74
|
+
mes[49] = "840"
|
75
|
+
mes[51] = 978
|
76
|
+
mes[52] = '\x00\x01\x02\x03'
|
77
|
+
mes[53] = '\x07\x06\x05\x04'
|
78
|
+
mes[54] = "No additional amount"
|
79
|
+
mes[55] = '\x07\x06\x05\x04'
|
80
|
+
mes[56] = 88888888888
|
81
|
+
mes[59] = "I'm you're private data, data for money..."
|
82
|
+
mes[64] = "\xF0\xF0\xF0\xF0"
|
83
|
+
|
84
|
+
expected = <<-END
|
85
|
+
MTI:1814 (Network Management Request Response Issuer Gateway or Acquirer Gateway)
|
86
|
+
|
87
|
+
002 Primary Account Number (PAN) : 12341234
|
88
|
+
003 Processing Code : 1111
|
89
|
+
004 Amount (Transaction) : 100
|
90
|
+
006 Amount, Cardholder Billing : 101
|
91
|
+
007 Date and Time, Transmission : 0808120000
|
92
|
+
010 Conversion Rate, Cardholder Billing : 100
|
93
|
+
011 System Trace Audit Number (STAN) : 0
|
94
|
+
012 Date and Time, Local Transaction : 740808120000
|
95
|
+
014 Date, Expiration : 1010
|
96
|
+
022 POS Data Code : POSDATACODE
|
97
|
+
023 Card Sequence Number : 0
|
98
|
+
024 Function Code : 1
|
99
|
+
025 Message Reason Code : 90
|
100
|
+
026 Card Acceptor Business Code : 4444
|
101
|
+
030 Amounts, Original : 150
|
102
|
+
032 Acquiring Institution Identification Code : 321321
|
103
|
+
035 Track 2 Data : ;123123123=123?5
|
104
|
+
037 Retrieval Reference Number : 123 123
|
105
|
+
038 Approval Code : 90
|
106
|
+
039 Action Code : 90
|
107
|
+
041 Card Acceptor Terminal Identification : TermLoc!
|
108
|
+
042 Card Acceptor Identification Code : ID Code!
|
109
|
+
043 Card Acceptor Name/Location : Card Acceptor Name Location
|
110
|
+
049 Currency Code, Transaction : 840
|
111
|
+
051 Currency Code, Cardholder Billing : 978
|
112
|
+
052 Personal Identification Number (PIN) Data : \\x00\\x01\\x02\\x03
|
113
|
+
053 Security Related Control Information : \\x07\\x06\\x05\\x04
|
114
|
+
054 Amounts, Additional : No additional amount
|
115
|
+
055 Integrated Circuit Card (ICC) System Related Data : \\x07\\x06\\x05\\x04
|
116
|
+
056 Original Data Elements : 88888888888
|
117
|
+
059 Additional Data - Private : I'm you're private data, data for money...
|
118
|
+
064 Message Authentication Code (MAC) Field : \360\360\360\360
|
119
|
+
END
|
120
|
+
assert_equal expected, mes.to_s
|
121
|
+
end
|
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"
|
158
|
+
|
159
|
+
bytes = mes.to_b
|
160
|
+
mes2 = BerlinMessage.parse(mes.to_b)
|
161
|
+
assert_equal(mes.to_b, mes2.to_b)
|
162
|
+
end
|
163
|
+
end
|
data/test/test_codec.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'lib/iso8583'
|
3
|
+
|
4
|
+
include ISO8583
|
5
|
+
|
6
|
+
class FieldTest < Test::Unit::TestCase
|
7
|
+
def test_MMDDhhmmssCodec
|
8
|
+
dt = MMDDhhmmssCodec.decode "1212121212"
|
9
|
+
assert_equal DateTime, dt.class
|
10
|
+
assert_equal 12, dt.month
|
11
|
+
assert_equal 12, dt.day
|
12
|
+
assert_equal 12, dt.hour
|
13
|
+
assert_equal 12, dt.min
|
14
|
+
assert_equal 12, dt.sec
|
15
|
+
|
16
|
+
assert_raise(ISO8583Exception) {
|
17
|
+
dt = MMDDhhmmssCodec.decode "1312121212"
|
18
|
+
}
|
19
|
+
|
20
|
+
assert_raise(ISO8583Exception) {
|
21
|
+
dt = MMDDhhmmssCodec.encode "1312121212"
|
22
|
+
}
|
23
|
+
|
24
|
+
assert_equal "1212121212", MMDDhhmmssCodec.encode("1212121212")
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_YYMMDDhhmmssCodec
|
28
|
+
dt = YYMMDDhhmmssCodec.decode "081212121212"
|
29
|
+
assert_equal DateTime, dt.class
|
30
|
+
assert_equal 2008, dt.year
|
31
|
+
assert_equal 12, dt.month
|
32
|
+
assert_equal 12, dt.day
|
33
|
+
assert_equal 12, dt.hour
|
34
|
+
assert_equal 12, dt.min
|
35
|
+
assert_equal 12, dt.sec
|
36
|
+
|
37
|
+
assert_raise(ISO8583Exception) {
|
38
|
+
dt = YYMMDDhhmmssCodec.decode "091312121212"
|
39
|
+
}
|
40
|
+
|
41
|
+
assert_raise(ISO8583Exception) {
|
42
|
+
dt = YYMMDDhhmmssCodec.encode "091312121212"
|
43
|
+
}
|
44
|
+
|
45
|
+
assert_equal "091212121212", YYMMDDhhmmssCodec.encode("091212121212")
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_YYMMCodec
|
49
|
+
dt = YYMMCodec.decode "0812"
|
50
|
+
assert_equal DateTime, dt.class
|
51
|
+
assert_equal 2008, dt.year
|
52
|
+
assert_equal 12, dt.month
|
53
|
+
|
54
|
+
assert_raise(ISO8583Exception) {
|
55
|
+
dt = YYMMCodec.decode "0913"
|
56
|
+
}
|
57
|
+
|
58
|
+
assert_raise(ISO8583Exception) {
|
59
|
+
dt = YYMMCodec.encode "0913"
|
60
|
+
}
|
61
|
+
|
62
|
+
assert_equal "0912", YYMMCodec.encode("0912")
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_AN_Codec
|
66
|
+
assert_raise(ISO8583Exception) {
|
67
|
+
dt = AN_Codec.encode "!!!"
|
68
|
+
}
|
69
|
+
assert_equal "bla", AN_Codec.encode("bla")
|
70
|
+
assert_equal "bla", AN_Codec.decode("bla")
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_Track2_Codec
|
74
|
+
assert_raise(ISO8583Exception) {
|
75
|
+
dt = Track2.encode "!!!"
|
76
|
+
}
|
77
|
+
assert_raise(ISO8583Exception) {
|
78
|
+
dt = Track2.encode ";12312312=123?5"
|
79
|
+
}
|
80
|
+
assert_equal ";123123123=123?5", Track2.encode(";123123123=123?5")
|
81
|
+
assert_equal ";123123123=123?5", Track2.decode(";123123123=123?5")
|
82
|
+
end
|
83
|
+
|
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
|
97
|
+
end
|
data/test/test_fields.rb
ADDED
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'lib/iso8583'
|
3
|
+
|
4
|
+
include ISO8583
|
5
|
+
|
6
|
+
class FieldTest < Test::Unit::TestCase
|
7
|
+
def test_LLL
|
8
|
+
value, rest = LLL.parse "123456"
|
9
|
+
assert_equal 123, value
|
10
|
+
assert_equal "456", rest
|
11
|
+
|
12
|
+
assert_raise(ISO8583ParseException) {
|
13
|
+
l,rest = LLL.parse "12"
|
14
|
+
}
|
15
|
+
|
16
|
+
enc = LLL.encode 123
|
17
|
+
assert_equal "\x31\x32\x33", enc
|
18
|
+
|
19
|
+
enc = LLL.encode "123"
|
20
|
+
assert_equal "\x31\x32\x33", enc
|
21
|
+
|
22
|
+
enc = LLL.encode 12
|
23
|
+
assert_equal "\x30\x31\x32", enc
|
24
|
+
|
25
|
+
#enc = LLL.encode "012"
|
26
|
+
#assert_equal "\x30\x31\x32", enc
|
27
|
+
|
28
|
+
|
29
|
+
assert_raise(ISO8583Exception) {
|
30
|
+
enc = LLL.encode 1234
|
31
|
+
}
|
32
|
+
|
33
|
+
assert_raise(ISO8583Exception) {
|
34
|
+
enc = LLL.encode "1234"
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_LL_BCD
|
39
|
+
value, rest = LL_BCD.parse "\x123456"
|
40
|
+
assert_equal 12, value
|
41
|
+
assert_equal "3456", rest
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_LLVAR_N
|
45
|
+
value, rest = LLVAR_N.parse "021234"
|
46
|
+
assert_equal 12, value
|
47
|
+
assert_equal "34", rest
|
48
|
+
|
49
|
+
value, rest = LLLVAR_N.parse "0041234"
|
50
|
+
assert_equal 1234, value
|
51
|
+
assert_equal "", rest
|
52
|
+
assert_raise(ISO8583ParseException) {
|
53
|
+
l,rest = LLLVAR_N.parse "12"
|
54
|
+
}
|
55
|
+
assert_raise(ISO8583ParseException) {
|
56
|
+
l,rest = LLVAR_N.parse "12123"
|
57
|
+
}
|
58
|
+
|
59
|
+
enc = LLVAR_N.encode 1234
|
60
|
+
assert_equal "041234", enc
|
61
|
+
|
62
|
+
enc = LLVAR_N.encode 123412341234
|
63
|
+
assert_equal "12123412341234", enc
|
64
|
+
|
65
|
+
assert_raise(ISO8583Exception) {
|
66
|
+
enc = LLVAR_N.encode "1234ABCD"
|
67
|
+
}
|
68
|
+
|
69
|
+
enc = LLLVAR_N.encode "123412341234"
|
70
|
+
assert_equal "012123412341234", enc
|
71
|
+
|
72
|
+
assert_raise(ISO8583Exception) {
|
73
|
+
enc = LLLVAR_N.encode "1234ABCD"
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_LLVAR_Z
|
78
|
+
value, rest = LLVAR_Z.parse "16;123123123=123?5"+"021234"
|
79
|
+
assert_equal ";123123123=123?5", value
|
80
|
+
assert_equal "021234", rest
|
81
|
+
|
82
|
+
value, rest = LLVAR_Z.parse "16;123123123=123?5"
|
83
|
+
assert_equal ";123123123=123?5", value
|
84
|
+
assert_equal "", rest
|
85
|
+
assert_raise(ISO8583ParseException) {
|
86
|
+
l,rest = LLVAR_Z.parse "12"
|
87
|
+
}
|
88
|
+
assert_raise(ISO8583ParseException) {
|
89
|
+
l,rest = LLVAR_Z.parse "17;123123123=123?5"
|
90
|
+
}
|
91
|
+
|
92
|
+
enc = LLVAR_Z.encode ";123123123=123?5"
|
93
|
+
assert_equal "16;123123123=123?5", enc
|
94
|
+
|
95
|
+
|
96
|
+
assert_raise(ISO8583Exception) {
|
97
|
+
enc = LLVAR_Z.encode "1234ABCD"
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_AN
|
102
|
+
fld = AN.dup
|
103
|
+
fld.length = 3
|
104
|
+
value, rest = fld.parse "1234"
|
105
|
+
assert_equal "123", value
|
106
|
+
assert_equal "4", rest
|
107
|
+
|
108
|
+
assert_raise(ISO8583ParseException) {
|
109
|
+
fld.parse "12"
|
110
|
+
}
|
111
|
+
|
112
|
+
assert_raise(ISO8583Exception) {
|
113
|
+
fld.encode "888810"
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_ANP
|
118
|
+
fld = ANP.dup
|
119
|
+
fld.length = 3
|
120
|
+
value, rest = fld.parse "1234"
|
121
|
+
assert_equal "123", value
|
122
|
+
assert_equal "4", rest
|
123
|
+
|
124
|
+
assert_raise(ISO8583ParseException) {
|
125
|
+
fld.parse "12"
|
126
|
+
}
|
127
|
+
|
128
|
+
assert_equal "10 ", fld.encode("10")
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_ANS
|
132
|
+
fld = ANS.dup
|
133
|
+
fld.length = 3
|
134
|
+
value, rest = fld.parse "1234"
|
135
|
+
assert_equal "123", value
|
136
|
+
assert_equal "4", rest
|
137
|
+
|
138
|
+
assert_raise(ISO8583ParseException) {
|
139
|
+
fld.parse "12"
|
140
|
+
}
|
141
|
+
|
142
|
+
assert_equal "10 ", fld.encode("10")
|
143
|
+
assert_equal ["1!", "a"], fld.parse("1! a")
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_B
|
147
|
+
fld = B.dup
|
148
|
+
fld.length = 3
|
149
|
+
value, rest = fld.parse "\000234"
|
150
|
+
assert_equal "\00023", value
|
151
|
+
assert_equal "4", rest
|
152
|
+
|
153
|
+
assert_raise(ISO8583ParseException) {
|
154
|
+
fld.parse "12"
|
155
|
+
}
|
156
|
+
|
157
|
+
assert_equal "10\000", fld.encode("10")
|
158
|
+
assert_equal ["1! ", "a"], fld.parse("1! a")
|
159
|
+
assert_equal ["1!", ""], fld.parse("1!\000")
|
160
|
+
end
|
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
|
188
|
+
end
|