1use super::{FeatureCategory, FeatureTest};
3
4pub const TESTS: &[FeatureTest] = &[
5 FeatureTest {
7 name: "import_named",
8 covers: &["import_stmt", "import_item_list", "import_item"],
9 code: r#"
10from mylib::module use { foo }
11function test() {
12 return 42;
13}
14"#,
15 function: "test",
16 category: FeatureCategory::Module,
17 requires_data: false,
18 },
19 FeatureTest {
20 name: "import_named_multiple",
21 covers: &["import_stmt", "import_item_list", "import_item"],
22 code: r#"
23from mylib::module use { foo, bar, baz }
24function test() {
25 return 1;
26}
27"#,
28 function: "test",
29 category: FeatureCategory::Module,
30 requires_data: false,
31 },
32 FeatureTest {
33 name: "import_with_alias",
34 covers: &["import_stmt", "import_item"],
35 code: r#"
36from mylib::module use { foo as myFoo }
37function test() {
38 return 1;
39}
40"#,
41 function: "test",
42 category: FeatureCategory::Module,
43 requires_data: false,
44 },
45 FeatureTest {
46 name: "import_module_alias",
47 covers: &["import_stmt"],
48 code: r#"
49use utils as u
50function test() {
51 return 1;
52}
53"#,
54 function: "test",
55 category: FeatureCategory::Module,
56 requires_data: false,
57 },
58 FeatureTest {
59 name: "import_simple",
60 covers: &["import_stmt"],
61 code: r#"
62use utils
63function test() {
64 return 1;
65}
66"#,
67 function: "test",
68 category: FeatureCategory::Module,
69 requires_data: false,
70 },
71 FeatureTest {
72 name: "import_from_syntax",
73 covers: &[
74 "import_stmt",
75 "import_item_list",
76 "import_item",
77 "module_path",
78 ],
79 code: r#"
80from std::core::math use { sum, avg }
81function test() {
82 return 1;
83}
84"#,
85 function: "test",
86 category: FeatureCategory::Module,
87 requires_data: false,
88 },
89 FeatureTest {
91 name: "pub_function",
92 covers: &["pub_item", "function_def"],
93 code: r#"
94pub fn add(a, b) {
95 return a + b;
96}
97function test() {
98 return add(1, 2);
99}
100"#,
101 function: "test",
102 category: FeatureCategory::Module,
103 requires_data: false,
104 },
105 FeatureTest {
106 name: "pub_variable",
107 covers: &["pub_item", "variable_decl"],
108 code: r#"
109pub let PI = 3.14159;
110function test() {
111 return PI;
112}
113"#,
114 function: "test",
115 category: FeatureCategory::Module,
116 requires_data: false,
117 },
118 FeatureTest {
119 name: "pub_enum",
120 covers: &["pub_item", "enum_def"],
121 code: r#"
122pub enum Color {
123 Red,
124 Green,
125 Blue
126}
127function test() {
128 return 1;
129}
130"#,
131 function: "test",
132 category: FeatureCategory::Module,
133 requires_data: false,
134 },
135 FeatureTest {
136 name: "pub_struct",
137 covers: &["pub_item", "struct_type_def"],
138 code: r#"
139pub type Point {
140 x: number,
141 y: number
142}
143function test() {
144 return 1;
145}
146"#,
147 function: "test",
148 category: FeatureCategory::Module,
149 requires_data: false,
150 },
151 FeatureTest {
152 name: "pub_type_alias",
153 covers: &["pub_item", "type_alias_def"],
154 code: r#"
155pub type ID = number;
156function test() {
157 return 1;
158}
159"#,
160 function: "test",
161 category: FeatureCategory::Module,
162 requires_data: false,
163 },
164 FeatureTest {
165 name: "pub_interface",
166 covers: &["pub_item", "interface_def"],
167 code: r#"
168pub interface Printable {
169 fn toString(): string;
170}
171function test() {
172 return 1;
173}
174"#,
175 function: "test",
176 category: FeatureCategory::Module,
177 requires_data: false,
178 },
179 FeatureTest {
181 name: "pub_spec_basic",
182 covers: &["pub_item", "export_spec_list", "export_spec"],
183 code: r#"
184let foo = 1;
185let bar = 2;
186pub { foo, bar };
187function test() {
188 return foo + bar;
189}
190"#,
191 function: "test",
192 category: FeatureCategory::Module,
193 requires_data: false,
194 },
195 FeatureTest {
196 name: "pub_spec_with_alias",
197 covers: &["pub_item", "export_spec_list", "export_spec"],
198 code: r#"
199let internalName = 42;
200pub { internalName as publicName };
201function test() {
202 return internalName;
203}
204"#,
205 function: "test",
206 category: FeatureCategory::Module,
207 requires_data: false,
208 },
209 FeatureTest {
210 name: "pub_spec_mixed_aliases",
211 covers: &["export_spec_list", "export_spec"],
212 code: r#"
213let a = 1;
214let b = 2;
215let c = 3;
216pub { a, b as renamed, c };
217function test() {
218 return a + b + c;
219}
220"#,
221 function: "test",
222 category: FeatureCategory::Module,
223 requires_data: false,
224 },
225];
226
227#[cfg(test)]
228mod tests {
229 use super::*;
230 use std::collections::BTreeSet;
231
232 #[test]
233 fn test_module_tests_defined() {
234 assert!(!TESTS.is_empty());
235 for test in TESTS {
237 assert_eq!(test.category, FeatureCategory::Module);
238 }
239 }
240
241 #[test]
242 fn test_covers_module_grammar_rules() {
243 let covered: BTreeSet<_> = TESTS
244 .iter()
245 .flat_map(|t| t.covers.iter().copied())
246 .collect();
247 assert!(covered.contains(&"import_stmt"));
249 assert!(covered.contains(&"pub_item"));
250 assert!(covered.contains(&"export_spec"));
251 }
252}