public bool Validate(out string errorMessage) { // check various - including multiple sequence roots and duplicate sequence names errorMessage = ""; foreach (ValidateTest test in Enum.GetValues(typeof(ValidateTest))) { switch (test) { case ValidateTest.FieldList: if (FieldList.Count == 0) { errorMessage = Properties.Resources.FtMeta_Validate_MustHaveAtLeastOneField; } break; case ValidateTest.QuoteCharSameAsDelimiterChar: if (QuoteChar == DelimiterChar) { errorMessage = Properties.Resources.FtMeta_Validate_QuoteCharAndDelimiterCharMustBeDifferent; } break; case ValidateTest.QuoteCharSameAsLineCommentChar: if (QuoteChar == LineCommentChar) { errorMessage = Properties.Resources.FtMeta_Validate_QuoteCharAndLineCommentCharMustBeDifferent; } break; case ValidateTest.LineCommentCharSameAsDelimiterChar: if (LineCommentChar == DelimiterChar) { errorMessage = Properties.Resources.FtMeta_Validate_LineCommentCharAndDelimiterCharMustBeDifferent; } break; case ValidateTest.SubstitutionChar: if (SubstitutionsEnabled) { if (QuoteChar == SubstitutionChar) { errorMessage = Properties.Resources.FtMeta_Validate_QuoteCharAndSubstitutionCharMustBeDifferent; } else { if (DelimiterChar == SubstitutionChar) { errorMessage = Properties.Resources.FtMeta_Validate_DelimiterCharAndSubstitutionCharMustBeDifferent; } else { if (LineCommentChar == SubstitutionChar) { errorMessage = Properties.Resources.FtMeta_Validate_LineCommentCharAndSubstitutionCharMustBeDifferent; } else { } } } } break; case ValidateTest.EndOfLineType: switch (EndOfLineType) { case FtEndOfLineType.CrLf: case FtEndOfLineType.Auto: if (ValidateEndOfLineTypeChar(Serialization.SerializationCore.CarriageReturnChar, out errorMessage)) { ValidateEndOfLineTypeChar(Serialization.SerializationCore.LineFeedChar, out errorMessage); } break; case FtEndOfLineType.Char: ValidateEndOfLineTypeChar(EndOfLineChar, out errorMessage); break; default: throw FtInternalException.Create(InternalError.FtMeta_Validate_UnsupportedEndOfLineType); } break; case ValidateTest.SequenceRoot: string firstRootSequenceName; string secondRootSequenceName; if (SequenceList.IsMoreThanOneRoot(out firstRootSequenceName, out secondRootSequenceName)) { errorMessage = string.Format(Properties.Resources.FtMeta_Validate_MoreThanOneRootSequence, firstRootSequenceName, secondRootSequenceName); } break; case ValidateTest.DuplicateSequenceName: string duplicateSequenceName; if (SequenceList.HasDuplicateName(out duplicateSequenceName)) { errorMessage = string.Format(Properties.Resources.FtMeta_Validate_DuplicateSequenceName, duplicateSequenceName); } break; case ValidateTest.SequenceItemHasNullField: for (int i = 0; i < SequenceList.Count; i++) { int itemIdx; if (SequenceList[i].AnyItemWithNullField(out itemIdx)) { errorMessage = string.Format(Properties.Resources.FtMeta_Validate_SequenceItemWithNullField, SequenceList[i].Name, itemIdx); } } break; case ValidateTest.SequenceItemWithConstantFieldHasRedirects: for (int i = 0; i < SequenceList.Count; i++) { int itemIdx; if (SequenceList[i].AnyItemWithConstantFieldHasRedirects(out itemIdx)) { errorMessage = string.Format(Properties.Resources.FtMeta_Validate_SequenceItemWithConstantFieldHasRedirects, SequenceList[i].Name, itemIdx); } } break; default: throw FtInternalException.Create(InternalError.FtMeta_Validate_UnsupportedValidateTest); } if (errorMessage.Length != 0) { break; } } return(errorMessage == ""); }