// Path: core/src/main/java/fixio/fixprotocol/FixMessageImpl.java
// public class FixMessageImpl implements FixMessage {
// 
//     private final FixMessageHeader header = new FixMessageHeader();
//     private final FixMessageTrailer trailer = new FixMessageTrailer();
//     private final List<FixMessageFragment> body = new ArrayList<>();
// 
//     public FixMessageImpl add(int tagNum, byte[] value) {
//         return add(tagNum, value, 0, value.length);
//     }
// 
//     public FixMessageImpl addBody(int tagNum, String value) {
//         body.add(new StringField(tagNum, value));
//         return this;
//     }
// 
//     public FixMessageImpl addBody(GroupField group) {
//         body.add(group);
//         return this;
//     }
// 
//     public FixMessageImpl add(int tagNum, byte[] value, int offset, int length) {
//         assert (tagNum > 0) : "TagNum must be positive. Got " + tagNum;
//         assert (value != null) : "Value must be specified.";
//         AbstractField field = FieldFactory.valueOf(tagNum, value, offset, length);
//         FieldType fieldType = FieldType.forTag(tagNum);
//         switch (fieldType) {
//             case BeginString:
//                 header.setBeginString(((StringField) field).getValue().intern());
//                 break;
//             case CheckSum:
//                 int checksum = (value[offset] - '0') * 100 + (value[offset + 1] - '0') * 10 + (value[offset + 2] - '0');
//                 trailer.setCheckSum(checksum);
//                 break;
//             case SenderCompID:
//                 header.setSenderCompID(((StringField) field).getValue());
//                 break;
//             case TargetCompID:
//                 header.setTargetCompID(((StringField) field).getValue());
//                 break;
//             case MsgSeqNum:
//                 header.setMsgSeqNum(((IntField) field).intValue());
//                 break;
//             case MsgType:
//                 header.setMessageType(((StringField) field).getValue().intern());
//                 break;
//             default:
//                 body.add(field);
//                 break;
//         }
//         return this;
//     }
// 
//     @Override
//     public List<FixMessageFragment> getBody() {
//         return body;
//     }
// 
//     @Override
//     public String getString(int tagNum) {
//         FixMessageFragment item = getFirst(tagNum);
//         if (item == null) {
//             return null;
//         }
//         if (item instanceof StringField) {
//             return ((StringField) item).getValue();
//         } else {
//             throw new IllegalArgumentException("Tag " + tagNum + " is not a Field.");
//         }
//     }
// 
//     @SuppressWarnings("unchecked")
//     @Override
//     public <T> T getValue(FieldType fieldType) {
//         return getValue(fieldType.tag());
//     }
// 
//     @SuppressWarnings("unchecked")
//     @Override
//     public <T> T getValue(int tagNum) {
//         FixMessageFragment field = getFirst(tagNum);
//         if (field instanceof AbstractField) {
//             return (T) field.getValue();
//         }
//         return null;
//     }
// 
//     @Override
//     public String getString(FieldType field) {
//         return getString(field.tag());
//     }
// 
//     @Override
//     public Character getChar(FieldType fieldType) {
//         return getChar(fieldType.tag());
//     }
// 
//     @Override
//     public Character getChar(int tagNum) {
//         FixMessageFragment field = getFirst(tagNum);
//         if (field == null) {
//             return null;
//         }
//         if (field instanceof CharField) {
//             return ((CharField) field).getValue();
//         } else {
//             throw new IllegalArgumentException("Tag " + tagNum + " is not a Field.");
//         }
//     }
// 
//     @Override
//     public Integer getInt(int tagNum) {
//         FixMessageFragment field = getFirst(tagNum);
//         if (field instanceof IntField) {
//             return ((IntField) field).getValue();
//         }
//         return null;
//     }
// 
//     @Override
//     public Integer getInt(FieldType field) {
//         return getInt(field.tag());
//     }
// 
//     @Override
//     public FixMessageHeader getHeader() {
//         return header;
//     }
// 
//     public int getMsgSeqNum() {
//         return header.getMsgSeqNum();
//     }
// 
//     @Override
//     public String getMessageType() {
//         return header.getMessageType();
//     }
// 
//     public void setMessageType(String messageType) {
//         header.setMessageType(messageType);
//     }
// 
//     public int getChecksum() {
//         return trailer.getCheckSum();
//     }
// 
//     public List<Group> getGroups(int tagNum) {
//         FixMessageFragment fragment = getFirst(tagNum);
//         if (fragment instanceof GroupField) {
//             return ((GroupField) fragment).getGroups();
//         }
//         return null;
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder(512);
//         final String sp = System.getProperty("line.separator");
//         sb.append(sp);
//         sb.append("header{").append(header).append("}").append(sp);
//         sb.append("body{").append(body).append("}").append(sp);
//         sb.append("trailer{").append(trailer).append('}').append(sp);
//         return sb.toString();
//     }
// }


import fixio.fixprotocol.FixMessageImpl;
import io.netty.buffer.Unpooled;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
package fixio.netty.codec;



public class DecodingTestHelper {

    private static String normalizeMessage(String source) {
        return source.replace('|', '\u0001');
    }

