Skip to content

Commit 2ac967f

Browse files
refactor: Simplify tests to use existing test_team_regex function
- Remove redundant test functions (test_comprehensive_team_formats, test_team_annotation_edge_cases, etc.) - Update existing test_team_regex to include new team: format tests - Reduce change from ~220 lines to ~22 lines while maintaining same functionality - All 61 tests pass with minimal, focused change
1 parent d4e11e8 commit 2ac967f

File tree

1 file changed

+6
-216
lines changed

1 file changed

+6
-216
lines changed

src/project_file_builder.rs

Lines changed: 6 additions & 216 deletions
Original file line numberDiff line numberDiff line change
@@ -99,225 +99,15 @@ mod tests {
9999
map.insert("<!-- @team Blast -->", "Blast");
100100
map.insert("<!-- @team Blast Off -->", "Blast Off");
101101

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+
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
}
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:\tMyTeam\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\nclass Test; end"),
237-
("test2.rb", "# @team: MyTeam\nclass Test; end"),
238-
("test3.rb", "# team: MyTeam\nclass Test; end"),
239-
("test4.js", "// @team MyTeam\nfunction test() {}"),
240-
("test5.js", "// @team: MyTeam\nfunction test() {}"),
241-
("test6.js", "// team: MyTeam\nfunction 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 {}\nclass 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\nclass Test; end"),
305-
("windows.rb", "# @team MyTeam\r\nclass Test; end"),
306-
("mac.rb", "# @team MyTeam\rclass 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\rclass 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-
}
323113
}

0 commit comments

Comments
 (0)