Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PersistenceReintegration/HeuristicLab.Tests/HeuristicLab.Persistence-3.3/UseCasesPersistenceNew.cs @ 15857

Last change on this file since 15857 was 15857, checked in by jkarder, 6 years ago

#2520: worked on conversions

File size: 95.0 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections;
24using System.Collections.Generic;
25using System.Diagnostics;
26using System.Drawing;
27using System.Globalization;
28using System.IO;
29using System.Linq;
30using System.Reflection;
31using System.Text;
32using System.Threading.Tasks;
33using HeuristicLab.Algorithms.GeneticAlgorithm;
34using HeuristicLab.Core;
35using HeuristicLab.Data;
36using HeuristicLab.Persistence;
37using HeuristicLab.Persistence.Auxiliary;
38using HeuristicLab.Persistence.Core;
39using HeuristicLab.Persistence.Default.DebugString;
40using HeuristicLab.Persistence.Default.Xml;
41using HeuristicLab.Persistence.Tests;
42using HeuristicLab.Problems.TestFunctions;
43using HeuristicLab.Tests;
44using Microsoft.VisualStudio.TestTools.UnitTesting;
45
46namespace HeuristicLab.PersistenceNew.Tests {
47  public static class EnumerableTimeSpanExtensions {
48    public static TimeSpan Average(this IEnumerable<TimeSpan> span) {
49      var avg = (long)Math.Round(span.Select(x => x.Ticks).Average());
50      return new TimeSpan(avg);
51    }
52  }
53
54  #region Test Classes
55  [StorableType("7D9672BD-703D-42BB-9080-9929885D4580")]
56  public class NumberTest {
57    [Storable]
58    private bool _bool = true;
59    [Storable]
60    private byte _byte = 0xFF;
61    [Storable]
62    private sbyte _sbyte = 0xF;
63    [Storable]
64    private short _short = -123;
65    [Storable]
66    private ushort _ushort = 123;
67    [Storable]
68    private int _int = -123;
69    [Storable]
70    private uint _uint = 123;
71    [Storable]
72    private long _long = 123456;
73    [Storable]
74    private ulong _ulong = 123456;
75    public override bool Equals(object obj) {
76      NumberTest nt = obj as NumberTest;
77      if (nt == null)
78        throw new NotSupportedException();
79      return
80        nt._bool == _bool &&
81        nt._byte == _byte &&
82        nt._sbyte == _sbyte &&
83        nt._short == _short &&
84        nt._ushort == _ushort &&
85        nt._int == _int &&
86        nt._uint == _uint &&
87        nt._long == _long &&
88        nt._ulong == _ulong;
89    }
90    public override int GetHashCode() {
91      return
92        _bool.GetHashCode() ^
93        _byte.GetHashCode() ^
94        _sbyte.GetHashCode() ^
95        _short.GetHashCode() ^
96        _short.GetHashCode() ^
97        _int.GetHashCode() ^
98        _uint.GetHashCode() ^
99        _long.GetHashCode() ^
100        _ulong.GetHashCode();
101    }
102  }
103
104  [StorableType("EEB19599-D5AC-48ED-A56B-CF213DFAF2E4")]
105  public class NonDefaultConstructorClass {
106    [Storable]
107    int value;
108    public NonDefaultConstructorClass(int value) {
109      this.value = value;
110    }
111  }
112
113  [StorableType("EE43FE7A-6D07-4D52-9338-C21B3485F82A")]
114  public class IntWrapper {
115
116    [Storable]
117    public int Value;
118
119    private IntWrapper() { }
120
121    public IntWrapper(int value) {
122      this.Value = value;
123    }
124
125    public override bool Equals(object obj) {
126      if (obj as IntWrapper == null)
127        return false;
128      return Value.Equals(((IntWrapper)obj).Value);
129    }
130    public override int GetHashCode() {
131      return Value.GetHashCode();
132    }
133
134  }
135
136  [StorableType("00A8E48E-8E8A-443C-A327-9F6ACCBE7E80")]
137  public class PrimitivesTest : NumberTest {
138    [Storable]
139    private char c = 'e';
140    [Storable]
141    private long[,] _long_array =
142      new long[,] { { 123, 456, }, { 789, 123 } };
143    [Storable]
144    public List<int> list = new List<int> { 1, 2, 3, 4, 5 };
145    [Storable]
146    private object o = new object();
147    public override bool Equals(object obj) {
148      PrimitivesTest pt = obj as PrimitivesTest;
149      if (pt == null)
150        throw new NotSupportedException();
151      return base.Equals(obj) &&
152        c == pt.c &&
153        _long_array == pt._long_array &&
154        list == pt.list &&
155        o == pt.o;
156    }
157    public override int GetHashCode() {
158      return base.GetHashCode() ^
159        c.GetHashCode() ^
160        _long_array.GetHashCode() ^
161        list.GetHashCode() ^
162        o.GetHashCode();
163    }
164  }
165
166  [StorableType("c15e3ac3-2681-48a1-9171-d97321cd60bb")]
167  public enum TestEnum { va1, va2, va3, va8 };
168
169  [StorableType("26BA37F6-926D-4665-A10A-1F39E1CF6468")]
170  public class RootBase {
171    [Storable]
172    private string baseString = "   Serial  ";
173    [Storable]
174    public TestEnum myEnum = TestEnum.va3;
175    public override bool Equals(object obj) {
176      RootBase rb = obj as RootBase;
177      if (rb == null)
178        throw new NotSupportedException();
179      return baseString == rb.baseString &&
180        myEnum == rb.myEnum;
181    }
182    public override int GetHashCode() {
183      return baseString.GetHashCode() ^
184        myEnum.GetHashCode();
185    }
186  }
187
188  [StorableType("F6BCB436-B5F2-40F6-8E2F-7A018CD1CBA0")]
189  public class Root : RootBase {
190    [Storable]
191    public Stack<int> intStack = new Stack<int>();
192    [Storable]
193    public int[] i = new[] { 3, 4, 5, 6 };
194    [Storable(Name = "Test String")]
195    public string s;
196    [Storable]
197    public ArrayList intArray = new ArrayList(new[] { 1, 2, 3 });
198    [Storable]
199    public List<int> intList = new List<int>(new[] { 321, 312, 321 });
200    [Storable]
201    public Custom c;
202    [Storable]
203    public List<Root> selfReferences;
204    [Storable]
205    public double[,] multiDimArray = new double[,] { { 1, 2, 3 }, { 3, 4, 5 } };
206    [Storable]
207    public bool boolean = true;
208    [Storable]
209    public DateTime dateTime;
210    [Storable]
211    public KeyValuePair<string, int> kvp = new KeyValuePair<string, int>("Serial", 123);
212    [Storable]
213    public Dictionary<string, int> dict = new Dictionary<string, int>();
214    [Storable(DefaultValue = "default")]
215    public string uninitialized;
216  }
217
218  [StorableType("a6bd45c2-bf18-47d7-9f66-c130222f2f00")]
219  public enum SimpleEnum { one, two, three }
220  [StorableType("b5c8285e-5c1b-457e-a5a3-e25eb588c283")]
221  public enum ComplexEnum { one = 1, two = 2, three = 3 }
222  [FlagsAttribute]
223  [StorableType("c2ee7205-0a3a-443a-87d6-68568c4f4153")]
224  public enum TrickyEnum { zero = 0, one = 1, two = 2 }
225
226  [StorableType("2F6326ED-023A-415F-B5C7-9F9241940D05")]
227  public class EnumTest {
228    [Storable]
229    public SimpleEnum simpleEnum = SimpleEnum.one;
230    [Storable]
231    public ComplexEnum complexEnum = (ComplexEnum)2;
232    [Storable]
233    public TrickyEnum trickyEnum = (TrickyEnum)15;
234  }
235
236  [StorableType("92365E2A-1184-4280-B763-4853C7ADF3E3")]
237  public class Custom {
238    [Storable]
239    public int i;
240    [Storable]
241    public Root r;
242    [Storable]
243    public string name = "<![CDATA[<![CDATA[Serial]]>]]>";
244  }
245
246  [StorableType("7CF19EBC-1EC4-4FBE-BCA9-DA48E3CFE30D")]
247  public class Manager {
248
249    public DateTime lastLoadTime;
250    [Storable]
251    private DateTime lastLoadTimePersistence {
252      get { return lastLoadTime; }
253      set { lastLoadTime = DateTime.Now; }
254    }
255    [Storable]
256    public double? dbl;
257  }
258
259  [StorableType("9092C705-F5E9-4BA9-9750-4357DB29AABF")]
260  public class C {
261    [Storable]
262    public C[][] allCs;
263    [Storable]
264    public KeyValuePair<List<C>, C> kvpList;
265  }
266
267  public class NonSerializable {
268    int x = 0;
269    public override bool Equals(object obj) {
270      NonSerializable ns = obj as NonSerializable;
271      if (ns == null)
272        throw new NotSupportedException();
273      return ns.x == x;
274    }
275    public override int GetHashCode() {
276      return x.GetHashCode();
277    }
278  }
279
280  [StorableType("FD953B0A-BDE6-41E6-91A8-CA3D90C91CDB")]
281  public class SimpleClass {
282    [Storable]
283    public double x { get; set; }
284    [Storable]
285    public int y { get; set; }
286  }
287  #endregion
288
289  [TestClass]
290  [StorableType("6324d1f6-a82b-4914-937a-21846c4af9e6")]
291  public class UseCasesPersistenceNew {
292    #region Helpers
293    private string tempFile;
294    private static Dictionary<Guid, Type> guid2Type;
295    private static Dictionary<Type, Guid> type2Guid;
296    private static Dictionary<Type, Persistence.TypeInfo> typeInfos;
297    private static PropertyInfo guidPropertyInfo = typeof(StorableTypeAttribute).GetProperty("Guid");
298
299
300    [ClassInitialize]
301    public static void Initialize(TestContext testContext) {
302      ConfigurationService.Instance.Reset();
303
304      var guid2TypeFieldInfo = typeof(StaticCache).GetField("guid2Type", BindingFlags.NonPublic | BindingFlags.Instance);
305      var type2GuidFieldInfo = typeof(StaticCache).GetField("type2Guid", BindingFlags.NonPublic | BindingFlags.Instance);
306      var typeInfosFieldInfo = typeof(StaticCache).GetField("typeInfos", BindingFlags.NonPublic | BindingFlags.Instance);
307
308      guid2Type = (Dictionary<Guid, Type>)guid2TypeFieldInfo.GetValue(Mapper.StaticCache);
309      type2Guid = (Dictionary<Type, Guid>)type2GuidFieldInfo.GetValue(Mapper.StaticCache);
310      typeInfos = (Dictionary<Type, Persistence.TypeInfo>)typeInfosFieldInfo.GetValue(Mapper.StaticCache);
311    }
312
313    [TestInitialize()]
314    public void CreateTempFile() {
315      tempFile = Path.GetTempFileName();
316    }
317
318    [TestCleanup()]
319    public void ClearTempFile() {
320      StreamReader reader = new StreamReader(tempFile);
321      string s = reader.ReadToEnd();
322      reader.Close();
323      File.Delete(tempFile);
324    }
325
326    public static void RegisterType(Guid guid, Type type) {
327      Mapper.StaticCache.RegisterType(guid, type);
328    }
329
330    public static void DeregisterType(Type type) {
331      var typeInfo = GetTypeInfo(type);
332      type2Guid.Remove(guid2Type[typeInfo.StorableTypeAttribute.Guid]);
333      guid2Type.Remove(typeInfo.StorableTypeAttribute.Guid);
334    }
335
336    public static Persistence.TypeInfo GetTypeInfo(Type type) {
337      return Mapper.StaticCache.GetTypeInfo(type);
338    }
339
340    public static void RemoveTypeInfo(Type type) {
341      typeInfos.Remove(typeof(ConversionA));
342    }
343
344    public static Guid GetTypeGuid(Type type) {
345      var typeInfo = GetTypeInfo(type);
346      return typeInfo.StorableTypeAttribute.Guid;
347    }
348
349    public static void SetTypeGuid(Type type, Guid guid) {
350      var typeInfo = GetTypeInfo(type);
351      guidPropertyInfo.SetValue(typeInfo.StorableTypeAttribute, guid);
352    }
353    #endregion
354
355    #region Persistence 4.0 Profiling Helpers 
356    [StorableType("f90de8e3-e7d1-43b2-a8f0-6689ec922e87")]
357    public class PerformanceData {
358      public TimeSpan OldSerializingTime { get; set; }
359      public TimeSpan NewSerializingTime { get; set; }
360      public TimeSpan OldDeserializingTime { get; set; }
361      public TimeSpan NewDeserializingTime { get; set; }
362      public long OldFileSize { get; set; }
363      public long NewFileSize { get; set; }
364      public long OldSerializingMemoryConsumed { get; set; }
365      public long NewSerializingMemoryConsumed { get; set; }
366      public long OldDeserializingMemoryConsumed { get; set; }
367      public long NewDeserializingMemoryConsumed { get; set; }
368    }
369
370    private void SerializeNew(object o) {
371      ProtoBufSerializer serializer = new ProtoBufSerializer();
372      serializer.Serialize(o, tempFile);
373    }
374    private void SerializeOld(object o) {
375      XmlGenerator.Serialize(o, tempFile);
376    }
377    private object DeserializeNew() {
378      ProtoBufSerializer serializer = new ProtoBufSerializer();
379      return serializer.Deserialize(tempFile);
380    }
381    private object DeserialiezOld() {
382      return XmlParser.Deserialize(tempFile);
383    }
384
385    private void CollectGarbage() {
386      GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
387      GC.WaitForPendingFinalizers();
388    }
389
390    public PerformanceData ProfileSingleRun(Func<object> GenerateDataFunc) {
391      PerformanceData performanceData = new PerformanceData();
392      Stopwatch sw = new Stopwatch();
393      object data = GenerateDataFunc();
394      object result = null;
395      long startMem, endMem;
396
397
398      //old file format serializing
399      CollectGarbage();
400      startMem = GC.GetTotalMemory(false);
401      sw.Start();
402      SerializeOld(data);
403      sw.Stop();
404      endMem = GC.GetTotalMemory(false);
405      performanceData.OldSerializingTime = sw.Elapsed;
406      performanceData.OldFileSize = new FileInfo(tempFile).Length;
407      performanceData.OldSerializingMemoryConsumed = endMem - startMem;
408      sw.Reset();
409
410
411      //old file format deserializing
412      CollectGarbage();
413      startMem = GC.GetTotalMemory(false);
414      sw.Start();
415      result = DeserialiezOld();
416      sw.Stop();
417      endMem = GC.GetTotalMemory(false);
418      performanceData.OldDeserializingTime = sw.Elapsed;
419      performanceData.OldDeserializingMemoryConsumed = endMem - startMem;
420      sw.Reset();
421
422
423      //new file format serializing
424      CollectGarbage();
425      startMem = GC.GetTotalMemory(false);
426      sw.Start();
427      SerializeNew(data);
428      sw.Stop();
429      endMem = GC.GetTotalMemory(false);
430      performanceData.NewSerializingTime = sw.Elapsed;
431      performanceData.NewSerializingMemoryConsumed = endMem - startMem;
432      performanceData.NewFileSize = new FileInfo(tempFile).Length;
433      sw.Reset();
434
435
436      //new file format deserializing
437      CollectGarbage();
438      startMem = GC.GetTotalMemory(false);
439      sw.Start();
440      result = DeserializeNew();
441      sw.Stop();
442      endMem = GC.GetTotalMemory(false);
443      performanceData.NewDeserializingTime = sw.Elapsed;
444      performanceData.NewDeserializingMemoryConsumed = endMem - startMem;
445      sw.Reset();
446
447      return performanceData;
448    }
449
450    public string Profile(Func<object> GenerateDataFunc, string filename = null) {
451      int nrOfRepetitions = 30;
452      StringBuilder report = new StringBuilder();
453      List<PerformanceData> dataList = new List<PerformanceData>();
454
455      for (int i = 0; i < nrOfRepetitions; i++) {
456        dataList.Add(ProfileSingleRun(GenerateDataFunc));
457      }
458
459      //report.Append("Performance Report for " + GenerateDataFunc.Method.Name + ": " + Environment.NewLine);
460      report.Append(Environment.NewLine);
461      report.AppendFormat("Avg. old vs. new time for serializing a file; {3};{0};{1};{2}",
462              dataList.Select(x => x.OldSerializingTime).Average(),
463              dataList.Select(x => x.NewSerializingTime).Average(),
464              dataList.Select(x => x.OldSerializingTime.TotalMilliseconds).Average() / dataList.Select(x => x.NewSerializingTime.TotalMilliseconds).Average()
465              , filename);
466      report.Append(Environment.NewLine);
467      report.AppendFormat("Avg. old vs. new time for deserializing a file; {3};{0};{1};{2}",
468              dataList.Select(x => x.OldDeserializingTime).Average(),
469              dataList.Select(x => x.NewDeserializingTime).Average(),
470              dataList.Select(x => x.OldDeserializingTime.TotalMilliseconds).Average() / dataList.Select(x => x.NewDeserializingTime.TotalMilliseconds).Average()
471              , filename);
472      report.Append(Environment.NewLine);
473      report.AppendFormat("Avg. old vs. new file size (in bytes); {3};{0};{1};{2}",
474              dataList.Select(x => x.OldFileSize).Average(),
475              dataList.Select(x => x.NewFileSize).Average(),
476              dataList.Select(x => x.OldFileSize).Average() / dataList.Select(x => x.NewFileSize).Average()
477              , filename);
478      report.Append(Environment.NewLine);
479      report.AppendFormat("Avg. old vs. new memory consumption for serializing a file (in bytes); {3};{0};{1};{2}",
480              dataList.Select(x => x.OldSerializingMemoryConsumed).Average(),
481              dataList.Select(x => x.NewSerializingMemoryConsumed).Average(),
482              dataList.Select(x => x.OldSerializingMemoryConsumed).Average() / dataList.Select(x => x.NewSerializingMemoryConsumed).Average()
483              , filename);
484      report.Append(Environment.NewLine);
485      report.AppendFormat("Avg. old vs. new memory consumption for deserializing a file (in bytes); {3};{0};{1};{2}",
486              dataList.Select(x => x.OldDeserializingMemoryConsumed).Average(),
487              dataList.Select(x => x.NewDeserializingMemoryConsumed).Average(),
488              dataList.Select(x => x.OldDeserializingMemoryConsumed).Average() / dataList.Select(x => x.NewDeserializingMemoryConsumed).Average()
489              , filename);
490      report.Append(Environment.NewLine);
491
492
493      return report.ToString();
494    }
495    #endregion
496
497    #region Persistence 4.0 Test methods
498    [TestMethod]
499    [TestCategory("PersistenceNew")]
500    [TestProperty("Time", "short")]
501    public void TestBool() {
502      var test = new Func<object>(() => { return true; });
503      ProtoBufSerializer serializer = new ProtoBufSerializer();
504      serializer.Serialize(test(), tempFile);
505      object o = serializer.Deserialize(tempFile);
506      bool result = (bool)o;
507      Assert.AreEqual(test(), result);
508
509      string msg = Profile(test);
510      Console.WriteLine(msg);
511    }
512
513    [TestMethod]
514    [TestCategory("PersistenceNew")]
515    [TestProperty("Time", "short")]
516    public void TestInt() {
517      var test = new Func<object>(() => { return (int)42; });
518      ProtoBufSerializer serializer = new ProtoBufSerializer();
519      serializer.Serialize(test(), tempFile);
520      object o = serializer.Deserialize(tempFile);
521      int result = (int)o;
522      Assert.AreEqual(test(), result);
523
524      string msg = Profile(test);
525      Console.WriteLine(msg);
526    }
527
528    [TestMethod]
529    [TestCategory("PersistenceNew")]
530    [TestProperty("Time", "short")]
531    public void TestDouble() {
532      var test = new Func<object>(() => { return 42.5d; });
533      ProtoBufSerializer serializer = new ProtoBufSerializer();
534      serializer.Serialize(test(), tempFile);
535      object o = serializer.Deserialize(tempFile);
536      double result = (double)o;
537      Assert.AreEqual(test(), result);
538      Assert.IsTrue(o is double);
539
540      string msg = Profile(test);
541      Console.WriteLine(msg);
542    }
543
544    [TestMethod]
545    [TestCategory("PersistenceNew")]
546    [TestProperty("Time", "short")]
547    public void TestFloat() {
548      var test = new Func<object>(() => { return 42.5f; });
549      ProtoBufSerializer serializer = new ProtoBufSerializer();
550      serializer.Serialize(test(), tempFile);
551      object o = serializer.Deserialize(tempFile);
552      float result = (float)o;
553      Assert.AreEqual(test(), result);
554      Assert.IsTrue(o is float);
555
556      string msg = Profile(test);
557      Console.WriteLine(msg);
558    }
559
560    [TestMethod]
561    [TestCategory("PersistenceNew")]
562    [TestProperty("Time", "short")]
563    public void TestDecimal() {
564      var test = new Func<object>(() => { return 42.5m; });
565      ProtoBufSerializer serializer = new ProtoBufSerializer();
566      serializer.Serialize(test(), tempFile);
567      object o = serializer.Deserialize(tempFile);
568      decimal result = (decimal)o;
569      Assert.AreEqual(test(), result);
570      Assert.IsTrue(o is decimal);
571
572      string msg = Profile(test);
573      Console.WriteLine(msg);
574    }
575
576    [TestMethod]
577    [TestCategory("PersistenceNew")]
578    [TestProperty("Time", "short")]
579    public void TestLong() {
580      var test = new Func<object>(() => { return 42l; });
581      ProtoBufSerializer serializer = new ProtoBufSerializer();
582      serializer.Serialize(test(), tempFile);
583      object o = serializer.Deserialize(tempFile);
584      long result = (long)o;
585      Assert.AreEqual(test(), result);
586      Assert.IsTrue(o is long);
587
588      string msg = Profile(test);
589      Console.WriteLine(msg);
590    }
591
592    [TestMethod]
593    [TestCategory("PersistenceNew")]
594    [TestProperty("Time", "short")]
595    public void TestUInt() {
596      var test = new Func<object>(() => { return 42u; });
597      ProtoBufSerializer serializer = new ProtoBufSerializer();
598      serializer.Serialize(test(), tempFile);
599      object o = serializer.Deserialize(tempFile);
600      uint result = (uint)o;
601      Assert.AreEqual(test(), result);
602      Assert.IsTrue(o is uint);
603
604      string msg = Profile(test);
605      Console.WriteLine(msg);
606    }
607
608    [TestMethod]
609    [TestCategory("PersistenceNew")]
610    [TestProperty("Time", "short")]
611    public void TestShort() {
612      var test = new Func<object>(() => { short s = 42; return s; });
613      ProtoBufSerializer serializer = new ProtoBufSerializer();
614      serializer.Serialize(test(), tempFile);
615      object o = serializer.Deserialize(tempFile);
616      short result = (short)o;
617      Assert.IsTrue(o is short);
618      Assert.AreEqual(test(), result);
619
620      string msg = Profile(test);
621      Console.WriteLine(msg);
622    }
623
624    [TestMethod]
625    [TestCategory("PersistenceNew")]
626    [TestProperty("Time", "short")]
627    public void TestByte() {
628      var test = new Func<object>(() => { byte b = 42; return b; });
629      ProtoBufSerializer serializer = new ProtoBufSerializer();
630      serializer.Serialize(test(), tempFile);
631      object o = serializer.Deserialize(tempFile);
632      byte result = (byte)o;
633      Assert.IsTrue(o is byte);
634      Assert.AreEqual(test(), result);
635
636      string msg = Profile(test);
637      Console.WriteLine(msg);
638    }
639
640    [TestMethod]
641    [TestCategory("PersistenceNew")]
642    [TestProperty("Time", "short")]
643    public void TestEnumSimple() {
644      var test = new Func<object>(() => { return SimpleEnum.two; });
645
646      ProtoBufSerializer serializer = new ProtoBufSerializer();
647      serializer.Serialize(test(), tempFile);
648      object o = serializer.Deserialize(tempFile);
649      SimpleEnum result = (SimpleEnum)o;
650      Assert.AreEqual(test(), result);
651
652      string msg = Profile(test);
653      Console.WriteLine(msg);
654    }
655
656    [TestMethod]
657    [TestCategory("PersistenceNew")]
658    [TestProperty("Time", "short")]
659    public void TestEnumComplex() {
660      var test = new Func<object>(() => { return ComplexEnum.three; });
661      ProtoBufSerializer serializer = new ProtoBufSerializer();
662      serializer.Serialize(test(), tempFile);
663      object o = serializer.Deserialize(tempFile);
664      ComplexEnum result = (ComplexEnum)o;
665      Assert.AreEqual(test(), result);
666
667      string msg = Profile(test);
668      Console.WriteLine(msg);
669    }
670
671    [TestMethod]
672    [TestCategory("PersistenceNew")]
673    [TestProperty("Time", "short")]
674    public void TestType() {
675      var test = new Func<object>(() => { return typeof(HeuristicLab.Algorithms.GeneticAlgorithm.GeneticAlgorithm); });
676      ProtoBufSerializer serializer = new ProtoBufSerializer();
677      serializer.Serialize(test(), tempFile);
678      object o = serializer.Deserialize(tempFile);
679      Type result = (Type)o;
680      Assert.AreEqual(test(), result);
681
682      string msg = Profile(test);
683      Console.WriteLine(msg);
684    }
685
686    [TestMethod]
687    [TestCategory("PersistenceNew")]
688    [TestProperty("Time", "short")]
689    public void TestBytes() {
690      var test = new Func<byte[]>(() => { return new byte[] { 3, 1 }; });
691      ProtoBufSerializer serializer = new ProtoBufSerializer();
692      serializer.Serialize(test(), tempFile);
693      object o = serializer.Deserialize(tempFile);
694      byte[] result = (byte[])o;
695      Assert.AreEqual(test()[0], result[0]);
696      Assert.AreEqual(test()[1], result[1]);
697
698      string msg = Profile(test);
699      Console.WriteLine(msg);
700    }
701
702    [TestMethod]
703    [TestCategory("PersistenceNew")]
704    [TestProperty("Time", "short")]
705    public void TestSBytes() {
706      var test = new Func<sbyte[]>(() => { return new sbyte[] { 3, 1 }; });
707      ProtoBufSerializer serializer = new ProtoBufSerializer();
708      serializer.Serialize(test(), tempFile);
709      object o = serializer.Deserialize(tempFile);
710      sbyte[] result = (sbyte[])o;
711      Assert.AreEqual(test()[0], result[0]);
712      Assert.AreEqual(test()[1], result[1]);
713
714      string msg = Profile(test);
715      Console.WriteLine(msg);
716    }
717
718    [TestMethod]
719    [TestCategory("PersistenceNew")]
720    [TestProperty("Time", "short")]
721    public void TestChars() {
722      var test = new Func<char[]>(() => { return new char[] { 'a', 'b' }; });
723      ProtoBufSerializer serializer = new ProtoBufSerializer();
724      serializer.Serialize(test(), tempFile);
725      object o = serializer.Deserialize(tempFile);
726      char[] result = (char[])o;
727      Assert.AreEqual(test()[0], result[0]);
728      Assert.AreEqual(test()[1], result[1]);
729
730      string msg = Profile(test);
731      Console.WriteLine(msg);
732    }
733
734    [TestMethod]
735    [TestCategory("PersistenceNew")]
736    [TestProperty("Time", "short")]
737    public void TestShorts() {
738      var test = new Func<short[]>(() => { return new short[] { 3, 1 }; });
739      ProtoBufSerializer serializer = new ProtoBufSerializer();
740      serializer.Serialize(test(), tempFile);
741      object o = serializer.Deserialize(tempFile);
742      short[] result = (short[])o;
743      Assert.AreEqual(test()[0], result[0]);
744      Assert.AreEqual(test()[1], result[1]);
745
746      string msg = Profile(test);
747      Console.WriteLine(msg);
748    }
749
750    [TestMethod]
751    [TestCategory("PersistenceNew")]
752    [TestProperty("Time", "short")]
753    public void TestUShorts() {
754      var test = new Func<ushort[]>(() => { return new ushort[] { 3, 1 }; });
755      ProtoBufSerializer serializer = new ProtoBufSerializer();
756      serializer.Serialize(test(), tempFile);
757      object o = serializer.Deserialize(tempFile);
758      ushort[] result = (ushort[])o;
759      Assert.AreEqual(test()[0], result[0]);
760      Assert.AreEqual(test()[1], result[1]);
761
762      string msg = Profile(test);
763      Console.WriteLine(msg);
764    }
765
766    [TestMethod]
767    [TestCategory("PersistenceNew")]
768    [TestProperty("Time", "short")]
769    public void TestString() {
770      var test = new Func<object>(() => { return "Hello World!"; });
771      ProtoBufSerializer serializer = new ProtoBufSerializer();
772      serializer.Serialize(test(), tempFile);
773      object o = serializer.Deserialize(tempFile);
774      string result = (string)o;
775      Assert.AreEqual(test(), result);
776
777      string msg = Profile(test);
778      Console.WriteLine(msg);
779    }
780
781    [TestMethod]
782    [TestCategory("PersistenceNew")]
783    [TestProperty("Time", "short")]
784    public void TestColor() {
785      var test = new Func<object>(() => { return Color.FromArgb(12, 34, 56, 78); });
786      ProtoBufSerializer serializer = new ProtoBufSerializer();
787      serializer.Serialize(test(), tempFile);
788      object o = serializer.Deserialize(tempFile);
789      Color result = (Color)o;
790      Assert.AreEqual(test(), result);
791
792      string msg = Profile(test);
793      Console.WriteLine(msg);
794    }
795
796    [TestMethod]
797    [TestCategory("PersistenceNew")]
798    [TestProperty("Time", "short")]
799    public void TestPoint() {
800      var test = new Func<object>(() => { return new Point(3, 4); });
801      ProtoBufSerializer serializer = new ProtoBufSerializer();
802      serializer.Serialize(test(), tempFile);
803      object o = serializer.Deserialize(tempFile);
804      Point result = (Point)o;
805      Assert.AreEqual(((Point)test()).X, result.X);
806      Assert.AreEqual(((Point)test()).Y, result.Y);
807
808      string msg = Profile(test);
809      Console.WriteLine(msg);
810    }
811
812    [TestMethod]
813    [TestCategory("PersistenceNew")]
814    [TestProperty("Time", "short")]
815    public void TestBoolArray() {
816      var test = new Func<bool[]>(() => { return new[] { true, false, true }; });
817      ProtoBufSerializer serializer = new ProtoBufSerializer();
818      serializer.Serialize(test(), tempFile);
819      object o = serializer.Deserialize(tempFile);
820      bool[] result = (bool[])o;
821      Assert.AreEqual(test()[0], result[0]);
822      Assert.AreEqual(test()[1], result[1]);
823      Assert.AreEqual(test()[2], result[2]);
824
825      string msg = Profile(test);
826      Console.WriteLine(msg);
827    }
828
829    [TestMethod]
830    [TestCategory("PersistenceNew")]
831    [TestProperty("Time", "short")]
832    public void TestIntArray() {
833      var test = new Func<int[]>(() => { return new[] { 41, 22, 13 }; });
834      ProtoBufSerializer serializer = new ProtoBufSerializer();
835      serializer.Serialize(test(), tempFile);
836      object o = serializer.Deserialize(tempFile);
837      int[] result = (int[])o;
838      Assert.AreEqual(test()[0], result[0]);
839      Assert.AreEqual(test()[1], result[1]);
840      Assert.AreEqual(test()[2], result[2]);
841
842      string msg = Profile(test);
843      Console.WriteLine(msg);
844    }
845
846    [TestMethod]
847    [TestCategory("PersistenceNew")]
848    [TestProperty("Time", "short")]
849    public void TestLongArray() {
850      var test = new Func<long[]>(() => { return new[] { 414481188112191633l, 245488586662l, 13546881335845865l }; });
851      ProtoBufSerializer serializer = new ProtoBufSerializer();
852      serializer.Serialize(test(), tempFile);
853      object o = serializer.Deserialize(tempFile);
854      long[] result = (long[])o;
855      Assert.AreEqual(test()[0], result[0]);
856      Assert.AreEqual(test()[1], result[1]);
857      Assert.AreEqual(test()[2], result[2]);
858
859      string msg = Profile(test);
860      Console.WriteLine(msg);
861    }
862
863    [TestMethod]
864    [TestCategory("PersistenceNew")]
865    [TestProperty("Time", "short")]
866    public void TestDoubleArray() {
867      var test = new Func<double[]>(() => { return new[] { 41.5, 22.7, 13.8 }; });
868      ProtoBufSerializer serializer = new ProtoBufSerializer();
869      serializer.Serialize(test(), tempFile);
870      object o = serializer.Deserialize(tempFile);
871      double[] result = (double[])o;
872      Assert.AreEqual(test()[0], result[0]);
873      Assert.AreEqual(test()[1], result[1]);
874      Assert.AreEqual(test()[2], result[2]);
875
876      string msg = Profile(test);
877      Console.WriteLine(msg);
878    }
879
880    [TestMethod]
881    [TestCategory("PersistenceNew")]
882    [TestProperty("Time", "short")]
883    public void TestObjectArray() {
884      var test = new Func<SimpleClass[]>(() => {
885        return new[] { new SimpleClass() { x = 42, y = 43 },
886                       new SimpleClass() { x = 44.44, y = 5677 },
887                       new SimpleClass() { x = 533.33, y = 2345 } };
888      });
889      ProtoBufSerializer serializer = new ProtoBufSerializer();
890      serializer.Serialize(test(), tempFile);
891      object o = serializer.Deserialize(tempFile);
892      SimpleClass[] result = (SimpleClass[])o;
893      Assert.AreEqual(test()[0].x, result[0].x);
894      Assert.AreEqual(test()[0].y, result[0].y);
895      Assert.AreEqual(test()[1].x, result[1].x);
896      Assert.AreEqual(test()[1].y, result[1].y);
897      Assert.AreEqual(test()[2].x, result[2].x);
898      Assert.AreEqual(test()[2].y, result[2].y);
899
900      string msg = Profile(test);
901      Console.WriteLine(msg);
902    }
903
904    [TestMethod]
905    [TestCategory("PersistenceNew")]
906    [TestProperty("Time", "short")]
907    public void TestStack() {
908      var test = new Func<Stack>(() => {
909        return new Stack(new int[] { 1, 2, 3 });
910      });
911      ProtoBufSerializer serializer = new ProtoBufSerializer();
912      serializer.Serialize(test(), tempFile);
913      object o = serializer.Deserialize(tempFile);
914      Stack result = (Stack)o;
915      var actualStack = test();
916      Assert.AreEqual(actualStack.Pop(), result.Pop());
917      Assert.AreEqual(actualStack.Pop(), result.Pop());
918      Assert.AreEqual(actualStack.Pop(), result.Pop());
919
920      string msg = Profile(test);
921      Console.WriteLine(msg);
922    }
923
924    [TestMethod]
925    [TestCategory("PersistenceNew")]
926    [TestProperty("Time", "short")]
927    public void TestArrayOfStack() {
928      var test = new Func<object[]>(() => {
929        return new object[] {
930          new Stack(new int[] { 1, 2, 3 }),
931          new Stack<int>(new int[] { 1, 2, 3 }),
932      };
933      });
934      ProtoBufSerializer serializer = new ProtoBufSerializer();
935      serializer.Serialize(test(), tempFile);
936      object o = serializer.Deserialize(tempFile);
937      var result = (object[])o;
938      var firstStack = (Stack)result[0];
939      var secondStack = (Stack<int>)result[1];
940      var actual = test();
941      var actualFirst = (Stack)actual[0];
942      var actualSecond = (Stack<int>)actual[1];
943
944      Assert.AreEqual(actualFirst.Pop(), firstStack.Pop());
945      Assert.AreEqual(actualFirst.Pop(), firstStack.Pop());
946      Assert.AreEqual(actualFirst.Pop(), firstStack.Pop());
947      Assert.AreEqual(actualSecond.Pop(), secondStack.Pop());
948      Assert.AreEqual(actualSecond.Pop(), secondStack.Pop());
949      Assert.AreEqual(actualSecond.Pop(), secondStack.Pop());
950
951      string msg = Profile(test);
952      Console.WriteLine(msg);
953    }
954
955
956    [TestMethod]
957    [TestCategory("PersistenceNew")]
958    [TestProperty("Time", "short")]
959    public void TestIntValueArray() {
960      var test = new Func<IntValue[]>(() => { return new[] { new IntValue(41), new IntValue(22), new IntValue(13) }; });
961      ProtoBufSerializer serializer = new ProtoBufSerializer();
962      serializer.Serialize(test(), tempFile);
963      object o = serializer.Deserialize(tempFile);
964      IntValue[] result = (IntValue[])o;
965      Assert.AreEqual(test()[0].Value, result[0].Value);
966      Assert.AreEqual(test()[1].Value, result[1].Value);
967      Assert.AreEqual(test()[2].Value, result[2].Value);
968
969      string msg = Profile(test);
970      Console.WriteLine(msg);
971    }
972
973    [TestMethod]
974    [TestCategory("PersistenceNew")]
975    [TestProperty("Time", "short")]
976    public void TestIntValueArrayArray() {
977      var test = new Func<IntValue[][]>(() => { return new IntValue[][] { new IntValue[] { new IntValue(41), new IntValue(22), new IntValue(13) } }; });
978      ProtoBufSerializer serializer = new ProtoBufSerializer();
979      serializer.Serialize(test(), tempFile);
980      object o = serializer.Deserialize(tempFile);
981      IntValue[][] result = (IntValue[][])o;
982      Assert.AreEqual(test()[0][0].Value, result[0][0].Value);
983      Assert.AreEqual(test()[0][1].Value, result[0][1].Value);
984      Assert.AreEqual(test()[0][2].Value, result[0][2].Value);
985
986      string msg = Profile(test);
987      Console.WriteLine(msg);
988    }
989    #endregion
990
991    #region Old Persistence Tests
992    [TestMethod]
993    [TestCategory("PersistenceNew")]
994    [TestProperty("Time", "short")]
995    public void ComplexStorable() {
996      ProtoBufSerializer serializer = new ProtoBufSerializer();
997      Root r = InitializeComplexStorable();
998      serializer.Serialize(r, tempFile);
999      Root newR = (Root)serializer.Deserialize(tempFile);
1000      CompareComplexStorables(r, newR);
1001    }
1002
1003    private static void CompareComplexStorables(Root r, Root newR) {
1004      Assert.AreEqual(
1005        DebugStringGenerator.Serialize(r),
1006        DebugStringGenerator.Serialize(newR));
1007      Assert.AreSame(newR, newR.selfReferences[0]);
1008      Assert.AreNotSame(r, newR);
1009      Assert.AreEqual(r.myEnum, TestEnum.va1);
1010      Assert.AreEqual(r.i[0], 7);
1011      Assert.AreEqual(r.i[1], 5);
1012      Assert.AreEqual(r.i[2], 6);
1013      Assert.AreEqual(r.s, "new value");
1014      Assert.AreEqual(r.intArray[0], 3);
1015      Assert.AreEqual(r.intArray[1], 2);
1016      Assert.AreEqual(r.intArray[2], 1);
1017      Assert.AreEqual(r.intList[0], 9);
1018      Assert.AreEqual(r.intList[1], 8);
1019      Assert.AreEqual(r.intList[2], 7);
1020      Assert.AreEqual(r.multiDimArray[0, 0], 5);
1021      Assert.AreEqual(r.multiDimArray[0, 1], 4);
1022      Assert.AreEqual(r.multiDimArray[0, 2], 3);
1023      Assert.AreEqual(r.multiDimArray[1, 0], 1);
1024      Assert.AreEqual(r.multiDimArray[1, 1], 4);
1025      Assert.AreEqual(r.multiDimArray[1, 2], 6);
1026      Assert.IsFalse(r.boolean);
1027      Assert.IsTrue((DateTime.Now - r.dateTime).TotalSeconds < 10);
1028      Assert.AreEqual(r.kvp.Key, "string key");
1029      Assert.AreEqual(r.kvp.Value, 321);
1030      Assert.IsNull(r.uninitialized);
1031      Assert.AreEqual(newR.myEnum, TestEnum.va1);
1032      Assert.AreEqual(newR.i[0], 7);
1033      Assert.AreEqual(newR.i[1], 5);
1034      Assert.AreEqual(newR.i[2], 6);
1035      Assert.AreEqual(newR.s, "new value");
1036      Assert.AreEqual(newR.intArray[0], 3);
1037      Assert.AreEqual(newR.intArray[1], 2);
1038      Assert.AreEqual(newR.intArray[2], 1);
1039      Assert.AreEqual(newR.intList[0], 9);
1040      Assert.AreEqual(newR.intList[1], 8);
1041      Assert.AreEqual(newR.intList[2], 7);
1042      Assert.AreEqual(newR.multiDimArray[0, 0], 5);
1043      Assert.AreEqual(newR.multiDimArray[0, 1], 4);
1044      Assert.AreEqual(newR.multiDimArray[0, 2], 3);
1045      Assert.AreEqual(newR.multiDimArray[1, 0], 1);
1046      Assert.AreEqual(newR.multiDimArray[1, 1], 4);
1047      Assert.AreEqual(newR.multiDimArray[1, 2], 6);
1048      Assert.AreEqual(newR.intStack.Pop(), 3);
1049      Assert.AreEqual(newR.intStack.Pop(), 2);
1050      Assert.AreEqual(newR.intStack.Pop(), 1);
1051      Assert.IsFalse(newR.boolean);
1052      Assert.IsTrue((DateTime.Now - newR.dateTime).TotalSeconds < 10);
1053      Assert.AreEqual(newR.kvp.Key, "string key");
1054      Assert.AreEqual(newR.kvp.Value, 321);
1055      Assert.IsNull(newR.uninitialized);
1056    }
1057
1058    private static Root InitializeComplexStorable() {
1059      Root r = new Root();
1060      r.intStack.Push(1);
1061      r.intStack.Push(2);
1062      r.intStack.Push(3);
1063      r.selfReferences = new List<Root> { r, r };
1064      r.c = new Custom { r = r };
1065      r.dict.Add("one", 1);
1066      r.dict.Add("two", 2);
1067      r.dict.Add("three", 3);
1068      r.myEnum = TestEnum.va1;
1069      r.i = new[] { 7, 5, 6 };
1070      r.s = "new value";
1071      r.intArray = new ArrayList { 3, 2, 1 };
1072      r.intList = new List<int> { 9, 8, 7 };
1073      r.multiDimArray = new double[,] { { 5, 4, 3 }, { 1, 4, 6 } };
1074      r.boolean = false;
1075      r.dateTime = DateTime.Now;
1076      r.kvp = new KeyValuePair<string, int>("string key", 321);
1077      r.uninitialized = null;
1078
1079      return r;
1080    }
1081
1082    [TestMethod]
1083    [TestCategory("PersistenceNew")]
1084    [TestProperty("Time", "short")]
1085    public void SelfReferences() {
1086      ProtoBufSerializer serializer = new ProtoBufSerializer();
1087      C c = new C();
1088      C[][] cs = new C[2][];
1089      cs[0] = new C[] { c };
1090      cs[1] = new C[] { c };
1091      c.allCs = cs;
1092      c.kvpList = new KeyValuePair<List<C>, C>(new List<C> { c }, c);
1093      serializer.Serialize(cs, tempFile);
1094      object o = serializer.Deserialize(tempFile);
1095      Assert.AreEqual(
1096        DebugStringGenerator.Serialize(cs),
1097        DebugStringGenerator.Serialize(o));
1098      Assert.AreSame(c, c.allCs[0][0]);
1099      Assert.AreSame(c, c.allCs[1][0]);
1100      Assert.AreSame(c, c.kvpList.Key[0]);
1101      Assert.AreSame(c, c.kvpList.Value);
1102      C[][] newCs = (C[][])o;
1103      C newC = newCs[0][0];
1104      Assert.AreSame(newC, newC.allCs[0][0]);
1105      Assert.AreSame(newC, newC.allCs[1][0]);
1106      Assert.AreSame(newC, newC.kvpList.Key[0]);
1107      Assert.AreSame(newC, newC.kvpList.Value);
1108    }
1109
1110    [TestMethod]
1111    [TestCategory("PersistenceNew")]
1112    [TestProperty("Time", "short")]
1113    public void ArrayCreation() {
1114      ProtoBufSerializer serializer = new ProtoBufSerializer();
1115      ArrayList[] arrayListArray = new ArrayList[4];
1116      arrayListArray[0] = new ArrayList();
1117      arrayListArray[0].Add(arrayListArray);
1118      arrayListArray[0].Add(arrayListArray);
1119      arrayListArray[1] = new ArrayList();
1120      arrayListArray[1].Add(arrayListArray);
1121      arrayListArray[2] = new ArrayList();
1122      arrayListArray[2].Add(arrayListArray);
1123      arrayListArray[2].Add(arrayListArray);
1124      Array a = Array.CreateInstance(
1125                              typeof(object),
1126                              new[] { 1, 2 }, new[] { 3, 4 });
1127      arrayListArray[2].Add(a);
1128      serializer.Serialize(arrayListArray, tempFile);
1129      object o = serializer.Deserialize(tempFile);
1130      Assert.AreEqual(
1131        DebugStringGenerator.Serialize(arrayListArray),
1132        DebugStringGenerator.Serialize(o));
1133      ArrayList[] newArray = (ArrayList[])o;
1134      Assert.AreSame(arrayListArray, arrayListArray[0][0]);
1135      Assert.AreSame(arrayListArray, arrayListArray[2][1]);
1136      Assert.AreSame(newArray, newArray[0][0]);
1137      Assert.AreSame(newArray, newArray[2][1]);
1138    }
1139
1140    [TestMethod]
1141    [TestCategory("PersistenceNew")]
1142    [TestProperty("Time", "short")]
1143    public void CustomSerializationProperty() {
1144      ProtoBufSerializer serializer = new ProtoBufSerializer();
1145      Manager m = new Manager();
1146      serializer.Serialize(m, tempFile);
1147      Manager newM = (Manager)serializer.Deserialize(tempFile);
1148      Assert.AreNotEqual(
1149        DebugStringGenerator.Serialize(m),
1150        DebugStringGenerator.Serialize(newM));
1151      Assert.AreEqual(m.dbl, newM.dbl);
1152      Assert.AreEqual(m.lastLoadTime, new DateTime());
1153      Assert.AreNotEqual(newM.lastLoadTime, new DateTime());
1154      Assert.IsTrue((DateTime.Now - newM.lastLoadTime).TotalSeconds < 10);
1155    }
1156
1157    [TestMethod]
1158    [TestCategory("PersistenceNew")]
1159    [TestProperty("Time", "short")]
1160    public void Primitives() {
1161      ProtoBufSerializer serializer = new ProtoBufSerializer();
1162      PrimitivesTest sdt = new PrimitivesTest();
1163      serializer.Serialize(sdt, tempFile);
1164      object o = serializer.Deserialize(tempFile);
1165      Assert.AreEqual(
1166        DebugStringGenerator.Serialize(sdt),
1167        DebugStringGenerator.Serialize(o));
1168    }
1169
1170    [TestMethod]
1171    [TestCategory("PersistenceNew")]
1172    [TestProperty("Time", "short")]
1173    public void MultiDimensionalArray() {
1174      ProtoBufSerializer serializer = new ProtoBufSerializer();
1175      string[,] mDimString = new string[,] {
1176        {"ora", "et", "labora"},
1177        {"Beten", "und", "Arbeiten"}
1178      };
1179      serializer.Serialize(mDimString, tempFile);
1180      object o = serializer.Deserialize(tempFile);
1181      Assert.AreEqual(
1182        DebugStringGenerator.Serialize(mDimString),
1183        DebugStringGenerator.Serialize(o));
1184    }
1185
1186    [StorableType("87A331AF-14DC-48B3-B577-D49065743BE6")]
1187    public class NestedType {
1188      [Storable]
1189      private string value = "value";
1190      public override bool Equals(object obj) {
1191        NestedType nt = obj as NestedType;
1192        if (nt == null)
1193          throw new NotSupportedException();
1194        return nt.value == value;
1195      }
1196      public override int GetHashCode() {
1197        return value.GetHashCode();
1198      }
1199    }
1200
1201    [TestMethod]
1202    [TestCategory("PersistenceNew")]
1203    [TestProperty("Time", "short")]
1204    public void NestedTypeTest() {
1205      ProtoBufSerializer serializer = new ProtoBufSerializer();
1206      NestedType t = new NestedType();
1207      serializer.Serialize(t, tempFile);
1208      object o = serializer.Deserialize(tempFile);
1209      Assert.AreEqual(
1210        DebugStringGenerator.Serialize(t),
1211        DebugStringGenerator.Serialize(o));
1212      Assert.IsTrue(t.Equals(o));
1213    }
1214
1215
1216    [TestMethod]
1217    [TestCategory("PersistenceNew")]
1218    [TestProperty("Time", "short")]
1219    public void SimpleArray() {
1220      ProtoBufSerializer serializer = new ProtoBufSerializer();
1221      string[] strings = { "ora", "et", "labora" };
1222      serializer.Serialize(strings, tempFile);
1223      object o = serializer.Deserialize(tempFile);
1224      Assert.AreEqual(
1225        DebugStringGenerator.Serialize(strings),
1226        DebugStringGenerator.Serialize(o));
1227    }
1228
1229    [TestMethod]
1230    [TestCategory("PersistenceNew")]
1231    [TestProperty("Time", "short")]
1232    public void PrimitiveRoot() {
1233      ProtoBufSerializer serializer = new ProtoBufSerializer();
1234      serializer.Serialize(12.3f, tempFile);
1235      object o = serializer.Deserialize(tempFile);
1236      Assert.AreEqual(
1237        DebugStringGenerator.Serialize(12.3f),
1238        DebugStringGenerator.Serialize(o));
1239    }
1240
1241    private string formatFullMemberName(MemberInfo mi) {
1242      return new StringBuilder()
1243        .Append(mi.DeclaringType.Assembly.GetName().Name)
1244        .Append(": ")
1245        .Append(mi.DeclaringType.Namespace)
1246        .Append('.')
1247        .Append(mi.DeclaringType.Name)
1248        .Append('.')
1249        .Append(mi.Name).ToString();
1250    }
1251
1252    public void CodingConventions() {
1253      List<string> lowerCaseMethodNames = new List<string>();
1254      List<string> lowerCaseProperties = new List<string>();
1255      List<string> lowerCaseFields = new List<string>();
1256      foreach (Assembly a in PluginLoader.Assemblies) {
1257        if (!a.GetName().Name.StartsWith("HeuristicLab"))
1258          continue;
1259        foreach (Type t in a.GetTypes()) {
1260          foreach (MemberInfo mi in t.GetMembers(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)) {
1261            if (mi.DeclaringType.Name.StartsWith("<>"))
1262              continue;
1263            if (char.IsLower(mi.Name[0])) {
1264              if (mi.MemberType == MemberTypes.Field)
1265                lowerCaseFields.Add(formatFullMemberName(mi));
1266              if (mi.MemberType == MemberTypes.Property)
1267                lowerCaseProperties.Add(formatFullMemberName(mi));
1268              if (mi.MemberType == MemberTypes.Method &&
1269                !mi.Name.StartsWith("get_") &&
1270                !mi.Name.StartsWith("set_") &&
1271                !mi.Name.StartsWith("add_") &&
1272                !mi.Name.StartsWith("remove_") &&
1273                !mi.Name.StartsWith("op_"))
1274                lowerCaseMethodNames.Add(formatFullMemberName(mi));
1275            }
1276          }
1277        }
1278      }
1279      //Assert.AreEqual("", lowerCaseFields.Aggregate("", (a, b) => a + "\r\n" + b));
1280      Assert.AreEqual("", lowerCaseMethodNames.Aggregate("", (a, b) => a + "\r\n" + b));
1281      Assert.AreEqual("", lowerCaseProperties.Aggregate("", (a, b) => a + "\r\n" + b));
1282    }
1283
1284    [TestMethod]
1285    [TestCategory("PersistenceNew")]
1286    [TestProperty("Time", "short")]
1287    public void Enums() {
1288      ProtoBufSerializer serializer = new ProtoBufSerializer();
1289      EnumTest et = new EnumTest();
1290      et.simpleEnum = SimpleEnum.two;
1291      et.complexEnum = ComplexEnum.three;
1292      et.trickyEnum = TrickyEnum.two | TrickyEnum.one;
1293      serializer.Serialize(et, tempFile);
1294      EnumTest newEt = (EnumTest)serializer.Deserialize(tempFile);
1295      Assert.AreEqual(et.simpleEnum, SimpleEnum.two);
1296      Assert.AreEqual(et.complexEnum, ComplexEnum.three);
1297      Assert.AreEqual(et.trickyEnum, (TrickyEnum)3);
1298    }
1299
1300    [TestMethod]
1301    [TestCategory("PersistenceNew")]
1302    [TestProperty("Time", "short")]
1303    public void TestAliasingWithOverriddenEquals() {
1304      ProtoBufSerializer serializer = new ProtoBufSerializer();
1305      List<IntWrapper> ints = new List<IntWrapper>();
1306      ints.Add(new IntWrapper(1));
1307      ints.Add(new IntWrapper(1));
1308      Assert.AreEqual(ints[0], ints[1]);
1309      Assert.AreNotSame(ints[0], ints[1]);
1310      serializer.Serialize(ints, tempFile);
1311      List<IntWrapper> newInts = (List<IntWrapper>)serializer.Deserialize(tempFile);
1312      Assert.AreEqual(newInts[0].Value, 1);
1313      Assert.AreEqual(newInts[1].Value, 1);
1314      Assert.AreEqual(newInts[0], newInts[1]);
1315      Assert.AreNotSame(newInts[0], newInts[1]);
1316    }
1317
1318    [TestMethod]
1319    [TestCategory("PersistenceNew")]
1320    [TestProperty("Time", "short")]
1321    public void NonDefaultConstructorTest() {
1322      ProtoBufSerializer serializer = new ProtoBufSerializer();
1323      NonDefaultConstructorClass c = new NonDefaultConstructorClass(1);
1324      try {
1325        serializer.Serialize(c, tempFile);
1326        Assert.Fail("Exception not thrown");
1327      } catch (PersistenceException) {
1328      }
1329    }
1330
1331    [TestMethod]
1332    [TestCategory("PersistenceNew")]
1333    [TestProperty("Time", "short")]
1334    public void TestSavingException() {
1335      ProtoBufSerializer serializer = new ProtoBufSerializer();
1336      List<int> list = new List<int> { 1, 2, 3 };
1337      serializer.Serialize(list, tempFile);
1338      NonSerializable s = new NonSerializable();
1339      try {
1340        serializer.Serialize(s, tempFile);
1341        Assert.Fail("Exception expected");
1342      } catch (PersistenceException) { }
1343      List<int> newList = (List<int>)serializer.Deserialize(tempFile);
1344      Assert.AreEqual(list[0], newList[0]);
1345      Assert.AreEqual(list[1], newList[1]);
1346    }
1347
1348    [TestMethod]
1349    [TestCategory("PersistenceNew")]
1350    [TestProperty("Time", "short")]
1351    public void TestTypeStringConversion() {
1352      string name = typeof(List<int>[]).AssemblyQualifiedName;
1353      string shortName =
1354        "System.Collections.Generic.List`1[[System.Int32, mscorlib]][], mscorlib";
1355      Assert.AreEqual(name, TypeNameParser.Parse(name).ToString());
1356      Assert.AreEqual(shortName, TypeNameParser.Parse(name).ToString(false));
1357      Assert.AreEqual(shortName, typeof(List<int>[]).VersionInvariantName());
1358    }
1359
1360    [TestMethod]
1361    [TestCategory("PersistenceNew")]
1362    [TestProperty("Time", "short")]
1363    public void TestHexadecimalPublicKeyToken() {
1364      string name = "TestClass, TestAssembly, Version=1.2.3.4, PublicKey=1234abc";
1365      string shortName = "TestClass, TestAssembly";
1366      Assert.AreEqual(name, TypeNameParser.Parse(name).ToString());
1367      Assert.AreEqual(shortName, TypeNameParser.Parse(name).ToString(false));
1368    }
1369
1370    [TestMethod]
1371    [TestCategory("PersistenceNew")]
1372    [TestProperty("Time", "short")]
1373    public void InheritanceTest() {
1374      ProtoBufSerializer serializer = new ProtoBufSerializer();
1375      New n = new New();
1376      serializer.Serialize(n, tempFile);
1377      New nn = (New)serializer.Deserialize(tempFile);
1378      Assert.AreEqual(n.Name, nn.Name);
1379      Assert.AreEqual(((Override)n).Name, ((Override)nn).Name);
1380    }
1381
1382    [StorableType("B963EF51-12B4-432E-8C54-88F026F9ACE2")]
1383    class Child {
1384      [Storable]
1385      public GrandParent grandParent;
1386    }
1387
1388    [StorableType("E66E9606-967A-4C35-A361-F6F0D21C064A")]
1389    class Parent {
1390      [Storable]
1391      public Child child;
1392    }
1393
1394    [StorableType("34D3893A-57AD-4F72-878B-81D6FA3F14A9")]
1395    class GrandParent {
1396      [Storable]
1397      public Parent parent;
1398    }
1399
1400    [TestMethod]
1401    [TestCategory("PersistenceNew")]
1402    [TestProperty("Time", "short")]
1403    public void InstantiateParentChainReference() {
1404      ProtoBufSerializer serializer = new ProtoBufSerializer();
1405      GrandParent gp = new GrandParent();
1406      gp.parent = new Parent();
1407      gp.parent.child = new Child();
1408      gp.parent.child.grandParent = gp;
1409      Assert.AreSame(gp, gp.parent.child.grandParent);
1410      serializer.Serialize(gp, tempFile);
1411      GrandParent newGp = (GrandParent)serializer.Deserialize(tempFile);
1412      Assert.AreSame(newGp, newGp.parent.child.grandParent);
1413    }
1414
1415    [StorableType("15DF777F-B12D-4FD4-88C3-8CB4C9CE4F0C")]
1416    struct TestStruct {
1417      int value;
1418      int PropertyValue { get; set; }
1419      public TestStruct(int value)
1420        : this() {
1421        this.value = value;
1422        PropertyValue = value;
1423      }
1424    }
1425
1426    [TestMethod]
1427    [TestCategory("PersistenceNew")]
1428    [TestProperty("Time", "short")]
1429    public void StructTest() {
1430      ProtoBufSerializer serializer = new ProtoBufSerializer();
1431      TestStruct s = new TestStruct(10);
1432      serializer.Serialize(s, tempFile);
1433      TestStruct newS = (TestStruct)serializer.Deserialize(tempFile);
1434      Assert.AreEqual(s, newS);
1435    }
1436
1437    [TestMethod]
1438    [TestCategory("PersistenceNew")]
1439    [TestProperty("Time", "short")]
1440    public void PointTest() {
1441      ProtoBufSerializer serializer = new ProtoBufSerializer();
1442      Point p = new Point(12, 34);
1443      serializer.Serialize(p, tempFile);
1444      Point newP = (Point)serializer.Deserialize(tempFile);
1445      Assert.AreEqual(p, newP);
1446    }
1447
1448    [TestMethod]
1449    [TestCategory("PersistenceNew")]
1450    [TestProperty("Time", "short")]
1451    public void NullableValueTypes() {
1452      ProtoBufSerializer serializer = new ProtoBufSerializer();
1453      double?[] d = new double?[] { null, 1, 2, 3 };
1454      serializer.Serialize(d, tempFile);
1455      double?[] newD = (double?[])serializer.Deserialize(tempFile);
1456      Assert.AreEqual(d[0], newD[0]);
1457      Assert.AreEqual(d[1], newD[1]);
1458      Assert.AreEqual(d[2], newD[2]);
1459      Assert.AreEqual(d[3], newD[3]);
1460    }
1461
1462    [TestMethod]
1463    [TestCategory("PersistenceNew")]
1464    [TestProperty("Time", "short")]
1465    public void BitmapTest() {
1466      ProtoBufSerializer serializer = new ProtoBufSerializer();
1467      Icon icon = System.Drawing.SystemIcons.Hand;
1468      Bitmap bitmap = icon.ToBitmap();
1469      serializer.Serialize(bitmap, tempFile);
1470      Bitmap newBitmap = (Bitmap)serializer.Deserialize(tempFile);
1471
1472      Assert.AreEqual(bitmap.Size, newBitmap.Size);
1473      for (int i = 0; i < bitmap.Size.Width; i++)
1474        for (int j = 0; j < bitmap.Size.Height; j++)
1475          Assert.AreEqual(bitmap.GetPixel(i, j), newBitmap.GetPixel(i, j));
1476    }
1477
1478    [StorableType("E846BC49-20F3-4D3F-A3F3-73D4F2DB1C2E")]
1479    private class PersistenceHooks {
1480      [Storable]
1481      public int a;
1482      [Storable]
1483      public int b;
1484      public int sum;
1485      public bool WasSerialized { get; private set; }
1486      [StorableHook(HookType.BeforeSerialization)]
1487      void PreSerializationHook() {
1488        WasSerialized = true;
1489      }
1490      [StorableHook(HookType.AfterDeserialization)]
1491      void PostDeserializationHook() {
1492        sum = a + b;
1493      }
1494    }
1495
1496    [TestMethod]
1497    [TestCategory("PersistenceNew")]
1498    [TestProperty("Time", "short")]
1499    public void HookTest() {
1500      ProtoBufSerializer serializer = new ProtoBufSerializer();
1501      PersistenceHooks hookTest = new PersistenceHooks();
1502      hookTest.a = 2;
1503      hookTest.b = 5;
1504      Assert.IsFalse(hookTest.WasSerialized);
1505      Assert.AreEqual(hookTest.sum, 0);
1506      serializer.Serialize(hookTest, tempFile);
1507      Assert.IsTrue(hookTest.WasSerialized);
1508      Assert.AreEqual(hookTest.sum, 0);
1509      PersistenceHooks newHookTest = (PersistenceHooks)serializer.Deserialize(tempFile);
1510      Assert.AreEqual(newHookTest.a, hookTest.a);
1511      Assert.AreEqual(newHookTest.b, hookTest.b);
1512      Assert.AreEqual(newHookTest.sum, newHookTest.a + newHookTest.b);
1513      Assert.IsFalse(newHookTest.WasSerialized);
1514    }
1515
1516    [StorableType("A35D71DF-397F-4910-A950-ED6923BE9483")]
1517    private class CustomConstructor {
1518      public string Value = "none";
1519      public CustomConstructor() {
1520        Value = "default";
1521      }
1522      [StorableConstructor]
1523      private CustomConstructor(StorableConstructorFlag _) {
1524        Value = "persistence";
1525      }
1526    }
1527
1528    [TestMethod]
1529    [TestCategory("PersistenceNew")]
1530    [TestProperty("Time", "short")]
1531    public void TestCustomConstructor() {
1532      ProtoBufSerializer serializer = new ProtoBufSerializer();
1533      CustomConstructor cc = new CustomConstructor();
1534      Assert.AreEqual(cc.Value, "default");
1535      serializer.Serialize(cc, tempFile);
1536      CustomConstructor newCC = (CustomConstructor)serializer.Deserialize(tempFile);
1537      Assert.AreEqual(newCC.Value, "persistence");
1538    }
1539
1540    [StorableType("D276E825-1F35-4BAC-8937-9ABC91D5C316")]
1541    public class ExplodingDefaultConstructor {
1542      public ExplodingDefaultConstructor() {
1543        throw new Exception("this constructor will always fail");
1544      }
1545      public ExplodingDefaultConstructor(string password) {
1546      }
1547    }
1548
1549    [TestMethod]
1550    [TestCategory("PersistenceNew")]
1551    [TestProperty("Time", "short")]
1552    public void TestConstructorExceptionUnwrapping() {
1553      ProtoBufSerializer serializer = new ProtoBufSerializer();
1554      ExplodingDefaultConstructor x = new ExplodingDefaultConstructor("password");
1555      serializer.Serialize(x, tempFile);
1556      try {
1557        ExplodingDefaultConstructor newX = (ExplodingDefaultConstructor)serializer.Deserialize(tempFile);
1558        Assert.Fail("Exception expected");
1559      } catch (PersistenceException pe) {
1560        Assert.AreEqual(pe.InnerException.Message, "this constructor will always fail");
1561      }
1562    }
1563
1564    [TestMethod]
1565    [TestCategory("PersistenceNew")]
1566    [TestProperty("Time", "short")]
1567    public void TestStreaming() {
1568      ProtoBufSerializer serializer = new ProtoBufSerializer();
1569      using (MemoryStream stream = new MemoryStream()) {
1570        Root r = InitializeComplexStorable();
1571        serializer.Serialize(r, stream);
1572        using (MemoryStream stream2 = new MemoryStream(stream.ToArray())) {
1573          Root newR = (Root)serializer.Deserialize(stream2);
1574          CompareComplexStorables(r, newR);
1575        }
1576      }
1577    }
1578
1579    [StorableType("4921031B-CB61-4677-97AD-9236A4CEC200")]
1580    public class HookInheritanceTestBase {
1581      [Storable]
1582      public object a;
1583      public object link;
1584      [StorableHook(HookType.AfterDeserialization)]
1585      private void relink() {
1586        link = a;
1587      }
1588    }
1589
1590    [StorableType("321CEE0A-5201-4CE2-B135-2343890D96BF")]
1591    public class HookInheritanceTestDerivedClass : HookInheritanceTestBase {
1592      [Storable]
1593      public object b;
1594      [StorableHook(HookType.AfterDeserialization)]
1595      private void relink() {
1596        Assert.AreSame(a, link);
1597        link = b;
1598      }
1599    }
1600
1601    [TestMethod]
1602    [TestCategory("PersistenceNew")]
1603    [TestProperty("Time", "short")]
1604    public void TestLinkInheritance() {
1605      ProtoBufSerializer serializer = new ProtoBufSerializer();
1606      HookInheritanceTestDerivedClass c = new HookInheritanceTestDerivedClass();
1607      c.a = new object();
1608      serializer.Serialize(c, tempFile);
1609      HookInheritanceTestDerivedClass newC = (HookInheritanceTestDerivedClass)serializer.Deserialize(tempFile);
1610      Assert.AreSame(c.b, c.link);
1611    }
1612
1613    [StorableType(StorableMemberSelection.AllFields, "B9AB42E8-1932-425B-B4CF-F31F07EAC599")]
1614    public class AllFieldsStorable {
1615      public int Value1 = 1;
1616      [Storable]
1617      public int Value2 = 2;
1618      public int Value3 { get; private set; }
1619      public int Value4 { get; private set; }
1620      [StorableConstructor]
1621      private AllFieldsStorable(StorableConstructorFlag _) { }
1622      public AllFieldsStorable() {
1623        Value1 = 12;
1624        Value2 = 23;
1625        Value3 = 34;
1626        Value4 = 56;
1627      }
1628    }
1629
1630    [TestMethod]
1631    [TestCategory("PersistenceNew")]
1632    [TestProperty("Time", "short")]
1633    public void TestStorableTypeDiscoveryAllFields() {
1634      ProtoBufSerializer serializer = new ProtoBufSerializer();
1635      AllFieldsStorable afs = new AllFieldsStorable();
1636      serializer.Serialize(afs, tempFile);
1637      AllFieldsStorable newAfs = (AllFieldsStorable)serializer.Deserialize(tempFile);
1638      Assert.AreEqual(afs.Value1, newAfs.Value1);
1639      Assert.AreEqual(afs.Value2, newAfs.Value2);
1640      Assert.AreEqual(0, newAfs.Value3);
1641      Assert.AreEqual(0, newAfs.Value4);
1642    }
1643
1644    [StorableType(StorableMemberSelection.AllProperties, "CB7DC31C-AEF3-4EB8-91CA-248B767E9F92")]
1645    public class AllPropertiesStorable {
1646      public int Value1 = 1;
1647      [Storable]
1648      public int Value2 = 2;
1649      public int Value3 { get; private set; }
1650      public int Value4 { get; private set; }
1651
1652      [StorableConstructor]
1653      private AllPropertiesStorable(StorableConstructorFlag _) { }
1654      public AllPropertiesStorable() {
1655        Value1 = 12;
1656        Value2 = 23;
1657        Value3 = 34;
1658        Value4 = 56;
1659      }
1660    }
1661
1662    [TestMethod]
1663    [TestCategory("PersistenceNew")]
1664    [TestProperty("Time", "short")]
1665    public void TestStorableTypeDiscoveryAllProperties() {
1666      ProtoBufSerializer serializer = new ProtoBufSerializer();
1667      AllPropertiesStorable afs = new AllPropertiesStorable();
1668      serializer.Serialize(afs, tempFile);
1669      AllPropertiesStorable newAfs = (AllPropertiesStorable)serializer.Deserialize(tempFile);
1670      Assert.AreEqual(1, newAfs.Value1);
1671      Assert.AreEqual(2, newAfs.Value2);
1672      Assert.AreEqual(afs.Value3, newAfs.Value3);
1673      Assert.AreEqual(afs.Value4, newAfs.Value4);
1674
1675    }
1676
1677    [StorableType(StorableMemberSelection.AllFieldsAndAllProperties, "0AD8D68F-E0FF-4FA8-8A72-1148CD91A2B9")]
1678    public class AllFieldsAndAllPropertiesStorable {
1679      public int Value1 = 1;
1680      [Storable]
1681      public int Value2 = 2;
1682      public int Value3 { get; private set; }
1683      public int Value4 { get; private set; }
1684      [StorableConstructor]
1685      private AllFieldsAndAllPropertiesStorable(StorableConstructorFlag _) { }
1686      public AllFieldsAndAllPropertiesStorable() {
1687        Value1 = 12;
1688        Value2 = 23;
1689        Value3 = 34;
1690        Value4 = 56;
1691      }
1692    }
1693
1694    [TestMethod]
1695    [TestCategory("PersistenceNew")]
1696    [TestProperty("Time", "short")]
1697    public void TestStorableTypeDiscoveryAllFieldsAndAllProperties() {
1698      ProtoBufSerializer serializer = new ProtoBufSerializer();
1699      AllFieldsAndAllPropertiesStorable afs = new AllFieldsAndAllPropertiesStorable();
1700      serializer.Serialize(afs, tempFile);
1701      AllFieldsAndAllPropertiesStorable newAfs = (AllFieldsAndAllPropertiesStorable)serializer.Deserialize(tempFile);
1702      Assert.AreEqual(afs.Value1, newAfs.Value1);
1703      Assert.AreEqual(afs.Value2, newAfs.Value2);
1704      Assert.AreEqual(afs.Value3, newAfs.Value3);
1705      Assert.AreEqual(afs.Value4, newAfs.Value4);
1706    }
1707
1708    [StorableType(StorableMemberSelection.MarkedOnly, "0D94E6D4-64E3-4637-B1EE-DEF2B3F6E2E0")]
1709    public class MarkedOnlyStorable {
1710      public int Value1 = 1;
1711      [Storable]
1712      public int Value2 = 2;
1713      public int Value3 { get; private set; }
1714      public int Value4 { get; private set; }
1715      [StorableConstructor]
1716      private MarkedOnlyStorable(StorableConstructorFlag _) { }
1717      public MarkedOnlyStorable() {
1718        Value1 = 12;
1719        Value2 = 23;
1720        Value3 = 34;
1721        Value4 = 56;
1722      }
1723    }
1724
1725    [TestMethod]
1726    [TestCategory("PersistenceNew")]
1727    [TestProperty("Time", "short")]
1728    public void TestStorableTypeDiscoveryMarkedOnly() {
1729      ProtoBufSerializer serializer = new ProtoBufSerializer();
1730      MarkedOnlyStorable afs = new MarkedOnlyStorable();
1731      serializer.Serialize(afs, tempFile);
1732      MarkedOnlyStorable newAfs = (MarkedOnlyStorable)serializer.Deserialize(tempFile);
1733      Assert.AreEqual(1, newAfs.Value1);
1734      Assert.AreEqual(afs.Value2, newAfs.Value2);
1735      Assert.AreEqual(0, newAfs.Value3);
1736      Assert.AreEqual(0, newAfs.Value4);
1737    }
1738
1739    [TestMethod]
1740    [TestCategory("PersistenceNew")]
1741    [TestProperty("Time", "short")]
1742    public void TestLineEndings() {
1743      ProtoBufSerializer serializer = new ProtoBufSerializer();
1744      List<string> lineBreaks = new List<string> { "\r\n", "\n", "\r", "\n\r", Environment.NewLine };
1745      List<string> lines = new List<string>();
1746      foreach (var br in lineBreaks)
1747        lines.Add("line1" + br + "line2");
1748      serializer.Serialize(lines, tempFile);
1749      List<string> newLines = (List<string>)serializer.Deserialize(tempFile);
1750      Assert.AreEqual(lines.Count, newLines.Count);
1751      for (int i = 0; i < lineBreaks.Count; i++) {
1752        Assert.AreEqual(lines[i], newLines[i]);
1753      }
1754    }
1755
1756    [TestMethod]
1757    [TestCategory("PersistenceNew")]
1758    [TestProperty("Time", "short")]
1759    public void TestSpecialNumbers() {
1760      ProtoBufSerializer serializer = new ProtoBufSerializer();
1761      List<double> specials = new List<double>() { 1.0 / 0, -1.0 / 0, 0.0 / 0 };
1762      Assert.IsTrue(double.IsPositiveInfinity(specials[0]));
1763      Assert.IsTrue(double.IsNegativeInfinity(specials[1]));
1764      Assert.IsTrue(double.IsNaN(specials[2]));
1765      serializer.Serialize(specials, tempFile);
1766      List<double> newSpecials = (List<double>)serializer.Deserialize(tempFile);
1767      Assert.IsTrue(double.IsPositiveInfinity(newSpecials[0]));
1768      Assert.IsTrue(double.IsNegativeInfinity(newSpecials[1]));
1769      Assert.IsTrue(double.IsNaN(newSpecials[2]));
1770    }
1771
1772    [TestMethod]
1773    [TestCategory("PersistenceNew")]
1774    [TestProperty("Time", "short")]
1775    public void TestStringSplit() {
1776      string s = "1.2;2.3;3.4;;;4.9";
1777      var l = s.EnumerateSplit(';').ToList();
1778      Assert.AreEqual("1.2", l[0]);
1779      Assert.AreEqual("2.3", l[1]);
1780      Assert.AreEqual("3.4", l[2]);
1781      Assert.AreEqual("4.9", l[3]);
1782    }
1783
1784    [StorableType("B13CB1B0-D2DA-47B8-A715-B166A28B1F03")]
1785    private class IdentityComparer<T> : IEqualityComparer<T> {
1786
1787      public bool Equals(T x, T y) {
1788        return x.Equals(y);
1789      }
1790
1791      public int GetHashCode(T obj) {
1792        return obj.GetHashCode();
1793      }
1794    }
1795
1796    [TestMethod]
1797    [TestCategory("PersistenceNew")]
1798    [TestProperty("Time", "short")]
1799    public void TestHashSetSerializer() {
1800      ProtoBufSerializer serializer = new ProtoBufSerializer();
1801      var hashSets = new List<HashSet<int>>() {
1802        new HashSet<int>(new[] { 1, 2, 3 }),
1803        new HashSet<int>(new[] { 4, 5, 6 }, new IdentityComparer<int>()),
1804      };
1805      serializer.Serialize(hashSets, tempFile);
1806      var newHashSets = (List<HashSet<int>>)serializer.Deserialize(tempFile);
1807      Assert.IsTrue(newHashSets[0].Contains(1));
1808      Assert.IsTrue(newHashSets[0].Contains(2));
1809      Assert.IsTrue(newHashSets[0].Contains(3));
1810      Assert.IsTrue(newHashSets[1].Contains(4));
1811      Assert.IsTrue(newHashSets[1].Contains(5));
1812      Assert.IsTrue(newHashSets[1].Contains(6));
1813      Assert.AreEqual(newHashSets[0].Comparer.GetType(), new HashSet<int>().Comparer.GetType());
1814      Assert.AreEqual(newHashSets[1].Comparer.GetType(), typeof(IdentityComparer<int>));
1815    }
1816
1817    [TestMethod]
1818    [TestCategory("PersistenceNew")]
1819    [TestProperty("Time", "short")]
1820    public void TestConcreteDictionarySerializer() {
1821      ProtoBufSerializer serializer = new ProtoBufSerializer();
1822      var dictionaries = new List<Dictionary<int, int>>() {
1823        new Dictionary<int, int>(),
1824        new Dictionary<int, int>(new IdentityComparer<int>()),
1825      };
1826      dictionaries[0].Add(1, 1);
1827      dictionaries[0].Add(2, 2);
1828      dictionaries[0].Add(3, 3);
1829      dictionaries[1].Add(4, 4);
1830      dictionaries[1].Add(5, 5);
1831      dictionaries[1].Add(6, 6);
1832      serializer.Serialize(dictionaries, tempFile);
1833      var newDictionaries = (List<Dictionary<int, int>>)serializer.Deserialize(tempFile);
1834      Assert.IsTrue(newDictionaries[0].ContainsKey(1));
1835      Assert.IsTrue(newDictionaries[0].ContainsKey(2));
1836      Assert.IsTrue(newDictionaries[0].ContainsKey(3));
1837      Assert.IsTrue(newDictionaries[1].ContainsKey(4));
1838      Assert.IsTrue(newDictionaries[1].ContainsKey(5));
1839      Assert.IsTrue(newDictionaries[1].ContainsKey(6));
1840      Assert.IsTrue(newDictionaries[0].ContainsValue(1));
1841      Assert.IsTrue(newDictionaries[0].ContainsValue(2));
1842      Assert.IsTrue(newDictionaries[0].ContainsValue(3));
1843      Assert.IsTrue(newDictionaries[1].ContainsValue(4));
1844      Assert.IsTrue(newDictionaries[1].ContainsValue(5));
1845      Assert.IsTrue(newDictionaries[1].ContainsValue(6));
1846      Assert.AreEqual(new Dictionary<int, int>().Comparer.GetType(), newDictionaries[0].Comparer.GetType());
1847      Assert.AreEqual(typeof(IdentityComparer<int>), newDictionaries[1].Comparer.GetType());
1848    }
1849
1850    [StorableType("A9B0D7FB-0CAF-4DD7-9045-EA136F9176F7")]
1851    public class ReadOnlyFail {
1852      [Storable]
1853      public string ReadOnly {
1854        get { return "fail"; }
1855      }
1856    }
1857
1858    [TestMethod]
1859    [TestCategory("PersistenceNew")]
1860    [TestProperty("Time", "short")]
1861    public void TestReadOnlyFail() {
1862      ProtoBufSerializer serializer = new ProtoBufSerializer();
1863      try {
1864        serializer.Serialize(new ReadOnlyFail(), tempFile);
1865        Assert.Fail("Exception expected");
1866      } catch (PersistenceException) {
1867      } catch {
1868        Assert.Fail("PersistenceException expected");
1869      }
1870    }
1871
1872
1873    [StorableType("2C9CC576-6823-4784-817B-37C8AF0B1C29")]
1874    public class WriteOnlyFail {
1875      [Storable]
1876      public string WriteOnly {
1877        set { throw new InvalidOperationException("this property should never be set."); }
1878      }
1879    }
1880
1881    [TestMethod]
1882    [TestCategory("PersistenceNew")]
1883    [TestProperty("Time", "short")]
1884    public void TestWriteOnlyFail() {
1885      ProtoBufSerializer serializer = new ProtoBufSerializer();
1886      try {
1887        serializer.Serialize(new WriteOnlyFail(), tempFile);
1888        Assert.Fail("Exception expected");
1889      } catch (PersistenceException) {
1890      } catch {
1891        Assert.Fail("PersistenceException expected.");
1892      }
1893    }
1894
1895    // TODO
1896    //[StorableType("8052D9E3-6DDD-4AE1-9B5B-67C6D5436512")]
1897    //public class OneWayTest {
1898    //  public OneWayTest() { this.value = "default"; }
1899    //  public string value;
1900    //  [Storable(AllowOneWay = true)]
1901    //  public string ReadOnly {
1902    //    get { return "ReadOnly"; }
1903    //  }
1904    //  [Storable(AllowOneWay = true)]
1905    //  public string WriteOnly {
1906    //    set { this.value = value; }
1907    //  }
1908    //}
1909
1910    //[TestMethod]
1911    //[TestCategory("PersistenceNew")]
1912    //[TestProperty("Time", "short")]
1913    //public void TestTypeCacheExport() {
1914    //  ProtoBufSerializer serializer = new ProtoBufSerializer();
1915    //  var test = new List<List<int>>();
1916    //  test.Add(new List<int>() { 1, 2, 3 });
1917    //  IEnumerable<Type> types;
1918    //  using (var stream = new MemoryStream()) {
1919    //    XmlGenerator.Serialize(test, stream, ConfigurationService.Instance.GetConfiguration(new XmlFormat()), false, out types);
1920    //  }
1921    //  List<Type> t = new List<Type>(types);
1922    //  // Assert.IsTrue(t.Contains(typeof(int))); not serialized as an int list is directly transformed into a string
1923    //  Assert.IsTrue(t.Contains(typeof(List<int>)));
1924    //  Assert.IsTrue(t.Contains(typeof(List<List<int>>)));
1925    //  Assert.AreEqual(t.Count, 2);
1926    //}
1927
1928    [TestMethod]
1929    [TestCategory("PersistenceNew")]
1930    [TestProperty("Time", "short")]
1931    public void TupleTest() {
1932      var t1 = Tuple.Create(1);
1933      var t2 = Tuple.Create('1', "2");
1934      var t3 = Tuple.Create(3.0, 3f, 5);
1935      var t4 = Tuple.Create(Tuple.Create(1, 2, 3), Tuple.Create(4, 5, 6), Tuple.Create(8, 9, 10));
1936      var tuple = Tuple.Create(t1, t2, t3, t4);
1937      SerializeNew(tuple);
1938      var newTuple = DeserializeNew();
1939      Assert.AreEqual(tuple, newTuple);
1940    }
1941
1942    [TestMethod]
1943    [TestCategory("PersistenceNew")]
1944    [TestProperty("Time", "short")]
1945    public void FontTest() {
1946      ProtoBufSerializer serializer = new ProtoBufSerializer();
1947      List<Font> fonts = new List<Font>() {
1948        new Font(FontFamily.GenericSansSerif, 12),
1949        new Font("Times New Roman", 21, FontStyle.Bold, GraphicsUnit.Pixel),
1950        new Font("Courier New", 10, FontStyle.Underline, GraphicsUnit.Document),
1951        new Font("Helvetica", 21, FontStyle.Strikeout, GraphicsUnit.Inch, 0, true),
1952      };
1953      serializer.Serialize(fonts, tempFile);
1954      var newFonts = (List<Font>)serializer.Deserialize(tempFile);
1955      Assert.AreEqual(fonts[0], newFonts[0]);
1956      Assert.AreEqual(fonts[1], newFonts[1]);
1957      Assert.AreEqual(fonts[2], newFonts[2]);
1958      Assert.AreEqual(fonts[3], newFonts[3]);
1959    }
1960
1961    [TestMethod]
1962    [TestCategory("PersistenceNew")]
1963    [TestProperty("Time", "medium")]
1964    public void ConcurrencyTest() {
1965      ProtoBufSerializer serializer = new ProtoBufSerializer();
1966      int n = 20;
1967      Task[] tasks = new Task[n];
1968      for (int i = 0; i < n; i++) {
1969        tasks[i] = Task.Factory.StartNew((idx) => {
1970          byte[] data;
1971          using (var stream = new MemoryStream()) {
1972            serializer.Serialize(new GeneticAlgorithm(), stream);
1973            data = stream.ToArray();
1974          }
1975        }, i);
1976      }
1977      Task.WaitAll(tasks);
1978    }
1979
1980    [TestMethod]
1981    [TestCategory("PersistenceNew")]
1982    [TestProperty("Time", "medium")]
1983    public void ConcurrentBitmapTest() {
1984      ProtoBufSerializer serializer = new ProtoBufSerializer();
1985      Bitmap b = new Bitmap(300, 300);
1986      System.Random r = new System.Random();
1987      for (int x = 0; x < b.Height; x++) {
1988        for (int y = 0; y < b.Width; y++) {
1989          b.SetPixel(x, y, Color.FromArgb(r.Next()));
1990        }
1991      }
1992      Task[] tasks = new Task[20];
1993      byte[][] datas = new byte[tasks.Length][];
1994      for (int i = 0; i < tasks.Length; i++) {
1995        tasks[i] = Task.Factory.StartNew((idx) => {
1996          using (var stream = new MemoryStream()) {
1997            serializer.Serialize(b, stream);
1998            datas[(int)idx] = stream.ToArray();
1999          }
2000        }, i);
2001      }
2002      Task.WaitAll(tasks);
2003    }
2004
2005    [StorableType("4b4f6317-30c9-4ccd-ad5f-01775f728fbc")]
2006    public class G<T, T2> {
2007      [StorableType("dad331ad-dfc5-4ea5-b044-3e582fcc648d")]
2008      public class S { }
2009      [StorableType("171d3a18-d0ce-498a-a85f-7107a8a198ef")]
2010      public class S2<T3, T4> { }
2011    }
2012
2013    [TestMethod]
2014    [TestCategory("PersistenceNew")]
2015    [TestProperty("Time", "short")]
2016    public void TestSpecialCharacters() {
2017      ProtoBufSerializer serializer = new ProtoBufSerializer();
2018      var s = "abc" + "\x15" + "def";
2019      serializer.Serialize(s, tempFile);
2020      var newS = serializer.Deserialize(tempFile);
2021      Assert.AreEqual(s, newS);
2022    }
2023
2024    [TestMethod]
2025    [TestCategory("PersistenceNew")]
2026    [TestProperty("Time", "short")]
2027    public void TestByteArray() {
2028      ProtoBufSerializer serializer = new ProtoBufSerializer();
2029      var b = new byte[3];
2030      b[0] = 0;
2031      b[1] = 200;
2032      b[2] = byte.MaxValue;
2033      serializer.Serialize(b, tempFile);
2034      var newB = (byte[])serializer.Deserialize(tempFile);
2035      CollectionAssert.AreEqual(b, newB);
2036    }
2037
2038    [TestMethod]
2039    [TestCategory("PersistenceNew")]
2040    [TestProperty("Time", "short")]
2041    public void TestOptionalNumberEnumerable() {
2042      ProtoBufSerializer serializer = new ProtoBufSerializer();
2043      var values = new List<double?> { 0, null, double.NaN, double.PositiveInfinity, double.MaxValue, 1 };
2044      serializer.Serialize(values, tempFile);
2045      var newValues = (List<double?>)serializer.Deserialize(tempFile);
2046      CollectionAssert.AreEqual(values, newValues);
2047    }
2048
2049    [TestMethod]
2050    [TestCategory("PersistenceNew")]
2051    [TestProperty("Time", "short")]
2052    public void TestOptionalDateTimeEnumerable() {
2053      ProtoBufSerializer serializer = new ProtoBufSerializer();
2054      var values = new List<DateTime?> { DateTime.MinValue, null, DateTime.Now, DateTime.Now.Add(TimeSpan.FromDays(1)),
2055        DateTime.ParseExact("10.09.2014 12:21", "dd.MM.yyyy hh:mm", CultureInfo.InvariantCulture), DateTime.MaxValue};
2056      serializer.Serialize(values, tempFile);
2057      var newValues = (List<DateTime?>)serializer.Deserialize(tempFile);
2058      CollectionAssert.AreEqual(values, newValues);
2059    }
2060
2061    [TestMethod]
2062    [TestCategory("PersistenceNew")]
2063    [TestProperty("Time", "short")]
2064    public void TestStringEnumerable() {
2065      ProtoBufSerializer serializer = new ProtoBufSerializer();
2066      var values = new List<string> { "", null, "s", "string", string.Empty, "123", "<![CDATA[nice]]>", "<![CDATA[nasty unterminated" };
2067      serializer.Serialize(values, tempFile);
2068      var newValues = (List<String>)serializer.Deserialize(tempFile);
2069      CollectionAssert.AreEqual(values, newValues);
2070    }
2071
2072    [TestMethod]
2073    [TestCategory("PersistenceNew")]
2074    [TestProperty("Time", "short")]
2075    public void TestUnicodeCharArray() {
2076      ProtoBufSerializer serializer = new ProtoBufSerializer();
2077      var s = Encoding.UTF8.GetChars(new byte[] { 0, 1, 2, 03, 04, 05, 06, 07, 08, 09, 0xa, 0xb });
2078      serializer.Serialize(s, tempFile);
2079      var newS = (char[])serializer.Deserialize(tempFile);
2080      CollectionAssert.AreEqual(s, newS);
2081    }
2082
2083    [TestMethod]
2084    [TestCategory("PersistenceNew")]
2085    [TestProperty("Time", "short")]
2086    public void TestUnicode() {
2087      ProtoBufSerializer serializer = new ProtoBufSerializer();
2088      var s = Encoding.UTF8.GetString(new byte[] { 0, 1, 2, 03, 04, 05, 06, 07, 08, 09, 0xa, 0xb });
2089      serializer.Serialize(s, tempFile);
2090      var newS = serializer.Deserialize(tempFile);
2091      Assert.AreEqual(s, newS);
2092    }
2093
2094    [TestMethod]
2095    [TestCategory("PersistenceNew")]
2096    [TestProperty("Time", "short")]
2097    public void TestQueue() {
2098      ProtoBufSerializer serializer = new ProtoBufSerializer();
2099      var q = new Queue<int>(new[] { 1, 2, 3, 4, 0 });
2100      serializer.Serialize(q, tempFile);
2101      var newQ = (Queue<int>)serializer.Deserialize(tempFile);
2102      CollectionAssert.AreEqual(q, newQ);
2103    }
2104    #endregion
2105
2106    #region New Persistence Tests
2107    [StorableType("6075F1E8-948A-4AD8-8F5A-942B777852EC")]
2108    public class A {
2109      [Storable]
2110      public B B { get; set; }
2111
2112      [Storable]
2113      public int i;
2114    }
2115    [StorableType("287BFEA0-6E27-4839-BCEF-D134FE738AC8")]
2116    public class B {
2117      [Storable]
2118      public A A { get; set; }
2119
2120      [StorableHook(HookType.AfterDeserialization)]
2121      void PostDeserializationHook() {
2122        //Assert.AreEqual(3, A.i);
2123      }
2124    }
2125
2126    [TestMethod]
2127    [TestCategory("PersistenceNew")]
2128    [TestProperty("Time", "short")]
2129    public void TestCyclicReferencesWithTuple() {
2130      var test = new Func<A>(() => {
2131        var a = new A { i = 4 };
2132        var b = new B { A = a };
2133        a.B = b;
2134        return a;
2135      });
2136
2137      //ProtoBufSerializer serializer = new ProtoBufSerializer();
2138      //serializer.Serialize(test(), tempFile);
2139      //object o = serializer.Deserialize(tempFile);
2140      //A result = (A)o;
2141
2142      XmlGenerator.Serialize(test(), tempFile);
2143      object o = XmlParser.Deserialize(tempFile);
2144
2145      string msg = Profile(test);
2146      Console.WriteLine(msg);
2147    }
2148
2149
2150    #region conversion
2151
2152    [StorableType("F9F51075-490C-48E3-BF64-14514A210149", 1)]
2153    private class OldBaseType {
2154      [Storable]
2155      public ItemCollection<IItem> items;
2156    }
2157    [StorableType("D211A828-6440-4E72-A8C7-AA4F9B4FFA75", 1)]
2158    private class V1 : OldBaseType {
2159      [Storable]
2160      public IntValue a;
2161
2162      [Storable]
2163      public ItemList<IntValue> vals;
2164
2165      [Storable]
2166      public V1 mySelf;
2167
2168      [Storable]
2169      public Tuple<int, int> tup;
2170
2171      [Storable]
2172      public int x;
2173      [Storable]
2174      public int y;
2175
2176      [Storable]
2177      public string s;
2178    }
2179
2180
2181    [StorableType("B72C58C8-3321-4706-AA94-578F57337070")]
2182    private class NewBaseType {
2183      [Storable]
2184      public DoubleValue[] items;
2185    }
2186    [StorableType("00000000-0000-0000-0000-BADCAFFEE001", 2)] // for testing (version 2)
2187    private class V2 : NewBaseType {
2188      [Storable]
2189      public int a;
2190
2191      [Storable]
2192      public int[] val;
2193
2194      [Storable]
2195      public V2 mySelf;
2196
2197      [Storable]
2198      public int TupItem1;
2199
2200      [Storable]
2201      public int TupItem2;
2202
2203      [Storable]
2204      public Point coords;
2205
2206      [Storable(Name = "s")]
2207      public string StorableString { get; set; }
2208    }
2209
2210    [StorableType("00000000-0000-0000-0000-BADCAFFEE002", 3)] // for testing (version 3)
2211    private class V3 : NewBaseType {
2212      [Storable]
2213      public int a;
2214
2215      [Storable]
2216      public int[] val;
2217
2218      [Storable]
2219      public V3 mySelf;
2220
2221      [Storable]
2222      public Tuple<int, int> tup;
2223
2224      [Storable]
2225      public Point coords;
2226
2227      [Storable(Name = "s", AllowOneWay = true)]
2228      public string StorableString { set { PublicString = value; } }
2229      public string PublicString { get; set; }
2230    }
2231
2232    private static class Conversions {
2233      [StorableConversion("D211A828-6440-4E72-A8C7-AA4F9B4FFA75", 1)]
2234      private static Dictionary<string, object> ConvertV1(Dictionary<string, object> values) {
2235        var newValues = new Dictionary<string, object>();
2236        var items = (ItemCollection<IItem>)values["F9F51075-490C-48E3-BF64-14514A210149.items"];
2237        newValues["B72C58C8-3321-4706-AA94-578F57337070.items"] = items.Select(iv => new DoubleValue((double)(((dynamic)iv).Value))).ToArray();
2238        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.a"] = ((IntValue)values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.a"]).Value;
2239        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.val"] = ((ItemList<IntValue>)values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.vals"]).Select(iv => iv.Value).ToArray();
2240
2241        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.mySelf"] = values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.mySelf"]; // myself type will be mapped correctly
2242
2243        var tup = (Tuple<int, int>)values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.tup"];
2244        if (tup != null) {
2245          newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.TupItem1"] = tup.Item1;
2246          newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.TupItem2"] = tup.Item2;
2247        }
2248
2249        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.coords"] = new Point((int)values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.x"], (int)values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.y"]);
2250
2251        return newValues;
2252      }
2253
2254      [StorableConversion("D211A828-6440-4E72-A8C7-AA4F9B4FFA75", 2)]
2255      private static Dictionary<string, object> ConvertV2(Dictionary<string, object> values) {
2256        var newValues = new Dictionary<string, object>();
2257        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.a"] = values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.a"];
2258        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.val"] = values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.val"];
2259        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.mySelf"] = values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.mySelf"];
2260
2261        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.tup"] = Tuple.Create((int)values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.TupItem1"], (int)values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.TupItem2"]);
2262        newValues["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.coords"] = values["D211A828-6440-4E72-A8C7-AA4F9B4FFA75.coords"];
2263
2264        return newValues;
2265      }
2266    }
2267
2268    [TestMethod]
2269    [TestCategory("PersistenceNew")]
2270    [TestProperty("Time", "short")]
2271    public void TestConversion() {
2272      var test = new Func<V1>(() => {
2273        var p = new V1();
2274        p.a = new IntValue(1);
2275        p.mySelf = p;
2276        p.vals = new ItemList<IntValue>(new IntValue[] { p.a, new IntValue(2), new IntValue(3) });
2277        p.tup = Tuple.Create(17, 4);
2278        var dv = new DoubleValue(1.0);
2279        p.items = new ItemCollection<IItem>(new IItem[] { dv, dv, p.a });
2280        p.s = "123";
2281        return p;
2282      });
2283
2284      ProtoBufSerializer serializer = new ProtoBufSerializer();
2285      var old = test();
2286      serializer.Serialize(old, tempFile);
2287
2288      DeregisterType(typeof(V1));
2289      DeregisterType(typeof(V2));
2290      DeregisterType(typeof(V3));
2291
2292      RegisterType(StorableTypeAttribute.GetStorableTypeAttribute(typeof(V1)).Guid, typeof(V3));
2293      SetTypeGuid(typeof(V3), GetTypeGuid(typeof(V1)));
2294      RemoveTypeInfo(typeof(V1));
2295
2296      object o = serializer.Deserialize(tempFile);
2297      var restored = (V3)o;
2298      Assert.AreEqual(restored.a, old.a.Value);
2299      Assert.IsTrue(restored.val.SequenceEqual(old.vals.Select(iv => iv.Value)));
2300      Assert.IsTrue(restored.items.Select(item => item.Value).SequenceEqual(old.items.Select(iv => (double)((dynamic)iv).Value)));
2301      // Assert.AreSame(restored.items[0], restored.items[1]);
2302      Assert.AreSame(restored, restored.mySelf);
2303      Assert.AreEqual(restored.PublicString, old.s);
2304    }
2305
2306    #endregion
2307
2308    [TestMethod]
2309    [TestCategory("PersistenceNew")]
2310    [TestProperty("Time", "short")]
2311    public void TestGASerializeDeserializeExecute() {
2312      var test = new Func<GeneticAlgorithm>(() => {
2313        var ga = new GeneticAlgorithm();
2314        ga.Problem = new SingleObjectiveTestFunctionProblem();
2315        ga.MaximumGenerations.Value = 100;
2316        ga.SetSeedRandomly.Value = false;
2317        return ga;
2318      });
2319      ProtoBufSerializer serializer = new ProtoBufSerializer();
2320      GeneticAlgorithm original = test();
2321      serializer.Serialize(original, tempFile);
2322      object o = serializer.Deserialize(tempFile);
2323
2324      // this fails because old persistence didn't handle all IComparer ?
2325      // Assert.AreEqual(DebugStringGenerator.Serialize(original),DebugStringGenerator.Serialize(o));
2326
2327      GeneticAlgorithm result = (GeneticAlgorithm)o;
2328      SamplesUtils.RunAlgorithm(result);
2329      SamplesUtils.RunAlgorithm(original);
2330      Assert.AreEqual(((DoubleValue)result.Results["BestQuality"].Value).Value,
2331        ((DoubleValue)original.Results["BestQuality"].Value).Value);
2332
2333      // Assert.AreEqual(DebugStringGenerator.Serialize(result), DebugStringGenerator.Serialize(result2));
2334    }
2335
2336    [TestMethod]
2337    [TestCategory("PersistenceNew")]
2338    [TestProperty("Time", "short")]
2339    public void TestLoadingSamples() {
2340      var path = @"D:\Dev\Software_HL\branches\PersistenceReintegration\HeuristicLab.Optimizer\3.3\Documents";
2341      var serializer = new ProtoBufSerializer();
2342      foreach (var fileName in Directory.EnumerateFiles(path, "*.hl")) {
2343        var original = XmlParser.Deserialize(fileName);
2344        var ok = true;
2345        // foreach (var t in original.GetObjectGraphObjects().Select(o => o.GetType())) {
2346        //   if (
2347        //     t.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)
2348        //       .Any(ctor => StorableConstructorAttribute.IsStorableConstructor(ctor))) {
2349        //     try {
2350        //       if (t.IsGenericType) {
2351        //         var g = Mapper.StaticCache.GetGuid(t.GetGenericTypeDefinition());
2352        //       } else {
2353        //         var g = Mapper.StaticCache.GetGuid(t);
2354        //       }
2355        //     } catch (Exception e) {
2356        //       Console.WriteLine(t.FullName);
2357        //       ok = false;
2358        //     }
2359        //   }
2360        // }
2361        if (ok) {
2362          serializer.Serialize(original, fileName + ".proto");
2363          // var newVersion = serializer.Deserialize(fileName + ".proto");
2364          //Console.WriteLine("File: " + fileName);
2365          var p = Profile(() => original, Path.GetFileName(fileName));
2366          Console.WriteLine(p);
2367        }
2368      }
2369    }
2370
2371    [StorableType("3B48A44F-93E2-4ECC-A9B9-56E425EF96F8")]
2372    private class ConversionA {
2373      [Storable]
2374      public int f;
2375    }
2376
2377    [StorableType("00000000-0000-0000-0000-000000000002", 2)]
2378    private class ConversionANew {
2379      [Storable]
2380      public int g;
2381    }
2382
2383    [StorableType("7CBF2251-CF9F-4D9E-AA7B-C65495AE078F")]
2384    private class ConversionB : ConversionA {
2385      [Storable]
2386      public int f;
2387      public int BaseF { get { return base.f; } }
2388
2389      public ConversionB() {
2390
2391      }
2392
2393      public ConversionB(int myF, int baseF) {
2394        this.f = myF;
2395        base.f = baseF;
2396      }
2397    }
2398
2399    [StorableType("00000000-0000-0000-0000-000000000001", 2)]
2400    private class ConversionBNew : ConversionANew {
2401      [Storable]
2402      public int g;
2403
2404      public int BaseG { get { return base.g; } }
2405    }
2406
2407    private static class NewConversions {
2408      [StorableConversion("7CBF2251-CF9F-4D9E-AA7B-C65495AE078F", 1)]
2409      private static Dictionary<string, object> ConvertB(Dictionary<string, object> values) {
2410        var newValues = new Dictionary<string, object>();
2411        newValues["7CBF2251-CF9F-4D9E-AA7B-C65495AE078F.g"] = values["7CBF2251-CF9F-4D9E-AA7B-C65495AE078F.f"];
2412        return newValues;
2413      }
2414
2415      [StorableConversion("3B48A44F-93E2-4ECC-A9B9-56E425EF96F8", 1)]
2416      private static Dictionary<string, object> ConvertA(Dictionary<string, object> values) {
2417        var newValues = new Dictionary<string, object>();
2418        newValues["3B48A44F-93E2-4ECC-A9B9-56E425EF96F8.g"] = values["3B48A44F-93E2-4ECC-A9B9-56E425EF96F8.f"];
2419        return newValues;
2420      }
2421    }
2422
2423    [TestMethod]
2424    [TestCategory("PersistenceNew")]
2425    [TestProperty("Time", "short")]
2426    public void TestConversionCase1() {
2427      var test = new Func<ConversionB>(() => {
2428        return new ConversionB(1, 2);
2429      });
2430
2431      ProtoBufSerializer serializer = new ProtoBufSerializer();
2432      var old = test();
2433      serializer.Serialize(old, tempFile);
2434
2435      DeregisterType(typeof(ConversionB));
2436      DeregisterType(typeof(ConversionBNew));
2437      DeregisterType(typeof(ConversionA));
2438      DeregisterType(typeof(ConversionANew));
2439
2440      RegisterType(StorableTypeAttribute.GetStorableTypeAttribute(typeof(ConversionA)).Guid, typeof(ConversionANew));
2441      SetTypeGuid(typeof(ConversionANew), GetTypeGuid(typeof(ConversionA)));
2442      RemoveTypeInfo(typeof(ConversionA));
2443
2444      RegisterType(StorableTypeAttribute.GetStorableTypeAttribute(typeof(ConversionB)).Guid, typeof(ConversionBNew));
2445      SetTypeGuid(typeof(ConversionBNew), GetTypeGuid(typeof(ConversionB)));
2446      RemoveTypeInfo(typeof(ConversionB));
2447
2448      object o = serializer.Deserialize(tempFile);
2449      var restored = (ConversionBNew)o;
2450      Assert.AreEqual(restored.g, old.f);
2451      Assert.AreEqual(restored.BaseG, old.BaseF);
2452    }
2453
2454    [StorableType("90470973-4559-428E-AF28-DD95866B0A84")]
2455    private class A0 {
2456      [Storable]
2457      public int x;
2458    }
2459
2460    [StorableType("00000000-0000-0000-0000-0000000000A1", 2)]
2461    private class A1 {
2462      [Storable]
2463      public int y;
2464    }
2465
2466    [StorableType("847DD840-3EE3-4A01-AC60-FD7E71ED05F8")]
2467    private class B0 {
2468      [Storable]
2469      public int x;
2470    }
2471
2472    [StorableType("00000000-0000-0000-0000-0000000000B1", 2)]
2473    private class B1 : A0 { }
2474
2475    [StorableType("00000000-0000-0000-0000-0000000000B2", 3)]
2476    private class B2 {
2477      [Storable]
2478      public int x;
2479    }
2480
2481    private static class ConversionsA2A_B2B {
2482      [StorableConversion("847DD840-3EE3-4A01-AC60-FD7E71ED05F8", 1, baseGuid: "90470973-4559-428E-AF28-DD95866B0A84", baseVersion: 1)]
2483      private static Dictionary<string, object> ConvertB0_B1(Dictionary<string, object> values) {
2484        var newValues = new Dictionary<string, object>();
2485        newValues["90470973-4559-428E-AF28-DD95866B0A84.x"] = values["847DD840-3EE3-4A01-AC60-FD7E71ED05F8.x"];
2486        return newValues;
2487      }
2488
2489      [StorableConversion("90470973-4559-428E-AF28-DD95866B0A84", 1)]
2490      private static Dictionary<string, object> ConvertA0_A1(Dictionary<string, object> values) {
2491        var newValues = new Dictionary<string, object>();
2492        newValues["90470973-4559-428E-AF28-DD95866B0A84.y"] = values["90470973-4559-428E-AF28-DD95866B0A84.x"];
2493        return newValues;
2494      }
2495
2496      [StorableConversion("847DD840-3EE3-4A01-AC60-FD7E71ED05F8", 2)]
2497      private static Dictionary<string, object> ConvertB1_B2(Dictionary<string, object> values) {
2498        var newValues = new Dictionary<string, object>();
2499        newValues["847DD840-3EE3-4A01-AC60-FD7E71ED05F8.x"] = values["90470973-4559-428E-AF28-DD95866B0A84.y"];
2500        return newValues;
2501      }
2502    }
2503
2504    [TestMethod]
2505    [TestCategory("PersistenceNew")]
2506    [TestProperty("Time", "short")]
2507    public void TestConversionCase2() {
2508      var test = new Func<B0>(() => {
2509        return new B0() { x = 17 };
2510      });
2511
2512      ProtoBufSerializer serializer = new ProtoBufSerializer();
2513      var old = test();
2514      serializer.Serialize(old, tempFile);
2515
2516      DeregisterType(typeof(B0));
2517      DeregisterType(typeof(B1));
2518      DeregisterType(typeof(B2));
2519      DeregisterType(typeof(A0));
2520      DeregisterType(typeof(A1));
2521
2522      RegisterType(StorableTypeAttribute.GetStorableTypeAttribute(typeof(B0)).Guid, typeof(B2));
2523      SetTypeGuid(typeof(B2), GetTypeGuid(typeof(B0)));
2524      RemoveTypeInfo(typeof(B0));
2525
2526      RegisterType(StorableTypeAttribute.GetStorableTypeAttribute(typeof(A0)).Guid, typeof(A1));
2527      SetTypeGuid(typeof(A1), GetTypeGuid(typeof(A0)));
2528      RemoveTypeInfo(typeof(A0));
2529
2530      object o = serializer.Deserialize(tempFile);
2531      var restored = (B2)o;
2532      Assert.AreEqual(restored.x, old.x);
2533    }
2534
2535    #region Inheritance Chain Test
2536    [StorableType("C1BFC249-89F6-45E2-8DFB-DA95E1BE9B95")]
2537    private class InheritanceA0 {
2538      [Storable]
2539      public int x;
2540    }
2541
2542    [StorableType("00000000-0000-0000-0000-0000000001A1", 2)]
2543    private class InheritanceA1 {
2544      [Storable]
2545      public int y;
2546    }
2547
2548    [StorableType("28A5F6B8-49AF-4C6A-AF0E-F92EB4511722", 1)]
2549    private class InheritanceC0 {
2550      [Storable]
2551      public int x;
2552    }
2553
2554    [StorableType("00000000-0000-0000-0000-0000000001C1", 2)]
2555    private class InheritanceC1 {
2556      [Storable]
2557      public int x;
2558    }
2559
2560    [StorableType("41108958-227D-43C4-B049-80AD0D3DB7F6")]
2561    private class InheritanceB0 : InheritanceA0 {
2562      //[Storable]
2563      //public int x;
2564    }
2565
2566    [StorableType("00000000-0000-0000-0000-0000000001B1", 2)]
2567    private class InheritanceB1 : InheritanceC1 { }
2568
2569    private static class InheritanceConversionsA2A_B2B {
2570      [StorableConversion("C1BFC249-89F6-45E2-8DFB-DA95E1BE9B95", 1)]
2571      private static Dictionary<string, object> ConvertA0_A1(Dictionary<string, object> values) {
2572        var newValues = new Dictionary<string, object>();
2573        newValues["C1BFC249-89F6-45E2-8DFB-DA95E1BE9B95.y"] = values["C1BFC249-89F6-45E2-8DFB-DA95E1BE9B95.x"];
2574        return newValues;
2575      }
2576
2577      [StorableConversion("41108958-227D-43C4-B049-80AD0D3DB7F6", 1, baseGuid: "C1BFC249-89F6-45E2-8DFB-DA95E1BE9B95", baseVersion: 2)]
2578      private static Dictionary<string, object> ConvertB0_B1(Dictionary<string, object> values, out List<Tuple<string, uint>> typeChain) {
2579        typeChain = new List<Tuple<string, uint>> {
2580          Tuple.Create("28A5F6B8-49AF-4C6A-AF0E-F92EB4511722", 1u)
2581        };
2582
2583        var newValues = new Dictionary<string, object>();
2584        newValues["41108958-227D-43C4-B049-80AD0D3DB7F6.x"] = values["C1BFC249-89F6-45E2-8DFB-DA95E1BE9B95.y"];
2585        newValues["28A5F6B8-49AF-4C6A-AF0E-F92EB4511722.x"] = values["C1BFC249-89F6-45E2-8DFB-DA95E1BE9B95.y"];
2586        return newValues;
2587      }
2588
2589      [StorableConversion("28A5F6B8-49AF-4C6A-AF0E-F92EB4511722", 1)]
2590      private static Dictionary<string, object> ConvertC0_C1(Dictionary<string, object> values) {
2591        var newValues = new Dictionary<string, object>();
2592        newValues["41108958-227D-43C4-B049-80AD0D3DB7F6.x"] = (int)values["41108958-227D-43C4-B049-80AD0D3DB7F6.x"] * 2;
2593        return newValues;
2594      }
2595    }
2596
2597    [TestMethod]
2598    [TestCategory("PersistenceNew")]
2599    [TestProperty("Time", "short")]
2600    public void TestInheritanceConversionCase1() {
2601      var test = new Func<InheritanceB0>(() => {
2602        return new InheritanceB0() { x = 17 };
2603      });
2604
2605      ProtoBufSerializer serializer = new ProtoBufSerializer();
2606      var old = test();
2607      serializer.Serialize(old, tempFile);
2608
2609      DeregisterType(typeof(InheritanceB0));
2610      DeregisterType(typeof(InheritanceB1));
2611      DeregisterType(typeof(InheritanceA0));
2612      DeregisterType(typeof(InheritanceA1));
2613      DeregisterType(typeof(InheritanceC0));
2614      DeregisterType(typeof(InheritanceC1));
2615
2616      RegisterType(StorableTypeAttribute.GetStorableTypeAttribute(typeof(InheritanceA0)).Guid, typeof(InheritanceA1));
2617      SetTypeGuid(typeof(InheritanceA1), GetTypeGuid(typeof(InheritanceA0)));
2618      RemoveTypeInfo(typeof(InheritanceA0));
2619
2620      RegisterType(StorableTypeAttribute.GetStorableTypeAttribute(typeof(InheritanceB0)).Guid, typeof(InheritanceB1));
2621      SetTypeGuid(typeof(InheritanceB1), GetTypeGuid(typeof(InheritanceB0)));
2622      RemoveTypeInfo(typeof(InheritanceB0));
2623
2624      RegisterType(StorableTypeAttribute.GetStorableTypeAttribute(typeof(InheritanceC0)).Guid, typeof(InheritanceC1));
2625      SetTypeGuid(typeof(InheritanceC1), GetTypeGuid(typeof(InheritanceC0)));
2626      RemoveTypeInfo(typeof(InheritanceC0));
2627
2628      object o = serializer.Deserialize(tempFile);
2629      var restoredC1 = (InheritanceC1)o;
2630      var restoredB1 = (InheritanceB1)o;
2631      Assert.AreEqual(old.x, restoredB1.x);
2632      Assert.AreEqual(old.x * 2, restoredC1.x);
2633    }
2634    #endregion
2635    #endregion
2636  }
2637}
Note: See TracBrowser for help on using the repository browser.