@@ -98,226 +98,30 @@ mod tests {
9898 map. insert ( "<%# @team: Zap Zip%>" , "Zap Zip" ) ;
9999 map. insert ( "<!-- @team Blast -->" , "Blast" ) ;
100100 map. insert ( "<!-- @team Blast Off -->" , "Blast Off" ) ;
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" ) ;
101107
102108 for ( key, value) in map {
103109 let owner = TEAM_REGEX . captures ( key) . and_then ( |cap| cap. get ( 1 ) ) . map ( |m| m. as_str ( ) ) ;
104110 assert_eq ! ( owner, Some ( value) ) ;
105111 }
106112 }
107113
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- ] ;
213114
214- let iterations = 10000 ;
215- let start = Instant :: now ( ) ;
216115
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- }
249116
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- }
257117
258- #[ test]
259- fn test_malformed_files ( ) {
260- let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
261118
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- ] ;
268119
269- for ( filename, content) in malformed_cases {
270- let file_path = temp_dir. path ( ) . join ( filename) ;
271- std:: fs:: write ( & file_path, content) . unwrap ( ) ;
120+
272121
273- // Should not panic
274- let project_file = build_project_file_without_cache ( & file_path) ;
275122
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- }
298123
299- #[ test]
300- fn test_cross_platform_line_endings ( ) {
301- let temp_dir = tempfile:: tempdir ( ) . unwrap ( ) ;
302124
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- ] ;
308125
309- for ( filename, content) in test_cases {
310- let file_path = temp_dir. path ( ) . join ( filename) ;
311- std:: fs:: write ( & file_path, content) . unwrap ( ) ;
312126
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- }
323127}
0 commit comments