116 lines
3.7 KiB
Python
116 lines
3.7 KiB
Python
"""Tests for PromptSection - 模块化 Prompt 段落"""
|
|
|
|
import pytest
|
|
|
|
from agentkit.prompts.section import PromptSection
|
|
|
|
|
|
class TestPromptSectionInit:
|
|
"""PromptSection 初始化测试"""
|
|
|
|
def test_default_all_empty(self):
|
|
section = PromptSection()
|
|
assert section.identity == ""
|
|
assert section.context == ""
|
|
assert section.instructions == ""
|
|
assert section.constraints == ""
|
|
assert section.output_format == ""
|
|
assert section.examples == ""
|
|
|
|
def test_custom_fields(self):
|
|
section = PromptSection(
|
|
identity="Bot",
|
|
context="Context info",
|
|
instructions="Do things",
|
|
constraints="Be safe",
|
|
output_format="JSON",
|
|
examples="Q: hi A: hello",
|
|
)
|
|
assert section.identity == "Bot"
|
|
assert section.context == "Context info"
|
|
assert section.instructions == "Do things"
|
|
assert section.constraints == "Be safe"
|
|
assert section.output_format == "JSON"
|
|
assert section.examples == "Q: hi A: hello"
|
|
|
|
|
|
class TestPromptSectionRender:
|
|
"""PromptSection.render 渲染测试"""
|
|
|
|
def test_render_empty_section(self):
|
|
section = PromptSection()
|
|
assert section.render() == ""
|
|
|
|
def test_render_single_field(self):
|
|
section = PromptSection(identity="I am a bot")
|
|
assert section.render() == "I am a bot"
|
|
|
|
def test_render_multiple_fields_joined(self):
|
|
section = PromptSection(
|
|
identity="Bot",
|
|
instructions="Do stuff",
|
|
)
|
|
result = section.render()
|
|
assert result == "Bot\n\nDo stuff"
|
|
|
|
def test_render_all_fields(self):
|
|
section = PromptSection(
|
|
identity="I",
|
|
context="C",
|
|
instructions="Ins",
|
|
constraints="Con",
|
|
output_format="O",
|
|
examples="E",
|
|
)
|
|
result = section.render()
|
|
assert result == "I\n\nC\n\nIns\n\nCon\n\nO\n\nE"
|
|
|
|
def test_render_skips_empty_fields(self):
|
|
section = PromptSection(
|
|
identity="Bot",
|
|
constraints="Be safe",
|
|
)
|
|
result = section.render()
|
|
assert result == "Bot\n\nBe safe"
|
|
|
|
def test_render_with_variable_substitution(self):
|
|
section = PromptSection(
|
|
identity="Hello ${name}",
|
|
context="You are in ${place}",
|
|
)
|
|
result = section.render(variables={"name": "Alice", "place": "Wonderland"})
|
|
assert "Hello Alice" in result
|
|
assert "You are in Wonderland" in result
|
|
|
|
def test_render_unsubstituted_variables_remain(self):
|
|
section = PromptSection(context="Hello ${name}")
|
|
result = section.render()
|
|
assert result == "Hello ${name}"
|
|
|
|
def test_render_partial_variable_substitution(self):
|
|
section = PromptSection(
|
|
context="Hello ${name}, ${unknown} stays",
|
|
)
|
|
result = section.render(variables={"name": "Bob"})
|
|
assert "Hello Bob, ${unknown} stays" == result
|
|
|
|
def test_render_variable_value_converted_to_string(self):
|
|
section = PromptSection(context="Count: ${count}")
|
|
result = section.render(variables={"count": 42})
|
|
assert result == "Count: 42"
|
|
|
|
def test_render_none_variables_treated_as_empty(self):
|
|
section = PromptSection(context="Hello ${name}")
|
|
result = section.render(variables=None)
|
|
assert result == "Hello ${name}"
|
|
|
|
def test_render_preserves_field_order(self):
|
|
section = PromptSection(
|
|
examples="E",
|
|
identity="I",
|
|
context="C",
|
|
)
|
|
result = section.render()
|
|
# 渲染顺序应为 identity, context, ..., examples
|
|
assert result.index("I") < result.index("C") < result.index("E")
|