package org.jboss.resteasy.test.resource;

import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.resteasy.test.resource.resource.ContextResolver1;
import org.jboss.resteasy.test.resource.resource.ContextResolver2;
import org.jboss.resteasy.test.resource.resource.ContextResolver3;
import org.jboss.resteasy.test.resource.resource.ContextResolver4;
import org.jboss.resteasy.test.resource.resource.ContextResolver5;
import org.jboss.resteasy.test.resource.resource.ContextResolver6;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.ext.ContextResolver;

/**
 * @tpSubChapter Resource
 * @tpChapter Unit tests
 * @tpTestCaseDetails Test for jakarta.ws.rs.ext.ContextResolver class.
 * @tpSince RESTEasy 3.0.16
 */
public class ContextResolverTest {
   @BeforeClass
   public static void before() {
      ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
      factory.registerProvider(ContextResolver1.class);
      factory.registerProvider(ContextResolver2.class);
      factory.registerProvider(ContextResolver3.class);
      factory.registerProvider(ContextResolver4.class);
      factory.registerProvider(ContextResolver5.class);
      factory.registerProvider(ContextResolver6.class);
   }

   /**
    * @tpTestDetails Test contexts for various types.
    * @tpSince RESTEasy 3.0.16
    */
   @Test
   public void testContextResolver() {
      String errMsg = "Failed to get context by ContextResolver";
      ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
      ContextResolver<String> resolver = factory.getContextResolver(String.class, MediaType.TEXT_PLAIN_TYPE);
      Assert.assertEquals(errMsg, resolver.getContext(int.class), "2");
      Assert.assertEquals(errMsg, resolver.getContext(float.class), "5");
      resolver = factory.getContextResolver(String.class, MediaType.TEXT_XML_TYPE);
      Assert.assertEquals(errMsg, resolver.getContext(int.class), "3");
      Assert.assertEquals(errMsg, resolver.getContext(float.class), "6");
      resolver = factory.getContextResolver(String.class, MediaType.APPLICATION_ATOM_XML_TYPE);
      Assert.assertEquals(errMsg, resolver.getContext(int.class), "1");
      Assert.assertEquals(errMsg, resolver.getContext(float.class), "4");
      Assert.assertNull("Unexpected context was returned by ContextResolver",
            resolver.getContext(double.class));
      Assert.assertNull("Unexpected context was returned by ContextResolver",
            factory.getContextResolver(Double.class, MediaType.APPLICATION_ATOM_XML_TYPE));
   }

}
