@@ -746,3 +746,138 @@ fn lockfile_save_is_atomic() {
746746 r. join ( ) . unwrap ( ) ;
747747 }
748748}
749+
750+ const EXAMPLES_TOML : & str = r#"
751+ [project]
752+ name = "test"
753+ version = "0.1.0"
754+
755+ [build]
756+ sources = ["src"]
757+ target = {type = "directory", path = "target"}
758+ "# ;
759+
760+ fn create_metadata_with_examples ( ) -> ( Metadata , TempDir ) {
761+ let tempdir = tempfile:: tempdir ( ) . unwrap ( ) ;
762+ let metadata = create_project ( tempdir. path ( ) , "test" , EXAMPLES_TOML , false ) ;
763+ let project_path = metadata. project_path ( ) ;
764+ fs:: create_dir_all ( project_path. join ( "src" ) ) . unwrap ( ) ;
765+ fs:: write ( project_path. join ( "src/a.veryl" ) , "module A {}\n " ) . unwrap ( ) ;
766+ fs:: create_dir_all ( project_path. join ( "examples" ) ) . unwrap ( ) ;
767+ fs:: write ( project_path. join ( "examples/ex.veryl" ) , "module Ex {}\n " ) . unwrap ( ) ;
768+
769+ ( metadata, tempdir)
770+ }
771+
772+ #[ test]
773+ fn paths_include_root_examples ( ) {
774+ let ( mut metadata, _tempdir) = create_metadata_with_examples ( ) ;
775+
776+ let paths = metadata. paths :: < & str > ( & [ ] , false , false ) . unwrap ( ) ;
777+ assert_eq ! ( paths. len( ) , 2 ) ;
778+
779+ let src = paths. iter ( ) . find ( |x| x. src . ends_with ( "a.veryl" ) ) . unwrap ( ) ;
780+ let example = paths. iter ( ) . find ( |x| x. src . ends_with ( "ex.veryl" ) ) . unwrap ( ) ;
781+ assert ! ( !src. example) ;
782+ assert ! ( example. example) ;
783+ }
784+
785+ #[ test]
786+ fn paths_include_examples_with_default_sources ( ) {
787+ // The default `sources = [""]` walks the whole project.
788+ let toml = r#"
789+ [project]
790+ name = "test"
791+ version = "0.1.0"
792+
793+ [build]
794+ target = {type = "directory", path = "target"}
795+ "# ;
796+ let tempdir = tempfile:: tempdir ( ) . unwrap ( ) ;
797+ let mut metadata = create_project ( tempdir. path ( ) , "test" , toml, false ) ;
798+ let project_path = metadata. project_path ( ) ;
799+ fs:: create_dir_all ( project_path. join ( "src" ) ) . unwrap ( ) ;
800+ fs:: write ( project_path. join ( "src/a.veryl" ) , "module A {}\n " ) . unwrap ( ) ;
801+ fs:: create_dir_all ( project_path. join ( "examples" ) ) . unwrap ( ) ;
802+ fs:: write ( project_path. join ( "examples/ex.veryl" ) , "module Ex {}\n " ) . unwrap ( ) ;
803+
804+ let paths = metadata. paths :: < & str > ( & [ ] , false , false ) . unwrap ( ) ;
805+ assert_eq ! ( paths. len( ) , 2 ) ;
806+
807+ let src = paths. iter ( ) . find ( |x| x. src . ends_with ( "a.veryl" ) ) . unwrap ( ) ;
808+ let example = paths. iter ( ) . find ( |x| x. src . ends_with ( "ex.veryl" ) ) . unwrap ( ) ;
809+ assert ! ( !src. example) ;
810+ assert ! ( example. example) ;
811+ }
812+
813+ #[ test]
814+ fn sources_under_examples_are_rejected ( ) {
815+ for source in [ "examples" , "examples/sub" ] {
816+ let toml = format ! (
817+ r#"
818+ [project]
819+ name = "test"
820+ version = "0.1.0"
821+
822+ [build]
823+ sources = ["src", "{source}"]
824+ target = {{type = "directory", path = "target"}}
825+ "#
826+ ) ;
827+ let tempdir = tempfile:: tempdir ( ) . unwrap ( ) ;
828+ let mut metadata = create_project ( tempdir. path ( ) , "test" , & toml, false ) ;
829+ let project_path = metadata. project_path ( ) ;
830+ fs:: create_dir_all ( project_path. join ( "src" ) ) . unwrap ( ) ;
831+ fs:: write ( project_path. join ( "src/a.veryl" ) , "module A {}\n " ) . unwrap ( ) ;
832+ fs:: create_dir_all ( project_path. join ( "examples/sub" ) ) . unwrap ( ) ;
833+ fs:: write ( project_path. join ( "examples/ex.veryl" ) , "module Ex {}\n " ) . unwrap ( ) ;
834+
835+ let result = metadata. paths :: < & str > ( & [ ] , false , false ) ;
836+ assert ! ( matches!( result, Err ( MetadataError :: ReservedSourceDir ( _) ) ) ) ;
837+ }
838+ }
839+
840+ #[ test]
841+ fn paths_route_explicit_example_file ( ) {
842+ let ( mut metadata, _tempdir) = create_metadata_with_examples ( ) ;
843+ let file = metadata. project_path ( ) . join ( "examples/ex.veryl" ) ;
844+
845+ let paths = metadata. paths ( & [ file] , false , false ) . unwrap ( ) ;
846+ assert_eq ! ( paths. len( ) , 1 ) ;
847+ assert ! ( paths[ 0 ] . example) ;
848+ }
849+
850+ #[ test]
851+ fn lockfile_paths_exclude_dependency_examples ( ) {
852+ let tempdir = tempfile:: tempdir ( ) . unwrap ( ) ;
853+
854+ let dep_path = tempdir. path ( ) . join ( "dep" ) ;
855+ fs:: create_dir_all ( dep_path. join ( "src" ) ) . unwrap ( ) ;
856+ fs:: create_dir_all ( dep_path. join ( "examples" ) ) . unwrap ( ) ;
857+ fs:: write (
858+ dep_path. join ( "Veryl.toml" ) ,
859+ r#"
860+ [project]
861+ name = "dep"
862+ version = "0.1.0"
863+ "# ,
864+ )
865+ . unwrap ( ) ;
866+ fs:: write ( dep_path. join ( "src/a.veryl" ) , "module A {}\n " ) . unwrap ( ) ;
867+ fs:: write ( dep_path. join ( "examples/ex.veryl" ) , "module Ex {}\n " ) . unwrap ( ) ;
868+
869+ let main_toml = r#"
870+ [project]
871+ name = "main"
872+ version = "0.1.0"
873+
874+ [dependencies]
875+ dep = {path = "../dep"}
876+ "# ;
877+ let metadata = create_project ( tempdir. path ( ) , "main" , main_toml, false ) ;
878+
879+ let lockfile = Lockfile :: new ( & metadata) . unwrap ( ) ;
880+ let paths = lockfile. paths ( Path :: new ( "target" ) ) . unwrap ( ) ;
881+ assert ! ( paths. iter( ) . any( |x| x. src. ends_with( "a.veryl" ) ) ) ;
882+ assert ! ( !paths. iter( ) . any( |x| x. src. ends_with( "ex.veryl" ) ) ) ;
883+ }
0 commit comments