content: package backend.util;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertNotNull;
  import static org.junit.Assert.assertNull;
  import static org.junit.Assert.assertSame;
  import static org.junit.Assert.assertTrue;
  import static org.junit.Assert.fail;
  import org.junit.Before;
  import org.junit.Test;
  
  import es.alvarogrlp.marvelsimu.backend.model.UsuarioModel;
  import es.alvarogrlp.marvelsimu.backend.util.SessionManager;
  
  /**
   * Tests para la clase SessionManager
   */
  public class SessionManagerTest {
      
      @Before
      public void setUp() {
          // Aseguramos que la sesión esté limpia antes de cada test
          SessionManager.cerrarSesion();
      }
      
      @Test
      public void testGetInstance() {
          // Verificar que no devuelve null
          assertNotNull(SessionManager.getInstance());
          
          // Verificar que siempre devuelve la misma instancia
          SessionManager instance1 = SessionManager.getInstance();
          SessionManager instance2 = SessionManager.getInstance();
          assertSame(instance1, instance2);
      }
      
      @Test
      public void testSetAndGetUsuarioActual() {
          // Inicialmente el usuario debe ser null
          assertNull(SessionManager.getUsuarioActual());
          
          // Crear y establecer un usuario ficticio
          UsuarioModel usuario = new UsuarioModel();
          usuario.setNombre("testUser"); // Corregido: usar setNombre en lugar de setUsername
          
          SessionManager.setUsuarioActual(usuario);
          
          // Verificar que se ha establecido correctamente
          assertEquals("testUser", SessionManager.getUsuarioActual().getNombre()); // Corregido: usar getNombre
      }
      
      // Comentado temporalmente hasta implementar SelectionManager o crear un mock
      /*
      @Test
      public void testSetAndGetSelectionManager() {
          // Inicialmente debe ser null
          assertNull(SessionManager.getSelectionManager());
          
          // Crear y establecer un SelectionManager
          SelectionManager manager = new SelectionManager();
          SessionManager.setSelectionManager(manager);
          
          // Verificar que se ha establecido correctamente
          assertSame(manager, SessionManager.getSelectionManager());
      }
      */
      
      @Test
      public void testCerrarSesion() {
          // Establecer datos de sesión
          UsuarioModel usuario = new UsuarioModel();
          
          SessionManager.setUsuarioActual(usuario);
          // Comentado: SessionManager.setSelectionManager(manager);
          
          // Verificar que se han establecido
          assertNotNull(SessionManager.getUsuarioActual());
          // Comentado: assertNotNull(SessionManager.getSelectionManager());
          
          // Cerrar sesión
          SessionManager.cerrarSesion();
          
          // Verificar que los datos se han eliminado
          assertNull(SessionManager.getUsuarioActual());
          assertNull(SessionManager.getSelectionManager());
      }
      
      @Test
      public void testSingletonPattern() {
          // Probar el patrón singleton desde diferentes hilos
          Thread thread1 = new Thread(() -> {
              SessionManager instance1 = SessionManager.getInstance();
              assertNotNull(instance1);
          });
          
          Thread thread2 = new Thread(() -> {
              SessionManager instance2 = SessionManager.getInstance();
              assertNotNull(instance2);
          });
          
          thread1.start();
          thread2.start();
          
          try {
              thread1.join();
              thread2.join();
          } catch (InterruptedException e) {
              fail("Interrupción inesperada: " + e.getMessage());
          }
          
          // Si llegamos aquí, el test pasa
          assertTrue(true);
      }
      
      @Test
      public void testMultipleSessionChanges() {
          // Probar múltiples cambios en la sesión
          for (int i = 0; i < 5; i++) {
              UsuarioModel usuario = new UsuarioModel();
              usuario.setNombre("user" + i); // Corregido: usar setNombre
              SessionManager.setUsuarioActual(usuario);
              
              assertEquals("user" + i, SessionManager.getUsuarioActual().getNombre()); // Corregido: usar getNombre
              
              // Limpiar para la siguiente iteración
              SessionManager.cerrarSesion();
              assertNull(SessionManager.getUsuarioActual());
          }
      }
  }
  