/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jboss.test.dbtest.test;

import java.rmi.*;
import java.util.Collection;

import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;
import javax.ejb.DuplicateKeyException;
import javax.ejb.EJBMetaData;
import javax.ejb.FinderException;
import javax.ejb.Handle;

import javax.naming.Context;
import javax.naming.InitialContext;

import junit.framework.*;

import org.jboss.test.dbtest.interfaces.AllTypes;
import org.jboss.test.dbtest.interfaces.AllTypesHome;
import org.jboss.test.dbtest.interfaces.MyObject;
import org.jboss.test.dbtest.interfaces.Record;
import org.jboss.test.dbtest.interfaces.RecordHome;

import org.jboss.test.JBossTestCase;

/**
 * Test case to try out all db types using cmp against DefaultDS
 */
public class DbTypesUnitTestCase
       extends JBossTestCase
{

   static boolean deployed = false;

   /**
    * Constructor for the DbTypesUnitTestCase object
    *
    * @param name  Description of Parameter
    */
   public DbTypesUnitTestCase(String name)
   {
      super(name);
   }




   /**
    * A unit test for JUnit
    *
    * @exception Exception  Description of Exception
    */
   public void testAllTypesBean() throws Exception
   {
      int test = 0;

      Context ctx = new InitialContext();

      getLog().debug(++test + "- " + "Looking up the home AllTypes...");

      AllTypesHome allTypesHome;

      try
      {
         allTypesHome = (AllTypesHome)ctx.lookup("AllTypes");

         if (allTypesHome == null)
         {
            throw new Exception("abort");
         }
         getLog().debug("OK");

      }
      catch (Exception e)
      {
         getLog().debug("Could not lookup the context:  the beans are probably not deployed");
         getLog().debug("Check the server trace for details");
         log.debug("failed", e);
         throw new Exception();
      }

      getLog().debug(++test + "- " + "Calling findByPrimaryKey on AllTypesHome with name seb...");

      AllTypes allTypes = null;

      try
      {
         allTypes = allTypesHome.findByPrimaryKey("seb");
      }
      catch (Exception e)
      {
         getLog().debug(e.getMessage());
      }

      if (allTypes == null)
      {

         getLog().debug("not found OK");
         getLog().debug(++test + "- " + "Calling create on AllTypesHome with name seb...");
         allTypes = allTypesHome.create("seb");
      }

      if (allTypes != null)
      {
         getLog().debug("OK");
      }
      else
      {
         getLog().debug("Could not find or create the alltypes bean");
         getLog().debug("Check the server trace for details");

         throw new Exception();
      }

      getLog().debug("Getting all the fields");
      getLog().debug(++test + "- " + "boolean " + allTypes.getBoolean() + " OK");
      getLog().debug(++test + "- " + "byte " + allTypes.getByte() + " OK");
      getLog().debug(++test + "- " + "short " + allTypes.getShort() + " OK");
      getLog().debug(++test + "- " + "int " + allTypes.getInt() + " OK");
      getLog().debug(++test + "- " + "long " + allTypes.getLong() + " OK");
      getLog().debug(++test + "- " + "float " + allTypes.getFloat() + " OK");
      getLog().debug(++test + "- " + "double " + allTypes.getDouble() + " OK");
      getLog().debug("No char test yet, bug in jdk");
      getLog().debug(++test + "- " + "String " + allTypes.getString() + " OK");
      getLog().debug(++test + "- " + "Date " + allTypes.getDate() + " OK");
      getLog().debug(++test + "- " + "Time " + allTypes.getTime() + " OK");
      getLog().debug(++test + "- " + "Timestamp " + allTypes.getTimestamp() + " OK");

      getLog().debug(++test + "- " + "MyObject ");
      MyObject obj = allTypes.getObject();
      getLog().debug("OK");

      getLog().debug(++test + "- " + "Creating Record beans and adding them to the Collection in Alltypes..");
      RecordHome recordHome = (RecordHome)ctx.lookup("Record");

      Record[] record = new Record[3];
      for (int i = 0; i < 3; i++)
      {
         try
         {
            record[i] = recordHome.findByPrimaryKey("bill " + i);
         }
         catch (FinderException e)
         {
            record[i] = recordHome.create("bill " + i);
         }

         record[i].setAddress("SanFrancisco, CA 9411" + i);
         allTypes.addObjectToList(record[i]);
      }
      getLog().debug("OK");

      getLog().debug(++test + "- " + "Getting them back..");

      Collection collection = allTypes.getObjectList();
      boolean ok = true;

      for (int i = 0; i < 3; i++)
      {
         ok = ok && collection.contains(record[i]);
      }

      if (ok)
      {
         getLog().debug("OK");
      }
      else
      {
         getLog().debug("failed");
         throw new Exception("abort");
      }

      getLog().debug("All basic tests passed; Now testing min/max values.");
      getLog().debug("This is just for information, it's okay if some fail.");
      getLog().debug("Not all DBs have a column type that supports 8-byte numbers.");
      // NOTE: In order from most likely to fail to least likely to fail
      //       Oracle in particular demonstrates cascading failures and
      //       we don't want to miss that

      // Double
      try
      {
         allTypes.setDouble(Double.MIN_VALUE);
         double d;
         if ((d = allTypes.getDouble()) == Double.MIN_VALUE)
         {
            getLog().debug(++test + "- Double Min Value OK");
         }
         else
         {
            getLog().debug(++test + "- Double Min Value Different (" + d + " <> " + Double.MIN_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Double Min Value Failed");
      }
      try
      {
         allTypes.setDouble(Double.MAX_VALUE);
         double d;
         if ((d = allTypes.getDouble()) == Double.MAX_VALUE)
         {
            getLog().debug(++test + "- Double Max Value OK");
         }
         else
         {
            getLog().debug(++test + "- Double Max Value Different (" + d + " <> " + Double.MAX_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Double Max Value Failed");
      }
      // Float
      try
      {
         allTypes.setFloat(Float.MIN_VALUE);
         float f;
         if ((f = allTypes.getFloat()) == Float.MIN_VALUE)
         {
            getLog().debug(++test + "- Float Min Value OK");
         }
         else
         {
            getLog().debug(++test + "- Float Min Value Different (" + f + " <> " + Float.MIN_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Float Min Value Failed");
      }
      try
      {
         allTypes.setFloat(Float.MAX_VALUE);
         float f;
         if ((f = allTypes.getFloat()) == Float.MAX_VALUE)
         {
            getLog().debug(++test + "- Float Max Value OK");
         }
         else
         {
            getLog().debug(++test + "- Float Max Value Different (" + f + " <> " + Float.MAX_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Float Max Value Failed");
      }

      // Long
      try
      {
         allTypes.setLong(Long.MIN_VALUE);
         long l;
         if ((l = allTypes.getLong()) == Long.MIN_VALUE)
         {
            getLog().debug(++test + "- Long Min Value OK");
         }
         else
         {
            getLog().debug(++test + "- Long Min Value Different (" + l + " <> " + Long.MIN_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Long Min Value Failed");
      }
      try
      {
         allTypes.setLong(Long.MAX_VALUE);
         long l;
         if ((l = allTypes.getLong()) == Long.MAX_VALUE)
         {
            getLog().debug(++test + "- Long Max Value OK");
         }
         else
         {
            getLog().debug(++test + "- Long Max Value Different (" + l + " <> " + Long.MAX_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Long Max Value Failed");
      }
      // Short
      try
      {
         allTypes.setShort(Short.MIN_VALUE);
         short s;
         if ((s = allTypes.getShort()) == Short.MIN_VALUE)
         {
            getLog().debug(++test + "- Short Min Value OK");
         }
         else
         {
            getLog().debug(++test + "- Short Min Value Different (" + s + " <> " + Short.MIN_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Short Min Value Failed");
      }
      try
      {
         allTypes.setShort(Short.MAX_VALUE);
         short s;
         if ((s = allTypes.getShort()) == Short.MAX_VALUE)
         {
            getLog().debug(++test + "- Short Max Value OK");
         }
         else
         {
            getLog().debug(++test + "- Short Max Value Different (" + s + " <> " + Short.MAX_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Short Max Value Failed");
      }
      // Byte
      try
      {
         allTypes.setByte(Byte.MIN_VALUE);
         byte b;
         if ((b = allTypes.getByte()) == Byte.MIN_VALUE)
         {
            getLog().debug(++test + "- Byte Min Value OK");
         }
         else
         {
            getLog().debug(++test + "- Byte Min Value Different (" + b + " <> " + Byte.MIN_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Byte Min Value Failed");
      }
      try
      {
         allTypes.setByte(Byte.MAX_VALUE);
         byte b;
         if ((b = allTypes.getByte()) == Byte.MAX_VALUE)
         {
            getLog().debug(++test + "- Byte Max Value OK");
         }
         else
         {
            getLog().debug(++test + "- Byte Max Value Different (" + b + " <> " + Byte.MAX_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Byte Max Value Failed");
      }
      // Int
      try
      {
         allTypes.setInt(Integer.MIN_VALUE);
         int i;
         if ((i = allTypes.getInt()) == Integer.MIN_VALUE)
         {
            getLog().debug(++test + "- Int Min Value OK");
         }
         else
         {
            getLog().debug(++test + "- Int Min Value Different (" + i + " <> " + Integer.MIN_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Int Min Value Failed");
      }
      try
      {
         allTypes.setInt(Integer.MAX_VALUE);
         int i;
         if ((i = allTypes.getInt()) == Integer.MAX_VALUE)
         {
            getLog().debug(++test + "- Int Max Value OK");
         }
         else
         {
            getLog().debug(++test + "- Int Max Value Different (" + i + " <> " + Integer.MAX_VALUE + ")");
         }
      }
      catch (Exception e)
      {
         getLog().debug(++test + "- Int Max Value Failed");
      }
   }


   public static Test suite() throws Exception
   {
      return getDeploySetup(DbTypesUnitTestCase.class, "dbtest.jar");
   }

}
