comparison UnitTests/CS/EditableObjects/EditableObjectTest.cs @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:f990fcb411a9
1 using System;
2 using System.Reflection;
3 using System.Xml;
4
5 using NUnit.Framework;
6
7 using BLToolkit.EditableObjects;
8 using BLToolkit.Mapping;
9 using BLToolkit.Reflection;
10 using BLToolkit.TypeBuilder;
11
12 namespace EditableObjects
13 {
14 [TestFixture]
15 public class EditableObjectTest
16 {
17 public class Source
18 {
19 public int ID = 10;
20 public string Name = "20";
21 public XmlDocument Xml;
22
23 public Source()
24 {
25 Xml = new XmlDocument();
26 Xml.LoadXml("<test/>");
27 }
28 }
29
30 public abstract class Dest: EditableObject
31 {
32 public string ChangedPropertyName;
33
34 public abstract int ID { get; set; }
35 public abstract string Name { get; set; }
36 public abstract XmlDocument Xml { get; set; }
37
38 protected override void OnPropertyChanged(string propertyName)
39 {
40 ChangedPropertyName = propertyName;
41 if (propertyName == "ID")
42 Assert.That(ID, Is.Not.EqualTo(0));
43 else if (propertyName == "Xml")
44 Assert.That(Xml.InnerXml, Is.Not.EqualTo("<test />"));
45
46 }
47 }
48
49 [Test]
50 public void Notification()
51 {
52 Dest o = Map.ObjectToObject<Dest>(new Source());
53
54 Assert.AreEqual("", o.ChangedPropertyName);
55
56 o.ID = 1;
57 Assert.AreEqual("ID", o.ChangedPropertyName);
58
59 o.Xml.DocumentElement.AppendChild(o.Xml.CreateElement("el"));
60 Assert.AreEqual("Xml", o.ChangedPropertyName);
61 }
62
63 public abstract class Object1: EditableObject<Object1>
64 {
65 [MapField("ObjectId")]
66 public abstract int ID { get; }
67 public abstract short Field1 { get; set; }
68
69 [MapValue(true, "Y")]
70 [MapValue(false, "N")]
71 public abstract bool Field2 { get; set; }
72 [Parameter(2, 2, 2)]
73 public abstract DateTime? Field3 { get; set; }
74 [Parameter(2L)]
75 public abstract long Field4 { get; set; }
76 public abstract byte Field5 { get; set; }
77 public abstract char Field6 { get; set; }
78 public abstract ushort Field7 { get; set; }
79 public abstract uint Field8 { get; set; }
80 public abstract ulong Field9 { get; set; }
81 public abstract sbyte Field10 { get; set; }
82 public abstract float Field11 { get; set; }
83 public abstract double Field12 { get; set; }
84 [Parameter(3.08)]
85 public abstract decimal? Field13 { get; set; }
86 public abstract string Field14 { get; set; }
87 public abstract Guid Field15 { get; set; }
88 public abstract DayOfWeek Field16 { get; set; }
89 public abstract ulong? Field17 { get; set; }
90 public abstract XmlDocument XmlField { get; set; }
91 }
92
93 [Test]
94 public void TestCreate()
95 {
96 Object1 o = Object1.CreateInstance();
97
98 Assert.That(o.Field4, Is.EqualTo(2L));
99 Assert.That(o.Field3, Is.EqualTo(new DateTime(2,2,2)));
100 Assert.That(o.Field13, Is.EqualTo(3.08m));
101
102 Assert.IsFalse(o.IsDirty);
103
104 TypeAccessor<Object1>.Instance["ID"].SetValue(o, 1);
105
106 Assert.AreEqual(1, o.ID);
107 Assert.IsTrue (o.IsDirty);
108 Assert.IsTrue (o.IsDirtyMember("ID"));
109 o.AcceptChanges();
110 Assert.IsFalse (o.IsDirty);
111
112 o.Field16 = DayOfWeek.Saturday;
113
114 Assert.AreEqual(DayOfWeek.Saturday, o.Field16);
115 Assert.IsTrue (o.IsDirty);
116 Assert.IsTrue (o.IsDirtyMember("Field16"));
117 o.AcceptChanges();
118 Assert.IsFalse (o.IsDirty);
119
120 o.Field17 = 5;
121
122 Assert.AreEqual(5, o.Field17);
123 Assert.IsTrue (o.IsDirty);
124 Assert.IsTrue (o.IsDirtyMember("Field17"));
125 o.AcceptChanges();
126 Assert.IsFalse (o.IsDirty);
127
128 o.XmlField.LoadXml(@"<root><element attribute=""value""/></root>");
129 Assert.IsTrue (o.IsDirty);
130 o.AcceptChanges();
131
132 o.XmlField.SelectSingleNode("/root/element/@attribute").Value = "changed";
133 Assert.IsTrue (o.IsDirty);
134 Assert.IsTrue (o.IsDirtyMember("XmlField"));
135 o.AcceptChanges();
136 Assert.IsFalse (o.IsDirty);
137
138 o.XmlField.SelectSingleNode("/root/element/@attribute").Value = "once again";
139 o.XmlField = new XmlDocument();
140 Assert.IsTrue (o.IsDirty);
141 }
142
143
144 [Test]
145 public void TestRejectChangesNotification()
146 {
147 Object1 o = Object1.CreateInstance();
148
149 Console.WriteLine("o is dirty: " + o.IsDirty);
150
151 o.PropertyChanged += object_PropertyChanged;
152
153 Console.WriteLine("Changing 3 fields");
154
155 o.Field1 = 10;
156 o.Field2 = !o.Field2;
157 o.Field3 = DateTime.Now;
158 o.XmlField.LoadXml("<root foo=\"bar\"/>");
159 o.XmlField.DocumentElement.Attributes.RemoveAll();
160 o.XmlField.DocumentElement.Attributes.Append(o.XmlField.CreateAttribute("attr"));
161
162 Console.WriteLine("Dirty Members");
163
164 PropertyInfo[] dirtyMembers = o.GetDirtyMembers();
165
166 Assert.AreEqual(4, dirtyMembers.Length);
167
168 foreach (PropertyInfo dirtyMember in dirtyMembers)
169 Console.WriteLine(dirtyMember.Name);
170
171 Console.WriteLine("Rejecting field 1");
172
173 o.RejectMemberChanges("Field1");
174 o.RejectMemberChanges("XmlField");
175
176 Console.WriteLine("Dirty Members");
177
178 dirtyMembers = o.GetDirtyMembers();
179 Assert.AreEqual(2, dirtyMembers.Length);
180
181 foreach (PropertyInfo dirtyMember in dirtyMembers)
182 Console.WriteLine(dirtyMember.Name);
183
184 Console.WriteLine("Rejecting all changes");
185
186 o.RejectChanges();
187
188 Console.WriteLine("Dirty Members");
189
190 dirtyMembers = o.GetDirtyMembers();
191 Assert.AreEqual(dirtyMembers.Length, 0);
192
193 foreach (PropertyInfo dirtyMember in dirtyMembers)
194 Console.WriteLine(dirtyMember.Name);
195 }
196
197 private static void object_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
198 {
199 Console.WriteLine("Property Changed: " + e.PropertyName);
200 }
201
202 [Test]
203 public void IsDirtyTest()
204 {
205 Object1 o = Object1.CreateInstance();
206
207 o.Field1 = 10;
208 o.Field2 = !o.Field2;
209 o.Field3 = DateTime.Now;
210 o.AcceptChanges();
211
212 Object1 c = (Object1)((ICloneable)o).Clone();
213
214 Assert.IsFalse(o.IsDirty);
215 Assert.IsFalse(c.IsDirty);
216
217 o.Field1 = 100;
218 c = (Object1)((ICloneable)o).Clone();
219
220 Assert.IsTrue(o.IsDirty);
221 Assert.IsTrue(c.IsDirty);
222
223 Assert.IsTrue(o.IsDirtyMember("Field1"));
224 Assert.IsTrue(c.IsDirtyMember("Field1"));
225
226 Assert.IsFalse(o.IsDirtyMember("Field2"));
227 Assert.IsFalse(c.IsDirtyMember("Field2"));
228 }
229
230 public class TestClass
231 {
232 public int ID;
233 public string Str;
234 }
235
236 public struct TestStruct
237 {
238 public int ID;
239 public string Str;
240 }
241
242 public abstract class TestEditableObject : EditableObject
243 {
244 public abstract int ID { get; set; }
245
246 public static TestEditableObject CreateInstance()
247 {
248 return (TestEditableObject)
249 TypeAccessor.CreateInstanceEx(typeof(TestEditableObject), null);
250 }
251 }
252
253 [Test]
254 public void EqualsTest()
255 {
256 TestClass classInst1 = new TestClass();
257 TestClass classInst2 = new TestClass();
258
259 TestStruct structInst1 = new TestStruct();
260 TestStruct structInst2 = new TestStruct();
261
262 TestEditableObject editableInst1 = TestEditableObject.CreateInstance();
263 TestEditableObject editableInst2 = TestEditableObject.CreateInstance();
264 TestEditableObject editableInst3 = editableInst1;
265
266 classInst1 .ID = classInst2 .ID = 1;
267 structInst1 .ID = structInst2 .ID = 1;
268 editableInst1.ID = editableInst2.ID = 1;
269
270 TestStruct structInst3 = structInst1;
271 TestClass classInst3 = classInst1;
272
273 Assert.IsTrue(Equals(structInst1, structInst2));
274 Assert.IsTrue(Equals(structInst1, structInst3));
275 Assert.IsTrue(Equals(structInst2, structInst3));
276
277 Assert.IsFalse(Equals(classInst1, classInst2));
278 Assert.IsFalse(Equals(editableInst1, editableInst2));
279
280 Assert.IsTrue (Equals(classInst1, classInst3));
281 Assert.IsTrue (Equals(editableInst1, editableInst3));
282
283 Assert.IsFalse(Equals(classInst2, classInst3));
284 Assert.IsFalse(Equals(editableInst2, editableInst3));
285 }
286
287 [Test]
288 public void EqualsSpeedTest()
289 {
290 TestClass eo1Inst1 = new TestClass();
291 TestClass eo1Inst3 = eo1Inst1;
292
293 TestEditableObject eo2Inst1 = TestEditableObject.CreateInstance();
294 TestEditableObject eo2Inst3 = eo2Inst1;
295
296 eo1Inst1.ID = 1; eo1Inst1.Equals(eo1Inst3);
297 eo2Inst1.ID = 1; eo2Inst1.Equals(eo2Inst3);
298
299 long startTicks = DateTime.Now.Ticks;
300 for (int i = 0; i < 100000; i++)
301 eo1Inst1.Equals(eo1Inst3);
302 Console.WriteLine(".NET: {0}", DateTime.Now.Ticks - startTicks);
303
304 startTicks = DateTime.Now.Ticks;
305 for (int i = 0; i < 100000; i++)
306 eo2Inst1.Equals(eo2Inst3);
307 Console.WriteLine("BLT: {0}", DateTime.Now.Ticks - startTicks);
308 }
309
310 [Test]
311 public void GetHashCodeSpeedTest()
312 {
313 TestClass eo1Inst1 = new TestClass();
314 TestEditableObject eo2Inst1 = TestEditableObject.CreateInstance();
315
316 eo1Inst1.ID = 1; eo1Inst1.GetHashCode();
317 eo2Inst1.ID = 1; eo2Inst1.GetHashCode();
318
319 long startTicks = DateTime.Now.Ticks;
320 for (int i = 0; i < 100000; i++)
321 eo1Inst1.GetHashCode();
322 Console.WriteLine(".NET: {0}", DateTime.Now.Ticks - startTicks);
323
324 startTicks = DateTime.Now.Ticks;
325 for (int i = 0; i < 100000; i++)
326 eo2Inst1.GetHashCode();
327 Console.WriteLine("BLT: {0}", DateTime.Now.Ticks - startTicks);
328 }
329
330 }
331 }