PageRenderTime 123ms CodeModel.GetById 30ms RepoModel.GetById 7ms app.codeStats 0ms

/LLBL Pro v3.1/AW.DebugVisualizers.Tests/DebugVisualizersTest.cs

#
C# | 486 lines | 346 code | 62 blank | 78 comment | 10 complexity | f41ba28bafcbb8d2ead22e1cbb49cef1 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, BSD-3-Clause, MIT, GPL-2.0, Apache-2.0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.Collections.Specialized;
  6. using System.ComponentModel;
  7. using System.Data;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Windows.Data;
  11. using System.Windows.Forms;
  12. using System.Xml;
  13. using System.Xml.Linq;
  14. using AW.Data;
  15. using AW.Data.EntityClasses;
  16. using AW.DebugVisualizers.Tests.Properties;
  17. using AW.Helper;
  18. using AW.Helper.LLBL;
  19. using AW.LinqToSQL;
  20. using AW.Tests;
  21. using AW.Winforms.Helpers;
  22. using Microsoft.VisualStudio.DebuggerVisualizers;
  23. using Microsoft.VisualStudio.TestTools.UnitTesting;
  24. using NUnit.Extensions.Forms;
  25. using Northwind.DAL.Linq;
  26. using Northwind.DAL.SqlServer;
  27. using SD.LLBLGen.Pro.ORMSupportClasses;
  28. using AddressType = AW.Data.AddressType;
  29. namespace AW.DebugVisualizers.Tests
  30. {
  31. /// <summary>
  32. /// Summary description for DebugVisualizersTest
  33. /// </summary>
  34. [TestClass]
  35. public class DebugVisualizersTest : NUnitFormMSTest
  36. {
  37. private static dynamic _enumerableVisualizer;
  38. private static dynamic EnumerableVisualizer
  39. {
  40. get { return _enumerableVisualizer ?? (_enumerableVisualizer = new AccessPrivateWrapper(new EnumerableVisualizer())); }
  41. }
  42. private static DialogVisualizerServiceFake _dialogVisualizerServiceFake;
  43. private static readonly EntityCollectionBase<AddressTypeEntity> _addressTypeEntityCollection = MetaSingletons.MetaData.AddressType.ToEntityCollection();
  44. private static DialogVisualizerServiceFake DialogVisualizerServiceFake
  45. {
  46. get { return _dialogVisualizerServiceFake ?? (_dialogVisualizerServiceFake = _dialogVisualizerServiceFake = new DialogVisualizerServiceFake()); }
  47. }
  48. ///<summary>
  49. /// Gets or sets the test context which provides
  50. /// information about and functionality for the current test run.
  51. ///</summary>
  52. public TestContext TestContext { get; set; }
  53. #region Additional test attributes
  54. //
  55. // You can use the following additional attributes as you write your tests:
  56. //
  57. // Use ClassInitialize to run code before running the first test in the class
  58. // [ClassInitialize()]
  59. // public static void MyClassInitialize(TestContext testContext) { }
  60. //
  61. // Use ClassCleanup to run code after all tests in a class have run
  62. // [ClassCleanup()]
  63. // public static void MyClassCleanup() { }
  64. //
  65. // Use TestInitialize to run code before running each test
  66. // [TestInitialize()]
  67. // public void MyTestInitialize() { }
  68. //
  69. // Use TestCleanup to run code after each test has run
  70. // [TestCleanup()]
  71. // public void MyTestCleanup() { }
  72. //
  73. #endregion
  74. [TestMethod]
  75. public void DataTableTest()
  76. {
  77. var nonSerializableClasseDataTable = GeneralHelper.CopyToDataTable(NonSerializableClass.GenerateList());
  78. TestSerialize(nonSerializableClasseDataTable);
  79. TestSerialize(nonSerializableClasseDataTable.DefaultView);
  80. var serializableClassDataTable = GeneralHelper.CopyToDataTable(SerializableClass.GenerateList());
  81. TestSerialize(serializableClassDataTable);
  82. TestSerialize(serializableClassDataTable.DefaultView);
  83. var dt = new DataSet();
  84. var addressTypeEntityCollection = MetaSingletons.MetaData.AddressType.ToEntityCollection();
  85. addressTypeEntityCollection.CreateHierarchicalProjection(dt);
  86. TestSerialize(dt.Tables[0]);
  87. TestSerialize(dt.Tables[0].DefaultView);
  88. var addressTypeDataTable = GeneralHelper.CopyToDataTable(MetaSingletons.MetaData.AddressType);
  89. TestSerialize(addressTypeDataTable);
  90. TestSerialize(addressTypeDataTable.DefaultView);
  91. var enumerableRowCollection = addressTypeDataTable.AsEnumerable();
  92. TestSerialize(enumerableRowCollection);
  93. TestSerialize(DataTableExtensions.CopyToDataTable(enumerableRowCollection));
  94. }
  95. [TestCategory("Winforms"), TestMethod]
  96. public void SerializableQueryTest()
  97. {
  98. TestSerialize(MetaSingletons.MetaData.AddressType);
  99. var addressTypeQueryable = MetaSingletons.MetaData.AddressType.Distinct();
  100. TestShowTransported(addressTypeQueryable, 4);
  101. var addressTypeEntityCollection = MetaSingletons.MetaData.AddressType.ToEntityCollection();
  102. var addressTypeEntityCollectionQueryable = addressTypeEntityCollection.AsQueryable();
  103. TestSerialize(addressTypeEntityCollectionQueryable);
  104. TestShowTransported(MetaSingletons.MetaData.AddressType, 4);
  105. }
  106. [TestCategory("Winforms"), TestMethod]
  107. public void WeakReferenceTest()
  108. {
  109. var addressTypeEntityCollection = MetaSingletons.MetaData.AddressType.ToEntityCollection();
  110. var weakReference = new WeakReference(addressTypeEntityCollection);
  111. TestSerialize(weakReference);
  112. TestShowTransported(weakReference, 4);
  113. }
  114. [TestMethod]
  115. public void LookupTest()
  116. {
  117. var lookup = MetaSingletons.MetaData.AddressType.ToLookup(at => at.Name);
  118. //Show(lookup);
  119. TestShow(lookup, 1);
  120. }
  121. [TestCategory("Winforms"), TestMethod]
  122. public void EntityFieldsTest()
  123. {
  124. var addressType = MetaSingletons.MetaData.AddressType.First();
  125. TestShow(addressType.Fields, TestData.NumFieldProperties);
  126. }
  127. [TestCategory("Winforms"), TestMethod, Timeout(10000)]
  128. public void LargeSerializableQueryTest()
  129. {
  130. var awDataClassesDataContext = AWDataClassesDataContext.GetNew();
  131. TestShow(awDataClassesDataContext.Addresses, 9);
  132. // TestSerialize(MetaSingletons.MetaData.PurchaseOrderHeader);
  133. // TestShow(MetaSingletons.MetaData.PurchaseOrderHeader);
  134. }
  135. [TestCategory("Winforms"), TestMethod]
  136. public void QueryWithRelatedFieldsTest()
  137. {
  138. TestShowTransported(MetaSingletons.MetaData.Address.Take(5), 9);
  139. }
  140. [TestMethod]
  141. public void AdapterTest()
  142. {
  143. var northwindLinqMetaData = GetNorthwindLinqMetaData();
  144. var customerList = northwindLinqMetaData.Customer.ToList();
  145. const int expectedColumnCount = 12;
  146. TestShowTransported(customerList, expectedColumnCount);
  147. TestShowTransported(northwindLinqMetaData.Customer, expectedColumnCount);
  148. TestShowTransported(northwindLinqMetaData.Customer.ToEntityCollection2(), expectedColumnCount);
  149. }
  150. public static LinqMetaData GetNorthwindLinqMetaData()
  151. {
  152. return new LinqMetaData {AdapterToUse = new DataAccessAdapter()};
  153. }
  154. [TestMethod]
  155. public void SerializableObservableCollectionTest()
  156. {
  157. TestShowTransported(new ObservableCollection<AddressTypeEntity>(MetaSingletons.MetaData.AddressType.ToEntityCollection()), 4);
  158. }
  159. [TestMethod]
  160. public void SerializableCollectionViewTest()
  161. {
  162. var collectionView = (new CollectionViewSource {Source = MetaSingletons.MetaData.AddressType.ToEntityCollection()}).View;
  163. TestShowTransported(collectionView, 4);
  164. }
  165. [TestCategory("Winforms"), TestMethod]
  166. public void SerializableEnumerableTest()
  167. {
  168. var addressTypeEntityCollection = MetaSingletons.MetaData.AddressType.ToEntityCollection();
  169. TestShowTransported(addressTypeEntityCollection, 4);
  170. TestShowTransported(new HashSet<AddressTypeEntity>(_addressTypeEntityCollection), 4);
  171. TestShowTransported(SerializableBaseClass.GenerateList(), 2);
  172. TestShowTransported(((IEntity) addressTypeEntityCollection.First()).CustomPropertiesOfType, 2);
  173. TestShowTransported(SerializableBaseClass2.GenerateListWithBothSerializableClasses(), 2);
  174. TestShowTransported(SerializableClass.GenerateList(), 8);
  175. }
  176. [TestCategory("Winforms"), TestMethod]
  177. public void NonSerializableEnumerationTest()
  178. {
  179. TestShowTransported(MetaSingletons.MetaData.AddressType, 4);
  180. TestShowTransported(MetaSingletons.MetaData.AddressType.Where(at => at.AddressTypeID > AddressType.Home), 4);
  181. TestShowTransported(_addressTypeEntityCollection.DefaultView, 4);
  182. TestShowTransported(new BindingSource(_addressTypeEntityCollection, null), 4);
  183. TestShowTransported(_addressTypeEntityCollection.Where(at => at.AddressTypeID > AddressType.Home), 4);
  184. TestShowTransported(_addressTypeEntityCollection.AsQueryable().OrderByDescending(at => at.AddressTypeID), 4);
  185. }
  186. [TestCategory("Winforms"), TestMethod]
  187. public void NonSerializableItemTest()
  188. {
  189. var listofNonSerializableClasses = NonSerializableClass.GenerateList();
  190. TestSerialize(listofNonSerializableClasses);
  191. listofNonSerializableClasses.Insert(0, new SerializableClass {DateTimeField = DateTime.Now, IntField = listofNonSerializableClasses.Count, StringField = listofNonSerializableClasses.Count.ToString()});
  192. TestSerialize(listofNonSerializableClasses);
  193. TestSerialize(new ArrayList(listofNonSerializableClasses));
  194. TestShow(MetaDataHelper.GetPropertiesToDisplay(typeof (AddressTypeEntity)), 14);
  195. }
  196. [TestMethod]
  197. public void DifferentItemTypesTest()
  198. {
  199. var listofNonSerializableClasses = SerializableClass.GenerateListWithBothSerializableClasses();
  200. TestSerialize(listofNonSerializableClasses);
  201. TestSerialize(listofNonSerializableClasses.Distinct());
  202. TestSerialize(listofNonSerializableClasses.ToBindingListView());
  203. }
  204. [TestCategory("Winforms"), TestMethod]
  205. public void StringArrayTest()
  206. {
  207. var enumerable = new[] {"s1", "s2", "s3"};
  208. TestShow(enumerable, 1);
  209. var stringEnumerable = enumerable.Where(s => s.Length > 1);
  210. TestShow(stringEnumerable, 1);
  211. TestShowTransported(stringEnumerable, 1);
  212. TestShowTransported(new SortedSet<string>(stringEnumerable), 1);
  213. }
  214. [TestCategory("Winforms"), TestMethod]
  215. public void LinqtoSQLTest()
  216. {
  217. var awDataClassesDataContext = AWDataClassesDataContext.GetNew();
  218. TestShowTransported(awDataClassesDataContext.AddressTypes, 4);
  219. TestShowTransported(awDataClassesDataContext.AddressTypes.OrderByDescending(at => at.AddressTypeID), 4);
  220. }
  221. [TestMethod]
  222. public void KeysCollectionTest()
  223. {
  224. var nv = new NameValueCollection {{"foo", "foo"}, {"b", "b"}};
  225. TestSerialize(nv);
  226. TestSerialize(nv.Keys);
  227. }
  228. [TestMethod]
  229. public void StringDictionaryTest()
  230. {
  231. var sd = new StringDictionary {{"key1", "value1"}, {"key2", "value2"}};
  232. TestShowTransported(sd, 2);
  233. TestSerialize(sd.Keys);
  234. }
  235. [TestMethod]
  236. public void DictionaryTest()
  237. {
  238. var dictionary = NonSerializableClass.GenerateList().ToDictionary(ns => ns.IntProperty, ns => ns);
  239. TestShowTransported(dictionary, 2, 1);
  240. var expectedColumnCount = NonSerializableClass.NumberOfNonSerializableClassProperties*2;
  241. TestShowTransported(dictionary.Values, expectedColumnCount);
  242. TestShowTransported(dictionary.Keys, 1);
  243. }
  244. [TestCategory("Winforms"), TestMethod]
  245. public void Xml_test()
  246. {
  247. var xml = TestData.GetTestxmlString();
  248. var xElement = XElement.Parse(xml);
  249. TestShowTransported(xElement.Elements(), 21, 7);
  250. //TestSerialize(xElement);
  251. var xmlDoc = new XmlDocument();
  252. xmlDoc.LoadXml(xml);
  253. //Show(xmlDoc.FirstChild.ChildNodes);
  254. TestShowTransported(xmlDoc.FirstChild.ChildNodes, 24, 14);
  255. }
  256. [TestMethod]
  257. public void XmlSchemaTest()
  258. {
  259. var xmlSchema = TestData.GetTestXmlSchema();
  260. TestShowTransported(xmlSchema.Items, 28, 23);
  261. TestShowTransported(xmlSchema.Attributes.Names, 0);
  262. TestShowTransported(xmlSchema.Elements.Names, 3);
  263. TestShowTransported(xmlSchema.Elements.Values, 28, 23);
  264. TestShowTransported(xmlSchema.Groups.Values, 0);
  265. TestShowTransported(xmlSchema.SchemaTypes.Values, 0);
  266. }
  267. //[TestMethod]
  268. //public void XmlSchemaFromFileTest()
  269. //{
  270. // var xmlSchema = TestData.GetTestXmlSchema(@"C:\TFSProjects\AQDPortal\Trunk\AQDPortal.MVC\AQD.ExportUtility\RASchemas\Occurrence_1_0.xsd");
  271. // TestShowTransported(xmlSchema.Items, 5, 28);
  272. // TestShowTransported(xmlSchema.Groups.Values, 0);
  273. // var xmlSchemaComplexType = (xmlSchema.Elements.Values.Cast<XmlSchemaElement>().First(element => element.Name == "OccurrenceDetails").ElementSchemaType as XmlSchemaComplexType);
  274. // TestShowTransported((xmlSchemaComplexType.Particle as XmlSchemaSequence).Items, 28, 23);
  275. //}
  276. [TestMethod]
  277. public void SettingsPropertyTest()
  278. {
  279. TestShowTransported(Settings.Default.Properties, 9, 7);
  280. if (Settings.Default.PropertyValues.Count == 0)
  281. {
  282. var x = Settings.Default.StringSetting;
  283. }
  284. Assert.AreNotEqual(0, Settings.Default.PropertyValues.Count);
  285. TestShowTransported(Settings.Default.PropertyValues, 7, 6);
  286. }
  287. public static void TestSerialize(object enumerableOrDataTableToVisualize)
  288. {
  289. //Assert.IsInstanceOfType(enumerableToVisualize, typeof(IEnumerable));
  290. AssertNewContanerIsBindingListView(enumerableOrDataTableToVisualize, VisualizerObjectProviderFake.SerializeDeserialize(enumerableOrDataTableToVisualize));
  291. }
  292. /// <summary>
  293. /// Assert that if the Serialized and Deserialized enumeration is not the same type as the source then it is a IBindingListView
  294. /// </summary>
  295. /// <param name="enumerableOrDataTableToVisualize"> The enumerable or data table to visualize. </param>
  296. /// <param name="transportedEnumerableOrDataTable"> The transported enumerable or data table. </param>
  297. private static void AssertNewContanerIsBindingListView(object enumerableOrDataTableToVisualize, object transportedEnumerableOrDataTable)
  298. {
  299. if (!(transportedEnumerableOrDataTable is DataTableSurrogate) && !(transportedEnumerableOrDataTable is IListSource)
  300. && transportedEnumerableOrDataTable.GetType() != enumerableOrDataTableToVisualize.GetType())
  301. Assert.IsInstanceOfType(transportedEnumerableOrDataTable, typeof (IBindingListView));
  302. }
  303. private static void Show(object enumerableOrDataTableToVisualize)
  304. {
  305. var visualizerHost = new VisualizerDevelopmentHost(enumerableOrDataTableToVisualize, typeof (EnumerableVisualizer), typeof (EnumerableVisualizerObjectSource));
  306. visualizerHost.ShowVisualizer();
  307. }
  308. /// <summary>
  309. /// Shows the enumerable or data table to visualize and asserts the number of columns displayed.
  310. /// </summary>
  311. /// <param name="enumerableOrDataTableToVisualize"> The enumerable or data table to visualize. </param>
  312. /// <param name="expectedColumnCount"> The expected column count. </param>
  313. public static void TestShow(object enumerableOrDataTableToVisualize, int expectedColumnCount)
  314. {
  315. Assert.IsTrue(enumerableOrDataTableToVisualize is IEnumerable || enumerableOrDataTableToVisualize is DataTableSurrogate || enumerableOrDataTableToVisualize is WeakReference);
  316. var visualizerObjectProviderFake = new VisualizerObjectProviderFake(enumerableOrDataTableToVisualize);
  317. //AssertNewContanerIsBindingListView(enumerableOrDataTableToVisualize, visualizerObjectProviderFake.GetObject());
  318. EnumerableVisualizer.Show(DialogVisualizerServiceFake, visualizerObjectProviderFake);
  319. var dataGridView = GridDataEditorTestBase.GetDataGridViewFromGridDataEditor(_dialogVisualizerServiceFake.VisualizerForm);
  320. Assert.AreEqual(expectedColumnCount, dataGridView.ColumnCount, enumerableOrDataTableToVisualize.ToString());
  321. Application.DoEvents();
  322. }
  323. /// <summary>
  324. /// Shows the enumerable or data table to visualize and asserts the number of columns displayed are that same before and after transportation.
  325. /// </summary>
  326. /// <param name="enumerableOrDataTableToVisualize"> The enumerable or data table to visualize. </param>
  327. /// <param name="expectedColumnCount"> The expected column count. </param>
  328. /// <param name="expectedTransportedColumnCount"> The expected transported column count. </param>
  329. public static void TestShowTransported(object enumerableOrDataTableToVisualize, int expectedColumnCount, int expectedTransportedColumnCount = -1)
  330. {
  331. TestShow(enumerableOrDataTableToVisualize, expectedColumnCount);
  332. var transportedEnumerableOrDataTable = VisualizerObjectProviderFake.SerializeDeserialize(enumerableOrDataTableToVisualize);
  333. AssertNewContanerIsBindingListView(enumerableOrDataTableToVisualize, transportedEnumerableOrDataTable);
  334. if (expectedTransportedColumnCount == -1)
  335. expectedTransportedColumnCount = expectedColumnCount;
  336. TestShow(transportedEnumerableOrDataTable, expectedTransportedColumnCount);
  337. }
  338. }
  339. internal class DialogVisualizerServiceFake : IDialogVisualizerService
  340. {
  341. public Form VisualizerForm { get; set; }
  342. #region Implementation of IDialogVisualizerService
  343. /// <returns> Displays a Windows Form. </returns>
  344. /// <param name="form"> Any Windows Form object derived from System.Windows.Forms.Form. </param>
  345. public DialogResult ShowDialog(Form form)
  346. {
  347. VisualizerForm = form;
  348. //form.ShowDialog();
  349. form.Show();
  350. return DialogResult.None;
  351. }
  352. /// <param name="dialog"> Any dialog derived from System.Windows.Forms.CommonDialog. </param>
  353. public DialogResult ShowDialog(CommonDialog dialog)
  354. {
  355. return DialogResult.None;
  356. }
  357. /// <param name="control"> Any control derived from System.Windows.Forms.Control. </param>
  358. public DialogResult ShowDialog(Control control)
  359. {
  360. return DialogResult.None;
  361. }
  362. #endregion
  363. }
  364. internal class VisualizerObjectProviderFake : IVisualizerObjectProvider
  365. {
  366. private readonly object _enumerableOrDataTableToVisualize;
  367. public VisualizerObjectProviderFake(object enumerableOrDataTableToVisualize)
  368. {
  369. _enumerableOrDataTableToVisualize = enumerableOrDataTableToVisualize;
  370. }
  371. public static object SerializeDeserialize(object enumerableToVisualize)
  372. {
  373. var enumerableVisualizerObjectSource = new EnumerableVisualizerObjectSource();
  374. var memoryStream = new MemoryStream();
  375. enumerableVisualizerObjectSource.GetData(enumerableToVisualize, memoryStream);
  376. memoryStream.Position = 0;
  377. Assert.AreNotEqual(0, memoryStream.Length);
  378. return VisualizerObjectSource.Deserialize(memoryStream);
  379. }
  380. #region Implementation of IVisualizerObjectProvider
  381. /// <returns> A stream of data containing the contents of the object being visualized. Calling this method results in <see
  382. /// cref="M:Microsoft.VisualStudio.DebuggerVisualizers.VisualizerObjectSource.GetData(System.Object,System.IO.Stream)" /> being called on the VisualizerObjectSource. The return value of that GetData call is then returned to the caller of this method. </returns>
  383. public Stream GetData()
  384. {
  385. return null;
  386. }
  387. /// <returns> The data object being visualized. This is actually a debugger-side copy of the object you are visualizing in the debuggee. If you modify the contents of this object, the changes will not be reflected back in the debuggee unless you use the <see
  388. /// cref="M:Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.ReplaceData(System.IO.Stream)" /> / <see
  389. /// cref="M:Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.ReplaceObject(System.Object)" /> or <see
  390. /// cref="M:Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.TransferData(System.IO.Stream)" /> / <see
  391. /// cref="M:Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.TransferObject(System.Object)" /> . </returns>
  392. public object GetObject()
  393. {
  394. return _enumerableOrDataTableToVisualize;
  395. }
  396. /// <param name="newObjectData"> A stream containing data to be used to create a new object, replacing the object currently being visualized. </param>
  397. public void ReplaceData(Stream newObjectData)
  398. {
  399. }
  400. /// <param name="newObject"> The new object to replace the object currently being visualized. </param>
  401. public void ReplaceObject(object newObject)
  402. {
  403. }
  404. /// <returns> Returns the data stream filled in by VisualizerObjectSource's TransferData method. There is no two-way stream-based communication between the debugger side and debuggee side (object source.) </returns>
  405. /// <param name="outgoingData"> A stream of data that is to be transferred back to the debuggee side. </param>
  406. public Stream TransferData(Stream outgoingData)
  407. {
  408. return null;
  409. }
  410. /// <returns> The result of deserializing the return value of <see
  411. /// cref="M:Microsoft.VisualStudio.DebuggerVisualizers.IVisualizerObjectProvider.TransferData(System.IO.Stream)" /> . </returns>
  412. /// <param name="outgoingObject"> An object that is to be transferred back to the debuggee side. </param>
  413. public object TransferObject(object outgoingObject)
  414. {
  415. return null;
  416. }
  417. /// <returns> Determines whether the data object being visualized is replaceable (read/write) or nonreplaceable (read only). </returns>
  418. public bool IsObjectReplaceable
  419. {
  420. get { return false; }
  421. }
  422. #endregion
  423. }
  424. }