1- using System ;
2- using System . Collections ;
3- using System . Linq ;
41using Dynamo ;
2+ using Dynamo . Graph . Workspaces ;
53using Dynamo . PythonServices ;
64using Dynamo . PythonServices . EventHandlers ;
75using Dynamo . Utilities ;
6+ using Newtonsoft . Json ;
7+ using Newtonsoft . Json . Linq ;
88using NUnit . Framework ;
99using PythonNodeModels ;
10+ using System ;
11+ using System . Collections ;
12+ using System . IO ;
13+ using System . Linq ;
1014using static Dynamo . Models . DynamoModel ;
1115
1216namespace DynamoPythonTests
1317{
1418 [ TestFixture ]
1519 class PythonEngineSelectorTests : DynamoModelTestBase
1620 {
21+ private void UpdatePythonEngineAndRun ( PythonNode pythonNode , string pythonEngineVersion )
22+ {
23+ pythonNode . EngineName = pythonEngineVersion ;
24+ //to kick off a run node modified must be called
25+ pythonNode . OnNodeModified ( ) ;
26+ }
27+
1728 /// <summary>
1829 /// This test will cover the use case of the API to query certain Python engine ability for evaluation
1930 /// </summary>
@@ -24,6 +35,69 @@ public void TestEngineSelectorInitialization()
2435 Assert . AreEqual ( false , PythonEngineManager . Instance . AvailableEngines . Any ( x => x . Name == PythonEngineManager . IronPython2EngineName ) ) ;
2536 }
2637
38+ [ Test ]
39+ public void PythonEnginePackageDependencyIsCollectedAndSerialized ( )
40+ {
41+ // Load JSON file graph
42+ string path = Path . Combine ( TestDirectory , @"core\packageDependencyTests\PythonDependency.dyn" ) ;
43+
44+ // Assert package dependency is not already serialized to .dyn
45+ using ( StreamReader file = new StreamReader ( path ) )
46+ {
47+ var data = file . ReadToEnd ( ) ;
48+ var json = ( JObject ) JsonConvert . DeserializeObject ( data ) ;
49+ Assert . IsEmpty ( json [ WorkspaceReadConverter . NodeLibraryDependenciesPropString ] ) ;
50+ }
51+
52+ string packageDirectory = Path . Combine ( TestDirectory , @"core\packageDependencyTests\PythonEnginePackage" ) ;
53+ LoadPackage ( packageDirectory ) ;
54+
55+ OpenModel ( path ) ;
56+
57+ //TO-DO: Force load binaries or mock the python engine instead of loading a package
58+ //assert that default python engine was selected, and 2 different engines are loaded
59+ var currentws = CurrentDynamoModel . CurrentWorkspace ;
60+ var pyNode = currentws . Nodes . OfType < PythonNode > ( ) . FirstOrDefault ( ) ;
61+ Assert . IsNotNull ( pyNode ) ;
62+ Assert . AreEqual ( pyNode . EngineName , PythonEngineManager . PythonNet3EngineName ) ;
63+ Assert . AreEqual ( PythonEngineManager . Instance . AvailableEngines . Count , 2 ) ;
64+
65+ currentws . ForceComputeWorkspaceReferences = true ;
66+ var packageDependencies = currentws . NodeLibraryDependencies ;
67+ // PythonNet3 is loaded as a default package, ww should have a single package dependency.
68+ Assert . AreEqual ( 1 , packageDependencies . Count ) ;
69+
70+ // Change engine to IronPython2, which is loaded as a package.
71+ UpdatePythonEngineAndRun ( pyNode , "IronPython2" ) ;
72+ currentws . ForceComputeWorkspaceReferences = true ;
73+
74+ //assert that python engine imported from a package gets added to NodeLibraryDependencies
75+ packageDependencies = currentws . NodeLibraryDependencies ;
76+ Assert . AreEqual ( 1 , packageDependencies . Count ) ;
77+ var package = packageDependencies . First ( ) ;
78+ Assert . AreEqual ( new PackageDependencyInfo ( "DynamoIronPython2.7" , new Version ( "3.2.1" ) ) , package ) ;
79+ Assert . AreEqual ( 1 , package . Nodes . Count ) ;
80+
81+ Assert . IsTrue ( package . IsLoaded ) ;
82+ if ( package is PackageDependencyInfo )
83+ {
84+ var packageDependencyState = ( ( PackageDependencyInfo ) package ) . State ;
85+ Assert . AreEqual ( PackageDependencyState . Loaded , packageDependencyState ) ;
86+ }
87+
88+ // Assert package dependency is serialized
89+ var ToJson = currentws . ToJson ( CurrentDynamoModel . EngineController ) ;
90+ var JObject = ( JObject ) JsonConvert . DeserializeObject ( ToJson ) ;
91+ var deserializedPackageDependencies = JObject [ WorkspaceReadConverter . NodeLibraryDependenciesPropString ] ;
92+ Assert . AreEqual ( 1 , deserializedPackageDependencies . Count ( ) ) ;
93+ var name = deserializedPackageDependencies . First ( ) [ NodeLibraryDependencyConverter . NamePropString ] . Value < string > ( ) ;
94+ Assert . AreEqual ( package . Name , name ) ;
95+ var version = deserializedPackageDependencies . First ( ) [ NodeLibraryDependencyConverter . VersionPropString ] . Value < string > ( ) ;
96+ Assert . AreEqual ( package . Version . ToString ( ) , version ) ;
97+ var nodes = deserializedPackageDependencies . First ( ) [ NodeLibraryDependencyConverter . NodesPropString ] . Values < string > ( ) ;
98+ Assert . AreEqual ( package . Nodes . Select ( n => n . ToString ( "N" ) ) , nodes ) ;
99+ }
100+
27101 [ Test ]
28102 public void CanCopydAndPasteAndUndoPythonEngine ( )
29103 {
0 commit comments