diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..be99d70 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# Godot 4+ specific ignores +.godot/ +*.tmp + +# Godot-specific ignores +.import/ +export.cfg +export_presets.cfg + +# Imported translations (automatically generated from CSV files) +*.translation + +# Mono/C# specific ignores +.mono/ +data_*/ +mono_crash.*.json + +# System/tool-specific ignores +.directory +*~ +*.uid + +# macOS +.DS_Store +.AppleDouble +.LSOverride + +# Windows +Thumbs.db +ehthumbs.db +Desktop.ini + +# VS Code +.vscode/ + +# JetBrains +.idea/ \ No newline at end of file diff --git a/README.md b/README.md index aed9a72..627ad97 100644 --- a/README.md +++ b/README.md @@ -252,7 +252,7 @@ Mood transition data includes: - `old_mood`: The NPC's previous mood - `confidence`: How confident the AI is about this mood change (0.0-1.0) - `reasoning`: AI's explanation for why the mood changed -- `stress_level`: Current stress level (1-10) +- `stress_level`: Current stress level (1-9) ## NPC Properties diff --git a/tests/test_npc_features.gd b/tests/test_npc_features.gd deleted file mode 100644 index e7ae9ad..0000000 --- a/tests/test_npc_features.gd +++ /dev/null @@ -1,218 +0,0 @@ -extends GutTest -# Unit tests for NPC chat history and serialization features - -var mock_client -var test_npc - - -func before_each(): - # Create a mock client - mock_client = Node.new() - - # Create a test NPC with sample data - var npc_data = { - "npc_id": 123456789, - "name": "Test Merchant", - "profession": "merchant", - "personality_type": 7, - "universe_id": "test-universe", - "seed": 42, - "spawned": {"location": "market", "mood": "friendly", "stress_level": 3}, - "cached": false, - "cache_url": "" - } - test_npc = GumYumNPC.new(npc_data, mock_client) - - -func after_each(): - if mock_client: - mock_client.queue_free() - - -func test_chat_history_starts_empty(): - assert_eq(test_npc.chat_history.size(), 0, "Chat history should start empty") - - -func test_chat_history_tracking(): - # Simulate adding messages to history - test_npc.chat_history.append({"role": "user", "content": "Hello there!"}) - test_npc.chat_history.append({"role": "assistant", "content": "Greetings, traveler!"}) - - assert_eq(test_npc.chat_history.size(), 2, "Should have 2 messages") - assert_eq(test_npc.chat_history[0]["role"], "user") - assert_eq(test_npc.chat_history[1]["content"], "Greetings, traveler!") - - -func test_clear_history(): - # Add some messages - test_npc.chat_history.append({"role": "user", "content": "Test 1"}) - test_npc.chat_history.append({"role": "assistant", "content": "Response 1"}) - - # Clear history - test_npc.clear_history() - - assert_eq(test_npc.chat_history.size(), 0, "History should be empty after clear") - - -func test_chat_history_to_json(): - # Add test messages - test_npc.chat_history.append({"role": "user", "content": "What are you selling?"}) - test_npc.chat_history.append({"role": "assistant", "content": "Fine weapons and armor!"}) - - var json_str = test_npc.chat_history_to_json() - assert_ne(json_str, "", "JSON should not be empty") - - # Parse it back to verify - var json = JSON.new() - var parse_result = json.parse(json_str) - assert_eq(parse_result, OK, "Should parse valid JSON") - assert_eq(json.data.size(), 2, "Should have 2 messages") - assert_eq(json.data[0]["content"], "What are you selling?") - - -func test_to_dict(): - # Add some chat history - test_npc.chat_history.append({"role": "user", "content": "Hello"}) - - var dict = test_npc.to_dict() - - # Verify all fields are present - assert_has(dict, "npc_id") - assert_has(dict, "name") - assert_has(dict, "profession") - assert_has(dict, "personality_type") - assert_has(dict, "universe_id") - assert_has(dict, "seed") - assert_has(dict, "spawned") - assert_has(dict, "chat_history") - - # Verify values - assert_eq(dict["npc_id"], 123456789) - assert_eq(dict["name"], "Test Merchant") - assert_eq(dict["profession"], "merchant") - assert_eq(dict["chat_history"].size(), 1) - - -func test_to_json(): - var json_str = test_npc.to_json() - assert_ne(json_str, "", "JSON should not be empty") - - # Parse to verify it's valid - var json = JSON.new() - var parse_result = json.parse(json_str) - assert_eq(parse_result, OK, "Should produce valid JSON") - assert_eq(json.data["name"], "Test Merchant") - - -func test_from_dict(): - # Create dict with test data - var test_data = { - "npc_id": 987654321, - "name": "Guard Captain", - "profession": "guard", - "personality_type": 1, - "universe_id": "kingdom", - "seed": 100, - "spawned": {"location": "castle", "mood": "stern", "stress_level": 5}, - "chat_history": - [ - {"role": "user", "content": "Who goes there?"}, - {"role": "assistant", "content": "State your business!"} - ] - } - - var loaded_npc = GumYumNPC.from_dict(test_data, mock_client) - - assert_not_null(loaded_npc, "Should create NPC from dict") - assert_eq(loaded_npc.npc_id, 987654321) - assert_eq(loaded_npc.name, "Guard Captain") - assert_eq(loaded_npc.profession, "guard") - assert_eq(loaded_npc.chat_history.size(), 2) - assert_eq(loaded_npc.client, mock_client) - - -func test_from_json(): - # Create JSON string - var json_data = { - "npc_id": 111222333, - "name": "Wise Elder", - "profession": "sage", - "personality_type": 5, - "universe_id": "fantasy", - "seed": 777, - "spawned": {"location": "temple", "mood": "contemplative"}, - "chat_history": [] - } - var json_str = JSON.stringify(json_data) - - var loaded_npc = GumYumNPC.from_json(json_str, mock_client) - - assert_not_null(loaded_npc, "Should create NPC from JSON") - assert_eq(loaded_npc.name, "Wise Elder") - assert_eq(loaded_npc.universe_id, "fantasy") - - -func test_from_json_invalid(): - var invalid_json = "{ invalid json [" - var loaded_npc = GumYumNPC.from_json(invalid_json, mock_client) - - assert_null(loaded_npc, "Should return null for invalid JSON") - - -func test_round_trip_serialization(): - # Add chat history - test_npc.chat_history.append({"role": "user", "content": "Test message 1"}) - test_npc.chat_history.append({"role": "assistant", "content": "Test response 1"}) - - # Convert to JSON and back - var json_str = test_npc.to_json() - var restored_npc = GumYumNPC.from_json(json_str, mock_client) - - assert_not_null(restored_npc, "Should restore NPC") - assert_eq(restored_npc.npc_id, test_npc.npc_id) - assert_eq(restored_npc.name, test_npc.name) - assert_eq(restored_npc.chat_history.size(), 2) - assert_eq(restored_npc.chat_history[0]["content"], "Test message 1") - - -func test_save_to_file(): - # Note: This test requires file system access - var test_path = "user://test_npc_save.json" - - # Add some data - test_npc.chat_history.append({"role": "user", "content": "Save test"}) - - var result = test_npc.save_to_file(test_path) - assert_eq(result, OK, "Should save successfully") - - # Verify file exists - var file = FileAccess.open(test_path, FileAccess.READ) - assert_not_null(file, "File should exist") - if file: - file.close() - - # Clean up - DirAccess.remove_absolute(test_path) - - -func test_load_from_file(): - # First save an NPC - var test_path = "user://test_npc_load.json" - test_npc.chat_history.append({"role": "user", "content": "Load test"}) - test_npc.save_to_file(test_path) - - # Load it back - var loaded_npc = GumYumNPC.load_from_file(test_path, mock_client) - - assert_not_null(loaded_npc, "Should load NPC from file") - assert_eq(loaded_npc.name, test_npc.name) - assert_eq(loaded_npc.chat_history.size(), 1) - assert_eq(loaded_npc.chat_history[0]["content"], "Load test") - - # Clean up - DirAccess.remove_absolute(test_path) - - -func test_load_from_nonexistent_file(): - var loaded_npc = GumYumNPC.load_from_file("user://does_not_exist.json", mock_client) - assert_null(loaded_npc, "Should return null for nonexistent file") diff --git a/tests/test_npc_features.gd.uid b/tests/test_npc_features.gd.uid deleted file mode 100644 index 8eefc76..0000000 --- a/tests/test_npc_features.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b5q5lpoo3s2dj