private void Check(bool shuffle) { var otherModel = TypeModel.Create(); using (var ms = new MemoryStream()) { _model.Serialize(ms, _model.ExportTypeRelations()); ms.Position = 0; var rel = _model.Deserialize <ModelTypeRelationsData>(ms); if (shuffle) // types order should not matter (only subtypes) { rel.Types = rel.Types.OrderBy(x => _rnd.Next(0, rel.Types.Length + 1)).ToArray(); } otherModel.ImportTypeRelations(rel, true); } var newTypes = otherModel.Types.Except(_model.Types).ToArray(); var removedTypes = _model.Types.Except(otherModel.Types).ToArray(); Assert.AreEqual(0, newTypes.Length); Assert.AreEqual(0, removedTypes.Length); if (!shuffle) { var inequal = otherModel.Types.Where((t, i) => t != _model.Types[i]).ToArray(); Assert.AreEqual(0, inequal.Length); } MetaType[] modelMetaTypes = _model.MetaTypes; for (int i = 0; i < modelMetaTypes.Length; i++) { Type type = modelMetaTypes[i].Type; SubType[] otherSubTypes = otherModel.FindWithoutAdd(type).GetSubtypes(); SubType[] modelSubTypes = modelMetaTypes[i].GetSubtypes(); Assert.AreEqual(modelSubTypes.Length, otherSubTypes.Length, "Subtypes of " + type.FullName); for (int j = 0; j < otherSubTypes.Length; j++) { Assert.AreEqual(otherSubTypes[j].DerivedType.Type, modelSubTypes[j].DerivedType.Type); Assert.AreEqual(otherSubTypes[j].FieldNumber, modelSubTypes[j].FieldNumber); } } }