/src/NHibernate.Test/NHSpecificTest/NH2583/AbstractMassTestingFixture.cs
C# | 279 lines | 252 code | 22 blank | 5 comment | 25 complexity | 12663c68b8bf106c1abd65fd79b189f6 MD5 | raw file
1using NHibernate.Cfg;
2using NHibernate.Linq;
3using NUnit.Framework;
4using System;
5using System.Collections.Generic;
6using System.Linq;
7using System.Linq.Expressions;
8using Environment = NHibernate.Cfg.Environment;
9
10namespace NHibernate.Test.NHSpecificTest.NH2583
11{
12 public abstract class AbstractMassTestingFixture : BugTestCase
13 {
14 public const int BatchSize = 200;
15 protected override void Configure(Configuration configuration)
16 {
17 base.Configure(configuration);
18 configuration.DataBaseIntegration(x => x.BatchSize = BatchSize+5);
19 List<string> cacheSettings = new List<string>(configuration.Properties.Keys.Where(x => x.Contains("cache")));
20 foreach (var cacheSetting in cacheSettings)
21 {
22 configuration.Properties.Remove(cacheSetting);
23 }
24 configuration.SetProperty(Environment.UseSecondLevelCache, "false");
25
26 }
27 private class ValueTuple<T1, T2, T3, T4, T5, T6, T7>
28 {
29 public T1 Item1;
30 public T2 Item2;
31 public T3 Item3;
32 public T4 Item4;
33 public T5 Item5;
34 public T6 Item6;
35 public T7 Item7;
36 }
37
38 private static IEnumerable<ValueTuple<T1, T2, T3, T4, T5, T6, T7>> GetAllTestCases<T1, T2, T3, T4, T5, T6, T7>()
39 {
40 foreach (T1 v1 in Enum.GetValues(typeof(T1)))
41 {
42 foreach (T2 v2 in Enum.GetValues(typeof(T2)))
43 {
44 foreach (T3 v3 in Enum.GetValues(typeof(T3)))
45 {
46 foreach (T4 v4 in Enum.GetValues(typeof(T4)))
47 {
48 foreach (T5 v5 in Enum.GetValues(typeof(T5)))
49 {
50 foreach (T6 v6 in Enum.GetValues(typeof(T6)))
51 {
52 foreach (T7 v7 in Enum.GetValues(typeof(T7)))
53 {
54 yield return
55 new ValueTuple<T1, T2, T3, T4, T5, T6, T7> { Item1 = v1, Item2 = v2, Item3 = v3, Item4 = v4, Item5 = v5, Item6 = v6, Item7 = v7 };
56 }
57 }
58 }
59 }
60 }
61 }
62 }
63 }
64
65 public class SetterTuple<T1, T2, T3, T4, T5, T6, T7>
66 {
67 private readonly Action<MyBO, ISession, T1> _set1;
68 private readonly Action<MyBO, ISession, T2> _set2;
69 private readonly Action<MyBO, ISession, T3> _set3;
70 private readonly Action<MyBO, ISession, T4> _set4;
71 private readonly Action<MyBO, ISession, T5> _set5;
72 private readonly Action<MyBO, ISession, T6> _set6;
73 private readonly Action<MyBO, ISession, T7> _set7;
74
75 public SetterTuple(Action<MyBO, ISession, T1> set1,
76 Action<MyBO, ISession, T2> set2,
77 Action<MyBO, ISession, T3> set3,
78 Action<MyBO, ISession, T4> set4,
79 Action<MyBO, ISession, T5> set5,
80 Action<MyBO, ISession, T6> set6,
81 Action<MyBO, ISession, T7> set7)
82 {
83 _set1 = set1;
84 _set2 = set2;
85 _set3 = set3;
86 _set4 = set4;
87 _set5 = set5;
88 _set6 = set6;
89 _set7 = set7;
90 }
91
92 public void Set(MyBO bo, ISession s, T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
93 {
94 if (_set1 != null) { _set1(bo, s, item1); }
95 if (_set2 != null) { _set2(bo, s, item2); }
96 if (_set3 != null) { _set3(bo, s, item3); }
97 if (_set4 != null) { _set4(bo, s, item4); }
98 if (_set5 != null) { _set5(bo, s, item5); }
99 if (_set6 != null) { _set6(bo, s, item6); }
100 if (_set7 != null) { _set7(bo, s, item7); }
101 }
102 }
103
104 protected int RunTest<T1, T2, T3, T4, T5, T6, T7>(Expression<Func<MyBO, bool>> condition, SetterTuple<T1, T2, T3, T4, T5, T6, T7> setters)
105 {
106 if (condition == null)
107 {
108 throw new ArgumentNullException("condition");
109 }
110 if (setters == null)
111 {
112 throw new ArgumentNullException("setters");
113 }
114 IEnumerable<int> expectedIds;
115
116 // Setup
117 using (var session = OpenSession())
118 {
119 expectedIds = CreateObjects(session, setters, condition.Compile());
120 }
121
122 try
123 {
124 // Test
125 using (var session = OpenSession())
126 {
127 session.CacheMode = CacheMode.Ignore;
128 session.DefaultReadOnly = true;
129 using (session.BeginTransaction())
130 {
131 return TestAndAssert(condition, session, expectedIds);
132 }
133 }
134
135 }
136 finally
137 {
138 // Teardown
139 using (var session = OpenSession())
140 {
141 using (var tx = session.BeginTransaction())
142 {
143 DeleteAll<MyBO>(session);
144 DeleteAll<MyRef1>(session);
145 DeleteAll<MyRef2>(session);
146 DeleteAll<MyRef3>(session);
147 tx.Commit();
148 }
149 }
150 }
151 }
152
153 protected abstract int TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds);
154
155 protected static SetterTuple<T1, T2, T3, T4, T5, T6, T7> Setters<T1, T2, T3, T4, T5, T6, T7>(Action<MyBO, ISession, T1> set1,
156 Action<MyBO, ISession, T2> set2,
157 Action<MyBO, ISession, T3> set3,
158 Action<MyBO, ISession, T4> set4,
159 Action<MyBO, ISession, T5> set5,
160 Action<MyBO, ISession, T6> set6,
161 Action<MyBO, ISession, T7> set7)
162 {
163 return new SetterTuple<T1, T2, T3, T4, T5, T6, T7>(set1, set2, set3, set4, set5, set6, set7);
164 }
165
166 protected static SetterTuple<T1, T2, T3, T4, T5, T6, Ignore> Setters<T1, T2, T3, T4, T5, T6>(Action<MyBO, ISession, T1> set1,
167 Action<MyBO, ISession, T2> set2,
168 Action<MyBO, ISession, T3> set3,
169 Action<MyBO, ISession, T4> set4,
170 Action<MyBO, ISession, T5> set5,
171 Action<MyBO, ISession, T6> set6)
172 {
173 return new SetterTuple<T1, T2, T3, T4, T5, T6, Ignore>(set1, set2, set3, set4, set5, set6, null);
174 }
175
176 protected static SetterTuple<T1, T2, T3, T4, T5, Ignore, Ignore> Setters<T1, T2, T3, T4, T5>(Action<MyBO, ISession, T1> set1,
177 Action<MyBO, ISession, T2> set2,
178 Action<MyBO, ISession, T3> set3,
179 Action<MyBO, ISession, T4> set4,
180 Action<MyBO, ISession, T5> set5)
181 {
182 return new SetterTuple<T1, T2, T3, T4, T5, Ignore, Ignore>(set1, set2, set3, set4, set5, null, null);
183 }
184
185 protected static SetterTuple<T1, T2, T3, T4, Ignore, Ignore, Ignore> Setters<T1, T2, T3, T4>(Action<MyBO, ISession, T1> set1,
186 Action<MyBO, ISession, T2> set2,
187 Action<MyBO, ISession, T3> set3,
188 Action<MyBO, ISession, T4> set4)
189 {
190 return new SetterTuple<T1, T2, T3, T4, Ignore, Ignore, Ignore>(set1, set2, set3, set4, null, null, null);
191 }
192
193 protected static SetterTuple<T1, T2, T3, Ignore, Ignore, Ignore, Ignore> Setters<T1, T2, T3>(Action<MyBO, ISession, T1> set1,
194 Action<MyBO, ISession, T2> set2,
195 Action<MyBO, ISession, T3> set3)
196 {
197 return new SetterTuple<T1, T2, T3, Ignore, Ignore, Ignore, Ignore>(set1, set2, set3,null, null, null, null);
198 }
199
200 protected static SetterTuple<T1, T2, Ignore, Ignore, Ignore, Ignore, Ignore> Setters<T1, T2>(Action<MyBO, ISession, T1> set1,
201 Action<MyBO, ISession, T2> set2)
202 {
203 return new SetterTuple<T1, T2, Ignore, Ignore, Ignore, Ignore, Ignore>(set1, set2, null, null, null, null, null);
204 }
205
206 protected static SetterTuple<T1, Ignore, Ignore, Ignore, Ignore, Ignore, Ignore> Setters<T1>(Action<MyBO, ISession, T1> set1)
207 {
208 return new SetterTuple<T1, Ignore, Ignore, Ignore, Ignore, Ignore, Ignore>(set1, null, null, null, null, null, null);
209 }
210
211 private static void DeleteAll<T>(ISession session)
212 {
213 session.CreateQuery("delete from " + typeof(T).Name).ExecuteUpdate();
214 }
215
216 private static IEnumerable<int> CreateObjects<T1, T2, T3, T4, T5, T6, T7>(ISession session, SetterTuple<T1, T2, T3, T4, T5, T6, T7> setters, Func<MyBO, bool> condition)
217 {
218 var expectedIds = new List<int>();
219 bool thereAreSomeWithTrue = false;
220 bool thereAreSomeWithFalse = false;
221 var allTestCases = GetAllTestCases<T1, T2, T3, T4, T5, T6, T7>().ToList();
222 var i = 0;
223 foreach (var q in allTestCases)
224 {
225 MyBO bo = new MyBO();
226 setters.Set(bo, session, q.Item1, q.Item2, q.Item3, q.Item4, q.Item5, q.Item6, q.Item7);
227 try
228 {
229 if (condition(bo))
230 {
231 expectedIds.Add(bo.Id);
232 thereAreSomeWithTrue = true;
233 }
234 else
235 {
236 thereAreSomeWithFalse = true;
237 }
238 if ((i%BatchSize) == 0)
239 {
240 if (session.Transaction.IsActive)
241 {
242 session.Transaction.Commit();
243 session.Clear();
244 }
245 session.BeginTransaction();
246 }
247 session.Save(bo);
248 i++;
249 }
250 catch (NullReferenceException)
251 {
252 // ignore - we only check consistency with Linq2Objects in non-failing cases;
253 // emulating the outer-join logic for exceptional cases in Lin2Objects is IMO very hard.
254 }
255 }
256 if (session.Transaction.IsActive)
257 {
258 session.Transaction.Commit();
259 session.Clear();
260 }
261
262 Console.WriteLine("Congratulation!! you have saved "+ i +" entities.");
263 if (!thereAreSomeWithTrue)
264 {
265 throw new ArgumentException("Condition is false for all - not a good test", "condition");
266 }
267 if (!thereAreSomeWithFalse)
268 {
269 throw new ArgumentException("Condition is true for all - not a good test", "condition");
270 }
271 return expectedIds;
272 }
273
274 protected static void AreEqual(IEnumerable<int> expectedIds, IEnumerable<int> actualList)
275 {
276 Assert.That(() => actualList.ToList(), Is.EquivalentTo(expectedIds));
277 }
278 }
279}