Skip to main content

shape_vm/feature_tests/
module_tests.rs

1//! Tests for module system features
2use super::{FeatureCategory, FeatureTest};
3
4pub const TESTS: &[FeatureTest] = &[
5    // === Module Use Statement ===
6    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    // === Pub Item ===
90    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    // === Export Spec ===
180    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        // All tests should be in Module category
236        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        // Verify key grammar rules are covered
248        assert!(covered.contains(&"import_stmt"));
249        assert!(covered.contains(&"pub_item"));
250        assert!(covered.contains(&"export_spec"));
251    }
252}