mirror of
https://github.com/roc-lang/roc.git
synced 2024-11-10 18:08:55 +03:00
Fix test_uniq_load
This commit is contained in:
parent
cb843c37e7
commit
87630e1d69
@ -1,11 +1,11 @@
|
||||
#[macro_use]
|
||||
extern crate pretty_assertions;
|
||||
// #[macro_use]
|
||||
// extern crate pretty_assertions;
|
||||
|
||||
extern crate arena_pool;
|
||||
|
||||
#[cfg(test)]
|
||||
mod test_arena_pool {
|
||||
use arena_pool::pool::{Arena, ArenaIter, ArenaPool, ArenaRef};
|
||||
use arena_pool::pool::{ArenaIter, ArenaPool};
|
||||
|
||||
#[test]
|
||||
fn empty_pool() {
|
||||
|
@ -35,9 +35,9 @@ mod test_load {
|
||||
let src_dir = fixtures_dir().join(dir_name);
|
||||
let filename = src_dir.join(format!("{}.roc", module_name));
|
||||
let loaded = load(
|
||||
src_dir,
|
||||
filename,
|
||||
&roc_builtins::std::standard_stdlib(),
|
||||
filename.as_path(),
|
||||
src_dir.as_path(),
|
||||
subs_by_module,
|
||||
);
|
||||
let loaded_module = loaded.expect("Test module failed to load");
|
||||
@ -129,9 +129,9 @@ mod test_load {
|
||||
let src_dir = fixtures_dir().join("interface_with_deps");
|
||||
let filename = src_dir.join("Primary.roc");
|
||||
let loaded = load(
|
||||
src_dir,
|
||||
filename,
|
||||
&roc_builtins::std::standard_stdlib(),
|
||||
filename.as_path(),
|
||||
src_dir.as_path(),
|
||||
subs_by_module,
|
||||
);
|
||||
|
||||
|
@ -13,7 +13,7 @@ mod helpers;
|
||||
|
||||
#[cfg(test)]
|
||||
mod test_uniq_load {
|
||||
use crate::helpers::{fixtures_dir, test_async};
|
||||
use crate::helpers::fixtures_dir;
|
||||
use inlinable_string::InlinableString;
|
||||
use roc_builtins::unique;
|
||||
use roc_can::def::Declaration::*;
|
||||
@ -28,14 +28,19 @@ mod test_uniq_load {
|
||||
|
||||
// HELPERS
|
||||
|
||||
async fn load_fixture(
|
||||
fn load_fixture(
|
||||
dir_name: &str,
|
||||
module_name: &str,
|
||||
subs_by_module: SubsByModule,
|
||||
) -> LoadedModule {
|
||||
let src_dir = fixtures_dir().join(dir_name);
|
||||
let filename = src_dir.join(format!("{}.roc", module_name));
|
||||
let loaded = load(&unique::uniq_stdlib(), src_dir, filename, subs_by_module).await;
|
||||
let loaded = load(
|
||||
filename,
|
||||
&unique::uniq_stdlib(),
|
||||
src_dir.as_path(),
|
||||
subs_by_module,
|
||||
);
|
||||
let loaded_module = loaded.expect("Test module failed to load");
|
||||
|
||||
assert_eq!(loaded_module.can_problems, Vec::new());
|
||||
@ -124,205 +129,179 @@ mod test_uniq_load {
|
||||
let subs_by_module = MutMap::default();
|
||||
let src_dir = fixtures_dir().join("interface_with_deps");
|
||||
let filename = src_dir.join("Primary.roc");
|
||||
let loaded = load(
|
||||
filename,
|
||||
&roc_builtins::std::standard_stdlib(),
|
||||
src_dir.as_path(),
|
||||
subs_by_module,
|
||||
);
|
||||
|
||||
test_async(async {
|
||||
let loaded = load(
|
||||
&roc_builtins::std::standard_stdlib(),
|
||||
src_dir,
|
||||
filename,
|
||||
subs_by_module,
|
||||
)
|
||||
.await;
|
||||
let mut loaded_module = loaded.expect("Test module failed to load");
|
||||
|
||||
let mut loaded_module = loaded.expect("Test module failed to load");
|
||||
assert_eq!(loaded_module.can_problems, Vec::new());
|
||||
assert_eq!(loaded_module.type_problems, Vec::new());
|
||||
|
||||
assert_eq!(loaded_module.can_problems, Vec::new());
|
||||
assert_eq!(loaded_module.type_problems, Vec::new());
|
||||
let def_count: usize = loaded_module
|
||||
.declarations_by_id
|
||||
.remove(&loaded_module.module_id)
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|decl| decl.def_count())
|
||||
.sum();
|
||||
|
||||
let def_count: usize = loaded_module
|
||||
.declarations_by_id
|
||||
.remove(&loaded_module.module_id)
|
||||
.unwrap()
|
||||
.into_iter()
|
||||
.map(|decl| decl.def_count())
|
||||
.sum();
|
||||
let expected_name = loaded_module
|
||||
.interns
|
||||
.module_ids
|
||||
.get_name(loaded_module.module_id)
|
||||
.expect("Test ModuleID not found in module_ids");
|
||||
|
||||
let expected_name = loaded_module
|
||||
.interns
|
||||
.module_ids
|
||||
.get_name(loaded_module.module_id)
|
||||
.expect("Test ModuleID not found in module_ids");
|
||||
|
||||
assert_eq!(expected_name, &InlinableString::from("Primary"));
|
||||
assert_eq!(def_count, 10);
|
||||
});
|
||||
assert_eq!(expected_name, &InlinableString::from("Primary"));
|
||||
assert_eq!(def_count, 10);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn load_unit() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("no_deps", "Unit", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("no_deps", "Unit", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"unit" => "Attr * Unit",
|
||||
},
|
||||
);
|
||||
});
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"unit" => "Attr * Unit",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn import_alias() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module =
|
||||
load_fixture("interface_with_deps", "ImportAlias", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "ImportAlias", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"unit" => "Attr * Dep1.Unit",
|
||||
},
|
||||
);
|
||||
});
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"unit" => "Attr * Dep1.Unit",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn load_and_typecheck() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module =
|
||||
load_fixture("interface_with_deps", "WithBuiltins", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "WithBuiltins", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"floatTest" => "Attr Shared Float",
|
||||
"divisionFn" => "Attr Shared (Attr * Float, Attr * Float -> Attr * (Result (Attr * Float) (Attr * [ DivByZero ]*)))",
|
||||
"divisionTest" => "Attr * (Result (Attr * Float) (Attr * [ DivByZero ]*))",
|
||||
"intTest" => "Attr * Int",
|
||||
"x" => "Attr * Float",
|
||||
"constantNum" => "Attr * (Num (Attr * *))",
|
||||
"divDep1ByDep2" => "Attr * (Result (Attr * Float) (Attr * [ DivByZero ]*))",
|
||||
"fromDep2" => "Attr * Float",
|
||||
},
|
||||
);
|
||||
});
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"floatTest" => "Attr Shared Float",
|
||||
"divisionFn" => "Attr Shared (Attr * Float, Attr * Float -> Attr * (Result (Attr * Float) (Attr * [ DivByZero ]*)))",
|
||||
"divisionTest" => "Attr * (Result (Attr * Float) (Attr * [ DivByZero ]*))",
|
||||
"intTest" => "Attr * Int",
|
||||
"x" => "Attr * Float",
|
||||
"constantNum" => "Attr * (Num (Attr * *))",
|
||||
"divDep1ByDep2" => "Attr * (Result (Attr * Float) (Attr * [ DivByZero ]*))",
|
||||
"fromDep2" => "Attr * Float",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn load_astar() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "AStar", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "AStar", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"findPath" => "Attr * (Attr * { costFunction : (Attr Shared (Attr Shared position, Attr Shared position -> Attr * Float)), end : (Attr Shared position), moveFunction : (Attr Shared (Attr Shared position -> Attr * (Set (Attr * position)))), start : (Attr Shared position) } -> Attr * (Result (Attr * (List (Attr Shared position))) (Attr * [ KeyNotFound ]*)))",
|
||||
"initialModel" => "Attr * (Attr Shared position -> Attr * (Model (Attr Shared position)))",
|
||||
"reconstructPath" => "Attr Shared (Attr Shared (Map (Attr * position) (Attr Shared position)), Attr Shared position -> Attr * (List (Attr Shared position)))",
|
||||
"updateCost" => "Attr * (Attr Shared position, Attr Shared position, Attr Shared (Model (Attr Shared position)) -> Attr Shared (Model (Attr Shared position)))",
|
||||
"cheapestOpen" => "Attr * (Attr * (Attr Shared position -> Attr * Float), Attr (* | a | b | c) (Model (Attr Shared position)) -> Attr * (Result (Attr Shared position) (Attr * [ KeyNotFound ]*)))",
|
||||
"astar" => "Attr Shared (Attr Shared (Attr Shared position, Attr Shared position -> Attr * Float), Attr Shared (Attr Shared position -> Attr * (Set (Attr * position))), Attr Shared position, Attr Shared (Model (Attr Shared position)) -> Attr * [ Err (Attr * [ KeyNotFound ]*), Ok (Attr * (List (Attr Shared position))) ]*)",
|
||||
},
|
||||
);
|
||||
});
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"findPath" => "Attr * (Attr * { costFunction : (Attr Shared (Attr Shared position, Attr Shared position -> Attr * Float)), end : (Attr Shared position), moveFunction : (Attr Shared (Attr Shared position -> Attr * (Set (Attr * position)))), start : (Attr Shared position) } -> Attr * (Result (Attr * (List (Attr Shared position))) (Attr * [ KeyNotFound ]*)))",
|
||||
"initialModel" => "Attr * (Attr Shared position -> Attr * (Model (Attr Shared position)))",
|
||||
"reconstructPath" => "Attr Shared (Attr Shared (Map (Attr * position) (Attr Shared position)), Attr Shared position -> Attr * (List (Attr Shared position)))",
|
||||
"updateCost" => "Attr * (Attr Shared position, Attr Shared position, Attr Shared (Model (Attr Shared position)) -> Attr Shared (Model (Attr Shared position)))",
|
||||
"cheapestOpen" => "Attr * (Attr * (Attr Shared position -> Attr * Float), Attr (* | a | b | c) (Model (Attr Shared position)) -> Attr * (Result (Attr Shared position) (Attr * [ KeyNotFound ]*)))",
|
||||
"astar" => "Attr Shared (Attr Shared (Attr Shared position, Attr Shared position -> Attr * Float), Attr Shared (Attr Shared position -> Attr * (Set (Attr * position))), Attr Shared position, Attr Shared (Model (Attr Shared position)) -> Attr * [ Err (Attr * [ KeyNotFound ]*), Ok (Attr * (List (Attr Shared position))) ]*)",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn load_and_typecheck_quicksort() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module =
|
||||
load_fixture("interface_with_deps", "Quicksort", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "Quicksort", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"swap" => "Attr * (Attr * Int, Attr * Int, Attr * (List (Attr Shared a)) -> Attr * (List (Attr Shared a)))",
|
||||
"partition" => "Attr * (Attr Shared Int, Attr Shared Int, Attr b (List (Attr Shared (Num (Attr Shared a)))) -> Attr * [ Pair (Attr * Int) (Attr b (List (Attr Shared (Num (Attr Shared a))))) ])",
|
||||
"quicksort" => "Attr Shared (Attr b (List (Attr Shared (Num (Attr Shared a)))), Attr Shared Int, Attr Shared Int -> Attr b (List (Attr Shared (Num (Attr Shared a)))))",
|
||||
},
|
||||
);
|
||||
});
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"swap" => "Attr * (Attr * Int, Attr * Int, Attr * (List (Attr Shared a)) -> Attr * (List (Attr Shared a)))",
|
||||
"partition" => "Attr * (Attr Shared Int, Attr Shared Int, Attr b (List (Attr Shared (Num (Attr Shared a)))) -> Attr * [ Pair (Attr * Int) (Attr b (List (Attr Shared (Num (Attr Shared a))))) ])",
|
||||
"quicksort" => "Attr Shared (Attr b (List (Attr Shared (Num (Attr Shared a)))), Attr Shared Int, Attr Shared Int -> Attr b (List (Attr Shared (Num (Attr Shared a)))))",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn load_principal_types() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("no_deps", "Principal", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("no_deps", "Principal", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"intVal" => "Attr * Str",
|
||||
"identity" => "Attr * (a -> a)",
|
||||
},
|
||||
);
|
||||
});
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"intVal" => "Attr * Str",
|
||||
"identity" => "Attr * (a -> a)",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn load_dep_types() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module =
|
||||
load_fixture("interface_with_deps", "Primary", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "Primary", subs_by_module);
|
||||
|
||||
// the inferred signature for withDefault is wrong, part of the alias in alias issue.
|
||||
// "withDefault" => "Attr * (Attr * (Res.Res (Attr a b) (Attr * *)), Attr a b -> Attr a b)",
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"blah2" => "Attr * Float",
|
||||
"blah3" => "Attr * Str",
|
||||
"str" => "Attr * Str",
|
||||
"alwaysThree" => "Attr * (* -> Attr * Str)",
|
||||
"identity" => "Attr * (a -> a)",
|
||||
"z" => "Attr * Str",
|
||||
"w" => "Attr * (Dep1.Identity (Attr * {}))",
|
||||
"succeed" => "Attr * (Attr b a -> Attr * (Dep1.Identity (Attr b a)))",
|
||||
"yay" => "Attr * (Res.Res (Attr * {}) (Attr * err))",
|
||||
"withDefault" => "Attr * (Attr (* | b | c) (Res.Res (Attr b a) (Attr c *)), Attr b a -> Attr b a)",
|
||||
},
|
||||
);
|
||||
});
|
||||
// the inferred signature for withDefault is wrong, part of the alias in alias issue.
|
||||
// "withDefault" => "Attr * (Attr * (Res.Res (Attr a b) (Attr * *)), Attr a b -> Attr a b)",
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"blah2" => "Attr * Float",
|
||||
"blah3" => "Attr * Str",
|
||||
"str" => "Attr * Str",
|
||||
"alwaysThree" => "Attr * (* -> Attr * Str)",
|
||||
"identity" => "Attr * (a -> a)",
|
||||
"z" => "Attr * Str",
|
||||
"w" => "Attr * (Dep1.Identity (Attr * {}))",
|
||||
"succeed" => "Attr * (Attr b a -> Attr * (Dep1.Identity (Attr b a)))",
|
||||
"yay" => "Attr * (Res.Res (Attr * {}) (Attr * err))",
|
||||
"withDefault" => "Attr * (Attr (* | b | c) (Res.Res (Attr b a) (Attr c *)), Attr b a -> Attr b a)",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn load_custom_res() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "Res", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "Res", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"withDefault" =>"Attr * (Attr (* | b | c) (Res (Attr b a) (Attr c err)), Attr b a -> Attr b a)",
|
||||
"map" => "Attr * (Attr (* | c | d) (Res (Attr c a) (Attr d err)), Attr * (Attr c a -> Attr e b) -> Attr * (Res (Attr e b) (Attr d err)))",
|
||||
"andThen" => "Attr * (Attr (* | c | d) (Res (Attr c a) (Attr d err)), Attr * (Attr c a -> Attr f (Res (Attr e b) (Attr d err))) -> Attr f (Res (Attr e b) (Attr d err)))",
|
||||
},
|
||||
);
|
||||
});
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"withDefault" =>"Attr * (Attr (* | b | c) (Res (Attr b a) (Attr c err)), Attr b a -> Attr b a)",
|
||||
"map" => "Attr * (Attr (* | c | d) (Res (Attr c a) (Attr d err)), Attr * (Attr c a -> Attr e b) -> Attr * (Res (Attr e b) (Attr d err)))",
|
||||
"andThen" => "Attr * (Attr (* | c | d) (Res (Attr c a) (Attr d err)), Attr * (Attr c a -> Attr f (Res (Attr e b) (Attr d err))) -> Attr f (Res (Attr e b) (Attr d err)))",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn imported_dep_regression() {
|
||||
test_async(async {
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "OneDep", subs_by_module).await;
|
||||
let subs_by_module = MutMap::default();
|
||||
let loaded_module = load_fixture("interface_with_deps", "OneDep", subs_by_module);
|
||||
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"str" => "Attr * Str",
|
||||
},
|
||||
);
|
||||
});
|
||||
expect_types(
|
||||
loaded_module,
|
||||
hashmap! {
|
||||
"str" => "Attr * Str",
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// #[test]
|
||||
@ -332,7 +311,7 @@ mod test_uniq_load {
|
||||
|
||||
// let subs_by_module = MutMap::default();
|
||||
// let loaded_module =
|
||||
// load_fixture("interface_with_deps", "Records", subs_by_module).await;
|
||||
// load_fixture("interface_with_deps", "Records", subs_by_module);
|
||||
|
||||
// // NOTE: `a` here is unconstrained, so unifies with <type error>
|
||||
// let expected_types = hashmap! {
|
||||
|
Loading…
Reference in New Issue
Block a user