package org.jboss.seam.test.integration.bpm;

import org.jboss.seam.mock.SeamTest;
import org.jbpm.jpdl.el.ELException;
import org.testng.annotations.Test;

/**
 * @author Pete Muir
 *
 */
public class SeamExpressionEvaluatorTest extends SeamTest
{

   // Test for JBSEAM-1937
   @Test
   public void testValueExpression() throws Exception
   {
      String cid = new FacesRequest()
      {

         @Override
         protected void invokeApplication() throws Exception
         {
            invokeAction("#{seamExpressionEvaluatorTestController.createProcess2}");
         }
          
      }.run();
   }
   
   // Test for JBSEAM-3250
   @Test
   public void testUnqualifiedValueExpression() throws Exception
   {
      new FacesRequest()
      {
         @Override
         protected void invokeApplication() throws Exception
         {
            invokeAction("#{seamExpressionEvaluatorTestController.createProcess4}");
         }
          
      }.run();
   }
   
   // Test for JBSEAM-2152
   @Test
   public void testMissingMethod() throws Exception
   {
      String cid = new FacesRequest()
      {

         @Override
         protected void invokeApplication() throws Exception
         {
            try
            {
               invokeAction("#{seamExpressionEvaluatorTestController.createProcess3}");
            }
            catch (Exception e)
            {
               if (!(isRootCause(e, ELException.class) || isRootCause(e, javax.el.ELException.class)))
               {
                  e.printStackTrace();
                  assert false;
               }
            }
         }
          
      }.run();
   }
   
   private static boolean isRootCause(Throwable t, Class clazz)
   {
      for (Throwable cause = t.getCause(); cause != null && cause != cause.getCause(); cause = cause.getCause())
      {
         if (clazz.isAssignableFrom(cause.getClass()))
         {
            return true;
         }
      }
      return false;
   }
   
}
