1#[cfg(test)]
2mod tests {
3 use gpui::{AppContext as _, BorrowAppContext, TestAppContext};
4 use language::{AutoindentMode, Buffer};
5 use settings::SettingsStore;
6 use std::num::NonZeroU32;
7 use unindent::Unindent;
8
9 #[gpui::test]
10 async fn test_cpp_autoindent_basic(cx: &mut TestAppContext) {
11 cx.update(|cx| {
12 let test_settings = SettingsStore::test(cx);
13 cx.set_global(test_settings);
14 language::init(cx);
15 cx.update_global::<SettingsStore, _>(|store, cx| {
16 store.update_user_settings(cx, |s| {
17 s.project.all_languages.defaults.tab_size = NonZeroU32::new(2);
18 });
19 });
20 });
21 let language = crate::language("cpp", tree_sitter_cpp::LANGUAGE.into());
22
23 cx.new(|cx| {
24 let mut buffer = Buffer::local("", cx).with_language(language, cx);
25
26 buffer.edit([(0..0, "int main() {}")], None, cx);
27
28 let ix = buffer.len() - 1;
29 buffer.edit([(ix..ix, "\n\n")], Some(AutoindentMode::EachLine), cx);
30 assert_eq!(
31 buffer.text(),
32 "int main() {\n \n}",
33 "content inside braces should be indented"
34 );
35
36 buffer
37 });
38 }
39
40 #[gpui::test]
41 async fn test_cpp_autoindent_if_else(cx: &mut TestAppContext) {
42 cx.update(|cx| {
43 let test_settings = SettingsStore::test(cx);
44 cx.set_global(test_settings);
45 language::init(cx);
46 cx.update_global::<SettingsStore, _>(|store, cx| {
47 store.update_user_settings(cx, |s| {
48 s.project.all_languages.defaults.tab_size = NonZeroU32::new(2);
49 });
50 });
51 });
52 let language = crate::language("cpp", tree_sitter_cpp::LANGUAGE.into());
53
54 cx.new(|cx| {
55 let mut buffer = Buffer::local("", cx).with_language(language, cx);
56
57 buffer.edit(
58 [(
59 0..0,
60 r#"
61 int main() {
62 if (a)
63 b;
64 }
65 "#
66 .unindent(),
67 )],
68 Some(AutoindentMode::EachLine),
69 cx,
70 );
71 assert_eq!(
72 buffer.text(),
73 r#"
74 int main() {
75 if (a)
76 b;
77 }
78 "#
79 .unindent(),
80 "body of if-statement without braces should be indented"
81 );
82
83 let ix = buffer.len() - 4;
84 buffer.edit([(ix..ix, "\n.c")], Some(AutoindentMode::EachLine), cx);
85 assert_eq!(
86 buffer.text(),
87 r#"
88 int main() {
89 if (a)
90 b
91 .c;
92 }
93 "#
94 .unindent(),
95 "field expression (.c) should be indented further than the statement body"
96 );
97
98 buffer.edit([(0..buffer.len(), "")], Some(AutoindentMode::EachLine), cx);
99 buffer.edit(
100 [(
101 0..0,
102 r#"
103 int main() {
104 if (a) a++;
105 else b++;
106 }
107 "#
108 .unindent(),
109 )],
110 Some(AutoindentMode::EachLine),
111 cx,
112 );
113 assert_eq!(
114 buffer.text(),
115 r#"
116 int main() {
117 if (a) a++;
118 else b++;
119 }
120 "#
121 .unindent(),
122 "single-line if/else without braces should align at the same level"
123 );
124
125 buffer.edit([(0..buffer.len(), "")], Some(AutoindentMode::EachLine), cx);
126 buffer.edit(
127 [(
128 0..0,
129 r#"
130 int main() {
131 if (a)
132 b++;
133 else
134 c++;
135 }
136 "#
137 .unindent(),
138 )],
139 Some(AutoindentMode::EachLine),
140 cx,
141 );
142 assert_eq!(
143 buffer.text(),
144 r#"
145 int main() {
146 if (a)
147 b++;
148 else
149 c++;
150 }
151 "#
152 .unindent(),
153 "multi-line if/else without braces should indent statement bodies"
154 );
155
156 buffer.edit([(0..buffer.len(), "")], Some(AutoindentMode::EachLine), cx);
157 buffer.edit(
158 [(
159 0..0,
160 r#"
161 int main() {
162 if (a)
163 if (b)
164 c++;
165 }
166 "#
167 .unindent(),
168 )],
169 Some(AutoindentMode::EachLine),
170 cx,
171 );
172 assert_eq!(
173 buffer.text(),
174 r#"
175 int main() {
176 if (a)
177 if (b)
178 c++;
179 }
180 "#
181 .unindent(),
182 "nested if statements without braces should indent properly"
183 );
184
185 buffer.edit([(0..buffer.len(), "")], Some(AutoindentMode::EachLine), cx);
186 buffer.edit(
187 [(
188 0..0,
189 r#"
190 int main() {
191 if (a)
192 b++;
193 else if (c)
194 d++;
195 else
196 f++;
197 }
198 "#
199 .unindent(),
200 )],
201 Some(AutoindentMode::EachLine),
202 cx,
203 );
204 assert_eq!(
205 buffer.text(),
206 r#"
207 int main() {
208 if (a)
209 b++;
210 else if (c)
211 d++;
212 else
213 f++;
214 }
215 "#
216 .unindent(),
217 "else-if chains should align all conditions at same level with indented bodies"
218 );
219
220 buffer.edit([(0..buffer.len(), "")], Some(AutoindentMode::EachLine), cx);
221 buffer.edit(
222 [(
223 0..0,
224 r#"
225 int main() {
226 if (a) {
227 b++;
228 } else
229 c++;
230 }
231 "#
232 .unindent(),
233 )],
234 Some(AutoindentMode::EachLine),
235 cx,
236 );
237 assert_eq!(
238 buffer.text(),
239 r#"
240 int main() {
241 if (a) {
242 b++;
243 } else
244 c++;
245 }
246 "#
247 .unindent(),
248 "mixed braces should indent properly"
249 );
250
251 buffer
252 });
253 }
254}