import unittest
import os
import tempfile
import shutil
import bedrock_metrics
class TestBedrockMetrics(unittest.TestCase):
def setUp(self):
self.test_dir = tempfile.mkdtemp(prefix="bedrock_test_")
self.sub_dir = os.path.join(self.test_dir, "sub")
os.makedirs(self.sub_dir)
files_to_create_for_matching = [
("file_alpha.h", "apple banana\ncount_me_once"),
("file_beta.cc", "banana cherry\ncount_me_once\ncount_me_once"),
("file_gamma.mm", "apple cherry\nno_count_string"),
(os.path.join("sub", "file_delta.h"), "apple\ncount_me_once"),
("file_exclude_me.cc", "apple banana\ncontent for exclude"),
("other_extension.txt",
"apple banana\ntext file content"),
("empty_file.h", "")
]
for rel_path, content in files_to_create_for_matching:
full_path = os.path.join(self.test_dir, rel_path)
os.makedirs(os.path.dirname(full_path), exist_ok=True)
with open(full_path, 'w', encoding='utf-8') as f:
f.write(content)
self.lines_file1_path = os.path.join(self.test_dir, "lines_file1.data")
with open(self.lines_file1_path, 'w', encoding='utf-8') as f:
f.write("line1\nline2\nline3")
self.lines_file2_path = os.path.join(self.test_dir, "lines_file2.data")
with open(self.lines_file2_path, 'w', encoding='utf-8') as f:
f.write("single line")
self.lines_empty_file_path = os.path.join(self.test_dir, "lines_empty.data")
with open(self.lines_empty_file_path, 'w', encoding='utf-8') as f:
f.write("")
def tearDown(self):
shutil.rmtree(self.test_dir)
def test_cmf_no_filters_counts_valid_extensions(self):
count, str_count = bedrock_metrics.count_matching_files(self.test_dir)
self.assertEqual(count, 6, "File count mismatch with no filters")
self.assertEqual(str_count, 0,
"String count should be 0 with no content search strings")
def test_cmf_include_filename_single(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, include_filename_strings=["alpha"])
self.assertEqual(count, 1)
self.assertEqual(str_count, 0)
def test_cmf_include_filename_multiple_all_match(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, include_filename_strings=["file", "alpha"])
self.assertEqual(count, 1)
self.assertEqual(str_count, 0)
def test_cmf_include_filename_multiple_one_no_match(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, include_filename_strings=["alpha", "nomatch"])
self.assertEqual(count, 0)
self.assertEqual(str_count, 0)
def test_cmf_exclude_filename_single(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, exclude_filename_strings=["exclude"])
self.assertEqual(count, 5)
self.assertEqual(str_count, 0)
def test_cmf_include_file_content_strings_any_behavior_one_present(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, include_file_content_strings=["apple"])
self.assertEqual(count, 4)
self.assertEqual(str_count, 0)
def test_cmf_include_file_content_strings_any_behavior_multiple_options(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, include_file_content_strings=["apple", "cherry"])
self.assertEqual(count, 5)
self.assertEqual(str_count, 0)
def test_cmf_include_file_content_strings_none_present_in_content(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir,
include_file_content_strings=["nonexistent_string_pattern"])
self.assertEqual(count, 0)
self.assertEqual(str_count, 0)
def test_cmf_content_match_strings_single_term_count(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, content_match_strings=["count_me_once"])
self.assertEqual(
count, 6,
"File count should include all valid files for content counting")
self.assertEqual(str_count, 4, "String match count error")
def test_cmf_content_match_strings_multiple_terms_count(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, content_match_strings=["apple", "banana"])
self.assertEqual(count, 6)
self.assertEqual(str_count, 7)
def test_cmf_all_filters_combined(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir,
include_file_content_strings=["apple"],
content_match_strings=["count_me_once"],
include_filename_strings=["file"],
exclude_filename_strings=["exclude"])
self.assertEqual(count, 3)
self.assertEqual(str_count, 2)
def test_cmf_empty_directory(self):
empty_subdir_path = os.path.join(self.test_dir, "empty_subdir_for_test")
os.makedirs(empty_subdir_path)
count, str_count = bedrock_metrics.count_matching_files(empty_subdir_path)
self.assertEqual(count, 0)
self.assertEqual(str_count, 0)
def test_cmf_no_matching_extension_files_present(self):
other_ext_dir = os.path.join(self.test_dir, "other_ext_dir")
os.makedirs(other_ext_dir)
with open(os.path.join(other_ext_dir, "somefile.txt"), 'w') as f:
f.write("content")
count, str_count = bedrock_metrics.count_matching_files(other_ext_dir)
self.assertEqual(count, 0)
self.assertEqual(str_count, 0)
def test_cmf_include_file_content_strings_is_empty_list(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, include_file_content_strings=[])
self.assertEqual(count, 6)
self.assertEqual(str_count, 0)
def test_cmf_content_match_strings_is_empty_list(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, content_match_strings=[])
self.assertEqual(count, 6)
self.assertEqual(str_count, 0)
def test_cmf_content_match_strings_includes_empty_string(self):
count, str_count = bedrock_metrics.count_matching_files(
self.test_dir, content_match_strings=["count_me_once", ""])
self.assertEqual(count, 6)
self.assertEqual(str_count, 4)
def test_cl_single_file_multiple_lines(self):
self.assertEqual(bedrock_metrics.count_lines([self.lines_file1_path]), 3)
def test_cl_single_file_one_line_no_trailing_newline(self):
self.assertEqual(bedrock_metrics.count_lines([self.lines_file2_path]), 1)
def test_cl_multiple_files(self):
total_lines = bedrock_metrics.count_lines(
[self.lines_file1_path, self.lines_file2_path])
self.assertEqual(total_lines, 3 + 1)
def test_cl_empty_file(self):
self.assertEqual(bedrock_metrics.count_lines([self.lines_empty_file_path]),
0)
def test_cl_mixed_files_including_empty(self):
total_lines = bedrock_metrics.count_lines([
self.lines_file1_path, self.lines_empty_file_path, self.lines_file2_path
])
self.assertEqual(total_lines, 3 + 0 + 1)
def test_cl_empty_file_list(self):
self.assertEqual(bedrock_metrics.count_lines([]), 0)
if __name__ == '__main__':
unittest.main(verbosity=2)