public void Format()
        {
            FormatterContext formatterContext = new FormatterContext(
                FormatterContext.DefaultBufferSize);
            Message value = new Message();

            value.Formatter = GetFormatter(_fixedMessageFormatter);
            value.Fields.Add(1, "HE");
            value.Fields.Add(2, "LLO");

            InnerMessageField field = new InnerMessageField(37, value);

            InnerMessageFieldFormatter formatter;
            string formattedData;

            // Test fixed length formatting.
            formatter = new InnerMessageFieldFormatter(37,
                                                       new FixedLengthManager(5), BinaryEncoder.GetInstance(),
                                                       GetFormatter(_fixedMessageFormatter));

            formatter.Format(field, ref formatterContext);
            formattedData = formatterContext.GetDataAsString();
            Assert.IsTrue(formattedData.Equals("HELLO"));

            formatterContext.Clear();
            formatter = new InnerMessageFieldFormatter(37,
                                                       new FixedLengthManager(4), BinaryEncoder.GetInstance(),
                                                       GetFormatter(_fixedMessageFormatter));
            try {
                formatter.Format(field, ref formatterContext);
                Assert.Fail();
            }
            catch (ArgumentOutOfRangeException e) {
                Assert.IsTrue(e.ParamName.Equals("dataLength"));
            }

            // Test variable length formatting.
            formatterContext.Clear();
            formatter = new InnerMessageFieldFormatter(48, new VariableLengthManager(0,
                                                                                     999, StringLengthEncoder.GetInstance(999)),
                                                       BinaryEncoder.GetInstance(), GetFormatter(_fixedMessageFormatter));
            formatter.Format(field, ref formatterContext);
            formattedData = formatterContext.GetDataAsString();
            Assert.IsTrue(formattedData.Equals("005HELLO"));
            formatterContext.Clear();
            formatter.Format(new InnerMessageField(35, null), ref formatterContext);
            formattedData = formatterContext.GetDataAsString();
            Assert.IsTrue(formattedData.Equals("000"));
        }
        public void Constructors()
        {
            // Test fixed length properties.
            InnerMessageFieldFormatter formatter = new InnerMessageFieldFormatter(37,
                                                                                  new FixedLengthManager(12), BinaryEncoder.GetInstance(),
                                                                                  GetFormatter(_fixedMessageFormatter), "My formatter");

            Assert.IsTrue(formatter.FieldNumber == 37);
            Assert.IsTrue(formatter.LengthManager.MaximumLength == 12);
            Assert.IsTrue(formatter.Description.Equals("My formatter"));
            Assert.IsTrue(formatter.Encoder == BinaryEncoder.GetInstance());

            // Test variable length properties.
            formatter = new InnerMessageFieldFormatter(63, new VariableLengthManager(1, 800,
                                                                                     StringLengthEncoder.GetInstance(5)), BinaryEncoder.GetInstance(),
                                                       GetFormatter(_fixedMessageFormatter));

            Assert.IsTrue(formatter.FieldNumber == 63);
            Assert.IsTrue(formatter.LengthManager.MaximumLength == 800);
            Assert.IsTrue(formatter.Description.Equals(string.Empty));
            Assert.IsTrue(formatter.Encoder == BinaryEncoder.GetInstance());
        }
        public void Parse()
        {
            ParserContext parseContext = new ParserContext(
                ParserContext.DefaultBufferSize);
            InnerMessageField          field;
            InnerMessageFieldFormatter formatter;

            parseContext.Write("HELLO0512345005ABCDE00");

            // Test fixed length parse.
            formatter = new InnerMessageFieldFormatter(37, new FixedLengthManager(5),
                                                       BinaryEncoder.GetInstance(), GetFormatter(_fixedMessageFormatter));
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNotNull(field);
            parseContext.ResetDecodedLength();
            Assert.IsTrue(field.ToString() == "1:HE,2:LLO");

            // Test variable length parse.
            formatter = new InnerMessageFieldFormatter(48, new VariableLengthManager(1, 20,
                                                                                     StringLengthEncoder.GetInstance(99)), BinaryEncoder.GetInstance(),
                                                       GetFormatter(_fixedMessageFormatter), string.Empty);
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNotNull(field);
            parseContext.ResetDecodedLength();
            Assert.IsTrue(field.ToString() == "1:12,2:345");

            formatter = new InnerMessageFieldFormatter(48, new VariableLengthManager(1,
                                                                                     999, StringLengthEncoder.GetInstance(999)), BinaryEncoder.GetInstance(),
                                                       GetFormatter(_fixedMessageFormatter));
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNotNull(field);
            parseContext.ResetDecodedLength();
            Assert.IsTrue(field.ToString() == "1:AB,2:CDE");

            // Test partial variable length parse.
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNull(field);
            parseContext.Write("5HOU");
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNull(field);
            parseContext.Write("SE");
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNotNull(field);
            parseContext.ResetDecodedLength();
            Assert.IsTrue(field.ToString() == "1:HO,2:USE");

            // Test partial fixed.
            formatter = new InnerMessageFieldFormatter(37, new FixedLengthManager(5),
                                                       BinaryEncoder.GetInstance(), GetFormatter(_fixedMessageFormatter));
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNull(field);
            parseContext.Write("34 ");
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNull(field);
            parseContext.Write("56");
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNotNull(field);
            parseContext.ResetDecodedLength();
            Assert.IsTrue(field.ToString() == "1:34,2: 56");

            // Test variable length header with zero length.
            formatter = new InnerMessageFieldFormatter(48, new VariableLengthManager(0,
                                                                                     999, StringLengthEncoder.GetInstance(999)), BinaryEncoder.GetInstance(),
                                                       GetFormatter(_fixedMessageFormatter));
            parseContext.Write("000");
            field = ( InnerMessageField )formatter.Parse(ref parseContext);
            Assert.IsNotNull(field);
            parseContext.ResetDecodedLength();
            Assert.IsNull(field.Value);
        }