UnityDiffTreeTests.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. using System.Collections.Generic;
  2. using NUnit.Framework;
  3. using Codice.Client.Commands;
  4. using Codice.Client.Commands.Mount;
  5. using Codice.CM.Common;
  6. using Codice.CM.Common.Merge;
  7. using Codice.Utils;
  8. using PlasticGui.WorkspaceWindow.Diff;
  9. using Unity.PlasticSCM.Editor.Views.Diff;
  10. namespace Unity.PlasticSCM.Tests.Editor.Views.Diff
  11. {
  12. [TestFixture]
  13. class UnityDiffTreeTests
  14. {
  15. [Test]
  16. public void TestAddedNoMeta()
  17. {
  18. ClientDiff added = Build.Added("/foo/bar.c");
  19. List<ClientDiff> diffs = new List<ClientDiff>();
  20. diffs.Add(added);
  21. UnityDiffTree diffTree = new UnityDiffTree();
  22. diffTree.BuildCategories(diffs, false);
  23. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  24. added,
  25. ChangeCategoryType.Added,
  26. diffTree);
  27. Assert.IsNotNull(
  28. clientDiffInfo,
  29. "Added not found");
  30. Assert.IsFalse(
  31. diffTree.HasMeta(clientDiffInfo),
  32. "Meta exists");
  33. }
  34. [Test]
  35. public void TestChangedNoMeta()
  36. {
  37. ClientDiff changed = Build.Changed("/foo/bar.c");
  38. List<ClientDiff> diffs = new List<ClientDiff>();
  39. diffs.Add(changed);
  40. UnityDiffTree diffTree = new UnityDiffTree();
  41. diffTree.BuildCategories(diffs, false);
  42. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  43. changed,
  44. ChangeCategoryType.Changed,
  45. diffTree);
  46. Assert.IsNotNull(
  47. clientDiffInfo,
  48. "Changed not found");
  49. Assert.IsFalse(
  50. diffTree.HasMeta(clientDiffInfo),
  51. "Meta exists");
  52. }
  53. [Test]
  54. public void TestDeletedNoMeta()
  55. {
  56. ClientDiff deleted = Build.Deleted("/foo/bar.c");
  57. List<ClientDiff> diffs = new List<ClientDiff>();
  58. diffs.Add(deleted);
  59. UnityDiffTree diffTree = new UnityDiffTree();
  60. diffTree.BuildCategories(diffs, false);
  61. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  62. deleted,
  63. ChangeCategoryType.Deleted,
  64. diffTree);
  65. Assert.IsNotNull(
  66. clientDiffInfo,
  67. "Deleted not found");
  68. Assert.IsFalse(
  69. diffTree.HasMeta(clientDiffInfo),
  70. "Meta exists");
  71. }
  72. [Test]
  73. public void TestMovedNoMeta()
  74. {
  75. ClientDiff moved = Build.Moved("/foo/bar.src.c", "/foo/bar.c");
  76. List<ClientDiff> diffs = new List<ClientDiff>();
  77. diffs.Add(moved);
  78. UnityDiffTree diffTree = new UnityDiffTree();
  79. diffTree.BuildCategories(diffs, false);
  80. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  81. moved,
  82. ChangeCategoryType.Moved,
  83. diffTree);
  84. Assert.IsNotNull(
  85. clientDiffInfo,
  86. "Moved not found");
  87. Assert.IsFalse(
  88. diffTree.HasMeta(clientDiffInfo),
  89. "Meta exists");
  90. }
  91. [Test]
  92. public void TestFsPermissionsNoMeta()
  93. {
  94. ClientDiff changedFsPermissions = Build.ChangedFsPermissions("/foo/bar.c");
  95. List<ClientDiff> diffs = new List<ClientDiff>();
  96. diffs.Add(changedFsPermissions);
  97. UnityDiffTree diffTree = new UnityDiffTree();
  98. diffTree.BuildCategories(diffs, false);
  99. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  100. changedFsPermissions,
  101. ChangeCategoryType.FSProtection,
  102. diffTree);
  103. Assert.IsNotNull(
  104. clientDiffInfo,
  105. "Changed fs protection not found");
  106. Assert.IsFalse(
  107. diffTree.HasMeta(clientDiffInfo),
  108. "Meta exists");
  109. }
  110. [Test]
  111. public void TestMergedNoMeta()
  112. {
  113. ClientDiff merged = Build.Merged("/foo/bar.c");
  114. List<ClientDiff> diffs = new List<ClientDiff>();
  115. diffs.Add(merged);
  116. UnityDiffTree diffTree = new UnityDiffTree();
  117. diffTree.BuildCategories(diffs, false);
  118. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  119. merged,
  120. ChangeCategoryType.Merged,
  121. diffTree);
  122. Assert.IsNotNull(
  123. clientDiffInfo,
  124. "Merged not found");
  125. Assert.IsFalse(
  126. diffTree.HasMeta(clientDiffInfo),
  127. "Meta exists");
  128. }
  129. [Test]
  130. public void TestAddedWithMeta()
  131. {
  132. ClientDiff added = Build.Added("/foo/bar.c");
  133. ClientDiff addedMeta = Build.Added("/foo/bar.c.meta");
  134. List<ClientDiff> diffs = new List<ClientDiff>();
  135. diffs.Add(added);
  136. diffs.Add(addedMeta);
  137. UnityDiffTree diffTree = new UnityDiffTree();
  138. diffTree.BuildCategories(diffs, false);
  139. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  140. added,
  141. ChangeCategoryType.Added,
  142. diffTree);
  143. ClientDiffInfo clientDiffInfoMeta = FindClientDiffInfo.FromClientDiff(
  144. addedMeta,
  145. ChangeCategoryType.Added,
  146. diffTree);
  147. Assert.IsNotNull(
  148. clientDiffInfo,
  149. "Added not found");
  150. Assert.IsNull(
  151. clientDiffInfoMeta,
  152. "Added meta found");
  153. Assert.IsTrue(
  154. diffTree.HasMeta(clientDiffInfo),
  155. "Meta does not exist");
  156. }
  157. [Test]
  158. public void TestChangedWithMeta()
  159. {
  160. ClientDiff changed = Build.Changed("/foo/bar.c");
  161. ClientDiff changedMeta = Build.Changed("/foo/bar.c.meta");
  162. List<ClientDiff> diffs = new List<ClientDiff>();
  163. diffs.Add(changed);
  164. diffs.Add(changedMeta);
  165. UnityDiffTree diffTree = new UnityDiffTree();
  166. diffTree.BuildCategories(diffs, false);
  167. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  168. changed,
  169. ChangeCategoryType.Changed,
  170. diffTree);
  171. ClientDiffInfo clientDiffInfoMeta = FindClientDiffInfo.FromClientDiff(
  172. changedMeta,
  173. ChangeCategoryType.Changed,
  174. diffTree);
  175. Assert.IsNotNull(
  176. clientDiffInfo,
  177. "Changed not found");
  178. Assert.IsNull(
  179. clientDiffInfoMeta,
  180. "Changed meta found");
  181. Assert.IsTrue(
  182. diffTree.HasMeta(clientDiffInfo),
  183. "Meta does not exist");
  184. }
  185. [Test]
  186. public void TestDeletedWithMeta()
  187. {
  188. ClientDiff deleted = Build.Deleted("/foo/bar.c");
  189. ClientDiff deletedMeta = Build.Deleted("/foo/bar.c.meta");
  190. List<ClientDiff> diffs = new List<ClientDiff>();
  191. diffs.Add(deleted);
  192. diffs.Add(deletedMeta);
  193. UnityDiffTree diffTree = new UnityDiffTree();
  194. diffTree.BuildCategories(diffs, false);
  195. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  196. deleted,
  197. ChangeCategoryType.Deleted,
  198. diffTree);
  199. ClientDiffInfo clientDiffInfoMeta = FindClientDiffInfo.FromClientDiff(
  200. deletedMeta,
  201. ChangeCategoryType.Deleted,
  202. diffTree);
  203. Assert.IsNotNull(
  204. clientDiffInfo,
  205. "Deleted not found");
  206. Assert.IsNull(
  207. clientDiffInfoMeta,
  208. "Deleted meta found");
  209. Assert.IsTrue(
  210. diffTree.HasMeta(clientDiffInfo),
  211. "Meta does not exist");
  212. }
  213. [Test]
  214. public void TestMovedWithMeta()
  215. {
  216. ClientDiff moved = Build.Moved("/foo/bar.src.c", "/foo/bar.c");
  217. ClientDiff movedMeta = Build.Moved("/foo/bar.src.c.meta", "/foo/bar.c.meta");
  218. List<ClientDiff> diffs = new List<ClientDiff>();
  219. diffs.Add(moved);
  220. diffs.Add(movedMeta);
  221. UnityDiffTree diffTree = new UnityDiffTree();
  222. diffTree.BuildCategories(diffs, false);
  223. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  224. moved,
  225. ChangeCategoryType.Moved,
  226. diffTree);
  227. ClientDiffInfo clientDiffInfoMeta = FindClientDiffInfo.FromClientDiff(
  228. movedMeta,
  229. ChangeCategoryType.Moved,
  230. diffTree);
  231. Assert.IsNotNull(
  232. clientDiffInfo,
  233. "Moved not found");
  234. Assert.IsNull(
  235. clientDiffInfoMeta,
  236. "Moved meta found");
  237. Assert.IsTrue(
  238. diffTree.HasMeta(clientDiffInfo),
  239. "Meta does not exist");
  240. }
  241. [Test]
  242. public void TestFsPermissionsWithMeta()
  243. {
  244. ClientDiff fsPermissionsChange = Build.ChangedFsPermissions("/foo/bar.c");
  245. ClientDiff fsPermissionsChangeMeta = Build.ChangedFsPermissions("/foo/bar.c.meta");
  246. List<ClientDiff> diffs = new List<ClientDiff>();
  247. diffs.Add(fsPermissionsChange);
  248. diffs.Add(fsPermissionsChangeMeta);
  249. UnityDiffTree diffTree = new UnityDiffTree();
  250. diffTree.BuildCategories(diffs, false);
  251. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  252. fsPermissionsChange,
  253. ChangeCategoryType.FSProtection,
  254. diffTree);
  255. ClientDiffInfo clientDiffInfoMeta = FindClientDiffInfo.FromClientDiff(
  256. fsPermissionsChangeMeta,
  257. ChangeCategoryType.FSProtection,
  258. diffTree);
  259. Assert.IsNotNull(
  260. clientDiffInfo,
  261. "Change fs permissions not found");
  262. Assert.IsNull(
  263. clientDiffInfoMeta,
  264. "Change fs permissions meta found");
  265. Assert.IsTrue(
  266. diffTree.HasMeta(clientDiffInfo),
  267. "Meta does not exist");
  268. }
  269. [Test]
  270. public void TestMergedWithMeta()
  271. {
  272. ClientDiff merged = Build.Merged("/foo/bar.c");
  273. ClientDiff mergedMeta = Build.Merged("/foo/bar.c.meta");
  274. List<ClientDiff> diffs = new List<ClientDiff>();
  275. diffs.Add(merged);
  276. diffs.Add(mergedMeta);
  277. UnityDiffTree diffTree = new UnityDiffTree();
  278. diffTree.BuildCategories(diffs, false);
  279. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  280. merged,
  281. ChangeCategoryType.Merged,
  282. diffTree);
  283. ClientDiffInfo clientDiffInfoMeta = FindClientDiffInfo.FromClientDiff(
  284. mergedMeta,
  285. ChangeCategoryType.Merged,
  286. diffTree);
  287. Assert.IsNotNull(
  288. clientDiffInfo,
  289. "Merged not found");
  290. Assert.IsNull(
  291. clientDiffInfoMeta,
  292. "Merged meta found");
  293. Assert.IsTrue(
  294. diffTree.HasMeta(clientDiffInfo),
  295. "Meta does not exist");
  296. }
  297. [Test]
  298. public void TestChangeWithDeletedMeta()
  299. {
  300. ClientDiff changed = Build.Changed("/foo/bar.c");
  301. ClientDiff deletedMeta = Build.Deleted("/foo/bar.c.meta");
  302. List<ClientDiff> diffs = new List<ClientDiff>();
  303. diffs.Add(changed);
  304. diffs.Add(deletedMeta);
  305. UnityDiffTree diffTree = new UnityDiffTree();
  306. diffTree.BuildCategories(diffs, false);
  307. ClientDiffInfo clientDiffInfo = FindClientDiffInfo.FromClientDiff(
  308. changed,
  309. ChangeCategoryType.Changed,
  310. diffTree);
  311. ClientDiffInfo clientDiffInfoMeta = FindClientDiffInfo.FromClientDiff(
  312. deletedMeta,
  313. ChangeCategoryType.Deleted,
  314. diffTree);
  315. Assert.IsNotNull(
  316. clientDiffInfo,
  317. "Changed not found");
  318. Assert.IsNotNull(
  319. clientDiffInfoMeta,
  320. "Deleted meta not found");
  321. Assert.IsFalse(
  322. diffTree.HasMeta(clientDiffInfo),
  323. "Meta exists");
  324. }
  325. static class Build
  326. {
  327. internal static ClientDiff Added(string path)
  328. {
  329. return new ClientDiff(
  330. BuildRootMountPoint(),
  331. BuildAddedDifference(path),
  332. null);
  333. }
  334. internal static ClientDiff Changed(string path)
  335. {
  336. return new ClientDiff(
  337. BuildRootMountPoint(),
  338. BuildChangedDifference(path),
  339. null);
  340. }
  341. internal static ClientDiff ChangedFsPermissions(string path)
  342. {
  343. return new ClientDiff(
  344. BuildRootMountPoint(),
  345. BuildChangedFsPermissionsDifference(path),
  346. null);
  347. }
  348. internal static ClientDiff Deleted(string path)
  349. {
  350. return new ClientDiff(
  351. BuildRootMountPoint(),
  352. BuildDeletedDifference(path),
  353. null);
  354. }
  355. internal static ClientDiff Merged(string path)
  356. {
  357. return new ClientDiff(
  358. BuildRootMountPoint(),
  359. BuildChangedDifference(path),
  360. new ItemDiffMerge(new List<RevisionMerge>()
  361. {
  362. new RevisionMerge()
  363. {
  364. SrcRevId = 15,
  365. DstRevId = 16,
  366. Link = new MergeLinkRealizationInfo(),
  367. Type = MergeChangeType.Merged
  368. }
  369. }));
  370. }
  371. internal static ClientDiff Moved(
  372. string srcPath,
  373. string dstPath)
  374. {
  375. return new ClientDiff(
  376. BuildRootMountPoint(),
  377. BuildMovedDifference(srcPath, dstPath),
  378. null);
  379. }
  380. static Difference BuildAddedDifference(string path)
  381. {
  382. return new DiffChanged(
  383. new RevisionInfo() { Type = EnumRevisionType.enTextFile },
  384. -1,
  385. path,
  386. -1,
  387. Difference.DiffNodeStatus.Added);
  388. }
  389. static Difference BuildChangedDifference(string path)
  390. {
  391. return new DiffChanged(
  392. new RevisionInfo() { Type = EnumRevisionType.enTextFile },
  393. -1,
  394. path,
  395. -1,
  396. Difference.DiffNodeStatus.Changed);
  397. }
  398. static Difference BuildChangedFsPermissionsDifference(string path)
  399. {
  400. return new DiffChanged(
  401. new RevisionInfo() { Type = EnumRevisionType.enTextFile },
  402. -1,
  403. path,
  404. -1,
  405. Difference.DiffNodeStatus.Changed,
  406. null,
  407. 456);
  408. }
  409. static Difference BuildDeletedDifference(string path)
  410. {
  411. return new DiffChanged(
  412. new RevisionInfo() { Type = EnumRevisionType.enTextFile },
  413. -1,
  414. path,
  415. -1,
  416. Difference.DiffNodeStatus.Deleted);
  417. }
  418. static Difference BuildMovedDifference(string srcPath, string dstPath)
  419. {
  420. return new DiffMoved(
  421. new RevisionInfo() { Type = EnumRevisionType.enTextFile },
  422. -1,
  423. srcPath,
  424. -1,
  425. dstPath,
  426. -1);
  427. }
  428. static MountPointWithPath BuildRootMountPoint()
  429. {
  430. return new MountPointWithPath(
  431. MountPointId.WORKSPACE_ROOT,
  432. new RepositorySpec()
  433. {
  434. Name = "myrep",
  435. Server = "myserver:8084"
  436. },
  437. "/myroot");
  438. }
  439. }
  440. static class FindClientDiffInfo
  441. {
  442. internal static ClientDiffInfo FromClientDiff(
  443. ClientDiff clientDiff,
  444. ChangeCategoryType type,
  445. UnityDiffTree diffTree)
  446. {
  447. foreach (ITreeViewNode node in diffTree.GetNodes())
  448. {
  449. ClientDiffInfo result = FindClientDiffOfType(
  450. clientDiff.Diff.Path,
  451. type,
  452. node);
  453. if (result != null)
  454. return result;
  455. }
  456. return null;
  457. }
  458. static ClientDiffInfo FindClientDiffOfType(
  459. string path,
  460. ChangeCategoryType type,
  461. ITreeViewNode node)
  462. {
  463. if (node is ClientDiffInfo)
  464. {
  465. ClientDiffInfo clientDiffInfo = (ClientDiffInfo)node;
  466. ChangeCategory category = (ChangeCategory)node.GetParent();
  467. if (category.Type == type &&
  468. clientDiffInfo.DiffWithMount.Difference.Path == path)
  469. {
  470. return (ClientDiffInfo)node;
  471. }
  472. }
  473. for (int i = 0; i < node.GetChildrenCount(); i++)
  474. {
  475. ClientDiffInfo result = FindClientDiffOfType(path, type, node.GetChild(i));
  476. if (result != null)
  477. return result;
  478. }
  479. return null;
  480. }
  481. }
  482. }
  483. }