fix_spec 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/CONTRIBUTION_GUIDELINES.md +22 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +81 -0
- data/LICENSE.txt +14 -0
- data/QUICKFIX_LICENSE.txt +46 -0
- data/README.md +181 -0
- data/Rakefile +35 -0
- data/VERSION +1 -0
- data/features/builder.feature +148 -0
- data/features/equivalence.feature +52 -0
- data/features/equivalence_data_dictionary.feature +166 -0
- data/features/memory.feature +47 -0
- data/features/message_type.feature +25 -0
- data/features/nested_builder.feature +63 -0
- data/features/paths.feature +14 -0
- data/features/step_definitions/steps.rb +3 -0
- data/features/support/FIX42.xml +2670 -0
- data/features/support/env.rb +20 -0
- data/fix_spec.gemspec +89 -0
- data/lib/fix_spec/builder.rb +99 -0
- data/lib/fix_spec/configuration.rb +16 -0
- data/lib/fix_spec/cucumber.rb +76 -0
- data/lib/fix_spec/helpers.rb +98 -0
- data/lib/fix_spec/matchers/be_fix_eql.rb +45 -0
- data/lib/fix_spec/matchers/have_fix_path.rb +29 -0
- data/lib/fix_spec/matchers.rb +18 -0
- data/lib/fix_spec.rb +10 -0
- data/spec/fix_spec/helpers_spec.rb +114 -0
- data/spec/spec_helper.rb +13 -0
- metadata +194 -0
@@ -0,0 +1,166 @@
|
|
1
|
+
@with_data_dictionary
|
2
|
+
Feature: Equivalence with data dictionary
|
3
|
+
|
4
|
+
When configured with a data dictionary, cucumber steps can accept richer, type specific fix parameters and values
|
5
|
+
|
6
|
+
Scenario: All these checks are acceptable
|
7
|
+
Given the following unvalidated fix message:
|
8
|
+
"""
|
9
|
+
8=FIX.4.235=849=ITG56=SILO205=4315=86=100.25410=50.25424=23.45411=Y43=N40=15=N
|
10
|
+
"""
|
11
|
+
When I get the fix message
|
12
|
+
|
13
|
+
Then the FIX at "SenderCompID" should be "ITG"
|
14
|
+
Then the fix at tag "SenderCompID" should be "ITG"
|
15
|
+
Then the fix message at "SenderCompID" should be "ITG"
|
16
|
+
And the FIX at "SenderCompID" should not be "blah"
|
17
|
+
And the fix message at tag "SenderCompID" should be:
|
18
|
+
"""
|
19
|
+
"ITG"
|
20
|
+
"""
|
21
|
+
|
22
|
+
And the fix message at tag "SenderCompID" should not be:
|
23
|
+
"""
|
24
|
+
"NOT ITG"
|
25
|
+
"""
|
26
|
+
|
27
|
+
Scenario: Identical Fix as JSON
|
28
|
+
Given the following unvalidated fix message:
|
29
|
+
"""
|
30
|
+
8=FIX.4.235=849=ITG56=SILO205=4315=86=100.25410=50.25424=23.45411=Y43=N40=15=N
|
31
|
+
"""
|
32
|
+
When I get the fix message
|
33
|
+
|
34
|
+
Then the FIX message should be:
|
35
|
+
"""
|
36
|
+
{
|
37
|
+
"BeginString":"FIX.4.2",
|
38
|
+
"BodyLength":81,
|
39
|
+
"MsgType":"ExecutionReport",
|
40
|
+
"SenderCompID":"ITG",
|
41
|
+
"TargetCompID":"SILO",
|
42
|
+
"MaturityDay":4,
|
43
|
+
"DayOrderQty": 23.45,
|
44
|
+
"ExchangeForPhysical": true,
|
45
|
+
"AvgPx": 100.25,
|
46
|
+
"OrdType": "MARKET",
|
47
|
+
"PossDupFlag": false,
|
48
|
+
"AdvTransType": "NEW",
|
49
|
+
"UnderlyingPutOrCall": 8,
|
50
|
+
"WtAverageLiquidity": 50.25,
|
51
|
+
"CheckSum":"083"
|
52
|
+
}
|
53
|
+
"""
|
54
|
+
|
55
|
+
@ignore_length_and_checksum
|
56
|
+
Scenario: Identical Fix as JSON, ignoring length and checksum
|
57
|
+
Given the following unvalidated fix message:
|
58
|
+
"""
|
59
|
+
8=FIX.4.235=849=ITG56=SILO205=4315=86=100.25410=50.25424=23.45411=Y43=N40=15=N
|
60
|
+
"""
|
61
|
+
When I get the fix message
|
62
|
+
|
63
|
+
|
64
|
+
Then the FIX message should be:
|
65
|
+
"""
|
66
|
+
{
|
67
|
+
"BeginString":"FIX.4.2",
|
68
|
+
"MsgType":"ExecutionReport",
|
69
|
+
"SenderCompID":"ITG",
|
70
|
+
"TargetCompID":"SILO",
|
71
|
+
"MaturityDay":4,
|
72
|
+
"DayOrderQty": 23.45,
|
73
|
+
"ExchangeForPhysical": true,
|
74
|
+
"AvgPx": 100.25,
|
75
|
+
"OrdType": "MARKET",
|
76
|
+
"PossDupFlag": false,
|
77
|
+
"AdvTransType": "NEW",
|
78
|
+
"UnderlyingPutOrCall": 8,
|
79
|
+
"WtAverageLiquidity": 50.25
|
80
|
+
}
|
81
|
+
"""
|
82
|
+
|
83
|
+
Scenario: Identical Fix as raw FIX.
|
84
|
+
Given the following unvalidated fix message:
|
85
|
+
"""
|
86
|
+
8=FIX.4.235=849=ITG56=SILO205=4315=86=100.25410=50.25424=23.45411=Y43=N40=15=N
|
87
|
+
"""
|
88
|
+
When I get the fix message
|
89
|
+
|
90
|
+
|
91
|
+
Then the FIX message should be:
|
92
|
+
"""
|
93
|
+
8=FIX.4.235=849=ITG56=SILO205=4315=86=100.25410=50.25424=23.45411=Y43=N40=15=N
|
94
|
+
"""
|
95
|
+
|
96
|
+
Scenario Outline: Types values are type specific
|
97
|
+
Given the following unvalidated fix message:
|
98
|
+
"""
|
99
|
+
8=FIX.4.235=849=ITG56=SILO205=4315=86=100.25410=50.25424=23.45411=Y43=N40=15=N
|
100
|
+
"""
|
101
|
+
When I get the fix message
|
102
|
+
|
103
|
+
|
104
|
+
Then the FIX at tag "<TAG>" should be <VALUE>
|
105
|
+
|
106
|
+
Examples: Enumerations
|
107
|
+
| TAG | VALUE |
|
108
|
+
| OrdType | "MARKET" |
|
109
|
+
| AdvTransType | "NEW" |
|
110
|
+
|
111
|
+
Examples: MsgType -doesn't map to DD description
|
112
|
+
| MsgType | "ExecutionReport"|
|
113
|
+
|
114
|
+
Examples: STRING
|
115
|
+
| TAG | VALUE |
|
116
|
+
| SenderCompID | "ITG" |
|
117
|
+
|
118
|
+
Examples: INT
|
119
|
+
| TAG | VALUE |
|
120
|
+
|UnderlyingPutOrCall | 8 |
|
121
|
+
|
122
|
+
Examples: DAYOFMONTH
|
123
|
+
| TAG | VALUE |
|
124
|
+
|MaturityDay | 4 |
|
125
|
+
|
126
|
+
Examples: FLOAT and derivative types can accept many different formats
|
127
|
+
| TAG | VALUE |
|
128
|
+
| AvgPx | 100.25|
|
129
|
+
| AvgPx | 100.25000|
|
130
|
+
| AvgPx | 100.25e0|
|
131
|
+
| AvgPx | 100.25e+0|
|
132
|
+
| AvgPx | 100.25e-0|
|
133
|
+
| AvgPx | 1.0025e+2|
|
134
|
+
|
135
|
+
Examples: PRICE
|
136
|
+
| TAG | VALUE |
|
137
|
+
|AvgPx | 100.25 |
|
138
|
+
|
139
|
+
Examples: FLOAT
|
140
|
+
| TAG | VALUE |
|
141
|
+
|WtAverageLiquidity | 50.25 |
|
142
|
+
|
143
|
+
Examples: QTY
|
144
|
+
| TAG | VALUE |
|
145
|
+
|DayOrderQty | 23.45 |
|
146
|
+
|
147
|
+
Examples: BOOLEAN
|
148
|
+
| TAG | VALUE |
|
149
|
+
|PossDupFlag | false |
|
150
|
+
|ExchangeForPhysical | true |
|
151
|
+
|
152
|
+
|
153
|
+
Scenario: Table Format
|
154
|
+
Given the following unvalidated fix message:
|
155
|
+
"""
|
156
|
+
8=FIX.4.235=849=ITG56=SILO205=4315=86=100.25410=50.25424=23.45411=Y43=N40=15=N
|
157
|
+
"""
|
158
|
+
When I get the fix message
|
159
|
+
|
160
|
+
|
161
|
+
Then the fix should have the following:
|
162
|
+
| SenderCompID | "ITG" |
|
163
|
+
| BeginString | "FIX.4.2" |
|
164
|
+
| MaturityDay | 4 |
|
165
|
+
| UnderlyingPutOrCall | 8 |
|
166
|
+
| AvgPx | 100.25 |
|
@@ -0,0 +1,47 @@
|
|
1
|
+
@with_data_dictionary @ignore_length_and_checksum
|
2
|
+
Feature: Memory
|
3
|
+
|
4
|
+
Background:
|
5
|
+
|
6
|
+
Given the following fix message:
|
7
|
+
"""
|
8
|
+
8=FIX.4.235=849=ITG56=SILO44=1250.25
|
9
|
+
"""
|
10
|
+
|
11
|
+
When I get the fix message
|
12
|
+
|
13
|
+
Scenario: Entire FIX message
|
14
|
+
When I keep the FIX message as "FIX1"
|
15
|
+
Then the FIX message should be %{FIX1}
|
16
|
+
And the FIX message should be:
|
17
|
+
"""
|
18
|
+
%{FIX1}
|
19
|
+
"""
|
20
|
+
|
21
|
+
Scenario: String header field
|
22
|
+
When I keep the FIX message at tag "MsgType" as "MSGTYPE"
|
23
|
+
Then the FIX message at "MsgType" should be %{MSGTYPE}
|
24
|
+
And the FIX message should be:
|
25
|
+
"""
|
26
|
+
{
|
27
|
+
"MsgType": %{MSGTYPE},
|
28
|
+
"SenderCompID": "ITG",
|
29
|
+
"TargetCompID": "SILO",
|
30
|
+
"BeginString": "FIX.4.2",
|
31
|
+
"Price": 1250.25
|
32
|
+
}
|
33
|
+
"""
|
34
|
+
|
35
|
+
Scenario: Numerical body field
|
36
|
+
When I keep the FIX message at tag "Price" as "PRICE"
|
37
|
+
Then the FIX message at "Price" should be %{PRICE}
|
38
|
+
And the FIX message should be:
|
39
|
+
"""
|
40
|
+
{
|
41
|
+
"MsgType": "ExecutionReport",
|
42
|
+
"SenderCompID": "ITG",
|
43
|
+
"TargetCompID": "SILO",
|
44
|
+
"BeginString": "FIX.4.2",
|
45
|
+
"Price": %{PRICE}
|
46
|
+
}
|
47
|
+
"""
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Feature: Message Type
|
2
|
+
|
3
|
+
Scenario: the FIX message type should be...
|
4
|
+
Given the following unvalidated fix message:
|
5
|
+
"""
|
6
|
+
8=FIX.4.435=B49=TR_Initiator52=20090101-17:13:06.68456=TR_Acceptor61=033=158=uno58=dos148=abc
|
7
|
+
"""
|
8
|
+
When I get the fix message
|
9
|
+
Then the FIX message type should be "B"
|
10
|
+
|
11
|
+
Scenario: The FIX message type should not be...
|
12
|
+
Given the following unvalidated fix message:
|
13
|
+
"""
|
14
|
+
8=FIX.4.435=B49=TR_Initiator52=20090101-17:13:06.68456=TR_Acceptor61=033=158=uno58=dos148=abc
|
15
|
+
"""
|
16
|
+
When I get the fix message
|
17
|
+
Then the FIX message type should not be "A"
|
18
|
+
|
19
|
+
@with_data_dictionary
|
20
|
+
Scenario: With Data Dictionary loaded, message type is pretty string
|
21
|
+
"""
|
22
|
+
8=FIX.4.435=B49=TR_Initiator52=20090101-17:13:06.68456=TR_Acceptor61=033=158=uno58=dos148=abc
|
23
|
+
"""
|
24
|
+
When I get the fix message
|
25
|
+
Then the FIX message type should be "News"
|
@@ -0,0 +1,63 @@
|
|
1
|
+
@with_data_dictionary
|
2
|
+
Feature: Building Fix Messages with repeating groups from raw fix
|
3
|
+
|
4
|
+
@ignore_length_and_checksum
|
5
|
+
Scenario: Building fix message with 2 instances in a repeated group
|
6
|
+
Given the following fix message:
|
7
|
+
"""
|
8
|
+
8=FIX.4.235=B49=ITG56=SILO148=Market Bulls Have Short Sellers on the Run33=258=The bears have been cowed by the bulls.58=Buy buy buy354=043=N40=15=N
|
9
|
+
"""
|
10
|
+
When I get the fix message
|
11
|
+
|
12
|
+
Then the FIX message should be:
|
13
|
+
"""
|
14
|
+
{
|
15
|
+
"BeginString":"FIX.4.2",
|
16
|
+
"MsgType":"News",
|
17
|
+
"PossDupFlag":false,
|
18
|
+
"SenderCompID":"ITG",
|
19
|
+
"TargetCompID":"SILO",
|
20
|
+
"Headline":"Market Bulls Have Short Sellers on the Run",
|
21
|
+
"LinesOfText":[
|
22
|
+
{
|
23
|
+
"Text":"The bears have been cowed by the bulls."
|
24
|
+
},
|
25
|
+
{
|
26
|
+
"Text":"Buy buy buy",
|
27
|
+
"EncodedTextLen":0
|
28
|
+
}
|
29
|
+
]
|
30
|
+
}
|
31
|
+
"""
|
32
|
+
|
33
|
+
|
34
|
+
@ignore_length_and_checksum
|
35
|
+
Scenario: Building fix message with repeating groups in repeating groups
|
36
|
+
Given the following fix message:
|
37
|
+
"""
|
38
|
+
8=FIX.4.235=i49=ITG56=SILO117=ITG_SILO_MASS_QUOTE_001296=1302=Qset001311=JDSU304=1295=1299=Qset001_Q001
|
39
|
+
"""
|
40
|
+
When I get the fix message
|
41
|
+
|
42
|
+
Then the FIX message should be:
|
43
|
+
"""
|
44
|
+
{
|
45
|
+
"BeginString":"FIX.4.2",
|
46
|
+
"MsgType":"MassQuote",
|
47
|
+
"SenderCompID":"ITG",
|
48
|
+
"TargetCompID":"SILO",
|
49
|
+
"QuoteID":"ITG_SILO_MASS_QUOTE_001",
|
50
|
+
"NoQuoteSets":[
|
51
|
+
{
|
52
|
+
"QuoteSetID":"Qset001",
|
53
|
+
"UnderlyingSymbol":"JDSU",
|
54
|
+
"TotQuoteEntries":1,
|
55
|
+
"NoQuoteEntries":[
|
56
|
+
{
|
57
|
+
"QuoteEntryID":"Qset001_Q001"
|
58
|
+
}
|
59
|
+
]
|
60
|
+
}
|
61
|
+
]
|
62
|
+
}
|
63
|
+
"""
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Feature: Paths
|
2
|
+
|
3
|
+
Background:
|
4
|
+
|
5
|
+
Given the following unvalidated fix message:
|
6
|
+
"""
|
7
|
+
8=FIX.4.235=849=ITG56=SILO
|
8
|
+
"""
|
9
|
+
|
10
|
+
When I get the fix message
|
11
|
+
|
12
|
+
Scenario: BasePaths
|
13
|
+
Then the fix should have tag "35"
|
14
|
+
And the fix should not have tag "50"
|