alkaid_release_platform/tests/test_makefile_parser.py
ekko.bao 0a0f6a6054 初次创建仓库提交代码
1. 已经构建好了架子了。
2. 添加了示例的插件
2025-04-21 06:37:06 +00:00

141 lines
5.3 KiB
Python

import sys
import os
import tempfile
import shutil
from pathlib import Path
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
from utils.utils import MakefileParser
def test_makefile_parser_read():
"""测试 MakefileParser 类的读取功能"""
parser = MakefileParser(os.path.join(os.path.dirname(__file__), "data", "test.mk"))
with open(os.path.join(os.path.dirname(__file__), '.tmp', 'test_parsed.json'), 'w') as f:
f.write(f"{parser}")
# 测试获取简单变量
assert parser.get('SIMPLE_VAR') == ['simple', 'value']
# 测试获取使用不同分隔符的变量
assert parser.get('COLON_VAR') == ['immediately', 'expanded', 'value']
# 测试获取多行变量
multiline = parser.get('MULTILINE_VAR')
assert len(multiline) == 6
# 测试带注释的变量
assert parser.get('WITH_COMMENT')[0].startswith('value')
# 测试不存在的变量返回默认值
assert parser.get('NON_EXISTENT', 'default') == 'default'
# 测试复合变量
assert parser.get('COMPOUND_VAR') == ['$(SIMPLE_VAR)', 'and', '$(COLON_VAR)']
# 测试空变量
assert parser.get('EMPTY_VAR') == []
def test_makefile_parser_rw():
"""测试 MakefileParser 类的读写功能,看是否能够正确写回文件"""
src_file = os.path.join(os.path.dirname(__file__), "data", "test.mk")
parser = MakefileParser(src_file)
# new_file = os.path.join(os.path.dirname(__file__), 'test_rw.mk')
temp_dir = tempfile.mkdtemp()
new_file = os.path.join(temp_dir, 'test_copy.mk')
shutil.copy(os.path.join(os.path.dirname(__file__), "data", "test.mk"), new_file)
parser.flush(new_file)
try:
with open(new_file, 'r') as f:
with open(src_file, 'r') as f2:
# 由于一些格式控制符,导致读取的文件与原文件不一致,这里忽略空格进行比较
src = f2.read().replace(' ', '')
dst = f.read().replace(' ', '')
assert src == dst
finally:
# 清理临时文件
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir)
def test_makefile_parser_modify():
"""测试 MakefileParser 类的修改功能"""
# 创建测试文件的副本
temp_dir = tempfile.mkdtemp()
temp_file = os.path.join(temp_dir, 'test_copy.mk')
shutil.copy(os.path.join(os.path.dirname(__file__), "data", "test.mk"), temp_file)
try:
parser = MakefileParser(temp_file)
# 修改现有变量
parser['SIMPLE_VAR'] = 'modified value'
# 添加新变量
parser['NEW_VAR'] = 'new value'
#在SIMPLE_VAR前面插入新变量
# idx = parser.index('SIMPLE_VAR')
parser.insert('SIMPLE_VAR', 'NEW_VAR1', ':=', 'new value', '# comment')
# 添加多行变量
parser['NEW_MULTILINE'] = ['line 1', 'line 2', 'line 3']
# 删除变量
del parser['EMPTY_VAR']
# 使用正则
parser['REGEX_VAR'] = 'new value'
parser['REGEX_.* := new value'] = 'REGEX_VAR := regex value'
# 刷新到文件
parser.flush()
with open(os.path.join(os.path.dirname(__file__), '.tmp', 'test_parsed.json'), 'w') as f:
f.write(f"{parser}")
# 重新加载解析器验证修改
new_parser = MakefileParser(temp_file)
assert new_parser.get('SIMPLE_VAR') == ['modified', 'value']
assert new_parser.get('NEW_VAR') == ['new', 'value']
assert new_parser.get('NEW_VAR1') == ['new', 'value']
assert len(new_parser.get('NEW_MULTILINE')) == 6
assert new_parser.get('EMPTY_VAR') is None
assert new_parser.get('REGEX_VAR') == ['regex', 'value']
del new_parser['REGEX_VAR']
assert new_parser.get('REGEX_VAR') is None
finally:
# 清理临时文件
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir)
def test_makefile_parser_content_preservation():
"""测试 MakefileParser 类是否保留原始文件的注释和结构"""
# 创建测试文件的副本
temp_dir = tempfile.mkdtemp()
temp_file = os.path.join(temp_dir, 'test_copy.mk')
shutil.copy(os.path.join(os.path.dirname(__file__), "data", "test.mk"), temp_file)
try:
# 记录原始文件内容的行数和注释行数
with open(temp_file, 'r') as f:
original_lines = f.readlines()
original_line_count = len(original_lines)
original_comment_count = sum(1 for line in original_lines if line.strip().startswith('#'))
# 使用解析器进行一些简单修改
parser = MakefileParser(temp_file)
parser['SIMPLE_VAR'] = 'modified but preserving structure'
parser.flush()
# 检查修改后的文件是否保留了原始结构
with open(temp_file, 'r') as f:
modified_lines = f.readlines()
modified_line_count = len(modified_lines)
modified_comment_count = sum(1 for line in modified_lines if line.strip().startswith('#'))
assert original_line_count == modified_line_count
# 注释应该完全保留
assert original_comment_count == modified_comment_count
finally:
# 清理临时文件
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir)