@@ -667,3 +667,83 @@ fn terminate_exited_process() {
667667 assert ! ( p. kill( ) . is_ok( ) ) ;
668668 assert ! ( p. kill( ) . is_ok( ) ) ;
669669}
670+
671+ #[ test]
672+ fn test_get_resolved_envs ( ) {
673+ use crate :: env;
674+ use crate :: ffi:: OsString ;
675+
676+ // Test 1: Basic environment with inheritance
677+ let mut cmd = Command :: new ( "echo" ) ;
678+ cmd. env ( "TEST_VAR" , "test_value" ) ;
679+
680+ let resolved: Vec < ( OsString , OsString ) > = cmd. get_resolved_envs ( ) . collect ( ) ;
681+
682+ // Should contain our test var
683+ assert ! (
684+ resolved. iter( ) . any( |( k, v) | k == "TEST_VAR" && v == "test_value" ) ,
685+ "TEST_VAR should be present in resolved environment"
686+ ) ;
687+
688+ // Should also contain inherited vars (like PATH on most platforms)
689+ let current_env_count = env:: vars_os ( ) . count ( ) ;
690+ // We added one more, so should have at least as many
691+ assert ! (
692+ resolved. len( ) >= current_env_count,
693+ "Resolved environment should include inherited variables"
694+ ) ;
695+
696+ // Test 2: env_clear should only include explicitly set vars
697+ let mut cmd2 = Command :: new ( "echo" ) ;
698+ cmd2. env_clear ( ) ;
699+ cmd2. env ( "ONLY_VAR" , "only_value" ) ;
700+
701+ let resolved2: Vec < ( OsString , OsString ) > = cmd2. get_resolved_envs ( ) . collect ( ) ;
702+
703+ assert_eq ! ( resolved2. len( ) , 1 , "After env_clear, only explicitly set vars should be present" ) ;
704+ assert_eq ! ( resolved2[ 0 ] , ( OsString :: from( "ONLY_VAR" ) , OsString :: from( "only_value" ) ) ) ;
705+
706+ // Test 3: env_remove should exclude a variable
707+ let mut cmd3 = Command :: new ( "echo" ) ;
708+ // Set a known variable and then remove it
709+ cmd3. env ( "TO_REMOVE" , "value" ) ;
710+ cmd3. env_remove ( "TO_REMOVE" ) ;
711+
712+ let resolved3: Vec < ( OsString , OsString ) > = cmd3. get_resolved_envs ( ) . collect ( ) ;
713+
714+ // Should not contain TO_REMOVE
715+ assert ! (
716+ !resolved3. iter( ) . any( |( k, _) | k == "TO_REMOVE" ) ,
717+ "Removed variables should not appear in resolved environment"
718+ ) ;
719+
720+ // Test 4: Overriding inherited variables
721+ let original_value = env:: var_os ( "PATH" ) ;
722+ if original_value. is_some ( ) {
723+ let mut cmd4 = Command :: new ( "echo" ) ;
724+ cmd4. env ( "PATH" , "custom_path" ) ;
725+
726+ let resolved4: Vec < ( OsString , OsString ) > = cmd4. get_resolved_envs ( ) . collect ( ) ;
727+
728+ let path_entry = resolved4. iter ( ) . find ( |( k, _) | k == "PATH" ) ;
729+ assert ! ( path_entry. is_some( ) , "PATH should be in resolved environment" ) ;
730+ assert_eq ! (
731+ path_entry. unwrap( ) . 1 ,
732+ OsString :: from( "custom_path" ) ,
733+ "PATH should have the overridden value"
734+ ) ;
735+ }
736+
737+ // Test 5: Multiple operations combined
738+ let mut cmd5 = Command :: new ( "echo" ) ;
739+ cmd5. env ( "VAR1" , "value1" ) ;
740+ cmd5. env ( "VAR2" , "value2" ) ;
741+ cmd5. env ( "VAR3" , "value3" ) ;
742+ cmd5. env_remove ( "VAR2" ) ;
743+
744+ let resolved5: Vec < ( OsString , OsString ) > = cmd5. get_resolved_envs ( ) . collect ( ) ;
745+
746+ assert ! ( resolved5. iter( ) . any( |( k, v) | k == "VAR1" && v == "value1" ) ) ;
747+ assert ! ( !resolved5. iter( ) . any( |( k, _) | k == "VAR2" ) ) ;
748+ assert ! ( resolved5. iter( ) . any( |( k, v) | k == "VAR3" && v == "value3" ) ) ;
749+ }
0 commit comments