diff --git a/module/move/willbe/src/endpoint/list.rs b/module/move/willbe/src/endpoint/list.rs index 6b98f5280c..4256630922 100644 --- a/module/move/willbe/src/endpoint/list.rs +++ b/module/move/willbe/src/endpoint/list.rs @@ -159,12 +159,12 @@ mod private #[ derive( Debug, Clone ) ] pub struct ListNodeReport { - name: String, - version: Option< String >, - path: Option< PathBuf >, - normal_dependencies: Vec< ListNodeReport >, - dev_dependencies: Vec< ListNodeReport >, - build_dependencies: Vec< ListNodeReport >, + pub name: String, + pub version: Option< String >, + pub path: Option< PathBuf >, + pub normal_dependencies: Vec< ListNodeReport >, + pub dev_dependencies: Vec< ListNodeReport >, + pub build_dependencies: Vec< ListNodeReport >, } impl ListNodeReport diff --git a/module/move/willbe/tests/inc/endpoints/list.rs b/module/move/willbe/tests/inc/endpoints/list.rs index 3e8e0870c5..8eca5f0179 100644 --- a/module/move/willbe/tests/inc/endpoints/list.rs +++ b/module/move/willbe/tests/inc/endpoints/list.rs @@ -1,4 +1,3 @@ -use std::path::Path; use super::*; use assert_fs::prelude::*; use TheModule::endpoint::{ self, list::* }; @@ -9,7 +8,7 @@ const ASSETS_PATH : &str = "tests/assets"; // -fn crate_dir( path : &Path ) -> CrateDir +fn crate_dir( path : &std::path::Path ) -> CrateDir { let absolut = AbsolutePath::try_from( path ).unwrap(); CrateDir::try_from( absolut ).unwrap() @@ -48,12 +47,29 @@ mod chain_of_three_packages let output = endpoint::list( args ).unwrap(); // Assert - let ListReport::Tree { graph, names } = &output else { panic!( "Expected `Tree` format, but found another" ) }; + let ListReport::Tree( trees ) = &output else { panic!( "Expected `Tree` format, but found another" ) }; - assert_eq!( 3, graph.node_count() ); - assert_eq!( 2, graph.edge_count() ); - assert_eq!( 1, names.len() ); - assert_eq!( Some( "_chain_of_packages_a" ), graph.node_weight( names[ 0 ] ).map( | x | x.as_str() ) ); + assert_eq!( 1, trees.len() ); + let tree = &trees[ 0 ]; + assert_eq!( "_chain_of_packages_a", tree.name.as_str() ); + + assert_eq!( 1, tree.normal_dependencies.len() ); + assert!( tree.dev_dependencies.is_empty() ); + assert!( tree.build_dependencies.is_empty() ); + + let sub_tree = &tree.normal_dependencies[ 0 ]; + assert_eq!( "_chain_of_packages_b", sub_tree.name.as_str() ); + + assert_eq!( 1, sub_tree.normal_dependencies.len() ); + assert!( sub_tree.dev_dependencies.is_empty() ); + assert!( sub_tree.build_dependencies.is_empty() ); + + let mega_sub_tree = &sub_tree.normal_dependencies[ 0 ]; + assert_eq!( "_chain_of_packages_c", mega_sub_tree.name.as_str() ); + + assert!( mega_sub_tree.normal_dependencies.is_empty() ); + assert!( mega_sub_tree.dev_dependencies.is_empty() ); + assert!( mega_sub_tree.build_dependencies.is_empty() ); } #[ test ] @@ -132,12 +148,26 @@ mod package_with_remote_dependency let output = endpoint::list( args ).unwrap(); // Assert - let ListReport::Tree { graph, names } = &output else { panic!( "Expected `Tree` format, but found another" ) }; - - assert_eq!( 3, graph.node_count() ); - assert_eq!( 2, graph.edge_count() ); - assert_eq!( 1, names.len() ); - assert_eq!( Some( "_package_with_remote_dep_a" ), graph.node_weight( names[ 0 ] ).map( | x | x.as_str() ) ); + let ListReport::Tree( trees ) = &output else { panic!( "Expected `Tree` format, but found another" ) }; + + assert_eq!( 1, trees.len() ); + let tree = &trees[ 0 ]; + assert_eq!( "_package_with_remote_dep_a", tree.name.as_str() ); + + assert_eq!( 2, tree.normal_dependencies.len() ); + assert!( tree.dev_dependencies.is_empty() ); + assert!( tree.build_dependencies.is_empty() ); + + let [ sub_tree_1, sub_tree_2, .. ] = tree.normal_dependencies.as_slice() else { unreachable!() }; + assert_eq!( "_package_with_remote_dep_b", sub_tree_1.name.as_str() ); + assert!( sub_tree_1.normal_dependencies.is_empty() ); + assert!( sub_tree_1.dev_dependencies.is_empty() ); + assert!( sub_tree_1.build_dependencies.is_empty() ); + + assert_eq!( "foo", sub_tree_2.name.as_str() ); + assert!( sub_tree_2.normal_dependencies.is_empty() ); + assert!( sub_tree_2.dev_dependencies.is_empty() ); + assert!( sub_tree_2.build_dependencies.is_empty() ); } #[ test ] @@ -192,6 +222,67 @@ mod workspace_with_cyclic_dependency { use super::*; + #[ test ] + fn tree_format() + { + // Arrange + let root_path = std::path::Path::new( env!( "CARGO_MANIFEST_DIR" ) ); + let assets_relative_path = std::path::Path::new( ASSETS_PATH ); + let assets_path = root_path.join( assets_relative_path ); + + let temp = assert_fs::TempDir::new().unwrap(); + temp.copy_from( assets_path.join( "workspace_with_cyclic_dependency" ), &[ "**" ] ).unwrap(); + + let args = ListArgs::former() + .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) + .format( ListFormat::Tree ) + .info([ PackageAdditionalInfo::Version ]) + .dependency_sources([ DependencySource::Local, DependencySource::Remote ]) + .dependency_categories([ DependencyCategory::Primary, DependencyCategory::Dev ]) + .form(); + + // Act + let output = endpoint::list( args ).unwrap(); + + // Assert + let ListReport::Tree( trees ) = &output else { panic!( "Expected `Tree` format, but found another" ) }; + dbg!( trees ); + + assert_eq!( 1, trees.len() ); + let tree = &trees[ 0 ]; + assert_eq!( "_workspace_with_cyclic_dep_a", tree.name.as_str() ); + assert_eq!( "0.1.0", tree.version.as_ref().unwrap().as_str() ); + + assert_eq!( 1, tree.normal_dependencies.len() ); + assert!( tree.dev_dependencies.is_empty() ); + assert!( tree.build_dependencies.is_empty() ); + + let sub_tree = &tree.normal_dependencies[ 0 ]; + assert_eq!( "_workspace_with_cyclic_dep_b", sub_tree.name.as_str() ); + assert_eq!( "*", sub_tree.version.as_ref().unwrap().as_str() ); + + assert_eq!( 1, sub_tree.normal_dependencies.len() ); + assert!( sub_tree.dev_dependencies.is_empty() ); + assert!( sub_tree.build_dependencies.is_empty() ); + + let mega_sub_tree = &sub_tree.normal_dependencies[ 0 ]; + assert_eq!( "_workspace_with_cyclic_dep_a", mega_sub_tree.name.as_str() ); + assert_eq!( "*", mega_sub_tree.version.as_ref().unwrap().as_str() ); + + assert_eq!( 1, mega_sub_tree.normal_dependencies.len() ); + assert!( mega_sub_tree.dev_dependencies.is_empty() ); + assert!( mega_sub_tree.build_dependencies.is_empty() ); + + // (*) - means duplication + let ultra_sub_tree = &mega_sub_tree.normal_dependencies[ 0 ]; + assert_eq!( "_workspace_with_cyclic_dep_b (*)", ultra_sub_tree.name.as_str() ); + assert_eq!( "*", ultra_sub_tree.version.as_ref().unwrap().as_str() ); + + assert!( ultra_sub_tree.normal_dependencies.is_empty() ); + assert!( ultra_sub_tree.dev_dependencies.is_empty() ); + assert!( ultra_sub_tree.build_dependencies.is_empty() ); + } + #[ test ] fn can_not_show_list_with_cyclic_dependencies() { @@ -205,7 +296,7 @@ mod workspace_with_cyclic_dependency let args = ListArgs::former() .path_to_manifest( crate_dir( &temp.join( "a" ) ) ) - .format( ListFormat::Tree ) + .format( ListFormat::Topological ) .dependency_sources([ DependencySource::Local, DependencySource::Remote ]) .dependency_categories([ DependencyCategory::Primary, DependencyCategory::Dev ]) .form(); diff --git a/module/move/willbe/tests/inc/io2fmt_write.rs b/module/move/willbe/tests/inc/io2fmt_write.rs deleted file mode 100644 index 5afd4aefa1..0000000000 --- a/module/move/willbe/tests/inc/io2fmt_write.rs +++ /dev/null @@ -1,22 +0,0 @@ -use crate::TheModule::endpoint::list::Io2FmtWrite; - -#[ test ] -fn io2fmt_write() -{ - - // Arrange - fn accepts_io_write< W : std::io::Write >( mut w : W ) -> std::io::Result< () > - { - w.write( b"Hello, world!" )?; - - Ok( () ) - } - - let mut string = String::new(); - - // Act - accepts_io_write( Io2FmtWrite { f : &mut string } ).unwrap(); - - // Assert - assert_eq!( "Hello, world!", &string ); -} diff --git a/module/move/willbe/tests/inc/mod.rs b/module/move/willbe/tests/inc/mod.rs index ee2713f7c4..34abd8b648 100644 --- a/module/move/willbe/tests/inc/mod.rs +++ b/module/move/willbe/tests/inc/mod.rs @@ -5,6 +5,5 @@ mod endpoints; mod publish_need; mod query; mod version; -mod io2fmt_write; mod graph;