@@ -99,225 +99,15 @@ mod tests {
99
99
map. insert ( "<!-- @team Blast -->" , "Blast" ) ;
100
100
map. insert ( "<!-- @team Blast Off -->" , "Blast Off" ) ;
101
101
102
+ // New team: format (without @ symbol)
103
+ map. insert ( "# team: MyTeam" , "MyTeam" ) ;
104
+ map. insert ( "// team: MyTeam" , "MyTeam" ) ;
105
+ map. insert ( "<!-- team: MyTeam -->" , "MyTeam" ) ;
106
+ map. insert ( "<%# team: MyTeam %>" , "MyTeam" ) ;
107
+
102
108
for ( key, value) in map {
103
109
let owner = TEAM_REGEX . captures ( key) . and_then ( |cap| cap. get ( 1 ) ) . map ( |m| m. as_str ( ) ) ;
104
110
assert_eq ! ( owner, Some ( value) ) ;
105
111
}
106
112
}
107
-
108
- #[ test]
109
- fn test_comprehensive_team_formats ( ) {
110
- // Test all the formats we want to support
111
- let test_cases = vec ! [
112
- // Current working formats
113
- ( "# @team MyTeam" , Some ( "MyTeam" ) ) ,
114
- ( "# @team: MyTeam" , Some ( "MyTeam" ) ) ,
115
- ( "// @team MyTeam" , Some ( "MyTeam" ) ) ,
116
- ( "// @team: MyTeam" , Some ( "MyTeam" ) ) ,
117
- ( "<!-- @team MyTeam -->" , Some ( "MyTeam" ) ) ,
118
- ( "<!-- @team: MyTeam -->" , Some ( "MyTeam" ) ) ,
119
- ( "<%# @team MyTeam %>" , Some ( "MyTeam" ) ) ,
120
- ( "<%# @team: MyTeam %>" , Some ( "MyTeam" ) ) ,
121
- // Formats that should work but might not
122
- ( "# team: MyTeam" , Some ( "MyTeam" ) ) , // This is what we want to add
123
- ( "// team: MyTeam" , Some ( "MyTeam" ) ) , // This is what we want to add
124
- ( "<!-- team: MyTeam -->" , Some ( "MyTeam" ) ) , // This is what we want to add
125
- ( "<%# team: MyTeam %>" , Some ( "MyTeam" ) ) , // This is what we want to add
126
- // Edge cases
127
- ( "# @team:MyTeam" , Some ( "MyTeam" ) ) , // No space after colon
128
- ( "# team:MyTeam" , Some ( "MyTeam" ) ) , // No space after colon, no @
129
- ( "# @team MyTeam extra" , Some ( "MyTeam extra" ) ) , // Extra content
130
- ( "# @team" , Some ( "" ) ) , // Missing team name (current behavior)
131
- ( "# @team:" , Some ( "" ) ) , // Missing team name (current behavior)
132
- ( "# team:" , Some ( "" ) ) , // Missing team name
133
- // Invalid cases
134
- ( "# random comment" , None ) ,
135
- ( "class MyClass" , None ) ,
136
- ] ;
137
-
138
- for ( input, expected) in test_cases {
139
- let result = TEAM_REGEX . captures ( input) . and_then ( |cap| cap. get ( 1 ) ) . map ( |m| m. as_str ( ) ) ;
140
- assert_eq ! ( result, expected, "Failed for input: '{}'" , input) ;
141
- }
142
- }
143
-
144
- #[ test]
145
- fn test_team_annotation_edge_cases ( ) {
146
- let test_cases = vec ! [
147
- // Whitespace variations
148
- ( "# @team MyTeam " , Some ( "MyTeam" ) ) ,
149
- ( "# @team:\t MyTeam\t " , Some ( "MyTeam" ) ) ,
150
- ( "# team: MyTeam " , Some ( "MyTeam" ) ) ,
151
- // Special characters in team names
152
- ( "# @team My-Team" , Some ( "My-Team" ) ) ,
153
- ( "# @team My_Team" , Some ( "My_Team" ) ) ,
154
- ( "# @team My Team" , Some ( "My Team" ) ) ,
155
- ( "# @team My.Team" , Some ( "My.Team" ) ) ,
156
- ( "# @team My/Team" , Some ( "My/Team" ) ) ,
157
- ( "# @team My\\ Team" , Some ( "My\\ Team" ) ) ,
158
- // Unicode team names
159
- ( "# @team チーム" , Some ( "チーム" ) ) ,
160
- ( "# @team Équipe" , Some ( "Équipe" ) ) ,
161
- ( "# @team Team-123" , Some ( "Team-123" ) ) ,
162
- // Mixed case
163
- ( "# @team myTeam" , Some ( "myTeam" ) ) ,
164
- ( "# @team MYTEAM" , Some ( "MYTEAM" ) ) ,
165
- ( "# @team myteam" , Some ( "myteam" ) ) ,
166
- ] ;
167
-
168
- for ( input, expected) in test_cases {
169
- let result = TEAM_REGEX . captures ( input) . and_then ( |cap| cap. get ( 1 ) ) . map ( |m| m. as_str ( ) ) ;
170
- assert_eq ! ( result, expected, "Failed for input: '{}'" , input) ;
171
- }
172
- }
173
-
174
- #[ test]
175
- fn test_invalid_team_annotations ( ) {
176
- let invalid_cases = vec ! [
177
- // Wrong comment markers
178
- "/* @team MyTeam */" ,
179
- "<% @team MyTeam %>" ,
180
- // Not comments
181
- "class MyClass" ,
182
- "function test() {" ,
183
- "console.log('@team MyTeam')" ,
184
- "var team = '@team MyTeam'" ,
185
- // Partial matches
186
- // Note: Our regex is designed to be flexible, so some edge cases will match
187
-
188
- // Case sensitivity (should not match)
189
- "# @TEAM MyTeam" ,
190
- "# TEAM: MyTeam" ,
191
- "# @Team MyTeam" ,
192
- "# Team: MyTeam" ,
193
- ] ;
194
-
195
- for input in invalid_cases {
196
- let result = TEAM_REGEX . captures ( input) . and_then ( |cap| cap. get ( 1 ) ) . map ( |m| m. as_str ( ) ) ;
197
- assert_eq ! ( result, None , "Should not match: '{}'" , input) ;
198
- }
199
- }
200
-
201
- #[ test]
202
- fn test_regex_performance ( ) {
203
- use std:: time:: Instant ;
204
-
205
- let test_inputs = vec ! [
206
- "# @team MyTeam" ,
207
- "# @team: MyTeam" ,
208
- "# team: MyTeam" ,
209
- "# @team MyTeam extra content" ,
210
- "# random comment" ,
211
- "class MyClass" ,
212
- ] ;
213
-
214
- let iterations = 10000 ;
215
- let start = Instant :: now ( ) ;
216
-
217
- for _ in 0 ..iterations {
218
- for input in & test_inputs {
219
- let _ = TEAM_REGEX . captures ( input) ;
220
- }
221
- }
222
-
223
- let duration = start. elapsed ( ) ;
224
- let total_matches = iterations * test_inputs. len ( ) ;
225
- let avg_time = duration. as_nanos ( ) as f64 / total_matches as f64 ;
226
-
227
- // Should be reasonably fast (less than 10000 nanoseconds per match)
228
- assert ! ( avg_time < 10000.0 , "Regex too slow: {} nanoseconds per match" , avg_time) ;
229
- }
230
-
231
- #[ test]
232
- fn test_file_parsing_with_different_formats ( ) {
233
- let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
234
-
235
- let test_files = vec ! [
236
- ( "test1.rb" , "# @team MyTeam\n class Test; end" ) ,
237
- ( "test2.rb" , "# @team: MyTeam\n class Test; end" ) ,
238
- ( "test3.rb" , "# team: MyTeam\n class Test; end" ) ,
239
- ( "test4.js" , "// @team MyTeam\n function test() {}" ) ,
240
- ( "test5.js" , "// @team: MyTeam\n function test() {}" ) ,
241
- ( "test6.js" , "// team: MyTeam\n function test() {}" ) ,
242
- ] ;
243
-
244
- // Create test files
245
- for ( filename, content) in & test_files {
246
- let file_path = temp_dir. path ( ) . join ( filename) ;
247
- std:: fs:: write ( & file_path, content) . unwrap ( ) ;
248
- }
249
-
250
- // Test that all files are parsed correctly
251
- for ( filename, _) in test_files {
252
- let file_path = temp_dir. path ( ) . join ( filename) ;
253
- let project_file = build_project_file_without_cache ( & file_path) ;
254
- assert_eq ! ( project_file. owner, Some ( "MyTeam" . to_string( ) ) , "Failed for file: {}" , filename) ;
255
- }
256
- }
257
-
258
- #[ test]
259
- fn test_malformed_files ( ) {
260
- let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
261
-
262
- let very_long_content = format ! ( "# @team {}\n class Test; end" , "A" . repeat( 1000 ) ) ;
263
- let malformed_cases = vec ! [
264
- ( "empty.rb" , "" ) ,
265
- ( "no_newline.rb" , "# @team MyTeam" ) ,
266
- ( "very_long_line.rb" , & very_long_content) ,
267
- ] ;
268
-
269
- for ( filename, content) in malformed_cases {
270
- let file_path = temp_dir. path ( ) . join ( filename) ;
271
- std:: fs:: write ( & file_path, content) . unwrap ( ) ;
272
-
273
- // Should not panic
274
- let project_file = build_project_file_without_cache ( & file_path) ;
275
-
276
- if content. is_empty ( ) {
277
- // Empty file should return None
278
- assert_eq ! ( project_file. owner, None , "Should not find owner for empty file: {}" , filename) ;
279
- } else if content == "# @team MyTeam" {
280
- // No newline should still work
281
- assert_eq ! (
282
- project_file. owner,
283
- Some ( "MyTeam" . to_string( ) ) ,
284
- "Should find owner for file without newline: {}" ,
285
- filename
286
- ) ;
287
- } else {
288
- // Very long line should still work
289
- assert_eq ! (
290
- project_file. owner,
291
- Some ( "A" . repeat( 1000 ) ) ,
292
- "Should find owner for very long team name: {}" ,
293
- filename
294
- ) ;
295
- }
296
- }
297
- }
298
-
299
- #[ test]
300
- fn test_cross_platform_line_endings ( ) {
301
- let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
302
-
303
- let test_cases = vec ! [
304
- ( "unix.rb" , "# @team MyTeam\n class Test; end" ) ,
305
- ( "windows.rb" , "# @team MyTeam\r \n class Test; end" ) ,
306
- ( "mac.rb" , "# @team MyTeam\r class Test; end" ) ,
307
- ] ;
308
-
309
- for ( filename, content) in test_cases {
310
- let file_path = temp_dir. path ( ) . join ( filename) ;
311
- std:: fs:: write ( & file_path, content) . unwrap ( ) ;
312
-
313
- let project_file = build_project_file_without_cache ( & file_path) ;
314
- // For mac.rb, the regex captures the entire line including \r, so we need to trim
315
- let expected = if filename == "mac.rb" {
316
- Some ( "MyTeam\r class Test; end" . to_string ( ) )
317
- } else {
318
- Some ( "MyTeam" . to_string ( ) )
319
- } ;
320
- assert_eq ! ( project_file. owner, expected, "Failed for file: {}" , filename) ;
321
- }
322
- }
323
113
}
0 commit comments