|
27 | 27 | import static org.junit.Assert.assertTrue; |
28 | 28 | import static org.junit.Assert.fail; |
29 | 29 |
|
| 30 | +import static org.junit.Assert.assertThrows; |
| 31 | +import static quickfix.DataDictionaryTest.getDictionary; |
| 32 | + |
30 | 33 | import java.math.BigDecimal; |
31 | 34 | import java.time.LocalDateTime; |
32 | 35 | import java.time.ZoneOffset; |
|
120 | 123 | import quickfix.fix44.ExecutionReport; |
121 | 124 | import quickfix.fix44.IndicationOfInterest; |
122 | 125 | import quickfix.fix44.Logon; |
| 126 | +import quickfix.fix44.NewOrderMultileg; |
123 | 127 | import quickfix.fix44.Logon.NoMsgTypes; |
124 | 128 | import quickfix.fix44.NewOrderCross; |
125 | 129 | import quickfix.fix44.NewOrderSingle.NoPartyIDs; |
@@ -1445,6 +1449,66 @@ public void testValidateFieldsOutOfOrderPreFIXT11() throws Exception { |
1445 | 1449 | assertEquals(tcrOrdered.toString(), tcrUnOrdered.toString()); |
1446 | 1450 | } |
1447 | 1451 |
|
| 1452 | + @Test |
| 1453 | + public void testFirstFieldInGroupIsDelimiter() throws Exception { |
| 1454 | + |
| 1455 | + final DataDictionary dataDictionary = new DataDictionary(getDictionary()); |
| 1456 | + ValidationSettings validationSettings = new ValidationSettings(); |
| 1457 | + |
| 1458 | + String fixMsg = "8=FIX.4.4\u00019=688\u000135=AB\u000149=AAA\u000156=BBB\u000134=21133\u000150=ABCABC" + |
| 1459 | + "\u000152=20230905-13:24:37.022\u000155=AAPL\u00011=ACC1\u000111=123456abcedf\u000121=1\u000138=5\u000154=1\u000140=2\u000144=-0.8" + |
| 1460 | + "\u000159=0\u000160=20230905-13:24:36.984\u0001100=ALGO\u0001167=MLEG\u0001555=3\u0001602=111\u0001600=AAA" + |
| 1461 | + "\u0001602=222\u0001654=231\u0001600=BBB\u0001602=333\u0001654=332\u0001600=CCC\u000158=TEXT\u000110=168\u0001"; |
| 1462 | + |
| 1463 | + String byDictFixMsg = "8=FIX.4.4\u00019=688\u000135=AB\u000149=AAA\u000156=BBB\u000134=21133\u000150=ABCABC" + |
| 1464 | + "\u000152=20230905-13:24:37.022\u000155=AAPL\u00011=ACC1\u000111=123456abcedf\u000121=1\u000138=5\u000154=1\u000140=2\u000144=-0.8" + |
| 1465 | + "\u000159=0\u000160=20230905-13:24:36.984\u0001100=ALGO\u0001167=MLEG\u0001555=3\u0001600=AAA\u0001602=111" + |
| 1466 | + "\u0001600=BBB\u0001602=222\u0001654=231\u0001600=CCC\u0001602=333\u0001654=332\u000158=TEXT\u000110=168\u0001"; |
| 1467 | + |
| 1468 | + validationSettings.setFirstFieldInGroupIsDelimiter(true); |
| 1469 | + validationSettings.setCheckUnorderedGroupFields(false); |
| 1470 | + final NewOrderMultileg noml1 = new NewOrderMultileg(); |
| 1471 | + noml1.fromString(fixMsg, dataDictionary, validationSettings, true); |
| 1472 | + dataDictionary.validate(noml1, validationSettings); |
| 1473 | + assertTrue(noml1.hasGroup(555)); |
| 1474 | + assertEquals(3, noml1.getGroupCount(555)); |
| 1475 | + //when firstFieldInGroupIsDelimiter = true and setCheckUnorderedGroupFields = false - valid |
| 1476 | + //delimiter should be first tag in group |
| 1477 | + assertEquals(602, noml1.getGroup(1, 555).delim()); |
| 1478 | + |
| 1479 | + validationSettings.setFirstFieldInGroupIsDelimiter(false); |
| 1480 | + validationSettings.setCheckUnorderedGroupFields(false); |
| 1481 | + final NewOrderMultileg noml2 = new NewOrderMultileg(); |
| 1482 | + noml2.fromString(fixMsg, dataDictionary, validationSettings, true); |
| 1483 | + //when firstFieldInGroupIsDelimiter = false and setCheckUnorderedGroupFields = false - exception is thrown |
| 1484 | + assertThrows(FieldException.class, () -> dataDictionary.validate(noml2, validationSettings)); |
| 1485 | + |
| 1486 | + validationSettings.setFirstFieldInGroupIsDelimiter(false); |
| 1487 | + validationSettings.setCheckUnorderedGroupFields(true); |
| 1488 | + final NewOrderMultileg noml3 = new NewOrderMultileg(); |
| 1489 | + noml3.fromString(fixMsg, dataDictionary, validationSettings, true); |
| 1490 | + //when firstFieldInGroupIsDelimiter = false and setCheckUnorderedGroupFields = true - exception is thrown |
| 1491 | + assertThrows(FieldException.class, () -> dataDictionary.validate(noml3, validationSettings)); |
| 1492 | + |
| 1493 | + validationSettings.setFirstFieldInGroupIsDelimiter(true); |
| 1494 | + validationSettings.setCheckUnorderedGroupFields(true); |
| 1495 | + final NewOrderMultileg noml4 = new NewOrderMultileg(); |
| 1496 | + noml4.fromString(fixMsg, dataDictionary, validationSettings, true); |
| 1497 | + //when firstFieldInGroupIsDelimiter = true and setCheckUnorderedGroupFields = true - exception is thrown, since order of tags is incorrect. |
| 1498 | + assertThrows(FieldException.class, () -> dataDictionary.validate(noml4, validationSettings)); |
| 1499 | + |
| 1500 | + validationSettings.setFirstFieldInGroupIsDelimiter(true); |
| 1501 | + validationSettings.setCheckUnorderedGroupFields(true); |
| 1502 | + final NewOrderMultileg noml5 = new NewOrderMultileg(); |
| 1503 | + noml5.fromString(byDictFixMsg, dataDictionary, validationSettings, true); |
| 1504 | + //when firstFieldInGroupIsDelimiter = true and setCheckUnorderedGroupFields = true, message aligns with dictionary - do NOT fail |
| 1505 | + dataDictionary.validate(noml5, validationSettings); |
| 1506 | + assertTrue(noml5.hasGroup(555)); |
| 1507 | + assertEquals(3, noml5.getGroupCount(555)); |
| 1508 | + //delimiter should be dictionary first tag = 600 |
| 1509 | + assertEquals(600, noml5.getGroup(1, 555).delim()); |
| 1510 | + } |
| 1511 | + |
1448 | 1512 | private void assertHeaderField(Message message, String expectedValue, int field) |
1449 | 1513 | throws FieldNotFound { |
1450 | 1514 | assertEquals(expectedValue, message.getHeader().getString(field)); |
|
0 commit comments