/common/tests/core/CoreTests/ProjectTest.cs

https://github.com/phlegma/vvvv-sdk · C# · 404 lines · 306 code · 78 blank · 20 comment · 5 complexity · 44f58e57b8f9a58f16883e97f2f37050 MD5 · raw file

  1. using System;
  2. using System.IO;
  3. using System.Threading;
  4. using System.Windows.Forms;
  5. using NUnit.Framework;
  6. using VVVV.Core;
  7. using VVVV.Core.Model;
  8. using VVVV.Core.Runtime;
  9. namespace CoreTests
  10. {
  11. public abstract class ProjectTest
  12. {
  13. [TestFixtureSetUp]
  14. public void Init()
  15. {
  16. SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext());
  17. SourceTemplateProject = CreateTemplateProject(SourceTemplateDir);
  18. }
  19. [TestFixtureTearDown]
  20. public void Dispose()
  21. {
  22. CleanupDirectories();
  23. }
  24. protected void SetupDirectories()
  25. {
  26. CopyFilesRecursively(SourceTemplateDir, TemplateDir);
  27. }
  28. protected void CleanupDirectories()
  29. {
  30. // Make sure test dirs are cleaned up.
  31. if (Directory.Exists(TestDir))
  32. Directory.Delete(TestDir, true);
  33. if (Directory.Exists(TemplateDir))
  34. Directory.Delete(TemplateDir, true);
  35. }
  36. public static void CopyFilesRecursively(string source, string target)
  37. {
  38. CopyFilesRecursively(new DirectoryInfo(source), new DirectoryInfo(target));
  39. }
  40. public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target)
  41. {
  42. foreach (DirectoryInfo dir in source.GetDirectories())
  43. CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
  44. foreach (FileInfo file in source.GetFiles())
  45. {
  46. var destFileName = Path.Combine(target.FullName, file.Name);
  47. file.CopyTo(destFileName, true);
  48. // Make sure it's not read-only
  49. var destFile = new FileInfo(destFileName);
  50. destFile.IsReadOnly = false;
  51. }
  52. }
  53. public string TemplateDir
  54. {
  55. get
  56. {
  57. return SourceTemplateDir + "Working";
  58. }
  59. }
  60. public string SourceTemplateDir
  61. {
  62. get
  63. {
  64. var currentDir = Path.GetFullPath(Environment.CurrentDirectory + @"\..\..");
  65. return Path.Combine(currentDir, "Templates");
  66. }
  67. }
  68. public string TestDir
  69. {
  70. get
  71. {
  72. return Path.Combine(Environment.CurrentDirectory, "Test");
  73. }
  74. }
  75. protected IProject SourceTemplateProject
  76. {
  77. get;
  78. private set;
  79. }
  80. protected abstract IProject CreateTemplateProject(string baseDir);
  81. protected abstract IProject CreateProject(Uri location);
  82. protected abstract Uri TestLocation
  83. {
  84. get;
  85. }
  86. protected abstract Uri CloneLocation
  87. {
  88. get;
  89. }
  90. [Test]
  91. public void TestLoadProject()
  92. {
  93. SetupDirectories();
  94. try
  95. {
  96. using (var project = CreateTemplateProject(TemplateDir))
  97. {
  98. // Initial state (1)
  99. Assert.IsFalse(project.IsLoaded);
  100. Assert.IsFalse(project.IsDirty);
  101. Assert.AreEqual(0, project.Documents.Count);
  102. Assert.AreEqual(0, project.References.Count);
  103. // Load should bring us to state (3)
  104. bool loadEventRaised = false;
  105. project.Loaded += delegate(object sender, EventArgs e)
  106. {
  107. loadEventRaised = true;
  108. };
  109. // Load it.
  110. Assert.DoesNotThrow(() => project.Load(), "Load() caused exception.");
  111. Assert.IsTrue(loadEventRaised, "Loaded event wasn't raised.");
  112. Assert.IsTrue(project.IsLoaded, "IsLoaded should be true after Load().");
  113. Assert.IsFalse(project.IsDirty, "IsDirty should be false after Load().");
  114. // Check if load was ok.
  115. Assert.Greater(project.Documents.Count, 0);
  116. Assert.Greater(project.References.Count, 0);
  117. }
  118. }
  119. finally
  120. {
  121. CleanupDirectories();
  122. }
  123. }
  124. [Test]
  125. public void TestUnloadProject()
  126. {
  127. SetupDirectories();
  128. try
  129. {
  130. using (var project = CreateTemplateProject(TemplateDir))
  131. {
  132. // TODO: This is not good. We depend on Load(). How to solve?
  133. project.Load();
  134. // Unload should bring us to state (1)
  135. bool unloadEventRaised = false;
  136. project.Unloaded += delegate(object sender, EventArgs e)
  137. {
  138. unloadEventRaised = true;
  139. };
  140. // Unload it.
  141. Assert.DoesNotThrow(() => project.Unload(), "Unload() caused exception.");
  142. Assert.IsTrue(unloadEventRaised, "Unloaded event wasn't raised.");
  143. Assert.IsFalse(project.IsLoaded, "IsLoaded should be false after Unload().");
  144. Assert.IsFalse(project.IsDirty, "IsDirty should be false after Unload().");
  145. // Check if unload was ok.
  146. Assert.AreEqual(0, project.Documents.Count);
  147. Assert.AreEqual(0, project.References.Count);
  148. }
  149. }
  150. finally
  151. {
  152. CleanupDirectories();
  153. }
  154. }
  155. [Test]
  156. public void TestSaveProject()
  157. {
  158. SetupDirectories();
  159. try
  160. {
  161. using (var project = CreateTemplateProject(TemplateDir))
  162. {
  163. // TODO: This is not good. We depend on Load(). How to solve?
  164. project.Load();
  165. // Save the project -> state (3)
  166. bool saveEventRaised = false;
  167. project.Saved += delegate(object sender, EventArgs e)
  168. {
  169. saveEventRaised = true;
  170. };
  171. // Save it.
  172. Assert.DoesNotThrow(() => project.Save(), "Save() caused exception.");
  173. Assert.IsTrue(saveEventRaised, "Saved event wasn't raised.");
  174. Assert.IsTrue(project.IsLoaded, "IsLoaded should be true after Save().");
  175. Assert.IsFalse(project.IsDirty, "IsDirty should be false after Save().");
  176. // Test if same content.
  177. var expectedDir = new DirectoryInfo(SourceTemplateProject.Location.GetLocalDir());
  178. var actualDir = new DirectoryInfo(project.Location.GetLocalDir());
  179. DirectoriesContainSameFiles(expectedDir, actualDir, false);
  180. }
  181. }
  182. finally
  183. {
  184. CleanupDirectories();
  185. }
  186. }
  187. [Test]
  188. public void TestSaveToProject()
  189. {
  190. SetupDirectories();
  191. try
  192. {
  193. using (var project = CreateTemplateProject(SourceTemplateDir))
  194. {
  195. // TODO: This is not good. We depend on Load(). How to solve?
  196. project.Load();
  197. // Save the project -> state (3)
  198. bool saveEventRaised = false;
  199. project.Saved += delegate(object sender, EventArgs e)
  200. {
  201. saveEventRaised = true;
  202. };
  203. // Save it.
  204. Assert.DoesNotThrow(() => project.SaveTo(CloneLocation), "SaveTo() caused exception.");
  205. Assert.IsFalse(saveEventRaised, "Saved event was raised after SaveTo().");
  206. Assert.IsTrue(project.IsLoaded, "IsLoaded should be true after SaveTo().");
  207. Assert.IsFalse(project.IsDirty, "IsDirty should be false after SaveTo().");
  208. Assert.IsTrue(File.Exists(CloneLocation.LocalPath), "Can't find project file after SaveTo().");
  209. // Test if same content.
  210. var expectedDir = new DirectoryInfo(project.Location.GetLocalDir());
  211. var actualDir = new DirectoryInfo(CloneLocation.GetLocalDir());
  212. var newProject = CreateProject(CloneLocation);
  213. Assert.DoesNotThrow(() => newProject.Load(), "Project copy can't be loaded.");
  214. Assert.IsFalse(newProject.IsReadOnly, "IsReadOnly should be false after SaveTo().");
  215. }
  216. }
  217. finally
  218. {
  219. CleanupDirectories();
  220. }
  221. }
  222. [Test]
  223. public void TestCompileProject()
  224. {
  225. SetupDirectories();
  226. try
  227. {
  228. using (var project = CreateTemplateProject(TemplateDir))
  229. {
  230. // TODO: This is not good. We depend on Load(). How to solve?
  231. project.Load();
  232. bool projectCompiledSuccessfullyEventRaised = false;
  233. project.ProjectCompiledSuccessfully += delegate(object sender, CompilerEventArgs args)
  234. {
  235. projectCompiledSuccessfullyEventRaised = true;
  236. };
  237. bool compiledCompletedEventRaised = false;
  238. project.CompileCompleted += delegate(object sender, CompilerEventArgs args)
  239. {
  240. compiledCompletedEventRaised = true;
  241. };
  242. // Compile it.
  243. Assert.DoesNotThrow(() => project.Compile(), "Compile() caused exception.");
  244. Assert.IsTrue(projectCompiledSuccessfullyEventRaised, "ProjectCompiledSuccessfully event wasn't raised after Compile().");
  245. Assert.IsTrue(compiledCompletedEventRaised, "CompiledCompleted event wasn't raised after Compile().");
  246. }
  247. }
  248. finally
  249. {
  250. CleanupDirectories();
  251. }
  252. }
  253. [Test]
  254. public void TestLoadAndDisposeProject()
  255. {
  256. SetupDirectories();
  257. try
  258. {
  259. var project = CreateTemplateProject(TemplateDir);
  260. Assert.DoesNotThrow(() => project.Load());
  261. bool disposeEventRaised = false;
  262. project.Disposed += delegate(object sender, EventArgs e)
  263. {
  264. disposeEventRaised = true;
  265. };
  266. Assert.DoesNotThrow(() => project.Dispose());
  267. Assert.IsTrue(disposeEventRaised, "Disposed event was raised after Dispose().");
  268. }
  269. finally
  270. {
  271. CleanupDirectories();
  272. }
  273. }
  274. [Test]
  275. public void TestLoadAndDisposeProjectTwice()
  276. {
  277. SetupDirectories();
  278. try
  279. {
  280. var project = CreateTemplateProject(TemplateDir);
  281. Assert.DoesNotThrow(() => project.Load());
  282. bool disposeEventRaised = false;
  283. project.Disposed += delegate(object sender, EventArgs e)
  284. {
  285. disposeEventRaised = true;
  286. };
  287. Assert.DoesNotThrow(() => project.Dispose());
  288. Assert.IsTrue(disposeEventRaised, "Disposed event was raised after Dispose().");
  289. project = CreateTemplateProject(TemplateDir);
  290. Assert.DoesNotThrow(() => project.Load());
  291. disposeEventRaised = false;
  292. project.Disposed += delegate(object sender, EventArgs e)
  293. {
  294. disposeEventRaised = true;
  295. };
  296. Assert.DoesNotThrow(() => project.Dispose());
  297. Assert.IsTrue(disposeEventRaised, "Disposed event was raised after Dispose().");
  298. }
  299. finally
  300. {
  301. CleanupDirectories();
  302. }
  303. }
  304. private void DirectoriesContainSameFiles(DirectoryInfo expected, DirectoryInfo actual, bool checkFileContent)
  305. {
  306. var expectedDirs = expected.GetDirectories();
  307. var actualDirs = actual.GetDirectories();
  308. Assert.AreEqual(expectedDirs.Length, actualDirs.Length, "Subdirectory count of {0} doesn't match {1}.", actual, expected);
  309. for (int i = 0; i < expectedDirs.Length; i++)
  310. {
  311. Assert.AreEqual(expectedDirs[i].Name, actualDirs[i].Name, "{0} doesn't contain same subdirectories as {1}.", actual, expected);
  312. DirectoriesContainSameFiles(expectedDirs[i], actualDirs[i], checkFileContent);
  313. }
  314. var expectedFiles = expected.GetFiles();
  315. var actualFiles = actual.GetFiles();
  316. Assert.AreEqual(expectedFiles.Length, actualFiles.Length, "File count of {0} doesn't match {1}.", actual, expected);
  317. for (int i = 0; i < expectedFiles.Length; i++)
  318. {
  319. Assert.AreEqual(expectedFiles[i].Name, actualFiles[i].Name);
  320. Assert.IsFalse(actualFiles[i].IsReadOnly, "Copied files should not be read-only.");
  321. if (checkFileContent)
  322. FileAssert.AreEqual(expectedFiles[i], actualFiles[i], "File content of {0} differs from {1}.", actualFiles[i], expectedFiles[i]);
  323. }
  324. }
  325. }
  326. }