Skip to content

Commit 65e292d

Browse files
committed
More Luau require tests
1 parent 1a82f83 commit 65e292d

File tree

5 files changed

+49
-11
lines changed

5 files changed

+49
-11
lines changed

src/luau/require.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,16 +144,18 @@ impl TextRequirer {
144144
fn find_module_path(path: &Path) -> StdResult<PathBuf, NavigateError> {
145145
let mut found_path = None;
146146

147-
let current_ext = (path.extension().and_then(|s| s.to_str()))
148-
.map(|s| format!("{s}."))
149-
.unwrap_or_default();
150-
for ext in ["luau", "lua"] {
151-
let candidate = path.with_extension(format!("{current_ext}{ext}"));
152-
if candidate.is_file() {
153-
if found_path.is_some() {
154-
return Err(NavigateError::Ambiguous);
147+
if path.components().last() != Some(Component::Normal("init".as_ref())) {
148+
let current_ext = (path.extension().and_then(|s| s.to_str()))
149+
.map(|s| format!("{s}."))
150+
.unwrap_or_default();
151+
for ext in ["luau", "lua"] {
152+
let candidate = path.with_extension(format!("{current_ext}{ext}"));
153+
if candidate.is_file() {
154+
if found_path.is_some() {
155+
return Err(NavigateError::Ambiguous);
156+
}
157+
found_path = Some(candidate);
155158
}
156-
found_path = Some(candidate);
157159
}
158160
}
159161
if path.is_dir() {

tests/luau/require.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
use mlua::{IntoLua, Lua, Result, Value};
1+
use mlua::{IntoLua, Lua, MultiValue, Result, Value};
22

33
fn run_require(lua: &Lua, path: impl IntoLua) -> Result<Value> {
44
lua.load(r#"return require(...)"#).call(path)
55
}
66

7+
fn run_require_pcall(lua: &Lua, path: impl IntoLua) -> Result<MultiValue> {
8+
lua.load(r#"return pcall(require, ...)"#).call(path)
9+
}
10+
711
#[track_caller]
812
fn get_str(value: &Value, key: impl IntoLua) -> String {
913
value.as_table().unwrap().get::<String>(key).unwrap()
@@ -32,6 +36,13 @@ fn test_require_errors() {
3236
assert!(res.is_err());
3337
assert!((res.unwrap_err().to_string())
3438
.contains("bad argument #1 to 'require' (string expected, got boolean)"));
39+
40+
// Require from loadstring
41+
let res = lua
42+
.load(r#"return loadstring("require('./a/relative/path')")()"#)
43+
.eval::<Value>();
44+
assert!(res.is_err());
45+
assert!((res.unwrap_err().to_string()).contains("require is not supported in this context"));
3546
}
3647

3748
#[test]
@@ -42,6 +53,11 @@ fn test_require_without_config() {
4253
let res = run_require(&lua, "./require/without_config/dependency").unwrap();
4354
assert_eq!("result from dependency", get_str(&res, 1));
4455

56+
// RequireSimpleRelativePathWithinPcall
57+
let res = run_require_pcall(&lua, "./require/without_config/dependency").unwrap();
58+
assert!(res[0].as_boolean().unwrap());
59+
assert_eq!("result from dependency", get_str(&res[1], 1));
60+
4561
// RequireRelativeToRequiringFile
4662
let res = run_require(&lua, "./require/without_config/module").unwrap();
4763
assert_eq!("result from dependency", get_str(&res, 1));
@@ -59,10 +75,24 @@ fn test_require_without_config() {
5975
let res = run_require(&lua, "./require/without_config/lua").unwrap();
6076
assert_eq!("result from init.lua", get_str(&res, 1));
6177

62-
// RequireSubmoduleUsingSelf
78+
// RequireSubmoduleUsingSelfIndirectly
6379
let res = run_require(&lua, "./require/without_config/nested_module_requirer").unwrap();
6480
assert_eq!("result from submodule", get_str(&res, 1));
6581

82+
// RequireSubmoduleUsingSelfDirectly
83+
let res = run_require(&lua, "./require/without_config/nested").unwrap();
84+
assert_eq!("result from submodule", get_str(&res, 1));
85+
86+
// CannotRequireInitLuauDirectly
87+
let res = run_require(&lua, "./require/without_config/nested/init");
88+
assert!(res.is_err());
89+
assert!((res.unwrap_err().to_string()).contains("could not resolve child component \"init\""));
90+
91+
// RequireNestedInits
92+
let res = run_require(&lua, "./require/without_config/nested_inits_requirer").unwrap();
93+
assert_eq!("result from nested_inits/init", get_str(&res, 1));
94+
assert_eq!("required into module", get_str(&res, 2));
95+
6696
// RequireWithFileAmbiguity
6797
let res = run_require(&lua, "./require/without_config/ambiguous_file_requirer");
6898
assert!(res.is_err());
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
local result = require("@self/init")
2+
return result
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
return {"result from nested_inits/init"}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
local result = require("./nested_inits")
2+
result[#result+1] = "required into module"
3+
return result

0 commit comments

Comments
 (0)