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(); } }
// 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(); } }
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); } }