PageRenderTime 86ms CodeModel.GetById 25ms app.highlight 35ms RepoModel.GetById 14ms app.codeStats 1ms

/src/NHibernate.Test/NHSpecificTest/NH2583/AbstractMassTestingFixture.cs

https://github.com/thisisvijay/nhibernate-core
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}