11use std:: io:: Result as IoResult ;
22use std:: result:: Result as StdResult ;
33
4- use mlua:: { Error , IntoLua , Lua , MultiValue , NavigateError , Require , Result , TextRequirer , Value } ;
4+ use mlua:: { Error , FromLua , IntoLua , Lua , MultiValue , NavigateError , Require , Result , TextRequirer , Value } ;
55
66fn run_require ( lua : & Lua , path : impl IntoLua ) -> Result < Value > {
77 lua. load ( r#"return require(...)"# ) . call ( path)
@@ -11,9 +11,14 @@ fn run_require_pcall(lua: &Lua, path: impl IntoLua) -> Result<MultiValue> {
1111 lua. load ( r#"return pcall(require, ...)"# ) . call ( path)
1212}
1313
14+ #[ track_caller]
15+ fn get_value < V : FromLua > ( value : & Value , key : impl IntoLua ) -> V {
16+ value. as_table ( ) . unwrap ( ) . get ( key) . unwrap ( )
17+ }
18+
1419#[ track_caller]
1520fn get_str ( value : & Value , key : impl IntoLua ) -> String {
16- value . as_table ( ) . unwrap ( ) . get :: < String > ( key) . unwrap ( )
21+ get_value ( value , key)
1722}
1823
1924#[ test]
@@ -47,6 +52,16 @@ fn test_require_errors() {
4752 assert ! ( res. is_err( ) ) ;
4853 assert ! ( ( res. unwrap_err( ) . to_string( ) ) . contains( "require is not supported in this context" ) ) ;
4954
55+ // RequireAliasThatDoesNotExist
56+ let res = run_require ( & lua, "@this.alias.does.not.exist" ) ;
57+ assert ! ( res. is_err( ) ) ;
58+ assert ! ( ( res. unwrap_err( ) . to_string( ) ) . contains( "@this.alias.does.not.exist is not a valid alias" ) ) ;
59+
60+ // IllegalAlias
61+ let res = run_require ( & lua, "@" ) ;
62+ assert ! ( res. is_err( ) ) ;
63+ assert ! ( ( res. unwrap_err( ) . to_string( ) ) . contains( "@ is not a valid alias" ) ) ;
64+
5065 // Test throwing mlua::Error
5166 struct MyRequire ( TextRequirer ) ;
5267
@@ -171,40 +186,64 @@ fn test_require_without_config() {
171186 assert ! ( res. is_table( ) ) ;
172187}
173188
174- #[ test]
175- fn test_require_with_config ( ) {
189+ fn test_require_with_config_inner ( r#type : & str ) {
176190 let lua = Lua :: new ( ) ;
177191
192+ let base_path = format ! ( "./tests/luau/require/{type}" ) ;
193+
178194 // RequirePathWithAlias
179- let res = run_require ( & lua, "./tests/luau/require/with_config/ src/alias_requirer") . unwrap ( ) ;
195+ let res = run_require ( & lua, format ! ( "{base_path}/ src/alias_requirer") ) . unwrap ( ) ;
180196 assert_eq ! ( "result from dependency" , get_str( & res, 1 ) ) ;
181197
182198 // RequirePathWithAlias (case-insensitive)
183- let res2 = run_require ( & lua, "./tests/luau/require/with_config/ src/alias_requirer_uc") . unwrap ( ) ;
199+ let res2 = run_require ( & lua, format ! ( "{base_path}/ src/alias_requirer_uc") ) . unwrap ( ) ;
184200 assert_eq ! ( "result from dependency" , get_str( & res2, 1 ) ) ;
185201 assert_eq ! ( res. to_pointer( ) , res2. to_pointer( ) ) ;
186202
187203 // RequirePathWithParentAlias
188- let res = run_require ( & lua, "./tests/luau/require/with_config/ src/parent_alias_requirer") . unwrap ( ) ;
204+ let res = run_require ( & lua, format ! ( "{base_path}/ src/parent_alias_requirer") ) . unwrap ( ) ;
189205 assert_eq ! ( "result from other_dependency" , get_str( & res, 1 ) ) ;
190206
191207 // RequirePathWithAliasPointingToDirectory
208+ let res = run_require ( & lua, format ! ( "{base_path}/src/directory_alias_requirer" ) ) . unwrap ( ) ;
209+ assert_eq ! ( "result from subdirectory_dependency" , get_str( & res, 1 ) ) ;
210+
211+ // RequireChainedAliasesSuccess
192212 let res = run_require (
193213 & lua,
194- "./tests/luau/require/with_config/src/directory_alias_requirer" ,
214+ format ! ( "{base_path}/chained_aliases/subdirectory/successful_requirer" ) ,
195215 )
196216 . unwrap ( ) ;
197- assert_eq ! ( "result from subdirectory_dependency" , get_str( & res, 1 ) ) ;
217+ assert_eq ! ( "result from inner_dependency" , get_str( & get_value( & res, 1 ) , 1 ) ) ;
218+ assert_eq ! ( "result from outer_dependency" , get_str( & get_value( & res, 2 ) , 1 ) ) ;
198219
199- // RequireAliasThatDoesNotExist
200- let res = run_require ( & lua, "@this.alias.does.not.exist" ) ;
220+ // RequireChainedAliasesFailureCyclic
221+ let res = run_require (
222+ & lua,
223+ format ! ( "{base_path}/chained_aliases/subdirectory/failing_requirer_cyclic" ) ,
224+ ) ;
201225 assert ! ( res. is_err( ) ) ;
202- assert ! ( ( res. unwrap_err( ) . to_string( ) ) . contains( "@this.alias.does.not.exist is not a valid alias" ) ) ;
226+ let err_msg = "error requiring module \" @cyclicentry\" : detected alias cycle (@cyclic1 -> @cyclic2 -> @cyclic3 -> @cyclic1)" ;
227+ assert ! ( res. unwrap_err( ) . to_string( ) . contains( err_msg) ) ;
203228
204- // IllegalAlias
205- let res = run_require ( & lua, "@" ) ;
229+ // RequireChainedAliasesFailureMissing
230+ let res = run_require (
231+ & lua,
232+ format ! ( "{base_path}/chained_aliases/subdirectory/failing_requirer_missing" ) ,
233+ ) ;
206234 assert ! ( res. is_err( ) ) ;
207- assert ! ( ( res. unwrap_err( ) . to_string( ) ) . contains( "@ is not a valid alias" ) ) ;
235+ let err_msg = "error requiring module \" @brokenchain\" : @missing is not a valid alias" ;
236+ assert ! ( res. unwrap_err( ) . to_string( ) . contains( err_msg) ) ;
237+ }
238+
239+ #[ test]
240+ fn test_require_with_config ( ) {
241+ test_require_with_config_inner ( "with_config" ) ;
242+ }
243+
244+ #[ test]
245+ fn test_require_with_config_luau ( ) {
246+ test_require_with_config_inner ( "with_config_luau" ) ;
208247}
209248
210249#[ cfg( all( feature = "async" , not( windows) ) ) ]
0 commit comments