Ei kuvausta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SerializedGraphTests.cs 25KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  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. class TestableNode : TestNode
  81. {
  82. public const int Input0 = 0;
  83. public const int Input1 = 1;
  84. public const int Input2 = 2;
  85. public const int Output0 = 3;
  86. public const int Output1 = 4;
  87. public const int Output2 = 5;
  88. public TestableNode() : base()
  89. {
  90. AddSlot(new TestSlot(Input0, "Input", SlotType.Input));
  91. AddSlot(new TestSlot(Input1, "Input", SlotType.Input));
  92. AddSlot(new TestSlot(Input2, "Input", SlotType.Input));
  93. AddSlot(new TestSlot(Output0, "Output", SlotType.Output));
  94. AddSlot(new TestSlot(Output1, "Output", SlotType.Output));
  95. AddSlot(new TestSlot(Output2, "Output", SlotType.Output));
  96. }
  97. }
  98. [Test]
  99. public void TestRemoveNodeFromBaseMaterialGraphCleansEdges()
  100. {
  101. var graph = new GraphData();
  102. var outputNode = new TestableNode();
  103. graph.AddNode(outputNode);
  104. var inputNode = new TestableNode();
  105. graph.AddNode(inputNode);
  106. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  107. var createdEdge = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  108. Assert.AreEqual(1, graph.edges.Count());
  109. var edge = graph.edges.FirstOrDefault();
  110. Assert.AreEqual(createdEdge, edge);
  111. graph.RemoveNode(outputNode);
  112. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  113. Assert.AreEqual(0, graph.edges.Count());
  114. Assert.AreEqual(inputNode, graph.GetNodes<AbstractMaterialNode>().FirstOrDefault());
  115. }
  116. private class NoDeleteNode : TestNode
  117. {
  118. public override bool canDeleteNode { get { return false; } }
  119. }
  120. [Test]
  121. public void TestCanNotRemoveNoDeleteNodeFromBaseMaterialGraph()
  122. {
  123. var graph = new GraphData();
  124. var node = new NoDeleteNode();
  125. node.name = "Test Node";
  126. graph.AddNode(node);
  127. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  128. Assert.Catch<InvalidOperationException>(() => graph.RemoveNode(node));
  129. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  130. }
  131. private class OnEnableNode : TestNode, IOnAssetEnabled
  132. {
  133. public bool called = false;
  134. public void OnEnable()
  135. {
  136. called = true;
  137. }
  138. }
  139. [Test]
  140. public void TestSerializedGraphDelegatesOnEnableCalls()
  141. {
  142. var graph = new GraphData();
  143. var node = new OnEnableNode();
  144. node.name = "Test Node";
  145. graph.AddNode(node);
  146. Assert.IsFalse(node.called);
  147. graph.OnEnable();
  148. Assert.IsTrue(node.called);
  149. }
  150. [Test]
  151. public void TestCanFindNodeInBaseMaterialGraph()
  152. {
  153. var graph = new GraphData();
  154. var node = new TestNode();
  155. graph.AddNode(node);
  156. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  157. Assert.IsNotNull(graph.GetNodeFromId(node.objectId));
  158. Assert.IsNull(graph.GetNodeFromId("asdfffsd"));
  159. }
  160. [Test]
  161. public void TestCanAddSlotToTestNode()
  162. {
  163. var graph = new GraphData();
  164. var node = new TestNode();
  165. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  166. node.AddSlot(new TestSlot(1, "input", SlotType.Input));
  167. node.name = "Test Node";
  168. graph.AddNode(node);
  169. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  170. var found = graph.GetNodes<AbstractMaterialNode>().FirstOrDefault();
  171. Assert.AreEqual(1, found.GetInputSlots<MaterialSlot>().Count());
  172. Assert.AreEqual(1, found.GetInputSlots<MaterialSlot>().FirstOrDefault().id);
  173. Assert.AreEqual(1, found.GetOutputSlots<MaterialSlot>().Count());
  174. Assert.AreEqual(0, found.GetOutputSlots<MaterialSlot>().FirstOrDefault().id);
  175. Assert.AreEqual(2, found.GetSlots<MaterialSlot>().Count());
  176. }
  177. [Test]
  178. public void TestCanNotAddNullSlotToTestNode()
  179. {
  180. var node = new TestNode();
  181. Assert.Throws<ArgumentException>(() => node.AddSlot(null));
  182. }
  183. [Test]
  184. public void TestCanRemoveSlotFromTestNode()
  185. {
  186. var graph = new GraphData();
  187. var node = new TestNode();
  188. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  189. node.AddSlot(new TestSlot(1, "input", SlotType.Input));
  190. graph.AddNode(node);
  191. Assert.AreEqual(2, node.GetSlots<MaterialSlot>().Count());
  192. Assert.AreEqual(1, node.GetInputSlots<MaterialSlot>().Count());
  193. Assert.AreEqual(1, node.GetOutputSlots<MaterialSlot>().Count());
  194. node.RemoveSlot(1);
  195. Assert.AreEqual(1, node.GetSlots<MaterialSlot>().Count());
  196. Assert.AreEqual(0, node.GetInputSlots<MaterialSlot>().Count());
  197. Assert.AreEqual(1, node.GetOutputSlots<MaterialSlot>().Count());
  198. }
  199. [Test]
  200. public void TestCanRemoveSlotsWithNonMathingNameFromTestNode()
  201. {
  202. var graph = new GraphData();
  203. var node = new TestableNode();
  204. graph.AddNode(node);
  205. Assert.AreEqual(6, node.GetSlots<MaterialSlot>().Count());
  206. Assert.AreEqual(3, node.GetInputSlots<MaterialSlot>().Count());
  207. Assert.AreEqual(3, node.GetOutputSlots<MaterialSlot>().Count());
  208. node.RemoveSlotsNameNotMatching(new[] { TestableNode.Input1 });
  209. Assert.AreEqual(1, node.GetSlots<MaterialSlot>().Count());
  210. Assert.AreEqual(1, node.GetInputSlots<MaterialSlot>().Count());
  211. Assert.AreEqual(0, node.GetOutputSlots<MaterialSlot>().Count());
  212. Assert.IsNull(node.FindInputSlot<MaterialSlot>(TestableNode.Input0));
  213. Assert.IsNotNull(node.FindInputSlot<MaterialSlot>(TestableNode.Input1));
  214. Assert.IsNull(node.FindInputSlot<MaterialSlot>(TestableNode.Input2));
  215. }
  216. [Test]
  217. public void TestCanNotAddDuplicateSlotToTestNode()
  218. {
  219. var graph = new GraphData();
  220. var node = new TestNode();
  221. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  222. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  223. node.name = "Test Node";
  224. graph.AddNode(node);
  225. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  226. var found = graph.GetNodes<AbstractMaterialNode>().FirstOrDefault();
  227. Assert.AreEqual(0, found.GetInputSlots<MaterialSlot>().Count());
  228. Assert.AreEqual(1, found.GetOutputSlots<MaterialSlot>().Count());
  229. Assert.AreEqual(1, found.GetSlots<MaterialSlot>().Count());
  230. }
  231. [Test]
  232. public void TestCanUpdateDisplaynameByReaddingSlotToTestNode()
  233. {
  234. var graph = new GraphData();
  235. var node = new TestNode();
  236. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  237. node.AddSlot(new TestSlot(0, "output_updated", SlotType.Output));
  238. node.name = "Test Node";
  239. graph.AddNode(node);
  240. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  241. var found = graph.GetNodes<AbstractMaterialNode>().FirstOrDefault();
  242. Assert.AreEqual(0, found.GetInputSlots<MaterialSlot>().Count());
  243. Assert.AreEqual(1, found.GetOutputSlots<MaterialSlot>().Count());
  244. Assert.AreEqual(1, found.GetSlots<MaterialSlot>().Count());
  245. var slot = found.GetOutputSlots<MaterialSlot>().FirstOrDefault();
  246. Assert.AreEqual("output_updated(4)", slot.displayName);
  247. }
  248. [Test]
  249. public void TestCanUpdateSlotDisplayName()
  250. {
  251. var node = new TestNode();
  252. node.AddSlot(new TestSlot(0, "output", SlotType.Output));
  253. node.name = "Test Node";
  254. Assert.AreEqual(0, node.GetInputSlots<MaterialSlot>().Count());
  255. Assert.AreEqual(1, node.GetOutputSlots<MaterialSlot>().Count());
  256. Assert.AreEqual(1, node.GetSlots<MaterialSlot>().Count());
  257. var slot = node.GetOutputSlots<MaterialSlot>().FirstOrDefault();
  258. Assert.IsNotNull(slot);
  259. Assert.AreEqual("output(4)", slot.displayName);
  260. slot.displayName = "test";
  261. Assert.AreEqual("test(4)", slot.displayName);
  262. }
  263. [Test]
  264. public void TestCanFindSlotOnTestNode()
  265. {
  266. var node = new TestableNode();
  267. Assert.AreEqual(6, node.GetSlots<MaterialSlot>().Count());
  268. Assert.IsNotNull(node.FindInputSlot<MaterialSlot>(TestableNode.Input0));
  269. Assert.IsNull(node.FindInputSlot<MaterialSlot>(TestableNode.Output0));
  270. Assert.IsNotNull(node.FindOutputSlot<MaterialSlot>(TestableNode.Output0));
  271. Assert.IsNull(node.FindOutputSlot<MaterialSlot>(TestableNode.Input0));
  272. Assert.IsNotNull(node.FindSlot<MaterialSlot>(TestableNode.Input0));
  273. Assert.IsNotNull(node.FindSlot<MaterialSlot>(TestableNode.Output0));
  274. Assert.IsNull(node.FindSlot<MaterialSlot>(555));
  275. }
  276. [Test]
  277. public void TestCanFindSlotReferenceOnTestNode()
  278. {
  279. var node = new TestableNode();
  280. Assert.AreEqual(6, node.GetSlots<MaterialSlot>().Count());
  281. Assert.IsNotNull(node.GetSlotReference(TestableNode.Input0));
  282. Assert.IsNotNull(node.GetSlotReference(TestableNode.Output0));
  283. Assert.Throws<ArgumentException>(() => node.GetSlotReference(555));
  284. }
  285. [Test]
  286. public void TestCanConnectAndTraverseTwoNodesOnBaseMaterialGraph()
  287. {
  288. var graph = new GraphData();
  289. var outputNode = new TestableNode();
  290. graph.AddNode(outputNode);
  291. var inputNode = new TestableNode();
  292. graph.AddNode(inputNode);
  293. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  294. var createdEdge = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  295. Assert.AreEqual(1, graph.edges.Count());
  296. var edge = graph.edges.FirstOrDefault();
  297. Assert.AreEqual(createdEdge, edge);
  298. var foundOutputNode = edge.outputSlot.node;
  299. var foundOutputSlot = foundOutputNode.FindOutputSlot<MaterialSlot>(edge.outputSlot.slotId);
  300. Assert.AreEqual(outputNode, foundOutputNode);
  301. Assert.IsNotNull(foundOutputSlot);
  302. var foundInputNode = edge.inputSlot.node;
  303. var foundInputSlot = foundInputNode.FindInputSlot<MaterialSlot>(edge.inputSlot.slotId);
  304. Assert.AreEqual(inputNode, foundInputNode);
  305. Assert.IsNotNull(foundInputSlot);
  306. }
  307. [Test]
  308. public void TestCanConnectAndTraverseThreeNodesOnBaseMaterialGraph()
  309. {
  310. var graph = new GraphData();
  311. var outputNode = new TestableNode();
  312. graph.AddNode(outputNode);
  313. var middleNode = new TestableNode();
  314. graph.AddNode(middleNode);
  315. var inputNode = new TestableNode();
  316. graph.AddNode(inputNode);
  317. Assert.AreEqual(3, graph.GetNodes<AbstractMaterialNode>().Count());
  318. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), middleNode.GetSlotReference(TestableNode.Input0));
  319. Assert.AreEqual(1, graph.edges.Count());
  320. graph.Connect(middleNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  321. Assert.AreEqual(2, graph.edges.Count());
  322. var edgesOnMiddleNode = NodeUtils.GetAllEdges(middleNode);
  323. Assert.AreEqual(2, edgesOnMiddleNode.Count());
  324. outputNode.SetOverrideActiveState(AbstractMaterialNode.ActiveState.ExplicitActive);
  325. middleNode.SetOverrideActiveState(AbstractMaterialNode.ActiveState.ExplicitActive);
  326. inputNode.SetOverrideActiveState(AbstractMaterialNode.ActiveState.ExplicitActive);
  327. var result = new HashSet<AbstractMaterialNode>();
  328. NodeUtils.DepthFirstCollectNodesFromNode(result, inputNode);
  329. Assert.AreEqual(3, result.Count);
  330. result.Clear();
  331. NodeUtils.DepthFirstCollectNodesFromNode(result, inputNode, NodeUtils.IncludeSelf.Exclude);
  332. Assert.AreEqual(2, result.Count);
  333. result.Clear();
  334. NodeUtils.DepthFirstCollectNodesFromNode(result, null);
  335. Assert.AreEqual(0, result.Count);
  336. }
  337. [Test]
  338. public void TestExceptionIfBadNodeConfigurationWorks()
  339. {
  340. var node = new TestableNode();
  341. Assert.DoesNotThrow(
  342. () =>
  343. NodeUtils.SlotConfigurationExceptionIfBadConfiguration(
  344. node,
  345. new[] { TestableNode.Input0, TestableNode.Input1, TestableNode.Input2 },
  346. new[] { TestableNode.Output0, TestableNode.Output1, TestableNode.Output2, })
  347. );
  348. Assert.Throws<SlotConfigurationException>(
  349. () =>
  350. NodeUtils.SlotConfigurationExceptionIfBadConfiguration(
  351. node,
  352. new[] { 666, TestableNode.Input1, TestableNode.Input2 },
  353. new[] { TestableNode.Output0, TestableNode.Output1, TestableNode.Output2, })
  354. );
  355. Assert.Throws<SlotConfigurationException>(
  356. () =>
  357. NodeUtils.SlotConfigurationExceptionIfBadConfiguration(
  358. node,
  359. new[] { TestableNode.Input0, TestableNode.Input1, TestableNode.Input2 },
  360. new[] { 666, TestableNode.Output1, TestableNode.Output2, })
  361. );
  362. Assert.DoesNotThrow(
  363. () =>
  364. NodeUtils.SlotConfigurationExceptionIfBadConfiguration(
  365. node,
  366. new[] { TestableNode.Input0 },
  367. new[] { TestableNode.Output0 })
  368. );
  369. }
  370. [Test]
  371. public void TestConectionToSameInputReplacesOldInput()
  372. {
  373. var graph = new GraphData();
  374. var outputNode = new TestableNode();
  375. graph.AddNode(outputNode);
  376. var inputNode = new TestableNode();
  377. graph.AddNode(inputNode);
  378. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  379. var createdEdge = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  380. Assert.AreEqual(1, graph.edges.Count());
  381. var edge = graph.edges.FirstOrDefault();
  382. Assert.AreEqual(createdEdge, edge);
  383. var createdEdge2 = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  384. Assert.AreEqual(1, graph.edges.Count());
  385. var edge2 = graph.edges.FirstOrDefault();
  386. Assert.AreEqual(createdEdge2, edge2);
  387. }
  388. [Test]
  389. public void TestRemovingSlotRemovesConnectedEdges()
  390. {
  391. var graph = new GraphData();
  392. var outputNode = new TestableNode();
  393. graph.AddNode(outputNode);
  394. var inputNode = new TestableNode();
  395. graph.AddNode(inputNode);
  396. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  397. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  398. Assert.AreEqual(1, graph.edges.Count());
  399. outputNode.RemoveSlot(TestableNode.Output0);
  400. Assert.AreEqual(0, graph.edges.Count());
  401. }
  402. [Test]
  403. public void TestCanNotConnectToNullSlot()
  404. {
  405. var graph = new GraphData();
  406. var outputNode = new TestableNode();
  407. graph.AddNode(outputNode);
  408. var inputNode = new TestNode();
  409. graph.AddNode(inputNode);
  410. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  411. var createdEdge2 = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), new SlotReference(null, 666));
  412. Assert.AreEqual(0, graph.edges.Count());
  413. Assert.IsNull(createdEdge2);
  414. }
  415. [Test]
  416. public void TestCanNotConnectTwoOuputSlotsOnBaseMaterialGraph()
  417. {
  418. var graph = new GraphData();
  419. var outputNode = new TestableNode();
  420. graph.AddNode(outputNode);
  421. var outputNode2 = new TestableNode();
  422. graph.AddNode(outputNode2);
  423. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  424. var createdEdge = graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), outputNode2.GetSlotReference(TestableNode.Output0));
  425. Assert.IsNull(createdEdge);
  426. Assert.AreEqual(0, graph.edges.Count());
  427. }
  428. [Test]
  429. public void TestCanNotConnectTwoInputSlotsOnBaseMaterialGraph()
  430. {
  431. var graph = new GraphData();
  432. var inputNode = new TestableNode();
  433. graph.AddNode(inputNode);
  434. var inputNode2 = new TestableNode();
  435. graph.AddNode(inputNode2);
  436. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  437. var createdEdge = graph.Connect(inputNode.GetSlotReference(TestableNode.Input0), inputNode2.GetSlotReference(TestableNode.Input0));
  438. Assert.IsNull(createdEdge);
  439. Assert.AreEqual(0, graph.edges.Count());
  440. }
  441. [Test]
  442. public void TestRemovingNodeRemovesConectedEdgesOnBaseMaterialGraph()
  443. {
  444. var graph = new GraphData();
  445. var outputNode = new TestableNode();
  446. graph.AddNode(outputNode);
  447. var inputNode = new TestableNode();
  448. graph.AddNode(inputNode);
  449. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  450. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  451. Assert.AreEqual(1, graph.edges.Count());
  452. graph.RemoveNode(graph.GetNodes<AbstractMaterialNode>().FirstOrDefault());
  453. Assert.AreEqual(1, graph.GetNodes<AbstractMaterialNode>().Count());
  454. Assert.AreEqual(0, graph.edges.Count());
  455. }
  456. [Test]
  457. public void TestRemovingEdgeOnBaseMaterialGraph()
  458. {
  459. var graph = new GraphData();
  460. var outputNode = new TestableNode();
  461. graph.AddNode(outputNode);
  462. var inputNode = new TestableNode();
  463. graph.AddNode(inputNode);
  464. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  465. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  466. Assert.AreEqual(1, graph.edges.Count());
  467. graph.RemoveEdge(graph.edges.FirstOrDefault());
  468. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  469. Assert.AreEqual(0, graph.edges.Count());
  470. }
  471. [Test]
  472. public void TestRemovingElementsFromBaseMaterialGraph()
  473. {
  474. var graph = new GraphData();
  475. var outputNode = new TestableNode();
  476. graph.AddNode(outputNode);
  477. var inputNode = new TestableNode();
  478. graph.AddNode(inputNode);
  479. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  480. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  481. Assert.AreEqual(1, graph.edges.Count());
  482. graph.RemoveElements(graph.GetNodes<AbstractMaterialNode>().ToArray(), graph.edges.ToArray(), new GroupData[] { }, new StickyNoteData[] { });
  483. Assert.AreEqual(0, graph.GetNodes<AbstractMaterialNode>().Count());
  484. Assert.AreEqual(0, graph.edges.Count());
  485. }
  486. [Test]
  487. public void TestCanGetEdgesOnBaseMaterialGraphFromSlotReference()
  488. {
  489. var graph = new GraphData();
  490. var outputNode = new TestableNode();
  491. graph.AddNode(outputNode);
  492. var inputNode = new TestableNode();
  493. graph.AddNode(inputNode);
  494. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  495. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  496. Assert.AreEqual(1, graph.edges.Count());
  497. Assert.AreEqual(1, graph.GetEdges(inputNode.GetSlotReference(TestableNode.Input0)).Count());
  498. Assert.AreEqual(1, graph.GetEdges(outputNode.GetSlotReference(TestableNode.Output0)).Count());
  499. Assert.Throws<ArgumentException>(() => outputNode.GetSlotReference(666));
  500. }
  501. [Test]
  502. public void TestGetInputsWithNoConnection()
  503. {
  504. var graph = new GraphData();
  505. var outputNode = new TestableNode();
  506. graph.AddNode(outputNode);
  507. var inputNode = new TestableNode();
  508. graph.AddNode(inputNode);
  509. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  510. graph.Connect(outputNode.GetSlotReference(TestableNode.Output0), inputNode.GetSlotReference(TestableNode.Input0));
  511. Assert.AreEqual(1, graph.edges.Count());
  512. var slots = inputNode.GetInputsWithNoConnection();
  513. Assert.AreEqual(2, slots.Count());
  514. CollectionAssert.AreEqual(new[] { TestableNode.Input1, TestableNode.Input2 }, slots.Select(x => x.id));
  515. }
  516. [Test]
  517. public void TestCyclicConnectionsAreNotAllowedOnGraph()
  518. {
  519. var graph = new GraphData();
  520. var nodeA = new TestableNode();
  521. graph.AddNode(nodeA);
  522. var nodeB = new TestableNode();
  523. graph.AddNode(nodeB);
  524. Assert.AreEqual(2, graph.GetNodes<AbstractMaterialNode>().Count());
  525. graph.Connect(nodeA.GetSlotReference(TestableNode.Output0), nodeB.GetSlotReference(TestableNode.Input0));
  526. Assert.AreEqual(1, graph.edges.Count());
  527. var edge = graph.Connect(nodeB.GetSlotReference(TestableNode.Output0), nodeA.GetSlotReference(TestableNode.Input0));
  528. Assert.IsNull(edge);
  529. Assert.AreEqual(1, graph.edges.Count());
  530. }
  531. }
  532. }