import unittest
from unittest.mock import MagicMock, patch
import sys
import os

# Ensure project root is in path so we can import src.gui_2
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if project_root not in sys.path:
 sys.path.insert(0, project_root)

class TestMarkdownTableWidth(unittest.TestCase):
 def test_render_discussion_entry_full_width(self):
  """
  Verify that render_discussion_entry calls imgui.dummy with the full available width.
  """
  # Mock all dependencies to avoid side effects and complex setup during import/execution
  with patch('src.gui_2.imgui') as mock_imgui, \
       patch('src.gui_2.imscope') as mock_imscope, \
       patch('src.gui_2.theme') as mock_theme, \
       patch('src.gui_2.project_manager') as mock_pm, \
       patch('src.gui_2.render_thinking_trace') as mock_rtt, \
       patch('src.gui_2.render_discussion_entry_read_mode') as mock_rderm:

   # 1. Setup available width and coordinates
   expected_width = 850.0
   mock_avail = MagicMock()
   mock_avail.x = expected_width
   mock_imgui.get_content_region_avail.return_value = mock_avail

   # Mock ImVec2 to return a simple tuple for easier assertion
   mock_imgui.ImVec2.side_effect = lambda x, y: (x, y)

   # 3. Mock app and entry state
   mock_app = MagicMock()
   mock_app.disc_roles = ["User", "Assistant"]

   entry = {
    "role": "User",
    "content": "Hello world",
    "collapsed": False,
    "read_mode": False
   }

   # Mock interactive elements
   mock_imgui.begin_combo.return_value = False
   mock_imgui.button.return_value = False
   mock_imgui.input_text_multiline.return_value = (False, entry["content"])

   # 4. Import the function within the patch context
   from src.gui_2 import render_discussion_entry

   # 5. Execute the function
   render_discussion_entry(mock_app, entry, 0)

   # 6. Verification
   # The function should call imgui.dummy(imgui.ImVec2(full_width, 0))
   mock_imgui.dummy.assert_any_call((expected_width, 0.0))
   
   # CRITICAL: Verify newline or spacing is called to prevent squashing
   # We expect this to fail currently
   assert mock_imgui.new_line.called or mock_imgui.spacing.called

if __name__ == '__main__':
 unittest.main()
