SerializedGraphTests.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using NUnit.Framework;
  5. using UnityEngine;
  6. using UnityEditor.ShaderGraph;
  7. namespace UnityEditor.Graphing.UnitTests
  8. {
  9. [TestFixture]
  10. public class BaseMaterialGraphTests
  11. {
  12. [OneTimeSetUp]
  13. public void RunBeforeAnyTests()
  14. {
  15. Debug.unityLogger.logHandler = new ConsoleLogHandler();
  16. }
  17. [Test]
  18. public void TestCanCreateBaseMaterialGraph()
  19. {
  20. var graph = new GraphData();
  21. Assert.AreEqual(0, graph.edges.Count());
  22. Assert.AreEqual(0, graph.GetNodes<AbstractMaterialNode>().Count());
  23. }
  24. [Test]
  25. public void TestCanAddNodeToBaseMaterialGraph()
  26. {
  27. var graph = new GraphData();
  28. var node = new TestNode();
  29. node.name = "Test Node";
  30. graph.AddNode(node);
  31. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  32. Assert.AreEqual("Test Node", graph.GetNodes<AbstractMaterialNode>().FirstOrDefault().name);
  33. Assert.AreEqual(graph, node.owner);
  34. }
  35. [Test]
  36. public void TestCanRemoveNodeFromBaseMaterialGraph()
  37. {
  38. var graph = new GraphData();
  39. var node = new TestNode();
  40. node.name = "Test Node";
  41. graph.AddNode(node);
  42. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  43. graph.RemoveNode(graph.GetNodes<AbstractMaterialNode>().FirstOrDefault());
  44. Assert.AreEqual(0, graph.GetNodes<AbstractMaterialNode>().Count());
  45. }
  46. [Test]
  47. public void TestCanModifyNodeDrawState()
  48. {
  49. var node = new TestNode();
  50. node.name = "Test Node";
  51. var drawState = node.drawState;
  52. var newPos = new Rect(10, 10, 0, 0);
  53. drawState.position = newPos;
  54. drawState.expanded = false;
  55. node.drawState = drawState;
  56. Assert.AreEqual(drawState, node.drawState);
  57. Assert.AreEqual(newPos, node.drawState.position);
  58. Assert.IsFalse(node.drawState.expanded);
  59. }
  60. class SetErrorNode : TestNode
  61. {
  62. public void SetError()
  63. {
  64. hasError = true;
  65. }
  66. public void ClearError()
  67. {
  68. hasError = false;
  69. }
  70. }
  71. [Test]
  72. public void TestChildClassCanModifyErrorState()
  73. {
  74. var node = new SetErrorNode();
  75. node.SetError();
  76. Assert.IsTrue(node.hasError);
  77. node.ClearError();
  78. Assert.IsFalse(node.hasError);
  79. }
  80. [Test]
  81. public void TestNodeGUIDCanBeRewritten()
  82. {
  83. var node = new TestNode();
  84. var guid = node.guid;
  85. var newGuid = node.RewriteGuid();
  86. Assert.AreNotEqual(guid, newGuid);
  87. }
  88. class TestableNode : TestNode
  89. {
  90. public const int Input0 = 0;
  91. public const int Input1 = 1;
  92. public const int Input2 = 2;
  93. public const int Output0 = 3;
  94. public const int Output1 = 4;
  95. public const int Output2 = 5;
  96. public TestableNode()
  97. {
  98. AddSlot(new TestSlot(Input0, "Input", SlotType.Input));
  99. AddSlot(new TestSlot(Input1, "Input", SlotType.Input));
  100. AddSlot(new TestSlot(Input2, "Input", SlotType.Input));
  101. AddSlot(new TestSlot(Output0, "Output", SlotType.Output));
  102. AddSlot(new TestSlot(Output1, "Output", SlotType.Output));
  103. AddSlot(new TestSlot(Output2, "Output", SlotType.Output));
  104. }
  105. }
  106. [Test]
  107. public void TestRemoveNodeFromBaseMaterialGraphCleansEdges()
  108. {
  109. var graph = new GraphData();
  110. var outputNode = new TestableNode();
  111. graph.AddNode(outputNode);
  112. var inputNode = new TestableNode();
  113. graph.AddNode(inputNode);
  114. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  115. var createdEdge = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  116. Assert.AreEqual(1, graph.edges.Count());
  117. var edge = graph.edges.FirstOrDefault();
  118. Assert.AreEqual(createdEdge, edge);
  119. graph.RemoveNode(outputNode);
  120. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  121. Assert.AreEqual(0, graph.edges.Count());
  122. Assert.AreEqual(inputNode, graph.GetNodes<AbstractMaterialNode>().FirstOrDefault());
  123. }
  124. private class NoDeleteNode : TestNode
  125. {
  126. public override bool canDeleteNode { get { return false; } }
  127. }
  128. [Test]
  129. public void TestCanNotRemoveNoDeleteNodeFromBaseMaterialGraph()
  130. {
  131. var graph = new GraphData();
  132. var node = new NoDeleteNode();
  133. node.name = "Test Node";
  134. graph.AddNode(node);
  135. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  136. Assert.Catch<InvalidOperationException>(() => graph.RemoveNode(node));
  137. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  138. }
  139. private class OnEnableNode : TestNode, IOnAssetEnabled
  140. {
  141. public bool called = false;
  142. public void OnEnable()
  143. {
  144. called = true;
  145. }
  146. }
  147. [Test]
  148. public void TestSerializedGraphDelegatesOnEnableCalls()
  149. {
  150. var graph = new GraphData();
  151. var node = new OnEnableNode();
  152. node.name = "Test Node";
  153. graph.AddNode(node);
  154. Assert.IsFalse(node.called);
  155. graph.OnEnable();
  156. Assert.IsTrue(node.called);
  157. }
  158. [Test]
  159. public void TestCanFindNodeInBaseMaterialGraph()
  160. {
  161. var graph = new GraphData();
  162. var node = new TestNode();
  163. graph.AddNode(node);
  164. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  165. Assert.IsNotNull(graph.GetNodeFromGuid(node.guid));
  166. Assert.IsNull(graph.GetNodeFromGuid(Guid.NewGuid()));
  167. }
  168. [Test]
  169. public void TestCanAddSlotToTestNode()
  170. {
  171. var graph = new GraphData();
  172. var node = new TestNode();
  173. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  174. node.AddSlot(new TestSlot(1, "input", SlotType.Input));
  175. node.name = "Test Node";
  176. graph.AddNode(node);
  177. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  178. var found = graph.GetNodes<AbstractMaterialNode>().FirstOrDefault();
  179. Assert.AreEqual(1, found.GetInputSlots<ISlot>().Count());
  180. Assert.AreEqual(1, found.GetInputSlots<ISlot>().FirstOrDefault().id);
  181. Assert.AreEqual(1, found.GetOutputSlots<ISlot>().Count());
  182. Assert.AreEqual(0, found.GetOutputSlots<ISlot>().FirstOrDefault().id);
  183. Assert.AreEqual(2, found.GetSlots<ISlot>().Count());
  184. }
  185. [Test]
  186. public void TestCanNotAddNullSlotToTestNode()
  187. {
  188. var node = new TestNode();
  189. Assert.Throws<ArgumentException>(() => node.AddSlot(null));
  190. }
  191. [Test]
  192. public void TestCanRemoveSlotFromTestNode()
  193. {
  194. var graph = new GraphData();
  195. var node = new TestNode();
  196. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  197. node.AddSlot(new TestSlot(1, "input", SlotType.Input));
  198. graph.AddNode(node);
  199. Assert.AreEqual(2, node.GetSlots<ISlot>().Count());
  200. Assert.AreEqual(1, node.GetInputSlots<ISlot>().Count());
  201. Assert.AreEqual(1, node.GetOutputSlots<ISlot>().Count());
  202. node.RemoveSlot(1);
  203. Assert.AreEqual(1, node.GetSlots<ISlot>().Count());
  204. Assert.AreEqual(0, node.GetInputSlots<ISlot>().Count());
  205. Assert.AreEqual(1, node.GetOutputSlots<ISlot>().Count());
  206. }
  207. [Test]
  208. public void TestCanRemoveSlotsWithNonMathingNameFromTestNode()
  209. {
  210. var graph = new GraphData();
  211. var node = new TestableNode();
  212. graph.AddNode(node);
  213. Assert.AreEqual(6, node.GetSlots<ISlot>().Count());
  214. Assert.AreEqual(3, node.GetInputSlots<ISlot>().Count());
  215. Assert.AreEqual(3, node.GetOutputSlots<ISlot>().Count());
  216. node.RemoveSlotsNameNotMatching(new[] {TestableNode.Input1});
  217. Assert.AreEqual(1, node.GetSlots<ISlot>().Count());
  218. Assert.AreEqual(1, node.GetInputSlots<ISlot>().Count());
  219. Assert.AreEqual(0, node.GetOutputSlots<ISlot>().Count());
  220. Assert.IsNull(node.FindInputSlot<ISlot>(TestableNode.Input0));
  221. Assert.IsNotNull(node.FindInputSlot<ISlot>(TestableNode.Input1));
  222. Assert.IsNull(node.FindInputSlot<ISlot>(TestableNode.Input2));
  223. }
  224. [Test]
  225. public void TestCanNotAddDuplicateSlotToTestNode()
  226. {
  227. var graph = new GraphData();
  228. var node = new TestNode();
  229. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  230. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  231. node.name = "Test Node";
  232. graph.AddNode(node);
  233. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  234. var found = graph.GetNodes<AbstractMaterialNode>().FirstOrDefault();
  235. Assert.AreEqual(0, found.GetInputSlots<ISlot>().Count());
  236. Assert.AreEqual(1, found.GetOutputSlots<ISlot>().Count());
  237. Assert.AreEqual(1, found.GetSlots<ISlot>().Count());
  238. }
  239. [Test]
  240. public void TestCanUpdateDisplaynameByReaddingSlotToTestNode()
  241. {
  242. var graph = new GraphData();
  243. var node = new TestNode();
  244. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  245. node.AddSlot(new TestSlot(0, "output_updated", SlotType.Output));
  246. node.name = "Test Node";
  247. graph.AddNode(node);
  248. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  249. var found = graph.GetNodes<AbstractMaterialNode>().FirstOrDefault();
  250. Assert.AreEqual(0, found.GetInputSlots<ISlot>().Count());
  251. Assert.AreEqual(1, found.GetOutputSlots<ISlot>().Count());
  252. Assert.AreEqual(1, found.GetSlots<ISlot>().Count());
  253. var slot = found.GetOutputSlots<ISlot>().FirstOrDefault();
  254. Assert.AreEqual("output_updated(4)", slot.displayName);
  255. }
  256. [Test]
  257. public void TestCanUpdateSlotPriority()
  258. {
  259. var graph = new GraphData();
  260. var node = new TestNode();
  261. node.AddSlot(new TestSlot(0, "output", SlotType.Output, 0));
  262. node.name = "Test Node";
  263. graph.AddNode(node);
  264. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  265. var found = graph.GetNodes<AbstractMaterialNode>().FirstOrDefault();
  266. Assert.AreEqual(0, found.GetInputSlots<ISlot>().Count());
  267. Assert.AreEqual(1, found.GetOutputSlots<ISlot>().Count());
  268. Assert.AreEqual(1, found.GetSlots<ISlot>().Count());
  269. var slot = found.GetOutputSlots<ISlot>().FirstOrDefault();
  270. Assert.AreEqual(0, slot.priority);
  271. slot.priority = 2;
  272. Assert.AreEqual(2, slot.priority);
  273. }
  274. [Test]
  275. public void TestCanUpdateSlotPriorityByReaddingSlotToTestNode()
  276. {
  277. var graph = new GraphData();
  278. var node = new TestNode();
  279. node.AddSlot(new TestSlot(0, "output", SlotType.Output, 0));
  280. node.AddSlot(new TestSlot(0, "output", SlotType.Output, 5));
  281. node.name = "Test Node";
  282. graph.AddNode(node);
  283. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  284. var found = graph.GetNodes<AbstractMaterialNode>().FirstOrDefault();
  285. Assert.AreEqual(0, found.GetInputSlots<ISlot>().Count());
  286. Assert.AreEqual(1, found.GetOutputSlots<ISlot>().Count());
  287. Assert.AreEqual(1, found.GetSlots<ISlot>().Count());
  288. var slot = found.GetOutputSlots<ISlot>().FirstOrDefault();
  289. Assert.AreEqual(5, slot.priority);
  290. }
  291. [Test]
  292. public void TestCanUpdateSlotDisplayName()
  293. {
  294. var node = new TestNode();
  295. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  296. node.name = "Test Node";
  297. Assert.AreEqual(0, node.GetInputSlots<ISlot>().Count());
  298. Assert.AreEqual(1, node.GetOutputSlots<ISlot>().Count());
  299. Assert.AreEqual(1, node.GetSlots<ISlot>().Count());
  300. var slot = node.GetOutputSlots<ISlot>().FirstOrDefault();
  301. Assert.IsNotNull(slot);
  302. Assert.AreEqual("output(4)", slot.displayName);
  303. slot.displayName = "test";
  304. Assert.AreEqual("test(4)", slot.displayName);
  305. }
  306. [Test]
  307. public void TestCanFindSlotOnTestNode()
  308. {
  309. var node = new TestableNode();
  310. Assert.AreEqual(6, node.GetSlots<ISlot>().Count());
  311. Assert.IsNotNull(node.FindInputSlot<ISlot>(TestableNode.Input0));
  312. Assert.IsNull(node.FindInputSlot<ISlot>(TestableNode.Output0));
  313. Assert.IsNotNull(node.FindOutputSlot<ISlot>(TestableNode.Output0));
  314. Assert.IsNull(node.FindOutputSlot<ISlot>(TestableNode.Input0));
  315. Assert.IsNotNull(node.FindSlot<ISlot>(TestableNode.Input0));
  316. Assert.IsNotNull(node.FindSlot<ISlot>(TestableNode.Output0));
  317. Assert.IsNull(node.FindSlot<ISlot>(555));
  318. }
  319. [Test]
  320. public void TestCanFindSlotReferenceOnTestNode()
  321. {
  322. var node = new TestableNode();
  323. Assert.AreEqual(6, node.GetSlots<ISlot>().Count());
  324. Assert.IsNotNull(node.GetSlotReference(TestableNode.Input0));
  325. Assert.IsNotNull(node.GetSlotReference(TestableNode.Output0));
  326. Assert.Throws<ArgumentException>(() => node.GetSlotReference(555));
  327. }
  328. [Test]
  329. public void TestCanConnectAndTraverseTwoNodesOnBaseMaterialGraph()
  330. {
  331. var graph = new GraphData();
  332. var outputNode = new TestableNode();
  333. graph.AddNode(outputNode);
  334. var inputNode = new TestableNode();
  335. graph.AddNode(inputNode);
  336. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  337. var createdEdge = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  338. Assert.AreEqual(1, graph.edges.Count());
  339. var edge = graph.edges.FirstOrDefault();
  340. Assert.AreEqual(createdEdge, edge);
  341. var foundOutputNode = graph.GetNodeFromGuid(edge.outputSlot.nodeGuid);
  342. var foundOutputSlot = foundOutputNode.FindOutputSlot<ISlot>(edge.outputSlot.slotId);
  343. Assert.AreEqual(outputNode, foundOutputNode);
  344. Assert.IsNotNull(foundOutputSlot);
  345. var foundInputNode = graph.GetNodeFromGuid(edge.inputSlot.nodeGuid);
  346. var foundInputSlot = foundInputNode.FindInputSlot<ISlot>(edge.inputSlot.slotId);
  347. Assert.AreEqual(inputNode, foundInputNode);
  348. Assert.IsNotNull(foundInputSlot);
  349. }
  350. [Test]
  351. public void TestCanConnectAndTraverseThreeNodesOnBaseMaterialGraph()
  352. {
  353. var graph = new GraphData();
  354. var outputNode = new TestableNode();
  355. graph.AddNode(outputNode);
  356. var middleNode = new TestableNode();
  357. graph.AddNode(middleNode);
  358. var inputNode = new TestableNode();
  359. graph.AddNode(inputNode);
  360. Assert.AreEqual(3, graph.GetNodes<AbstractMaterialNode>().Count());
  361. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), middleNode.GetSlotReference(TestableNode.Input0));
  362. Assert.AreEqual(1, graph.edges.Count());
  363. graph.Connect(middleNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  364. Assert.AreEqual(2, graph.edges.Count());
  365. var edgesOnMiddleNode = NodeUtils.GetAllEdges(middleNode);
  366. Assert.AreEqual(2, edgesOnMiddleNode.Count());
  367. List<AbstractMaterialNode> result = new List<AbstractMaterialNode>();
  368. NodeUtils.DepthFirstCollectNodesFromNode(result, inputNode);
  369. Assert.AreEqual(3, result.Count);
  370. result.Clear();
  371. NodeUtils.DepthFirstCollectNodesFromNode(result, inputNode, NodeUtils.IncludeSelf.Exclude);
  372. Assert.AreEqual(2, result.Count);
  373. result.Clear();
  374. NodeUtils.DepthFirstCollectNodesFromNode(result, null);
  375. Assert.AreEqual(0, result.Count);
  376. }
  377. [Test]
  378. public void TestExceptionIfBadNodeConfigurationWorks()
  379. {
  380. var node = new TestableNode();
  381. Assert.DoesNotThrow(
  382. () =>
  383. NodeUtils.SlotConfigurationExceptionIfBadConfiguration(
  384. node,
  385. new[] {TestableNode.Input0, TestableNode.Input1, TestableNode.Input2},
  386. new[] {TestableNode.Output0, TestableNode.Output1, TestableNode.Output2, })
  387. );
  388. Assert.Throws<SlotConfigurationException>(
  389. () =>
  390. NodeUtils.SlotConfigurationExceptionIfBadConfiguration(
  391. node,
  392. new[] {666, TestableNode.Input1, TestableNode.Input2},
  393. new[] {TestableNode.Output0, TestableNode.Output1, TestableNode.Output2, })
  394. );
  395. Assert.Throws<SlotConfigurationException>(
  396. () =>
  397. NodeUtils.SlotConfigurationExceptionIfBadConfiguration(
  398. node,
  399. new[] {TestableNode.Input0, TestableNode.Input1, TestableNode.Input2},
  400. new[] {666, TestableNode.Output1, TestableNode.Output2, })
  401. );
  402. Assert.DoesNotThrow(
  403. () =>
  404. NodeUtils.SlotConfigurationExceptionIfBadConfiguration(
  405. node,
  406. new[] {TestableNode.Input0},
  407. new[] {TestableNode.Output0})
  408. );
  409. }
  410. [Test]
  411. public void TestConectionToSameInputReplacesOldInput()
  412. {
  413. var graph = new GraphData();
  414. var outputNode = new TestableNode();
  415. graph.AddNode(outputNode);
  416. var inputNode = new TestableNode();
  417. graph.AddNode(inputNode);
  418. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  419. var createdEdge = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  420. Assert.AreEqual(1, graph.edges.Count());
  421. var edge = graph.edges.FirstOrDefault();
  422. Assert.AreEqual(createdEdge, edge);
  423. var createdEdge2 = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  424. Assert.AreEqual(1, graph.edges.Count());
  425. var edge2 = graph.edges.FirstOrDefault();
  426. Assert.AreEqual(createdEdge2, edge2);
  427. }
  428. [Test]
  429. public void TestRemovingSlotRemovesConnectedEdges()
  430. {
  431. var graph = new GraphData();
  432. var outputNode = new TestableNode();
  433. graph.AddNode(outputNode);
  434. var inputNode = new TestableNode();
  435. graph.AddNode(inputNode);
  436. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  437. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  438. Assert.AreEqual(1, graph.edges.Count());
  439. outputNode.RemoveSlot(TestableNode.Output0);
  440. Assert.AreEqual(0, graph.edges.Count());
  441. }
  442. [Test]
  443. public void TestCanNotConnectToNullSlot()
  444. {
  445. var graph = new GraphData();
  446. var outputNode = new TestableNode();
  447. graph.AddNode(outputNode);
  448. var inputNode = new TestNode();
  449. graph.AddNode(inputNode);
  450. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  451. var createdEdge2 = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), new SlotReference(Guid.NewGuid(), 666));
  452. Assert.AreEqual(0, graph.edges.Count());
  453. Assert.IsNull(createdEdge2);
  454. }
  455. [Test]
  456. public void TestCanNotConnectTwoOuputSlotsOnBaseMaterialGraph()
  457. {
  458. var graph = new GraphData();
  459. var outputNode = new TestableNode();
  460. graph.AddNode(outputNode);
  461. var outputNode2 = new TestableNode();
  462. graph.AddNode(outputNode2);
  463. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  464. var createdEdge = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), outputNode2.GetSlotReference(TestableNode.Output0));
  465. Assert.IsNull(createdEdge);
  466. Assert.AreEqual(0, graph.edges.Count());
  467. }
  468. [Test]
  469. public void TestCanNotConnectTwoInputSlotsOnBaseMaterialGraph()
  470. {
  471. var graph = new GraphData();
  472. var inputNode = new TestableNode();
  473. graph.AddNode(inputNode);
  474. var inputNode2 = new TestableNode();
  475. graph.AddNode(inputNode2);
  476. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  477. var createdEdge = graph.Connect(inputNode.GetSlotReference(TestableNode.Input0), inputNode2.GetSlotReference(TestableNode.Input0));
  478. Assert.IsNull(createdEdge);
  479. Assert.AreEqual(0, graph.edges.Count());
  480. }
  481. [Test]
  482. public void TestRemovingNodeRemovesConectedEdgesOnBaseMaterialGraph()
  483. {
  484. var graph = new GraphData();
  485. var outputNode = new TestableNode();
  486. graph.AddNode(outputNode);
  487. var inputNode = new TestableNode();
  488. graph.AddNode(inputNode);
  489. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  490. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  491. Assert.AreEqual(1, graph.edges.Count());
  492. graph.RemoveNode(graph.GetNodes<AbstractMaterialNode>().FirstOrDefault());
  493. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  494. Assert.AreEqual(0, graph.edges.Count());
  495. }
  496. [Test]
  497. public void TestRemovingEdgeOnBaseMaterialGraph()
  498. {
  499. var graph = new GraphData();
  500. var outputNode = new TestableNode();
  501. graph.AddNode(outputNode);
  502. var inputNode = new TestableNode();
  503. graph.AddNode(inputNode);
  504. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  505. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  506. Assert.AreEqual(1, graph.edges.Count());
  507. graph.RemoveEdge(graph.edges.FirstOrDefault());
  508. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  509. Assert.AreEqual(0, graph.edges.Count());
  510. }
  511. [Test]
  512. public void TestRemovingElementsFromBaseMaterialGraph()
  513. {
  514. var graph = new GraphData();
  515. var outputNode = new TestableNode();
  516. graph.AddNode(outputNode);
  517. var inputNode = new TestableNode();
  518. graph.AddNode(inputNode);
  519. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  520. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  521. Assert.AreEqual(1, graph.edges.Count());
  522. graph.RemoveElements(graph.GetNodes<AbstractMaterialNode>().ToArray(), graph.edges.ToArray(), new GroupData[] {}, new StickyNoteData[] {});
  523. Assert.AreEqual(0, graph.GetNodes<AbstractMaterialNode>().Count());
  524. Assert.AreEqual(0, graph.edges.Count());
  525. }
  526. [Test]
  527. public void TestCanGetEdgesOnBaseMaterialGraphFromSlotReference()
  528. {
  529. var graph = new GraphData();
  530. var outputNode = new TestableNode();
  531. graph.AddNode(outputNode);
  532. var inputNode = new TestableNode();
  533. graph.AddNode(inputNode);
  534. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  535. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  536. Assert.AreEqual(1, graph.edges.Count());
  537. Assert.AreEqual(1, graph.GetEdges(inputNode.GetSlotReference(TestableNode.Input0)).Count());
  538. Assert.AreEqual(1, graph.GetEdges(outputNode.GetSlotReference(TestableNode.Output0)).Count());
  539. Assert.Throws<ArgumentException>(() => outputNode.GetSlotReference(666));
  540. }
  541. [Test]
  542. public void TestGetInputsWithNoConnection()
  543. {
  544. var graph = new GraphData();
  545. var outputNode = new TestableNode();
  546. graph.AddNode(outputNode);
  547. var inputNode = new TestableNode();
  548. graph.AddNode(inputNode);
  549. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  550. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  551. Assert.AreEqual(1, graph.edges.Count());
  552. var slots = inputNode.GetInputsWithNoConnection();
  553. Assert.AreEqual(2, slots.Count());
  554. CollectionAssert.AreEqual(new[] { TestableNode.Input1, TestableNode.Input2 }, slots.Select(x => x.id));
  555. }
  556. [Test]
  557. public void TestCyclicConnectionsAreNotAllowedOnGraph()
  558. {
  559. var graph = new GraphData();
  560. var nodeA = new TestableNode();
  561. graph.AddNode(nodeA);
  562. var nodeB = new TestableNode();
  563. graph.AddNode(nodeB);
  564. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  565. graph.Connect(nodeA.GetSlotReference(TestableNode.Output0), nodeB.GetSlotReference(TestableNode.Input0));
  566. Assert.AreEqual(1, graph.edges.Count());
  567. var edge = graph.Connect(nodeB.GetSlotReference(TestableNode.Output0), nodeA.GetSlotReference(TestableNode.Input0));
  568. Assert.IsNull(edge);
  569. Assert.AreEqual(1, graph.edges.Count());
  570. }
  571. }
  572. }