Skip to content

Commit 0beaac2

Browse files
committed
Update Luau require tests
1 parent 9a7f75a commit 0beaac2

24 files changed

+141
-15
lines changed

tests/luau/require.rs

Lines changed: 54 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::io::Result as IoResult;
22
use 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

66
fn 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]
1520
fn 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)))]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"aliases":{
3+
"outer": "./",
4+
"cyclicentry": "@cyclic1",
5+
"cyclic1": "@cyclic2",
6+
"cyclic2": "@cyclic3",
7+
"cyclic3": "@cyclic1"
8+
}
9+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
return {"result from outer_dependency"}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"aliases":{
3+
"passthroughinner": "./inner_dependency",
4+
"passthroughouter": "@outer",
5+
"dep": "@passthroughinner",
6+
"outerdep": "@outer/outer_dependency",
7+
"outerdir": "@passthroughouter",
8+
"brokenchain": "@missing"
9+
}
10+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
return require("@cyclicentry")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
return require("@brokenchain")
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
return {"result from inner_dependency"}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
local result = {}
2+
3+
table.insert(result, require("@dep"))
4+
table.insert(result, require("@outerdep"))
5+
table.insert(result, require("@outerdir/outer_dependency"))
6+
7+
return result
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
return {
2+
luau = {
3+
aliases = {
4+
dep = "./this_should_be_overwritten_by_child_luaurc",
5+
otherdep = "./src/other_dependency"
6+
}
7+
}
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
return {
2+
luau = {
3+
aliases = {
4+
outer = "./",
5+
cyclicentry = "@cyclic1",
6+
cyclic1 = "@cyclic2",
7+
cyclic2 = "@cyclic3",
8+
cyclic3 = "@cyclic1"
9+
}
10+
}
11+
}

0 commit comments

Comments
 (0)