示例#1
0
        public void Sequence()
        {
            int fieldsAffectedFromIndex;

            string metaFilePath = Path.Combine(DataFolder, SequenceMetaFileName);
            FtMeta meta         = FtMetaSerializer.Deserialize(metaFilePath);

            FtWriter writer = new FtWriter(meta, filePath);

            // root fields
            FtStringField   root1_StrConstField;
            FtDateTimeField root2_DateTimeField;
            FtIntegerField  root3_IntRedirField;
            FtDecimalField  level1_1_DecimalField;
            FtFloatField    level1_1_FloatRedirField;
            FtBooleanField  level1_Null_BooleanField;
            FtStringField   level1_1_StringField;
            FtDateTimeField level1_2_DateTimeField;
            //FtStringField level1_3_StringField;
            FtStringField level2_10_StringField;
            FtStringField level2_11_StringField;

            // in this case, root fields are never affected by redirects
            root1_StrConstField = writer.FieldList[Root1_StrConstFieldName] as FtStringField;
            root2_DateTimeField = writer.FieldList[Root2_DateTimeFieldName] as FtDateTimeField;
            root3_IntRedirField = writer.FieldList[Root3_IntRedirFieldName] as FtIntegerField;

            // Record 1 - no redirect
            root2_DateTimeField.Value = Record1_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record1_Root3IntRedirValue, out fieldsAffectedFromIndex);
            Assert.AreEqual(-1, fieldsAffectedFromIndex);
            Assert.AreEqual(Record1_FieldListCount, writer.FieldList.Count);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);
            writer.Write();

            Assert.AreEqual(1, writer.RecordCount);
            Assert.AreEqual(Record1_TableListCount, writer.TableCount);
            Assert.AreEqual(Record1_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 2 - no redirect
            root2_DateTimeField.Value = Record2_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record2_Root3IntRedirValue, out fieldsAffectedFromIndex);
            Assert.AreEqual(-1, fieldsAffectedFromIndex);
            Assert.AreEqual(Record2_FieldListCount, writer.FieldList.Count);
            Assert.AreEqual(Record2_SequenceInvokationListCount, writer.SequenceInvokationList.Count);
            writer.Write();

            Assert.AreEqual(2, writer.RecordCount);
            Assert.AreEqual(Record2_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 3 - root redirect 1
            root2_DateTimeField.Value = Record3_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record3_Root3IntRedirValue, out fieldsAffectedFromIndex);
            // redirect to level1_1 sequence
            {
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(Record3_FieldListCount, writer.FieldList.Count);
                Assert.AreEqual(Record3_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

                // remove redirection
                root3_IntRedirField.SetValue(20, out fieldsAffectedFromIndex);
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(Root_FieldListCount, writer.FieldList.Count);
                Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

                root3_IntRedirField.SetValue(Record3_Root3IntRedirValue, out fieldsAffectedFromIndex);
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(Record3_FieldListCount, writer.FieldList.Count);
                Assert.AreEqual(Record3_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

                level1_1_DecimalField    = writer.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = writer.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                level1_1_StringField     = writer.FieldList[Level1_1_StringFieldName] as FtStringField;

                level1_1_DecimalField.Value    = Record3_Level1_1_DecimalValue;
                level1_1_FloatRedirField.Value = Record3_Level1_1_FloatRedirValue;
                level1_1_StringField.Value     = Record3_Level1_1_StringValue;
            }
            writer.Write();

            Assert.AreEqual(3, writer.RecordCount);
            Assert.AreEqual(Record3_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 4 - root redirect 1
            root2_DateTimeField.Value = Record4_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record4_Root3IntRedirValue, out fieldsAffectedFromIndex);
            // redirect to level1_1 sequence
            {
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(Record4_FieldListCount, writer.FieldList.Count);
                Assert.AreEqual(Record4_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

                level1_1_DecimalField    = writer.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = writer.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                level1_1_StringField     = writer.FieldList[Level1_1_StringFieldName] as FtStringField;

                level1_1_DecimalField.Value    = Record4_Level1_1_DecimalValue;
                level1_1_FloatRedirField.Value = Record4_Level1_1_FloatRedirValue;
                level1_1_StringField.Value     = Record4_Level1_1_StringValue;
            }
            writer.Write();

            Assert.AreEqual(4, writer.RecordCount);
            Assert.AreEqual(Record4_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 5 - root redirect 1
            root2_DateTimeField.Value = Record5_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record5_Root3IntRedirValue, out fieldsAffectedFromIndex);
            // redirect to level1_1 sequence
            {
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(Record5_FieldListCount, writer.FieldList.Count);
                Assert.AreEqual(Record4_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

                level1_1_DecimalField    = writer.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = writer.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                level1_1_StringField     = writer.FieldList[Level1_1_StringFieldName] as FtStringField;

                level1_1_DecimalField.Value    = Record5_Level1_1_DecimalValue;
                level1_1_FloatRedirField.Value = Record5_Level1_1_FloatRedirValue;
                level1_1_StringField.Value     = Record5_Level1_1_StringValue;
            }
            writer.Write();

            Assert.AreEqual(5, writer.RecordCount);
            Assert.AreEqual(Record5_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 6 - root redirect Null
            root2_DateTimeField.Value = Record6_Root2DateTimeValue;
            root3_IntRedirField.SetNull(out fieldsAffectedFromIndex);
            // redirect to level1_Null sequence
            {
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(Record6_FieldListCount, writer.FieldList.Count);
                Assert.AreEqual(Record6_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

                level1_Null_BooleanField = writer.FieldList[Level1_Null_BooleanFieldName] as FtBooleanField;

                level1_Null_BooleanField.Value = Record6_level1_Null_BooleanValue;
            }
            writer.Write();

            Assert.AreEqual(6, writer.RecordCount);
            Assert.AreEqual(Record6_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 7 - root redirect 2
            root2_DateTimeField.Value = Record7_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record7_Root3IntRedirValue, out fieldsAffectedFromIndex);
            // redirect to level1_2 sequence
            {
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(Record7_FieldListCount, writer.FieldList.Count);
                Assert.AreEqual(Record7_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

                level1_2_DateTimeField = writer.FieldList[Level1_2_DateTimeFieldName] as FtDateTimeField;

                // leave it null
            }
            writer.Write();

            Assert.AreEqual(7, writer.RecordCount);
            Assert.AreEqual(Record7_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 8 - root redirect 1
            root2_DateTimeField.Value = Record8_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record8_Root3IntRedirValue, out fieldsAffectedFromIndex);
            // redirect to level1_1 sequence
            {
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(6, writer.FieldList.Count);
                Assert.AreEqual(2, writer.SequenceInvokationList.Count);

                level1_1_DecimalField    = writer.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = writer.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                level1_1_StringField     = writer.FieldList[Level1_1_StringFieldName] as FtStringField;

                level1_1_DecimalField.Value = Record8_Level1_1_DecimalValue;
                level1_1_FloatRedirField.SetValue(Record8_Level1_1_FloatRedirValue, out fieldsAffectedFromIndex); // redirect
                // redirect to Level2_10 sequence
                {
                    Assert.AreEqual(5, fieldsAffectedFromIndex);
                    Assert.AreEqual(Record8_FieldListCount, writer.FieldList.Count);
                    Assert.AreEqual(Record8_SequenceInvokationListCount, writer.SequenceInvokationList.Count);
                    Assert.AreEqual(-1, writer.FieldList.IndexOfName(Level1_1_StringFieldName)); // should have been discarded by Redirect

                    level2_10_StringField       = writer.FieldList[Level2_10_StringFieldName] as FtStringField;
                    level2_10_StringField.Value = Record8_level2_10_StringValue;
                }
            }
            writer.Write();

            Assert.AreEqual(8, writer.RecordCount);
            Assert.AreEqual(Record8_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 9 - root redirect 1
            root2_DateTimeField.Value = Record9_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record9_Root3IntRedirValue, out fieldsAffectedFromIndex);
            // redirect to level1_1 sequence
            {
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(6, writer.FieldList.Count);
                Assert.AreEqual(2, writer.SequenceInvokationList.Count);

                level1_1_DecimalField    = writer.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = writer.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                level1_1_StringField     = writer.FieldList[Level1_1_StringFieldName] as FtStringField;

                level1_1_DecimalField.Value = Record9_Level1_1_DecimalValue;
                level1_1_FloatRedirField.SetValue(Record9_Level1_1_FloatRedirValue, out fieldsAffectedFromIndex); // redirect
                // redirect to Level2_10 sequence
                {
                    Assert.AreEqual(5, fieldsAffectedFromIndex);
                    Assert.AreEqual(Record9_FieldListCount, writer.FieldList.Count);
                    Assert.AreEqual(Record9_SequenceInvokationListCount, writer.SequenceInvokationList.Count);
                    Assert.AreEqual(-1, writer.FieldList.IndexOfName(Level1_1_StringFieldName)); // should have been discarded by Redirect

                    level2_10_StringField       = writer.FieldList[Level2_10_StringFieldName] as FtStringField;
                    level2_10_StringField.Value = Record9_level2_10_StringValue;
                }
            }
            writer.Write();

            Assert.AreEqual(9, writer.RecordCount);
            Assert.AreEqual(Record9_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 10 - root redirect 1
            root2_DateTimeField.Value = Record10_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record10_Root3IntRedirValue, out fieldsAffectedFromIndex);
            // redirect to level1_1 sequence
            {
                Assert.AreEqual(3, fieldsAffectedFromIndex);
                Assert.AreEqual(6, writer.FieldList.Count);
                Assert.AreEqual(2, writer.SequenceInvokationList.Count);

                level1_1_DecimalField    = writer.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = writer.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                level1_1_StringField     = writer.FieldList[Level1_1_StringFieldName] as FtStringField;

                level1_1_DecimalField.Value = Record10_Level1_1_DecimalValue;
                level1_1_StringField.Value  = Record10_Level1_1_StringValue;
                level1_1_FloatRedirField.SetValue(Record10_Level1_1_FloatRedirValue, out fieldsAffectedFromIndex); // redirect
                // redirect to Level2_11 sequence
                {
                    Assert.AreEqual(6, fieldsAffectedFromIndex);
                    Assert.AreEqual(Record10_FieldListCount, writer.FieldList.Count);
                    Assert.AreEqual(Record10_SequenceInvokationListCount, writer.SequenceInvokationList.Count);
                    Assert.AreEqual(5, writer.FieldList.IndexOfName(Level1_1_StringFieldName)); // confirm not discarded
                    Assert.AreEqual(Record10_Level1_1_StringValue, level1_1_StringField.Value);

                    level2_11_StringField       = writer.FieldList[Level2_11_StringFieldName] as FtStringField;
                    level2_11_StringField.Value = Record10_level2_11_StringValue;
                }
            }
            writer.Write();

            Assert.AreEqual(10, writer.RecordCount);
            Assert.AreEqual(Record10_TableListCount, writer.TableCount);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            // Record 11 - no redirect
            root2_DateTimeField.Value = Record11_Root2DateTimeValue;
            root3_IntRedirField.SetValue(Record11_Root3IntRedirValue, out fieldsAffectedFromIndex);
            Assert.AreEqual(-1, fieldsAffectedFromIndex);
            Assert.AreEqual(Record11_FieldListCount, writer.FieldList.Count);
            Assert.AreEqual(Root_SequenceInvokationListCount, writer.SequenceInvokationList.Count);
            writer.Write();

            Assert.AreEqual(11, writer.RecordCount);
            Assert.AreEqual(Record11_TableListCount, writer.TableCount);
            Assert.AreEqual(Record11_SequenceInvokationListCount, writer.SequenceInvokationList.Count);

            writer.Close();

            string dataFilePath = Path.Combine(DataFolder, SequenceFileName);

            if (!TextFilesAreEqual(filePath, dataFilePath))
            {
                Assert.Fail("Sequence does not match Test Data");
            }
            else
            {
                FtReader reader = new FtReader(meta);
                reader.Open(filePath);

                Assert.AreEqual <bool>(false, reader.Declared);
                Assert.AreEqual <bool>(true, reader.HeaderRead);
                Assert.AreEqual <int>(1, reader.HeadingLineReadCount);
                Assert.AreEqual <FtMetaReferenceType>(FtMetaReferenceType.None, reader.MetaReferenceType);
                Assert.AreEqual <FtLineType>(FtLineType.Heading, reader.LineType); // last line in header

                root1_StrConstField = reader.FieldList[Root1_StrConstFieldName] as FtStringField;
                root2_DateTimeField = reader.FieldList[Root2_DateTimeFieldName] as FtDateTimeField;
                root3_IntRedirField = reader.FieldList[Root3_IntRedirFieldName] as FtIntegerField;

                // Record 1
                reader.Read();

                Assert.AreEqual(Record1_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record1_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(1, reader.RecordCount);
                Assert.AreEqual(Record1_TableListCount, reader.TableCount);

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record1_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record1_Root3IntRedirValue, root3_IntRedirField.Value);

                // Record 2
                reader.Read();

                Assert.AreEqual(Record2_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record2_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(2, reader.RecordCount);
                Assert.AreEqual(Record2_TableListCount, reader.TableCount);

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record2_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record2_Root3IntRedirValue, root3_IntRedirField.Value);

                // Record 3
                bool readResult = reader.Read();
                Assert.AreEqual <bool>(false, readResult);
                Assert.AreEqual(2, reader.RecordCount);
                Assert.AreEqual(Record2_TableListCount, reader.TableCount);

                reader.AutoNextTable = true;
                readResult           = reader.Read();
                Assert.AreEqual <bool>(true, readResult);

                Assert.AreEqual(Record3_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record3_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(3, reader.RecordCount);
                Assert.AreEqual(Record3_TableListCount, reader.TableCount);

                root1_StrConstField      = reader.FieldList[Root1_StrConstFieldName] as FtStringField;
                root2_DateTimeField      = reader.FieldList[Root2_DateTimeFieldName] as FtDateTimeField;
                root3_IntRedirField      = reader.FieldList[Root3_IntRedirFieldName] as FtIntegerField;
                level1_1_DecimalField    = reader.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = reader.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                level1_1_StringField     = reader.FieldList[Level1_1_StringFieldName] as FtStringField;

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record3_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record3_Root3IntRedirValue, root3_IntRedirField.Value);
                Assert.AreEqual <decimal>(Record3_Level1_1_DecimalValue, level1_1_DecimalField.Value);
                Assert.AreEqual <double>(Record3_Level1_1_FloatRedirValue, level1_1_FloatRedirField.Value);
                Assert.AreEqual <string>(Record3_Level1_1_StringValue, level1_1_StringField.Value);

                // Record 4
                reader.Read();

                Assert.AreEqual(Record4_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record4_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(4, reader.RecordCount);
                Assert.AreEqual(Record4_TableListCount, reader.TableCount);

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record4_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record4_Root3IntRedirValue, root3_IntRedirField.Value);
                Assert.AreEqual <decimal>(Record4_Level1_1_DecimalValue, level1_1_DecimalField.Value);
                Assert.AreEqual <double>(Record4_Level1_1_FloatRedirValue, level1_1_FloatRedirField.Value);
                Assert.AreEqual <string>(Record4_Level1_1_StringValue, level1_1_StringField.Value);

                // Record 5
                reader.Read();

                Assert.AreEqual(Record5_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record5_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(5, reader.RecordCount);
                Assert.AreEqual(Record5_TableListCount, reader.TableCount);

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record5_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record5_Root3IntRedirValue, root3_IntRedirField.Value);
                Assert.AreEqual <decimal>(Record5_Level1_1_DecimalValue, level1_1_DecimalField.Value);
                Assert.AreEqual <double>(Record5_Level1_1_FloatRedirValue, level1_1_FloatRedirField.Value);
                Assert.AreEqual <string>(Record5_Level1_1_StringValue, level1_1_StringField.Value);

                // Record 6
                reader.Read();

                Assert.AreEqual(Record6_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record6_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(6, reader.RecordCount);
                Assert.AreEqual(Record6_TableListCount, reader.TableCount);

                root1_StrConstField      = reader.FieldList[Root1_StrConstFieldName] as FtStringField;
                root2_DateTimeField      = reader.FieldList[Root2_DateTimeFieldName] as FtDateTimeField;
                root3_IntRedirField      = reader.FieldList[Root3_IntRedirFieldName] as FtIntegerField;
                level1_Null_BooleanField = reader.FieldList[Level1_Null_BooleanFieldName] as FtBooleanField;

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record6_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <bool>(true, root3_IntRedirField.IsNull());
                Assert.AreEqual <bool>(Record6_level1_Null_BooleanValue, level1_Null_BooleanField.Value);

                // Record 7
                reader.Read();

                Assert.AreEqual(Record7_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record7_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(7, reader.RecordCount);
                Assert.AreEqual(Record7_TableListCount, reader.TableCount);

                root1_StrConstField    = reader.FieldList[Root1_StrConstFieldName] as FtStringField;
                root2_DateTimeField    = reader.FieldList[Root2_DateTimeFieldName] as FtDateTimeField;
                root3_IntRedirField    = reader.FieldList[Root3_IntRedirFieldName] as FtIntegerField;
                level1_2_DateTimeField = reader.FieldList[Level1_2_DateTimeFieldName] as FtDateTimeField;

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record7_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record7_Root3IntRedirValue, root3_IntRedirField.Value);
                Assert.AreEqual <bool>(true, level1_2_DateTimeField.IsNull());

                // Record 8
                reader.Read();

                Assert.AreEqual(Record8_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record8_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(8, reader.RecordCount);
                Assert.AreEqual(Record8_TableListCount, reader.TableCount);

                root1_StrConstField      = reader.FieldList[Root1_StrConstFieldName] as FtStringField;
                root2_DateTimeField      = reader.FieldList[Root2_DateTimeFieldName] as FtDateTimeField;
                root3_IntRedirField      = reader.FieldList[Root3_IntRedirFieldName] as FtIntegerField;
                level1_1_DecimalField    = reader.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = reader.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                Assert.AreEqual <int>(-1, reader.FieldList.IndexOfName(Level1_1_StringFieldName));
                level2_10_StringField = reader.FieldList[Level2_10_StringFieldName] as FtStringField;

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record8_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record8_Root3IntRedirValue, root3_IntRedirField.Value);
                Assert.AreEqual <decimal>(Record8_Level1_1_DecimalValue, level1_1_DecimalField.Value);
                Assert.AreEqual <double>(Record8_Level1_1_FloatRedirValue, level1_1_FloatRedirField.Value);
                Assert.AreEqual <string>(Record8_level2_10_StringValue, level2_10_StringField.Value);

                // Record 9
                reader.Read();

                Assert.AreEqual <int>(-1, reader.FieldList.IndexOfName(Level1_1_StringFieldName));

                Assert.AreEqual(Record9_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record9_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(9, reader.RecordCount);
                Assert.AreEqual(Record9_TableListCount, reader.TableCount);

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record9_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record9_Root3IntRedirValue, root3_IntRedirField.Value);
                Assert.AreEqual <decimal>(Record9_Level1_1_DecimalValue, level1_1_DecimalField.Value);
                Assert.AreEqual <double>(Record9_Level1_1_FloatRedirValue, level1_1_FloatRedirField.Value);
                Assert.AreEqual <string>(Record9_level2_10_StringValue, level2_10_StringField.Value);

                // Record 10
                reader.Read();

                Assert.AreEqual(Record10_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record10_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(10, reader.RecordCount);
                Assert.AreEqual(Record10_TableListCount, reader.TableCount);

                root1_StrConstField      = reader.FieldList[Root1_StrConstFieldName] as FtStringField;
                root2_DateTimeField      = reader.FieldList[Root2_DateTimeFieldName] as FtDateTimeField;
                root3_IntRedirField      = reader.FieldList[Root3_IntRedirFieldName] as FtIntegerField;
                level1_1_DecimalField    = reader.FieldList[Level1_1_DecimalFieldName] as FtDecimalField;
                level1_1_FloatRedirField = reader.FieldList[Level1_1_FloatRedirFieldName] as FtFloatField;
                level1_1_StringField     = reader.FieldList[Level1_1_StringFieldName] as FtStringField;
                level2_11_StringField    = reader.FieldList[Level2_11_StringFieldName] as FtStringField;

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record10_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record10_Root3IntRedirValue, root3_IntRedirField.Value);
                Assert.AreEqual <decimal>(Record10_Level1_1_DecimalValue, level1_1_DecimalField.Value);
                Assert.AreEqual <double>(Record10_Level1_1_FloatRedirValue, level1_1_FloatRedirField.Value);
                Assert.AreEqual <string>(Record10_Level1_1_StringValue, level1_1_StringField.Value);
                Assert.AreEqual <string>(Record10_level2_11_StringValue, level2_11_StringField.Value);

                // Record 11
                reader.Read();

                Assert.AreEqual(Record11_FieldListCount, reader.FieldList.Count);
                Assert.AreEqual(Record11_SequenceInvokationListCount, reader.SequenceInvokationList.Count);
                Assert.AreEqual(11, reader.RecordCount);
                Assert.AreEqual(Record11_TableListCount, reader.TableCount);

                root1_StrConstField = reader.FieldList[Root1_StrConstFieldName] as FtStringField;
                root2_DateTimeField = reader.FieldList[Root2_DateTimeFieldName] as FtDateTimeField;
                root3_IntRedirField = reader.FieldList[Root3_IntRedirFieldName] as FtIntegerField;

                Assert.AreEqual <string>(Root1StrConstValue, root1_StrConstField.Value);
                Assert.AreEqual <DateTime>(Record11_Root2DateTimeValue, root2_DateTimeField.Value);
                Assert.AreEqual <long>(Record11_Root3IntRedirValue, root3_IntRedirField.Value);

                reader.Close();
            }
        }
示例#2
0
        // Write a CSV file containing sequences
        // Uses ExampleSequenceMeta.ftm from BuildMetaWithSequences project
        static void Main(string[] args)
        {
            // Name of file containing Meta
            const string MetaFileName = "ExampleSequenceMeta.ftm";
            // Name of file to be written
            const string CsvFileName = "ExampleSequence.csv";

            // Define Field Names
            const string TypeFieldName                  = "Type";
            const string NameFieldName                  = "Name";
            const string RunningSpeedFieldName          = "RunningSpeed";
            const string WalkDistanceFieldName          = "WalkDistance";
            const string TrainingFieldName              = "Training";
            const string TrainerFieldName               = "Trainer";
            const string SessionCostFieldName           = "SessionCost";
            const string ColorFieldName                 = "Color";
            const string ChineseClassificationFieldName = "ChineseClassification";

            // Define Type values
            const long CatType      = 1;
            const long DogType      = 2;
            const long GoldFishType = 3;

            // Create Meta from file
            FtMeta meta = FtMetaSerializer.Deserialize(MetaFileName);

            // Create Writer
            using (FtWriter writer = new FtWriter(meta, CsvFileName))
            {
                // When writing records with sequences, you must not set a field's value
                // if its sequence has not yet been invoked by a redirect.
                // When writing, whenever a sequence is invoked by a redirect, its field
                // values are initialized to null
                // Root Sequence is always automatically invoked

                // Write 1st Record (1st table)
                writer[TypeFieldName]         = CatType; // invoke Cat Sequence (after Root Sequence is finished)
                writer[NameFieldName]         = "Misty";
                writer[RunningSpeedFieldName] = 45.0;
                writer.Write();

                // Write 2nd Record
                writer[TypeFieldName]         = CatType; // invoke Cat Sequence (after Root Sequence is finished)
                writer[NameFieldName]         = "Oscar";
                writer[RunningSpeedFieldName] = 35.0;
                writer.Write();

                // Write 3rd Record  (2nd table)
                writer[TypeFieldName]         = DogType; // invoke Dog Sequence (after Root Sequence is finished)
                writer[NameFieldName]         = "Buddy";
                writer[WalkDistanceFieldName] = 0.5;
                writer[RunningSpeedFieldName] = 35.0;
                writer[TrainingFieldName]     = false;
                writer.Write();

                // Write 4th Record (3rd table)
                writer[TypeFieldName]         = DogType; // invoke Dog Sequence (after Root Sequence is finished)
                writer[NameFieldName]         = "Charlie";
                writer[WalkDistanceFieldName] = 2.0;
                writer[RunningSpeedFieldName] = 48.0;
                writer[TrainingFieldName]     = true; // invoke Training Sequence (after this field)
                writer[TrainerFieldName]      = "John";
                writer[SessionCostFieldName]  = 32.0M;
                writer.Write();

                // Write 5th Record (4th table)
                writer[TypeFieldName]         = DogType; // invoke Dog Sequence (after Root Sequence is finished)
                writer[NameFieldName]         = "Max";
                writer[WalkDistanceFieldName] = 0.5;
                writer[RunningSpeedFieldName] = 30.0;
                writer[TrainingFieldName]     = false;
                writer.Write();

                // Write 6th Record (5th table)
                writer[TypeFieldName]  = GoldFishType; // invoke Gold Fish Sequence (after Root Sequence is finished)
                writer[NameFieldName]  = "Bubbles";
                writer[ColorFieldName] = "Orange";
                writer[ChineseClassificationFieldName] = "Wen";
                writer.Write();

                // Write 7th Record
                writer[TypeFieldName]  = GoldFishType; // invoke Gold Fish Sequence (after Root Sequence is finished)
                writer[NameFieldName]  = "Flash";
                writer[ColorFieldName] = "Yellow";
                writer[ChineseClassificationFieldName] = "Crucian";
                writer.Write();
            }
        }
示例#3
0
        public void AllDefaults()
        {
            // Creates Meta with one sequence with one field of each type
            // Sets Meta and fields and sequence redirects properties to default values
            // Saves to XML (Serialize)
            // Compares XML to Expected
            // Creates Meta from XML (Deserialize)
            // Checks properties are as originally set

            state = State.Initialise;

            // Create Meta and set default properties
            FtMeta meta = new FtMeta();

            defaultMetaProperties.LoadIntoMeta(ref meta);

            FtStringMetaField stringField = meta.FieldList.New(FtStandardDataType.String) as FtStringMetaField;

            stringField.Name = StringFieldName;
            FtBooleanMetaField booleanField = meta.FieldList.New(FtStandardDataType.Boolean) as FtBooleanMetaField;

            booleanField.Name = BooleanFieldName;
            FtIntegerMetaField integerField = meta.FieldList.New(FtStandardDataType.Integer) as FtIntegerMetaField;

            integerField.Name = IntegerFieldName;
            FtFloatMetaField floatField = meta.FieldList.New(FtStandardDataType.Float) as FtFloatMetaField;

            floatField.Name = FloatFieldName;
            FtDecimalMetaField decimalField = meta.FieldList.New(FtStandardDataType.Decimal) as FtDecimalMetaField;

            decimalField.Name = DecimalFieldName;
            FtDateTimeMetaField dateTimeField = meta.FieldList.New(FtStandardDataType.DateTime) as FtDateTimeMetaField;

            dateTimeField.Name = DateTimeFieldName;

            FtStringMetaField redirectStringField1 = meta.FieldList.New(FtStandardDataType.String) as FtStringMetaField;

            redirectStringField1.Name = RedirectStringField1Name;
            FtBooleanMetaField redirectBooleanField2 = meta.FieldList.New(FtStandardDataType.Boolean) as FtBooleanMetaField;

            redirectBooleanField2.Name = RedirectBooleanField2Name;
            FtIntegerMetaField redirectIntegerField3 = meta.FieldList.New(FtStandardDataType.Integer) as FtIntegerMetaField;

            redirectIntegerField3.Name = RedirectIntegerField3Name;
            FtFloatMetaField redirectFloatField4 = meta.FieldList.New(FtStandardDataType.Float) as FtFloatMetaField;

            redirectFloatField4.Name = RedirectFloatField4Name;
            FtDecimalMetaField redirectDecimalField5 = meta.FieldList.New(FtStandardDataType.Decimal) as FtDecimalMetaField;

            redirectDecimalField5.Name = RedirectDecimalField5Name;
            FtDateTimeMetaField redirectDateTimeField6 = meta.FieldList.New(FtStandardDataType.DateTime) as FtDateTimeMetaField;

            redirectDateTimeField6.Name = RedirectDateTimeField6Name;

            // Create root sequence
            FtMetaSequence rootSequence = meta.SequenceList.New();

            rootSequence.Name = "Root";
            rootSequence.Root = true;

            // Create redirect target sequence
            FtMetaSequence redirectTargetSequence = meta.SequenceList.New();

            redirectTargetSequence.Name = "RedirectTarget";
            FtMetaSequenceItem     sequenceItem;
            FtMetaSequenceRedirect sequenceRedirect;

            sequenceItem              = redirectTargetSequence.ItemList.New();
            sequenceItem.Field        = redirectStringField1;
            sequenceItem              = redirectTargetSequence.ItemList.New();
            sequenceItem.Field        = redirectBooleanField2;
            sequenceRedirect          = sequenceItem.RedirectList.New(FtStandardSequenceRedirectType.Null);
            sequenceRedirect.Sequence = rootSequence;
            sequenceItem              = redirectTargetSequence.ItemList.New();
            sequenceItem.Field        = redirectIntegerField3;
            sequenceItem              = redirectTargetSequence.ItemList.New();
            sequenceItem.Field        = redirectFloatField4;
            sequenceRedirect          = sequenceItem.RedirectList.New(FtStandardSequenceRedirectType.Null);
            sequenceRedirect.Sequence = rootSequence;
            sequenceItem              = redirectTargetSequence.ItemList.New();
            sequenceItem.Field        = redirectDecimalField5;
            sequenceItem              = redirectTargetSequence.ItemList.New();
            sequenceItem.Field        = redirectDateTimeField6;

            // Create one field of each type and set properties to defaults and put in sequence.  Add default redirect to sequence item redirect list
            AllDefaults_Field(stringField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactString, 0);
            AllDefaults_Field(booleanField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.Boolean, 1);
            booleanField.FalseText = BooleanFalseText;
            booleanField.TrueText  = BooleanTrueText;
            booleanField.Styles    = BooleanStyles;
            AllDefaults_Field(integerField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactInteger, 2);
            integerField.Format = IntegerFieldFormat;
            integerField.Styles = IntegerFieldStyles;
            AllDefaults_Field(floatField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactFloat, 3);
            floatField.Format = FloatFieldFormat;
            floatField.Styles = FloatFieldStyles;
            AllDefaults_Field(decimalField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactDecimal, 4);
            decimalField.Format = DecimalFieldFormat;
            decimalField.Styles = DecimalFieldStyles;
            AllDefaults_Field(dateTimeField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactDateTime, 5);
            dateTimeField.Format = DateTimeFieldFormat;
            dateTimeField.Styles = DateTimeFieldStyles;

            // Add one substitution of default substitution type
            FtMetaSubstitution substitution = meta.SubstitutionList.New();

            substitution.Type  = SubstitutionType;
            substitution.Token = SubstitutionToken;
            substitution.Value = SubstitutionValue;

            // Serialize Meta
            XmlWriter writer = XmlWriter.Create(filePath, xmlWriterSettings);

            FtMetaSerializer.Serialize(meta, writer);
            writer.Close();

            state = State.Assert;

            string DataFilePath = Path.Combine(DataFolder, AllDefaultsFileName);

            if (!TextFilesAreEqual(filePath, DataFilePath))
            {
                Assert.Fail("AllDefaults does not match Test Data");
            }
            else
            {
                FtMeta deserialisedMeta = FtMetaSerializer.Deserialize(filePath);

                defaultMetaProperties.AssertMetaAreEqual(meta);

                rootSequence = meta.SequenceList[0];
                Assert.AreEqual <bool>(true, rootSequence.Root);
                Assert.AreEqual <int>(6, rootSequence.ItemList.Count);
                redirectTargetSequence = meta.SequenceList[1];
                Assert.AreEqual <bool>(false, redirectTargetSequence.Root);
                Assert.AreEqual <int>(6, redirectTargetSequence.ItemList.Count);

                stringField = meta.FieldList[0] as FtStringMetaField;
                Assert.AreEqual <string>(StringFieldName, stringField.Name);
                AllDefaults_Field(stringField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactString, 0);
                booleanField = meta.FieldList[1] as FtBooleanMetaField;
                Assert.AreEqual <string>(BooleanFieldName, booleanField.Name);
                AllDefaults_Field(booleanField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.Boolean, 1);
                Assert.AreEqual <string>(BooleanFalseText, booleanField.FalseText);
                Assert.AreEqual <string>(BooleanTrueText, booleanField.TrueText);
                Assert.AreEqual <FtBooleanStyles>(BooleanStyles, booleanField.Styles);
                integerField = meta.FieldList[2] as FtIntegerMetaField;
                Assert.AreEqual <string>(IntegerFieldName, integerField.Name);
                AllDefaults_Field(integerField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactInteger, 2);
                Assert.AreEqual <string>(IntegerFieldFormat, integerField.Format);
                Assert.AreEqual <NumberStyles>(IntegerFieldStyles, integerField.Styles);
                floatField = meta.FieldList[3] as FtFloatMetaField;
                Assert.AreEqual <string>(FloatFieldName, floatField.Name);
                AllDefaults_Field(floatField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactFloat, 3);
                Assert.AreEqual <string>(FloatFieldFormat, floatField.Format);
                Assert.AreEqual <NumberStyles>(FloatFieldStyles, floatField.Styles);
                decimalField = meta.FieldList[4] as FtDecimalMetaField;
                Assert.AreEqual <string>(DecimalFieldName, decimalField.Name);
                AllDefaults_Field(decimalField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactDecimal, 4);
                Assert.AreEqual <string>(DecimalFieldFormat, decimalField.Format);
                Assert.AreEqual <NumberStyles>(DecimalFieldStyles, decimalField.Styles);
                dateTimeField = meta.FieldList[5] as FtDateTimeMetaField;
                Assert.AreEqual <string>(DateTimeFieldName, dateTimeField.Name);
                AllDefaults_Field(dateTimeField, rootSequence, redirectTargetSequence, FtStandardSequenceRedirectType.ExactDateTime, 5);
                Assert.AreEqual <string>(DateTimeFieldFormat, dateTimeField.Format);
                Assert.AreEqual <DateTimeStyles>(DateTimeFieldStyles, dateTimeField.Styles);

                redirectStringField1 = meta.FieldList[6] as FtStringMetaField;
                Assert.AreEqual <string>(RedirectStringField1Name, redirectStringField1.Name);
                redirectBooleanField2 = meta.FieldList[7] as FtBooleanMetaField;
                Assert.AreEqual <string>(RedirectBooleanField2Name, redirectBooleanField2.Name);
                Assert.AreEqual <string>(BooleanFalseText, redirectBooleanField2.FalseText);
                Assert.AreEqual <string>(BooleanTrueText, redirectBooleanField2.TrueText);
                Assert.AreEqual <FtBooleanStyles>(BooleanStyles, redirectBooleanField2.Styles);
                redirectIntegerField3 = meta.FieldList[8] as FtIntegerMetaField;
                Assert.AreEqual <string>(RedirectIntegerField3Name, redirectIntegerField3.Name);
                Assert.AreEqual <string>(IntegerFieldFormat, redirectIntegerField3.Format);
                Assert.AreEqual <NumberStyles>(IntegerFieldStyles, redirectIntegerField3.Styles);
                redirectFloatField4 = meta.FieldList[9] as FtFloatMetaField;
                Assert.AreEqual <string>(RedirectFloatField4Name, redirectFloatField4.Name);
                Assert.AreEqual <string>(FloatFieldFormat, redirectFloatField4.Format);
                Assert.AreEqual <NumberStyles>(FloatFieldStyles, redirectFloatField4.Styles);
                redirectDecimalField5 = meta.FieldList[10] as FtDecimalMetaField;
                Assert.AreEqual <string>(RedirectDecimalField5Name, redirectDecimalField5.Name);
                Assert.AreEqual <string>(DecimalFieldFormat, redirectDecimalField5.Format);
                Assert.AreEqual <NumberStyles>(DecimalFieldStyles, redirectDecimalField5.Styles);
                redirectDateTimeField6 = meta.FieldList[11] as FtDateTimeMetaField;
                Assert.AreEqual <string>(RedirectDateTimeField6Name, redirectDateTimeField6.Name);
                Assert.AreEqual <string>(DateTimeFieldFormat, redirectDateTimeField6.Format);
                Assert.AreEqual <DateTimeStyles>(DateTimeFieldStyles, redirectDateTimeField6.Styles);

                Assert.AreEqual <FtMetaField>(redirectStringField1, redirectTargetSequence.ItemList[0].Field);
                Assert.AreEqual <int>(0, redirectTargetSequence.ItemList[0].RedirectList.Count);
                Assert.AreEqual <FtMetaField>(redirectBooleanField2, redirectTargetSequence.ItemList[1].Field);
                Assert.AreEqual <int>(1, redirectTargetSequence.ItemList[1].RedirectList.Count);
                Assert.AreEqual <int>(FtStandardSequenceRedirectType.Null, redirectTargetSequence.ItemList[1].RedirectList[0].Type);
                Assert.AreEqual <FtMetaField>(redirectIntegerField3, redirectTargetSequence.ItemList[2].Field);
                Assert.AreEqual <int>(0, redirectTargetSequence.ItemList[2].RedirectList.Count);
                Assert.AreEqual <FtMetaField>(redirectFloatField4, redirectTargetSequence.ItemList[3].Field);
                Assert.AreEqual <int>(1, redirectTargetSequence.ItemList[3].RedirectList.Count);
                Assert.AreEqual <int>(FtStandardSequenceRedirectType.Null, redirectTargetSequence.ItemList[3].RedirectList[0].Type);
                Assert.AreEqual <FtMetaField>(redirectDecimalField5, redirectTargetSequence.ItemList[4].Field);
                Assert.AreEqual <int>(0, redirectTargetSequence.ItemList[4].RedirectList.Count);
                Assert.AreEqual <FtMetaField>(redirectDateTimeField6, redirectTargetSequence.ItemList[5].Field);
                Assert.AreEqual <int>(0, redirectTargetSequence.ItemList[5].RedirectList.Count);
            }
        }