    public static List<Object> decode(String message, FixMessageDecoder decoder)  {
        String[] tags = normalizeMessage(message).split("\u0001");

        List<Object> result = new ArrayList<>();
        for (String tag : tags) {
            decoder.decode(null, Unpooled.wrappedBuffer(tag.getBytes(StandardCharsets.US_ASCII)), result);
        }
        return result;
    }

// Path: core/src/main/java/fixio/fixprotocol/FixMessageImpl.java
// public class FixMessageImpl implements FixMessage {
// 
//     private final FixMessageHeader header = new FixMessageHeader();
//     private final FixMessageTrailer trailer = new FixMessageTrailer();
//     private final List<FixMessageFragment> body = new ArrayList<>();
// 
//     public FixMessageImpl add(int tagNum, byte[] value) {
//         return add(tagNum, value, 0, value.length);
//     }
// 
//     public FixMessageImpl addBody(int tagNum, String value) {
//         body.add(new StringField(tagNum, value));
//         return this;
//     }
// 
//     public FixMessageImpl addBody(GroupField group) {
//         body.add(group);
//         return this;
//     }
// 
//     public FixMessageImpl add(int tagNum, byte[] value, int offset, int length) {
//         assert (tagNum > 0) : "TagNum must be positive. Got " + tagNum;
//         assert (value != null) : "Value must be specified.";
//         AbstractField field = FieldFactory.valueOf(tagNum, value, offset, length);
//         FieldType fieldType = FieldType.forTag(tagNum);
//         switch (fieldType) {
//             case BeginString:
//                 header.setBeginString(((StringField) field).getValue().intern());
//                 break;
//             case CheckSum:
//                 int checksum = (value[offset] - '0') * 100 + (value[offset + 1] - '0') * 10 + (value[offset + 2] - '0');
//                 trailer.setCheckSum(checksum);
//                 break;
//             case SenderCompID:
//                 header.setSenderCompID(((StringField) field).getValue());
//                 break;
//             case TargetCompID:
//                 header.setTargetCompID(((StringField) field).getValue());
//                 break;
//             case MsgSeqNum:
//                 header.setMsgSeqNum(((IntField) field).intValue());
//                 break;
//             case MsgType:
//                 header.setMessageType(((StringField) field).getValue().intern());
//                 break;
//             default:
//                 body.add(field);
//                 break;
//         }
//         return this;
//     }
// 
//     @Override
//     public List<FixMessageFragment> getBody() {
//         return body;
//     }
// 
//     @Override
//     public String getString(int tagNum) {
//         FixMessageFragment item = getFirst(tagNum);
//         if (item == null) {
//             return null;
//         }
//         if (item instanceof StringField) {
//             return ((StringField) item).getValue();
//         } else {
//             throw new IllegalArgumentException("Tag " + tagNum + " is not a Field.");
//         }
//     }
// 
//     @SuppressWarnings("unchecked")
//     @Override
//     public <T> T getValue(FieldType fieldType) {
//         return getValue(fieldType.tag());
//     }
// 
//     @SuppressWarnings("unchecked")
//     @Override
//     public <T> T getValue(int tagNum) {
//         FixMessageFragment field = getFirst(tagNum);
//         if (field instanceof AbstractField) {
//             return (T) field.getValue();
//         }
//         return null;
//     }
// 
//     @Override
//     public String getString(FieldType field) {
//         return getString(field.tag());
//     }
// 
//     @Override
//     public Character getChar(FieldType fieldType) {
//         return getChar(fieldType.tag());
//     }
// 
//     @Override
//     public Character getChar(int tagNum) {
//         FixMessageFragment field = getFirst(tagNum);
//         if (field == null) {
//             return null;
//         }
//         if (field instanceof CharField) {
//             return ((CharField) field).getValue();
//         } else {
//             throw new IllegalArgumentException("Tag " + tagNum + " is not a Field.");
//         }
//     }
// 
//     @Override
//     public Integer getInt(int tagNum) {
//         FixMessageFragment field = getFirst(tagNum);
//         if (field instanceof IntField) {
//             return ((IntField) field).getValue();
//         }
//         return null;
//     }
// 
//     @Override
//     public Integer getInt(FieldType field) {
//         return getInt(field.tag());
//     }
// 
//     @Override
//     public FixMessageHeader getHeader() {
//         return header;
//     }
// 
//     public int getMsgSeqNum() {
//         return header.getMsgSeqNum();
//     }
// 
//     @Override
//     public String getMessageType() {
//         return header.getMessageType();
//     }
// 
//     public void setMessageType(String messageType) {
//         header.setMessageType(messageType);
//     }
// 
//     public int getChecksum() {
//         return trailer.getCheckSum();
//     }
// 
//     public List<Group> getGroups(int tagNum) {
//         FixMessageFragment fragment = getFirst(tagNum);
//         if (fragment instanceof GroupField) {
//             return ((GroupField) fragment).getGroups();
//         }
//         return null;
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder(512);
//         final String sp = System.getProperty("line.separator");
//         sb.append(sp);
//         sb.append("header{").append(header).append("}").append(sp);
//         sb.append("body{").append(body).append("}").append(sp);
//         sb.append("trailer{").append(trailer).append('}').append(sp);
//         return sb.toString();
//     }
// }


// Path: core/src/test/java/fixio/netty/codec/DecodingTestHelper.java
import fixio.fixprotocol.FixMessageImpl;
import io.netty.buffer.Unpooled;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

package fixio.netty.codec;



public class DecodingTestHelper {

    private static String normalizeMessage(String source) {
        return source.replace('|', '\u0001');
    }

    public static List<Object> decode(String message, FixMessageDecoder decoder)  {
        String[] tags = normalizeMessage(message).split("\u0001");

        List<Object> result = new ArrayList<>();
        for (String tag : tags) {
            decoder.decode(null, Unpooled.wrappedBuffer(tag.getBytes(StandardCharsets.US_ASCII)), result);
        }
        return result;
    }

    public static FixMessageImpl decodeOne(String message, FixMessageDecoder decoder) {