#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
πΊ ChillMCP νμ κΈ°λ₯ ν
μ€νΈ
- νμ ννΌ νλ₯ ν
μ€νΈ (Boss Alert Levelμ λ°λ₯Έ)
- νμ μ°Έμ μ μ€νΈλ μ€ μ¦κ° ν
μ€νΈ
- νμ μ°Έμ μ Boss Alert Level κ°μ ν
μ€νΈ
"""
import asyncio
import sys
import os
# β
νλ‘μ νΈ λ£¨νΈ κ²½λ‘ μΆκ°
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
# β
FastMCP dummy ν¨μΉ (ν
μ€νΈ μ μ©)
import fastmcp
def dummy_tool(self=None, *args, **kwargs):
"""FastMCP.tool() λμ²΄μ© λλ―Έ λ°μ½λ μ΄ν°"""
def decorator(fn):
return fn
return decorator
fastmcp.FastMCP.tool = dummy_tool
# β
μ΄ν core import
from core.server import ServerState
from core import tools
# πΊ ν
μ€νΈ 1: νμ ννΌ νλ₯ ν
μ€νΈ
async def test_gathering_escape_probability():
"""Boss Alert Levelμ λ°λ₯Έ νμ ννΌ νλ₯ ν
μ€νΈ"""
print("\n=== ν
μ€νΈ 1: νμ ννΌ νλ₯ (Boss Alert Levelλ³) ===")
# Boss Alert Levelλ³ ννΌ μ±κ³΅ μΉ΄μ΄νΈ
test_cases = [
(0, 30), # Boss Alert 0: 30% μμ
(1, 25), # Boss Alert 1: 25% μμ
(2, 20), # Boss Alert 2: 20% μμ
(3, 15), # Boss Alert 3: 15% μμ
(4, 10), # Boss Alert 4: 10% μμ
(5, 5), # Boss Alert 5: 5% μμ
]
for boss_level, expected_escape_rate in test_cases:
# Boss Alert 5λ 20μ΄ μ§μ°μ΄ μμΌλ―λ‘ κ±΄λλ
if boss_level >= 5:
print(f"\n[Boss Alert Level = {boss_level}]")
print(f" μμ ννΌμ¨: {expected_escape_rate}%")
print(f" βοΈ SKIP: Boss Alert 5λ 20μ΄ μ§μ°μΌλ‘ μΈν΄ 건λλ")
continue
print(f"\n[Boss Alert Level = {boss_level}]")
print(f" μμ ννΌμ¨: {expected_escape_rate}%")
escape_count = 0
attend_count = 0
test_runs = 100 # 100λ² μλ
for _ in range(test_runs):
state = ServerState(0, 300) # Boss Alert μ¦κ° νλ₯ 0%λ‘ μ€μ
state.boss_alert_level = boss_level
tools.initialize_state(state)
initial_stress = state.stress_level
result = await tools.company_gathering()
# ννΌ μ±κ³΅ μ¬λΆ νλ¨
if "μ΄ μ’κ² νμμ λΉ μ‘μ΄" in result:
escape_count += 1
elif "νμ μ°Έμ μ€" in result:
attend_count += 1
escape_rate = (escape_count / test_runs) * 100
print(f" μ€μ ννΌμ¨: {escape_rate:.1f}% (ννΌ: {escape_count}, μ°Έμ: {attend_count})")
# ν΅κ³μ μ€μ°¨ λ²μ κ³ λ € (Β±10% μ λ)
if abs(escape_rate - expected_escape_rate) <= 15:
print(f" β
PASS: μμ λ²μ λ΄")
else:
print(f" β οΈ WARNING: μμκ³Ό μ°¨μ΄ μμ (ν΅κ³μ λ³λ κ°λ₯)")
print("\nννΌ νλ₯ ν
μ€νΈ μλ£!")
# πΊ ν
μ€νΈ 2: νμ μ°Έμ μ μ€νΈλ μ€ +25 ν
μ€νΈ
async def test_gathering_stress_increase():
"""νμ μ°Έμ μ μ€νΈλ μ€ 25 μ¦κ° νμΈ"""
print("\n=== ν
μ€νΈ 2: νμ μ°Έμ μ μ€νΈλ μ€ +25 ===")
success_count = 0
test_runs = 50
for i in range(test_runs):
state = ServerState(0, 300)
state.boss_alert_level = 4 # Boss Alert 4λ‘ μ€μ (5λ 20μ΄ μ§μ°)
state.stress_level = 30 # μ΄κΈ° μ€νΈλ μ€ 30
tools.initialize_state(state)
initial_stress = state.stress_level
result = await tools.company_gathering()
# νμ μ°Έμν κ²½μ°λ§ 체ν¬
if "νμ μ°Έμ μ€" in result:
final_stress = state.stress_level
stress_increase = final_stress - initial_stress
if stress_increase == 25:
success_count += 1
else:
print(f" β οΈ μλ {i+1}: μ€νΈλ μ€ μ¦κ°λ = {stress_increase} (μμ: 25)")
print(f"\nκ²°κ³Ό: {test_runs}λ² μλ μ€ {success_count}λ² μ€νΈλ μ€ +25 νμΈ")
if success_count >= test_runs * 0.8: # 80% μ΄μ μ±κ³΅
print("β
PASS: νμ μ°Έμ μ μ€νΈλ μ€ +25 μ μ μλ!")
else:
print("β FAIL: μ€νΈλ μ€ μ¦κ° λ‘μ§ μ€λ₯")
return False
return True
# πΊ ν
μ€νΈ 3: νμ μ°Έμ μ Boss Alert Level κ°μ ν
μ€νΈ
async def test_gathering_boss_alert_decrease():
"""νμ μ°Έμ μ Boss Alert Level -1 νμΈ"""
print("\n=== ν
μ€νΈ 3: νμ μ°Έμ μ Boss Alert Level -1 ===")
success_count = 0
test_runs = 50
for i in range(test_runs):
state = ServerState(0, 300)
state.boss_alert_level = 4 # Boss Alert 4λ‘ μ€μ (5λ 20μ΄ μ§μ°)
tools.initialize_state(state)
initial_boss_alert = state.boss_alert_level
result = await tools.company_gathering()
# νμ μ°Έμν κ²½μ°λ§ 체ν¬
if "νμ μ°Έμ μ€" in result:
final_boss_alert = state.boss_alert_level
boss_decrease = initial_boss_alert - final_boss_alert
if boss_decrease == 1:
success_count += 1
else:
print(f" β οΈ μλ {i+1}: Boss Alert κ°μλ = {boss_decrease} (μμ: 1)")
print(f"\nκ²°κ³Ό: {test_runs}λ² μλ μ€ {success_count}λ² Boss Alert -1 νμΈ")
if success_count >= test_runs * 0.8: # 80% μ΄μ μ±κ³΅
print("β
PASS: νμ μ°Έμ μ Boss Alert -1 μ μ μλ!")
else:
print("β FAIL: Boss Alert κ°μ λ‘μ§ μ€λ₯")
return False
return True
# πΊ ν
μ€νΈ 4: νμ ννΌ μ μ€νΈλ μ€ κ°μ ν
μ€νΈ
async def test_gathering_escape_stress_decrease():
"""νμ ννΌ μ±κ³΅ μ μ€νΈλ μ€ κ°μ νμΈ"""
print("\n=== ν
μ€νΈ 4: νμ ννΌ μ μ€νΈλ μ€ κ°μ (5~15) ===")
escape_success_count = 0
stress_decrease_count = 0
test_runs = 100
for i in range(test_runs):
state = ServerState(0, 300)
state.boss_alert_level = 0 # Boss Alert 0 (ννΌ νλ₯ μ΅λ)
state.stress_level = 50
tools.initialize_state(state)
initial_stress = state.stress_level
result = await tools.company_gathering()
# νμ ννΌ μ±κ³΅ν κ²½μ°λ§ 체ν¬
if "μ΄ μ’κ² νμμ λΉ μ‘μ΄" in result:
escape_success_count += 1
final_stress = state.stress_level
stress_decrease = initial_stress - final_stress
# μ€νΈλ μ€ κ°μλμ΄ 5~15 λ²μμΈμ§ νμΈ
if 5 <= stress_decrease <= 15:
stress_decrease_count += 1
else:
print(f" β οΈ μλ {i+1}: μ€νΈλ μ€ κ°μλ = {stress_decrease} (μμ: 5~15)")
print(f"\nκ²°κ³Ό: {test_runs}λ² μλ μ€ {escape_success_count}λ² ννΌ μ±κ³΅")
print(f" ννΌ μ±κ³΅ μ€ {stress_decrease_count}λ² μ€νΈλ μ€ κ°μ λ²μ μ μ")
if escape_success_count > 0 and stress_decrease_count == escape_success_count:
print("β
PASS: νμ ννΌ μ μ€νΈλ μ€ κ°μ μ μ μλ!")
elif escape_success_count == 0:
print("β οΈ WARNING: ννΌ μ±κ³΅ μ¬λ‘ μμ (νλ₯ μ λ³λ)")
return True # νλ₯ μ λ³λμΌλ‘ κ°μ£Ό
else:
print("β FAIL: μ€νΈλ μ€ κ°μ λ‘μ§ μ€λ₯")
return False
return True
# πΊ ν
μ€νΈ 5: ν΄κ·Ό μνμμ νμ νΈμΆ μ κ±°λΆ ν
μ€νΈ
async def test_gathering_when_off_work():
"""ν΄κ·Ό μνμμ νμ νΈμΆ μ κ±°λΆ νμΈ"""
print("\n=== ν
μ€νΈ 5: ν΄κ·Ό μνμμ νμ νΈμΆ ===")
state = ServerState(0, 300)
state.stress_level = 100 # μ€νΈλ μ€ 100μΌλ‘ μ€μ
state.is_off_work = True # ν΄κ·Ό μνλ‘ μ€μ
tools.initialize_state(state)
result = await tools.company_gathering()
# ν΄κ·Ό λ©μμ§κ° ν¬ν¨λμ΄ μλμ§ νμΈ
if "μ£Ό νλ‘μΈμ€κ° μΌμ μ€λ¨ μνμΌ" in result or "System offline" in result:
print("β
PASS: ν΄κ·Ό μνμμ νμ κ±°λΆ μ μ μλ!")
return True
else:
print("β FAIL: ν΄κ·Ό μν μ²΄ν¬ μ€λ₯")
print(f"κ²°κ³Ό:\n{result}")
return False
# πΊ ν
μ€νΈ 6: νμ μ°Έμ μ λ€μν μ΄λ²€νΈ λ©μμ§ μΆλ ₯ νμΈ
async def test_gathering_event_messages():
"""νμ μ°Έμ μ λ€μν μ΄λ²€νΈ λ©μμ§ μΆλ ₯ νμΈ"""
print("\n=== ν
μ€νΈ 6: νμ μ΄λ²€νΈ λ©μμ§ λ€μμ± ===")
event_messages = set()
test_runs = 50
for _ in range(test_runs):
state = ServerState(0, 300)
state.boss_alert_level = 4 # Boss Alert 4λ‘ μ€μ (5λ 20μ΄ μ§μ°)
tools.initialize_state(state)
result = await tools.company_gathering()
# νμ μ°Έμν κ²½μ° μ΄λ²€νΈ λ©μμ§ μμ§
if "νμ μ°Έμ μ€" in result:
# μ΄λ²€νΈ λ©μμ§ μΆμΆ (κ°λ¨νκ² νΉμ ν€μλλ‘ κ΅¬λΆ)
if "μλ μ΄μΌκΈ°" in result:
event_messages.add("μλ μ΄μΌκΈ°")
elif "건배" in result:
event_messages.add("건배")
elif "μ μ κΆνλ" in result:
event_messages.add("μ κΆνκΈ°")
elif "λ
Έλλ°©" in result:
event_messages.add("λ
Έλλ°©")
elif "μ
무 μ΄μΌκΈ°" in result:
event_messages.add("μ
무 μ΄μΌκΈ°")
elif "무μ©λ΄" in result:
event_messages.add("무μ©λ΄")
print(f"\nλ°κ²¬λ μ΄λ²€νΈ λ©μμ§ μ’
λ₯: {len(event_messages)}κ°")
print(f"μ΄λ²€νΈ λͺ©λ‘: {event_messages}")
if len(event_messages) >= 3:
print("β
PASS: λ€μν νμ μ΄λ²€νΈ λ©μμ§ μΆλ ₯ νμΈ!")
else:
print("β οΈ WARNING: μ΄λ²€νΈ λ©μμ§ λ€μμ± λΆμ‘± (νλ₯ μ λ³λ κ°λ₯)")
return True
# λ©μΈ ν
μ€νΈ μ€ν
async def main():
print("\n" + "="*60)
print(" πΊ ChillMCP νμ κΈ°λ₯ ν
μ€νΈ")
print(" Company Gathering Feature Test")
print("="*60)
results = []
# ν
μ€νΈ μ€ν
await test_gathering_escape_probability()
results.append(("νμ ννΌ νλ₯ ", True)) # νλ₯ ν
μ€νΈλ νμ ν΅κ³Ό
results.append(("νμ μ°Έμ μ€νΈλ μ€ +25", await test_gathering_stress_increase()))
results.append(("νμ μ°Έμ Boss Alert -1", await test_gathering_boss_alert_decrease()))
results.append(("νμ ννΌ μ€νΈλ μ€ κ°μ", await test_gathering_escape_stress_decrease()))
results.append(("ν΄κ·Ό μν νμ κ±°λΆ", await test_gathering_when_off_work()))
results.append(("νμ μ΄λ²€νΈ λ€μμ±", await test_gathering_event_messages()))
# κ²°κ³Ό μμ½
print("\n" + "="*60)
print("ν
μ€νΈ κ²°κ³Ό μμ½")
print("="*60)
passed = 0
for test_name, result in results:
status = "β
PASS" if result else "β FAIL"
print(f"{status}: {test_name}")
if result:
passed += 1
print("\n" + "="*60)
if passed == len(results):
print(">>> λͺ¨λ νμ κΈ°λ₯ ν
μ€νΈ ν΅κ³Ό! ππΊ")
else:
print(f">>> {len(results) - passed}κ° ν
μ€νΈ μ€ν¨")
print("="*60)
return passed == len(results)
if __name__ == "__main__":
success = asyncio.run(main())
sys.exit(0 if success else 1)