Package org.teiid.query.function

Source Code of org.teiid.query.function.TestFunctionLibrary

/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.  Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library 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 library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/

package org.teiid.query.function;

import static org.junit.Assert.*;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Arrays;
import java.util.Collection;
import java.util.Properties;
import java.util.TimeZone;

import javax.sql.rowset.serial.SerialBlob;
import javax.sql.rowset.serial.SerialClob;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.teiid.api.exception.query.FunctionExecutionException;
import org.teiid.common.buffer.BufferManagerFactory;
import org.teiid.core.types.BlobType;
import org.teiid.core.types.ClobType;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.NullType;
import org.teiid.core.types.XMLType;
import org.teiid.core.types.DataTypeManager.DefaultDataClasses;
import org.teiid.core.util.Base64;
import org.teiid.core.util.ObjectConverterUtil;
import org.teiid.core.util.TimestampWithTimezone;
import org.teiid.language.SQLConstants.NonReserved;
import org.teiid.metadata.FunctionMethod.PushDown;
import org.teiid.query.unittest.FakeMetadataFactory;
import org.teiid.query.unittest.TimestampUtil;
import org.teiid.query.util.CommandContext;
import org.teiid.translator.SourceSystemFunctions;


@SuppressWarnings("nls")
public class TestFunctionLibrary {

  // These are just used as shorthand convenience to make unit tests more readable below
  private static final Class<String> T_STRING = DataTypeManager.DefaultDataClasses.STRING;
  private static final Class<Integer> T_INTEGER = DataTypeManager.DefaultDataClasses.INTEGER;
  private static final Class<BigInteger> T_BIG_INTEGER = DataTypeManager.DefaultDataClasses.BIG_INTEGER;
  private static final Class<? extends BigDecimal> T_BIG_DECIMAL = DataTypeManager.DefaultDataClasses.BIG_DECIMAL;   
    private static final Class<Long> T_LONG = DataTypeManager.DefaultDataClasses.LONG;
  private static final Class<Float> T_FLOAT = DataTypeManager.DefaultDataClasses.FLOAT;
    private static final Class<Double> T_DOUBLE = DataTypeManager.DefaultDataClasses.DOUBLE;
  private static final Class<NullType> T_NULL = DataTypeManager.DefaultDataClasses.NULL;
  private static final Class<Time> T_TIME = DataTypeManager.DefaultDataClasses.TIME;
  private static final Class<Date> T_DATE = DataTypeManager.DefaultDataClasses.DATE;
  private static final Class<Timestamp> T_TIMESTAMP = DataTypeManager.DefaultDataClasses.TIMESTAMP;
 
  private FunctionLibrary library = new FunctionLibrary(FakeMetadataFactory.SFM.getSystemFunctions());

  @Before public void setUp() {
    TimestampWithTimezone.resetCalendar(TimeZone.getTimeZone("GMT-06:00")); //$NON-NLS-1$
  }
 
  @After public void tearDown() {
    TimestampWithTimezone.resetCalendar(null);
  }
 
  // ################################## TEST HELPERS ################################
 
    private FunctionDescriptor helpCreateDescriptor(String name, Class<?>[] types) {
        final String fname = name;
        final Class<?>[] ftypes = types;
        return new FunctionDescriptor() {
            public String getName() {
                return fname;
            }
            public PushDown getPushdown() {
                return PushDown.CAN_PUSHDOWN;
            }
            public Class<?>[] getTypes() {
                return ftypes;
            }
            public Class<?> getReturnType() {
                return null;
            }
           
            public String toString() {
                StringBuffer str = new StringBuffer(fname);
                str.append("("); //$NON-NLS-1$
                for(int i=0; i<ftypes.length; i++) {
                    if(ftypes[i] != null) {
                        str.append(ftypes[i].getName());
                    } else {
                        str.append("null"); //$NON-NLS-1$
                    }      
                    if(i<(ftypes.length-1)) {
                        str.append(", "); //$NON-NLS-1$
                    }
                }
                return str.toString();
            }
            public boolean requiresContext() {
                return false;
            }
            public boolean isNullDependent() {
                return true;
            }
           
        };
    }
   
  private void helpFindFunction(String fname, Class<?>[] types, FunctionDescriptor expected) {
    FunctionDescriptor actual =  library.findFunction(fname, types);
 
        assertEquals("Function names do not match: ", expected.getName().toLowerCase(), actual.getName().toLowerCase());             //$NON-NLS-1$
        assertEquals("Arg lengths do not match: ", expected.getTypes().length, actual.getTypes().length); //$NON-NLS-1$
  }

  private void helpFindFunctionFail(String fname, Class<?>[] types) {
    FunctionDescriptor actual =  library.findFunction(fname, types);
    assertNull("Function was found but should not have been: " + actual, actual); //$NON-NLS-1$
  }
   
  private void helpFindConversions(String fname, Class<?>[] types, FunctionDescriptor[] expected) {

    FunctionDescriptor[] actual = library.determineNecessaryConversions(fname, null, types, false);
   
    if(expected == null) {
      if(actual != null) {
        fail("Expected to find no conversion for " + fname + Arrays.asList(types) + " but found: " + Arrays.asList(actual)); //$NON-NLS-1$ //$NON-NLS-2$
     
    } else {
      if(actual == null) {
        fail("Expected to find conversion for " + fname + Arrays.asList(types) + " but found none"); //$NON-NLS-1$ //$NON-NLS-2$
      } else {
        // Compare returned descriptors with expected descriptor
        for(int i=0; i<expected.length; i++) {
                    if(expected[i] == null) {
                        if(actual[i] != null) {
                            fail("Expected no conversion at index " + i + ", but found: " + actual[i]); //$NON-NLS-1$ //$NON-NLS-2$
                        }
                    } else {
                        if(actual[i] == null) {
                            fail("Expected conversion at index " + i + ", but found none.");                             //$NON-NLS-1$ //$NON-NLS-2$
                        } else {
                            assertEquals("Expected conversion function names do not match: ", expected[i].getName(), actual[i].getName());             //$NON-NLS-1$
                            assertEquals("Expected conversion arg lengths do not match: ", expected[i].getTypes().length, actual[i].getTypes().length);                         //$NON-NLS-1$
                        }       
                    }       
        }     
      }     
    }
  } 
 
  private void helpFindForm(String fname, int numArgs) {
    FunctionForm form = library.findFunctionForm(fname, numArgs);
        assertNotNull("Failed to find function '" + fname + "' with " + numArgs + " args", form); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
        assertEquals("Function names do not match: ", fname.toUpperCase(), form.getName().toUpperCase());             //$NON-NLS-1$
        assertEquals("Arg lengths do not match: ", numArgs, form.getArgNames().size()); //$NON-NLS-1$
  }

  private void helpInvokeMethod(String fname, Object[] inputs, Object expectedOutput) {
        try {
            helpInvokeMethod(fname, null, inputs, null, expectedOutput);
        } catch (Exception err) {
            throw new RuntimeException(err);
        }
  }
   
    private void helpInvokeMethod(String fname, Class<?>[] types, Object[] inputs, CommandContext context, Object expectedOutput) throws FunctionExecutionException {
      Object actualOutput = helpInvokeMethod(fname, types, inputs, context);
        assertEquals("Actual function output not equal to expected: ", expectedOutput, actualOutput); //$NON-NLS-1$
    }

  private Object helpInvokeMethod(String fname, Class<?>[] types,
      Object[] inputs, CommandContext context)
      throws FunctionExecutionException {
    if (types == null) {
            // Build type signature
            types = new Class<?>[inputs.length];
            for(int i=0; i<inputs.length; i++) {
                types[i] = DataTypeManager.determineDataTypeClass(inputs[i]);  
            }       
      }
      if (context == null) {
        context = new CommandContext();
      }
        Object actualOutput = null;
        // Find function descriptor
        FunctionDescriptor descriptor = library.findFunction(fname, types);        
        if (descriptor.requiresContext()) {
            // Invoke function with inputs
            Object[] in = new Object[inputs.length+1];
            in[0] = context;
            for (int i = 0; i < inputs.length; i++) {
                in[i+1] = inputs[i];
            }
            actualOutput = descriptor.invokeFunction(in);
        }
        else {
            // Invoke function with inputs
            actualOutput = descriptor.invokeFunction(inputs);               
        }
    return actualOutput;
  }
         
  private void helpInvokeMethodFail(String fname, Object[] inputs) {
       helpInvokeMethodFail(fname, null, inputs);
 
     
    private void helpInvokeMethodFail(String fname, Class<?> types[], Object[] inputs) {
      try {
            helpInvokeMethod(fname, types, inputs, null);
            fail("expected exception"); //$NON-NLS-1$
        } catch (FunctionExecutionException err) {
        }   
    }   
  // ################################## ACTUAL TESTS ################################
 
  @Test public void testFindFunction1() {
    helpFindFunction("convert", new Class<?>[] { T_INTEGER, T_STRING }, //$NON-NLS-1$
            helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_INTEGER, T_STRING }) );
  }
 
  @Test public void testFindFunction2() {
    helpFindFunction("cast", new Class<?>[] { T_INTEGER, T_STRING }, //$NON-NLS-1$
            helpCreateDescriptor(FunctionLibrary.CAST, new Class<?>[] { T_INTEGER, T_STRING }) );
  }
 
    @Test public void testFindFunction3() {
        helpFindFunction("curdate", new Class<?>[0], //$NON-NLS-1$
          helpCreateDescriptor("curdate", new Class<?>[0])); //$NON-NLS-1$
    }
  
    @Test public void testFindFunction4() {
        helpFindFunctionFail("curdate", new Class<?>[] { T_INTEGER }); //$NON-NLS-1$
    }
   
    @Test public void testFindFunction5() {
        helpFindFunction("+", new Class<?>[] { T_INTEGER, T_INTEGER }, //$NON-NLS-1$
          helpCreateDescriptor("+", new Class<?>[] { T_INTEGER, T_INTEGER }) ); //$NON-NLS-1$
    }
   
    @Test public void testFindFunction6() {
        helpFindFunctionFail("+", new Class<?>[] {T_INTEGER, T_FLOAT}); //$NON-NLS-1$
    }
   
    @Test public void testFindFunction7() {
        helpFindFunctionFail("+", new Class<?>[] {T_INTEGER, T_FLOAT, T_INTEGER}); //$NON-NLS-1$
    }
   
    @Test public void testFindFunction8() {
        helpFindFunctionFail("+", new Class<?>[] {T_INTEGER}); //$NON-NLS-1$
    }
   
    @Test public void testFindFunction9() {       
    helpFindFunctionFail("+", new Class<?>[] {T_INTEGER, T_NULL });     //$NON-NLS-1$
    }

    @Test public void testFindFunction10() {
        helpFindFunction("substring", new Class<?>[] { T_STRING, T_INTEGER, T_INTEGER }, //$NON-NLS-1$
            helpCreateDescriptor("substring", new Class<?>[] { T_STRING, T_INTEGER, T_INTEGER }) ); //$NON-NLS-1$
    }

    @Test public void testFindFunction11() {
        helpFindFunction("substring", new Class<?>[] { T_STRING, T_INTEGER }, //$NON-NLS-1$
            helpCreateDescriptor("substring", new Class<?>[] { T_STRING, T_INTEGER }) ); //$NON-NLS-1$
    }

    @Test public void testFindFunction12() {
        helpFindFunction("context", new Class<?>[] { T_STRING, T_INTEGER }, //$NON-NLS-1$
            helpCreateDescriptor("context", new Class<?>[] { T_STRING, T_INTEGER }) ); //$NON-NLS-1$
    }

    @Test public void testFindFunction12a() {
        helpFindFunction("rowlimit", new Class<?>[] { T_STRING }, //$NON-NLS-1$
            helpCreateDescriptor("rowlimit", new Class<?>[] { T_STRING }) ); //$NON-NLS-1$
    }

    @Test public void testFindFunction12b() {
        helpFindFunction("rowlimitexception", new Class<?>[] { T_STRING }, //$NON-NLS-1$
            helpCreateDescriptor("rowlimitexception", new Class<?>[] { T_STRING }) ); //$NON-NLS-1$
    }
   
  @Test public void testFind0ArgConversion1() {  
    helpFindConversions(
      "curdate", new Class<?>[] {}, //$NON-NLS-1$
      new FunctionDescriptor[0] );
  }

  @Test public void testFind0ArgConversion2() {  
    helpFindConversions(
      "curdate", new Class<?>[] { T_INTEGER }, //$NON-NLS-1$
      null );
  }

  @Test public void testFind1ArgConversion1() {  
    helpFindConversions(
      "length", new Class<?>[] { T_STRING }, //$NON-NLS-1$
      new FunctionDescriptor[1] );
  }

  @Test public void testFind1ArgConversion2() {  
    helpFindConversions(
      "length", new Class<?>[] { T_INTEGER }, //$NON-NLS-1$
      new FunctionDescriptor[] {
          helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_INTEGER, T_STRING })
      } );
  }

  @Test public void testFind1ArgConversion3() {  
    helpFindConversions(
      "length", new Class<?>[] { DataTypeManager.DefaultDataClasses.TIMESTAMP }, //$NON-NLS-1$
      new FunctionDescriptor[] {
          helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { DataTypeManager.DefaultDataClasses.TIMESTAMP, T_STRING })
      } );
  }

  @Test public void testFind2ArgConversion1() {  
    helpFindConversions(
      "+", new Class<?>[] { T_INTEGER, T_INTEGER }, //$NON-NLS-1$
      new FunctionDescriptor[2] );
  }

  @Test public void testFind2ArgConversion2() {  
    helpFindConversions(
      "+", new Class<?>[] { T_INTEGER, T_FLOAT }, //$NON-NLS-1$
      new FunctionDescriptor[] {
                helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_INTEGER, T_STRING }),
                helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_FLOAT, T_STRING }) } );
  }

  @Test public void testFind2ArgConversion3() {  
    helpFindConversions(
      "+", new Class<?>[] { T_FLOAT, T_INTEGER }, //$NON-NLS-1$
      new FunctionDescriptor[] {
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_FLOAT, T_STRING }),
                helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_INTEGER, T_STRING }) } );
  }

  @Test public void testFind2ArgConversion4() {  
    helpFindConversions(
      "+", new Class<?>[] { T_STRING, T_FLOAT }, //$NON-NLS-1$
      null );
  }

  @Test public void testFind2ArgConversion5() {  
    helpFindConversions(
      "+", new Class<?>[] { T_NULL, T_NULL }, //$NON-NLS-1$
      new FunctionDescriptor[] {
          helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }),
                helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }) } );
  }

  @Test public void testFind2ArgConversion6() {  
    helpFindConversions(
      "+", new Class<?>[] { T_NULL, T_INTEGER }, //$NON-NLS-1$
      new FunctionDescriptor[] {
          helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }),
        null } );
  }

  @Test public void testFind2ArgConversion7() {  
    helpFindConversions(
      "+", new Class<?>[] { T_INTEGER, T_NULL }, //$NON-NLS-1$
      new FunctionDescriptor[] {
          null,
          helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }) } );
  }

  @Test public void testFind3ArgConversion1() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_STRING, T_INTEGER, T_INTEGER }, //$NON-NLS-1$
      new FunctionDescriptor[3] );
  }

  @Test public void testFind3ArgConversion2() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_INTEGER, T_INTEGER, T_INTEGER }, //$NON-NLS-1$
      new FunctionDescriptor[] {
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_INTEGER, T_STRING }),
        null,
        null   
      } );
  }

  @Test public void testFind3ArgConversion3() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_INTEGER, T_INTEGER, DataTypeManager.DefaultDataClasses.SHORT }, //$NON-NLS-1$
      new FunctionDescriptor[] {
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_INTEGER, T_STRING }),
        null,
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { DataTypeManager.DefaultDataClasses.SHORT, T_STRING })   
      } );
  }

  @Test public void testFind3ArgConversion4() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_STRING, T_INTEGER, DataTypeManager.DefaultDataClasses.TIMESTAMP }, //$NON-NLS-1$
      null );
  }

  @Test public void testFind3ArgConversion5() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_STRING, DataTypeManager.DefaultDataClasses.SHORT, DataTypeManager.DefaultDataClasses.SHORT }, //$NON-NLS-1$
      new FunctionDescriptor[] {
          null,
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { DataTypeManager.DefaultDataClasses.SHORT, T_STRING }),   
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { DataTypeManager.DefaultDataClasses.SHORT, T_STRING })   
      } );
  }

  @Test public void testFind3ArgConversion6() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_INTEGER, DataTypeManager.DefaultDataClasses.SHORT, DataTypeManager.DefaultDataClasses.SHORT }, //$NON-NLS-1$
      new FunctionDescriptor[] {
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { DataTypeManager.DefaultDataClasses.INTEGER, T_STRING }),   
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { DataTypeManager.DefaultDataClasses.SHORT, T_STRING }),   
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { DataTypeManager.DefaultDataClasses.SHORT, T_STRING })   
      } );
  }

  @Test public void testFind3ArgConversion7() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_NULL, T_INTEGER, T_INTEGER }, //$NON-NLS-1$
      new FunctionDescriptor[] {
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }),   
        null,
        null }
      );
  }

  @Test public void testFind3ArgConversion8() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_NULL, T_NULL, T_INTEGER }, //$NON-NLS-1$
      new FunctionDescriptor[] {
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }),   
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }),   
        null }
      );
  }

  @Test public void testFind3ArgConversion9() {  
    helpFindConversions(
      "substring", new Class<?>[] { T_NULL, T_NULL, T_NULL }, //$NON-NLS-1$
      new FunctionDescriptor[] {
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }),   
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }),   
        helpCreateDescriptor(FunctionLibrary.CONVERT, new Class<?>[] { T_NULL, T_STRING }) }
      );
  }

    // Walk through all functions by metadata
    @Test public void testEnumerateForms() {
        Collection<String> categories = library.getFunctionCategories();
        for (String category : categories) {
            //System.out.println("Category: " + category);
           
            Collection<FunctionForm> functions = library.getFunctionForms(category);
            for (FunctionForm form : functions) {
                //System.out.println("\tFunction: " + form.getDisplayString());               
               
                // Lookup this form
                helpFindForm(form.getName(), form.getArgNames().size());
            }           
        }       
    }

  @Test public void testFindForm1() {
    helpFindForm("convert", 2); //$NON-NLS-1$
  }
  @Test public void testFindForm2() {
    helpFindForm("locate", 2); //$NON-NLS-1$
  }
   
  @Test public void testFindForm3() {
    helpFindForm("locate", 3); //$NON-NLS-1$
  }

    @Test public void testFindForm4() {
        helpFindForm("substring", 2); //$NON-NLS-1$
    }
   
    @Test public void testFindForm5() {
        helpFindForm("substring", 3); //$NON-NLS-1$
    }
  @Test public void testFindForm6() {
    helpFindForm("now", 0); //$NON-NLS-1$
  }
   
    @Test public void testInvokePlus1() {
      helpInvokeMethod("+", new Object[] { new Integer(3), new Integer(2) }, new Integer(5)); //$NON-NLS-1$
    }

    @Test public void testInvokePlus2() {
        helpInvokeMethod("+", new Object[] { new Long(3), new Long(2) }, new Long(5)); //$NON-NLS-1$
    }

    @Test public void testInvokePlus3() {
        helpInvokeMethod("+", new Object[] { new Float(3), new Float(2) }, new Float(5)); //$NON-NLS-1$
    }

    @Test public void testInvokePlus4() {
        helpInvokeMethod("+", new Object[] { new Double(3), new Double(2) }, new Double(5)); //$NON-NLS-1$
    }

    @Test public void testInvokePlus5() {
        helpInvokeMethod("+", new Object[] { new BigInteger("3"), new BigInteger("2") }, new BigInteger("5")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokePlus6() {
        helpInvokeMethod("+", new Object[] { new BigDecimal("3"), new BigDecimal("2") }, new BigDecimal("5")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokeMinus1() {
        helpInvokeMethod("-", new Object[] { new Integer(3), new Integer(2) }, new Integer(1)); //$NON-NLS-1$
    }

    @Test public void testInvokeMinus2() {
        helpInvokeMethod("-", new Object[] { new Long(3), new Long(2) }, new Long(1)); //$NON-NLS-1$
    }

    @Test public void testInvokeMinus3() {
        helpInvokeMethod("-", new Object[] { new Float(3), new Float(2) }, new Float(1)); //$NON-NLS-1$
    }

    @Test public void testInvokeMinus4() {
        helpInvokeMethod("-", new Object[] { new Double(3), new Double(2) }, new Double(1)); //$NON-NLS-1$
    }

    @Test public void testInvokeMinus5() {
        helpInvokeMethod("-", new Object[] { new BigInteger("3"), new BigInteger("2") }, new BigInteger("1")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokeMinus6() {
        helpInvokeMethod("-", new Object[] { new BigDecimal("3"), new BigDecimal("2") }, new BigDecimal("1")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokeMultiply1() {
        helpInvokeMethod("*", new Object[] { new Integer(3), new Integer(2) }, new Integer(6)); //$NON-NLS-1$
    }

    @Test public void testInvokeMultiply2() {
        helpInvokeMethod("*", new Object[] { new Long(3), new Long(2) }, new Long(6)); //$NON-NLS-1$
    }

    @Test public void testInvokeMultiply3() {
        helpInvokeMethod("*", new Object[] { new Float(3), new Float(2) }, new Float(6)); //$NON-NLS-1$
    }

    @Test public void testInvokeMultiply4() {
        helpInvokeMethod("*", new Object[] { new Double(3), new Double(2) }, new Double(6)); //$NON-NLS-1$
    }

    @Test public void testInvokeMultiply5() {
        helpInvokeMethod("*", new Object[] { new BigInteger("3"), new BigInteger("2") }, new BigInteger("6")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokeMultiply6() {
        helpInvokeMethod("*", new Object[] { new BigDecimal("3"), new BigDecimal("2") }, new BigDecimal("6")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokeDivide1() {
        helpInvokeMethod("/", new Object[] { new Integer(3), new Integer(2) }, new Integer(1)); //$NON-NLS-1$
    }

    @Test public void testInvokeDivide2() {
        helpInvokeMethod("/", new Object[] { new Long(3), new Long(2) }, new Long(1)); //$NON-NLS-1$
    }

    @Test public void testInvokeDivide3() {
        helpInvokeMethod("/", new Object[] { new Float(3), new Float(2) }, new Float(1.5)); //$NON-NLS-1$
    }

    @Test public void testInvokeDivide4() {
        helpInvokeMethod("/", new Object[] { new Double(3), new Double(2) }, new Double(1.5)); //$NON-NLS-1$
    }

    @Test public void testInvokeDivide5() {
        helpInvokeMethod("/", new Object[] { new BigInteger("3"), new BigInteger("2") }, new BigInteger("1")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    // one digit precision
    @Test public void testInvokeDivide6() {
        helpInvokeMethod("/", new Object[] { new BigDecimal("3"), new BigDecimal("2") }, new BigDecimal("1.5"));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }
   
    @Test public void testInvokeDivide7() throws Exception {
        helpInvokeMethodFail("/", new Object[] { new Float("3"), new Float("0") });   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }
   
    @Test public void testInvokeDivideMod() {
        helpInvokeMethod("mod", new Object[] { new BigDecimal("3.1"), new BigDecimal("2") }, new BigDecimal("1.1"));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokeAbs1() {
        helpInvokeMethod("abs", new Object[] { new Integer(-3) }, new Integer(3)); //$NON-NLS-1$
    }

    @Test public void testInvokeAbs2() {
        helpInvokeMethod("abs", new Object[] { new Long(-3) }, new Long(3)); //$NON-NLS-1$
    }

    @Test public void testInvokeAbs3() {
        helpInvokeMethod("abs", new Object[] { new Float(-3) }, new Float(3)); //$NON-NLS-1$
    }

    @Test public void testInvokeAbs4() {
        helpInvokeMethod("abs", new Object[] { new Double(-3) }, new Double(3)); //$NON-NLS-1$
    }

    @Test public void testInvokeAbs5() {
        helpInvokeMethod("abs", new Object[] { new BigInteger("-3") }, new BigInteger("3")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

    @Test public void testInvokeAbs6() {
        helpInvokeMethod("abs", new Object[] { new BigDecimal("-3") }, new BigDecimal("3")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

  @Test public void testInvokeAcos() {
    helpInvokeMethod("acos", new Object[] { new Double(0.05) }, new Double(1.5207754699891267)); //$NON-NLS-1$
  }

  @Test public void testInvokeAsin() {
    helpInvokeMethod("asin", new Object[] { new Double(0.05) }, new Double(0.050020856805770016)); //$NON-NLS-1$
  }

  @Test public void testInvokeAtan() {
    helpInvokeMethod("atan", new Object[] { new Double(0.05) }, new Double(0.049958395721942765)); //$NON-NLS-1$
  }

  @Test public void testInvokeAtan2() {
    helpInvokeMethod("atan2", new Object[] { new Double(0.05), new Double(0.07) }, new Double(0.6202494859828215)); //$NON-NLS-1$
  }

  @Test public void testInvokeAtanBigDecimal() {
    helpInvokeMethod("atan", new Object[] { new BigDecimal(0.05) }, new Double(0.049958395721942765)); //$NON-NLS-1$
  }

  @Test public void testInvokeAtan2BigDecimal() {
    helpInvokeMethod("atan2", new Object[] { new BigDecimal(0.05), new BigDecimal(0.07) }, new Double(0.6202494859828215)); //$NON-NLS-1$
  }
 
  @Test public void testInvokeCos() {
    helpInvokeMethod("cos", new Object[] { new Double(1.57) }, new Double(7.963267107332633E-4)); //$NON-NLS-1$
  }

  @Test public void testInvokeCot() {
    helpInvokeMethod("cot", new Object[] { new Double(1.57) }, new Double(7.963269632231926E-4)); //$NON-NLS-1$
  }

  @Test public void testInvokeDegrees() {
    helpInvokeMethod("degrees", new Object[] { new Double(1.57) }, new Double(89.95437383553926)); //$NON-NLS-1$
  }

  @Test public void testInvokePI() {
    helpInvokeMethod("pi", new Object[] { }, new Double(3.141592653589793)); //$NON-NLS-1$
  }

  @Test public void testInvokeRadians() {
    helpInvokeMethod("radians", new Object[] { new Double(89.95437383553926) }, new Double(1.57)); //$NON-NLS-1$
  }
 
  @Test public void testInvokeSin() {
    helpInvokeMethod("sin", new Object[] { new Double(1.57) }, new Double(0.9999996829318346)); //$NON-NLS-1$
  }
 
  @Test public void testInvokeTan() {
    helpInvokeMethod("tan", new Object[] { new Double(0.785) }, new Double(0.9992039901050427)); //$NON-NLS-1$
  }
             
    @Test public void testInvokeAscii() {
        helpInvokeMethod("ascii", new Object[] { " " }, new Integer(32)); //$NON-NLS-1$ //$NON-NLS-2$
    }

    @Test public void testInvokeChr() {
        helpInvokeMethod("chr", new Object[] { new Integer(32) }, new Character(' ')); //$NON-NLS-1$
    }
   
    @Test public void testInvokeNvl() {
        helpInvokeMethod("nvl", new Object[] { new Integer(5), new Integer(10) }, new Integer(5) ); //$NON-NLS-1$
    }

    @Test public void testInvokeConcatOperator() {
        helpInvokeMethod("||", new Object[] { "a", "b" }, "ab" );         //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokeInitcap() {
        helpInvokeMethod("initcap", new Object[] { "my test\ndata" }, "My Test\nData" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

    @Test public void testInvokeLpad1() {
        helpInvokeMethod("lpad", new Object[] { "x", new Integer(3) }, "  x" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

    @Test public void testInvokeLpad2() {
        helpInvokeMethod("lpad", new Object[] { "x", new Integer(3), "y" }, "yyx" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }
   
    @Test public void testInvokeRpad1() {
        helpInvokeMethod("rpad", new Object[] { "x", new Integer(3) }, "x  " ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

    @Test public void testInvokeRpad2() {
        helpInvokeMethod("rpad", new Object[] { "x", new Integer(3), "y" }, "xyy" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }

    @Test public void testInvokeTranslate() {
        helpInvokeMethod("translate", new Object[] { "ababcd", "ad", "da" }, "dbdbca" ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
    }
   
  @Test public void testFindFunction13() {
    helpFindFunction("formatTime", new Class<?>[] { T_TIME, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatTime", new Class<?>[] { T_TIME, T_STRING }) ); //$NON-NLS-1$
  }
 
  @Test public void testFindFunction14() {
    helpFindFunction("formatDate", new Class<?>[] { T_DATE, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatDate", new Class<?>[] { T_DATE, T_STRING }) ); //$NON-NLS-1$
  }
 
  @Test public void testFindFunction15() {
    helpFindFunction("formatTimestamp", new Class<?>[] { T_TIMESTAMP, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatTimestamp", new Class<?>[] { T_TIMESTAMP, T_STRING }) ); //$NON-NLS-1$
  }
 
  @Test public void testFindFunction16() {
    helpFindFunction("parseTime", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("parseTime", new Class<?>[] { T_STRING, T_STRING }) ); //$NON-NLS-1$
  }
 
  @Test public void testFindFunction17() {
    helpFindFunction("parseDate", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("parseDate", new Class<?>[] { T_STRING, T_STRING }) ); //$NON-NLS-1$
  }
 
  @Test public void testFindFunction18() {
    helpFindFunction("parseTimestamp", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
        helpCreateDescriptor("parseTimestamp", new Class<?>[] { T_STRING, T_STRING }) ); //$NON-NLS-1$
  }
 
    @Test public void testFindFunction19() {
        helpFindFunction("env", new Class<?>[] {T_STRING}, //$NON-NLS-1$
                         helpCreateDescriptor("env", new Class<?>[] {T_STRING})); //$NON-NLS-1$
    }

  @Test public void testInvokeFormatTimestamp1() {
    helpInvokeMethod("formatTimestamp", new Object[] {TimestampUtil.createTimestamp(103, 2, 5, 3, 4, 12, 255), new String("mm/dd/yy h:mm a") }, "04/05/03 3:04 AM");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeFormatTimestamp2() {
    helpInvokeMethod("formatTimestamp", new Object[] {TimestampUtil.createTimestamp(103, 2, 5, 3, 4, 12, 255), new String("yyyy-mm-dd k:mm a z") }, "2003-04-05 3:04 AM GMT-06:00");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeFormatTimestamp3() {
      helpInvokeMethod("formatTimestamp", new Object[] {TimestampUtil.createTimestamp(103, 2, 5, 3, 4, 12, 255), new String("yyyy-mm-dd hh:mm:ss.SSSS") }, "2003-04-05 03:04:12.0000");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
   
  @Test public void testInvokeFormatTimestampFail() throws Exception {
    helpInvokeMethodFail("formatTimestamp", new Object[] {TimestampUtil.createTimestamp(103, 2, 5, 3, 4, 12, 255), new String("mm/dd/nn h:mm a") }); //$NON-NLS-1$
  }
 
  @Test public void testInvokeParseTimestamp1() {
    helpInvokeMethod("parseTimestamp", new Object[] {new String("05 Mar 2003 03:12:23 CST"), new String("dd MMM yyyy HH:mm:ss z") }, TimestampUtil.createTimestamp(103, 2, 5, 3, 12, 23, 0));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeParseTimestamp2() {
    helpInvokeMethod("parseTimestamp", new Object[] {new String("05 Mar 2003 03:12:23.333"), new String("dd MMM yyyy HH:mm:ss.SSS") }, TimestampUtil.createTimestamp(103, 2, 5, 3, 12, 23, 333*1000000));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }

  @Test public void testFindFormatInteger() {
    helpFindFunction("formatInteger", new Class<?>[] { T_INTEGER, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatInteger", new Class<?>[] { T_INTEGER, T_STRING}) ); //$NON-NLS-1$
  }
 
  @Test public void testFindFormatFloat() {
    helpFindFunction("formatFloat", new Class<?>[] { T_FLOAT, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatFloat", new Class<?>[] { T_FLOAT, T_STRING}) ); //$NON-NLS-1$
  }

  @Test public void testFindFormatDouble() {
    helpFindFunction("formatDouble", new Class<?>[] { T_DOUBLE, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatDouble", new Class<?>[] { T_DOUBLE, T_STRING}) ); //$NON-NLS-1$
  }
   
  @Test public void testFindFormatLong() {
    helpFindFunction("formatLong", new Class<?>[] { T_LONG, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatLong", new Class<?>[] { T_LONG, T_STRING}) ); //$NON-NLS-1$
  }
 
  @Test public void testFindFormatBigInteger() {
    helpFindFunction("formatBigInteger", new Class<?>[] { T_BIG_INTEGER, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatBigInteger", new Class<?>[] { T_BIG_INTEGER, T_STRING}) ); //$NON-NLS-1$
  }

  @Test public void testFindFormatBigDecimal() {
    helpFindFunction("formatBigDecimal", new Class<?>[] { T_BIG_DECIMAL, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("formatBigDecimal", new Class<?>[] { T_BIG_DECIMAL, T_STRING}) ); //$NON-NLS-1$
  }
     
  @Test public void testFindParseInteger() {
    helpFindFunction("parseInteger", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("parseInteger", new Class<?>[] { T_STRING, T_STRING}) ); //$NON-NLS-1$
  }
 
  @Test public void testFindParseLong() {
    helpFindFunction("parseLong", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("parseLong", new Class<?>[] { T_STRING, T_STRING}) ); //$NON-NLS-1$
  }

  @Test public void testFindParseDouble() {
    helpFindFunction("parseDouble", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("parseDouble", new Class<?>[] { T_STRING, T_STRING}) ); //$NON-NLS-1$
 
  @Test public void testFindParseFloat() {
    helpFindFunction("parseFloat", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("parseFloat", new Class<?>[] { T_STRING, T_STRING}) ); //$NON-NLS-1$
  }
 
  @Test public void testFindParseBigInteger() {
    helpFindFunction("parseBigInteger", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("parseBigInteger", new Class<?>[] { T_STRING, T_STRING}) ); //$NON-NLS-1$
  }

  @Test public void testFindParseBigDecimal() {
    helpFindFunction("parseBigDecimal", new Class<?>[] { T_STRING, T_STRING }, //$NON-NLS-1$
      helpCreateDescriptor("parseBigDecimal", new Class<?>[] { T_STRING, T_STRING}) ); //$NON-NLS-1$
 
     
  @Test public void testInvokeParseInteger() {
    helpInvokeMethod("parseInteger", new Object[] {new String("-1234"), new String("######")}, new Integer(-1234));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeParseLong() {
    helpInvokeMethod("parseLong", new Object[] {new String("123456"), new String("######.##")}, new Long(123456));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeParseDouble() {
    helpInvokeMethod("parseDouble", new Object[] {new String("123456.78"), new String("#####.#")}, new Double(123456.78));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeParseFloat() {
    helpInvokeMethod("parseFloat", new Object[] {new String("1234.56"), new String("####.###")}, new Float(1234.56));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeParseBigInteger() {
    helpInvokeMethod("parseBigInteger", new Object[] {new String("12345678"), new String("###,###")}, new BigInteger("12345678"));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
  }
 
  @Test public void testInvokeParseBigDecimal() {
    helpInvokeMethod("parseBigDecimal", new Object[] {new String("1234.56"), new String("#####")}, new BigDecimal("1234.56"));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
  }

  @Test public void testInvokeFormatInteger() {
    helpInvokeMethod("formatInteger", new Object[] {new Integer(-1234), new String("######")}, "-1234");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeFormatLong() {
    helpInvokeMethod("formatLong", new Object[] {new Long(123456788), new String("##,###,#")}, "1,2,3,4,5,6,7,8,8");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeFormatDouble() {
    helpInvokeMethod("formatDouble", new Object[] {new Double(1234.67), new String("####.##")}, "1234.67");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeFormatFloat() {
    helpInvokeMethod("formatFloat", new Object[] {new Float(1234.67), new String("###.###")}, "1234.67");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeFormatBigInteger() {
    helpInvokeMethod("formatBigInteger", new Object[] {new BigInteger("45"), new String("###.###")}, "45");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
  }
 
  @Test public void testInvokeFormatBigDecimal() {
    helpInvokeMethod("formatBigDecimal", new Object[] {new BigDecimal("1234.56"), new String("###.###")}, "1234.56");   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 

  @Test public void testInvokeQuarter1() {
    //    2003-5-15
    helpInvokeMethod("quarter", new Object[] {TimestampUtil.createDate(103, 4, 15)}, new Integer(2));   //$NON-NLS-1$
  }
 
  @Test public void testInvokeQuarter2() {
    //    2003-5-1
    helpInvokeMethod("quarter", new Object[] {TimestampUtil.createDate(103, 3, 31)}, new Integer(2));   //$NON-NLS-1$
  }
 
  @Test public void testInvokeQuarter3() {
    //    2003-1-31
    helpInvokeMethod("quarter", new Object[] {TimestampUtil.createDate(103, 0, 31)}, new Integer(1));   //$NON-NLS-1$
  }
 
  @Test public void testInvokeQuarter4() {
  //    2003-9-30
    helpInvokeMethod("quarter", new Object[] {TimestampUtil.createDate(103, 8, 30)}, new Integer(3));   //$NON-NLS-1$
  }
 
  @Test public void testInvokeQuarter5() {
  //    2003-12-31
    helpInvokeMethod("quarter", new Object[] {TimestampUtil.createDate(103, 11, 31)}, new Integer(4));   //$NON-NLS-1$
  }   
 
  @Test public void testInvokeQuarter6() {
    //bad date such as 2003-13-45
    helpInvokeMethod("quarter", new Object[] {TimestampUtil.createDate(103, 12, 45)}, new Integer(1));   //$NON-NLS-1$
  }
 
  @Test public void testInvokeIfNull() {
    helpInvokeMethod("ifnull", new Object[] {new Integer(5), new Integer(10)}, new Integer(5));   //$NON-NLS-1$
  }

  @Test public void testInvokeLower() {
    helpInvokeMethod("lower", new Object[] {new String("LOWER")}, new String("lower"));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }
 
  @Test public void testInvokeUpper() {
    helpInvokeMethod("upper", new Object[] {new String("upper")}, new String("UPPER"));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }

  @Test public void testInvokeRepeat() {
    helpInvokeMethod("repeat", new Object[] {new String("cat"), new Integer(3)}, new String("catcatcat"));   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
  }

  @Test public void testInvokeChar() {
    helpInvokeMethod("char", new Object[] {new Integer(32) }, new Character(' ')); //$NON-NLS-1$
  }

  /** normal input */
  @Test public void testInvokeInsert1() {
    helpInvokeMethod("insert", new Object[] {new String("Downtown"), new Integer(4)//$NON-NLS-1$ //$NON-NLS-2$
      new Integer(2), new String("cat")}, new String("Dowcatown"));   //$NON-NLS-1$ //$NON-NLS-2$
  }

  /** empty string2 */ 
  @Test public void testInvokeInsert2() {
    helpInvokeMethod("insert", new Object[] {new String("Downtown"), new Integer(4)//$NON-NLS-1$ //$NON-NLS-2$
      new Integer(2), new String("")}, new String("Dowown"));   //$NON-NLS-1$ //$NON-NLS-2$
  }

  /** empty string1 with start = 1 and length = 0, so result is just string2 */ 
  @Test public void testInvokeInsert3() {
    helpInvokeMethod("insert", new Object[] {new String(""), new Integer(1)//$NON-NLS-1$ //$NON-NLS-2$
      new Integer(0), new String("cat")}, new String("cat"));   //$NON-NLS-1$ //$NON-NLS-2$
  }

  /** should fail, with start > string1.length() */
  @Test public void testInvokeInsert4() throws Exception {
    helpInvokeMethodFail("insert", new Object[] {new String(""), new Integer(2)//$NON-NLS-1$ //$NON-NLS-2$
      new Integer(0), new String("cat")}); //$NON-NLS-1$ //$NON-NLS-2$
  }

  /** should fail, with length > 0 and input string1.length() = 0 */
  @Test public void testInvokeInsert5() throws Exception {
    helpInvokeMethodFail("insert", new Object[] {new String(""), new Integer(1)//$NON-NLS-1$ //$NON-NLS-2$
      new Integer(1), new String("cat")});   //$NON-NLS-1$ //$NON-NLS-2$
  }

  /**  (length + start) > string1.length(), then just append str2 starting at start position */
  @Test public void testInvokeInsert6() {
    helpInvokeMethod("insert", new Object[] {new String("Downtown"), new Integer(7)//$NON-NLS-1$ //$NON-NLS-2$
      new Integer(5), new String("cat")}, new String("Downtocat"));   //$NON-NLS-1$ //$NON-NLS-2$
  }

    @Test public void testInvokeTimestampAddDate_ignore_case() {
        helpInvokeMethod("timestampAdd", new Object[] {"sql_TSI_day"//$NON-NLS-1$ //$NON-NLS-2$
            new Integer(28), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(103, 5, 12).getTime()));   
    }  
   
  /** date + month --> count=18, inteval=month, result should be 2004-11-15 */
  @Test public void testInvokeTimestampAddDate2() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_MONTH,  //$NON-NLS-1$
      new Integer(18), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(104, 10, 15).getTime()))
  }

  /** date + month --> count=-18, inteval=month, result should be 2001-11-15 */
  @Test public void testInvokeTimestampAddDate2a() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_MONTH,  //$NON-NLS-1$
      new Integer(-18), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(101, 10, 15).getTime()))
  }
 
  /** date + week --> count=6, inteval=week, result should be 2003-04-03 */
  @Test public void testInvokeTimestampAddDate3() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_WEEK,  //$NON-NLS-1$
      new Integer(-6), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(103, 3, 3).getTime()))
  }

  /** date + quarter --> count=3, inteval=quarter, result should be 2004-2-15 */
  @Test public void testInvokeTimestampAddDate4() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_QUARTER,  //$NON-NLS-1$
      new Integer(3), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(104, 1, 15).getTime()))
  }

  /** date + year --> count=-1, inteval=year, result should be 2002-5-15 */
  @Test public void testInvokeTimestampAddDate5() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_YEAR,  //$NON-NLS-1$
      new Integer(-1), new Timestamp(TimestampUtil.createDate(103, 4, 15).getTime())}, new Timestamp(TimestampUtil.createDate(102, 4, 15).getTime()))
  }
     
  /** time + minute --> count=23, inteval=3, result should be 03:32:12 */
  @Test public void testInvokeTimestampAddTime1() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_MINUTE,  //$NON-NLS-1$
      new Integer(23), new Timestamp(TimestampUtil.createTime(3, 9, 12).getTime())}, new Timestamp(TimestampUtil.createTime(3, 32, 12).getTime()))
  }

  /** time + hour --> count=21, inteval=4, result should be 00:09:12 and overflow */
  @Test public void testInvokeTimestampAddTime2() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_HOUR,  //$NON-NLS-1$
      new Integer(21), new Timestamp(TimestampUtil.createTime(3, 9, 12).getTime())}, TimestampUtil.createTimestamp(70, 0, 2, 0, 9, 12, 0))
  }

  /** time + hour --> count=2, inteval=4, result should be 01:12:12*/
  @Test public void testInvokeTimestampAddTime3() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_HOUR,  //$NON-NLS-1$
      new Integer(2), new Timestamp(TimestampUtil.createTime(23, 12, 12).getTime())}, TimestampUtil.createTimestamp(70, 0, 2, 1, 12, 12, 0))
  }
 
  /** time + second --> count=23, inteval=2, result should be 03:10:01 */
  @Test public void testInvokeTimestampAddTime4() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_SECOND,  //$NON-NLS-1$
      new Integer(49), new Timestamp(TimestampUtil.createTime(3, 9, 12).getTime())}, new Timestamp(TimestampUtil.createTime(3, 10, 1).getTime()))
  }

  /** timestamp + second --> count=23, inteval=2, result should be 2003-05-15 03:09:35.100  */
  @Test public void testInvokeTimestampAddTimestamp1() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_SECOND,  //$NON-NLS-1$
      new Integer(23), TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 12, 100)},
      TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 35, 100))
  }

  /** timestamp + nanos --> count=1, inteval=1, result should be 2003-05-15 03:09:12.000000101  */
  @Test public void testInvokeTimestampAddTimestamp2() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
      new Integer(1), TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 12, 100)},
      TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 12, 101))
  }

  /** timestamp + nanos --> count=2100000000, inteval=1, result should be 2003-05-15 03:10:01.100000003
   *  with increase in second and minutes, because second already at 59 sec originally
   */
  @Test public void testInvokeTimestampAddTimestamp3() {
    helpInvokeMethod("timestampAdd", new Object[] {NonReserved.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
      new Integer(2100000000), TimestampUtil.createTimestamp(103, 4, 15, 3, 9, 59, 1)},
      TimestampUtil.createTimestamp(103, 4, 15, 3, 10, 1, 100000003))
  }
     
  /** time --> interval=hour, time1 = 03:04:45, time2= 05:05:36 return = 2  */
  @Test public void testInvokeTimestampDiffTime1() {
    helpInvokeMethod("timestampDiff", new Object[] {NonReserved.SQL_TSI_HOUR,  //$NON-NLS-1$
        new Timestamp(TimestampUtil.createTime(3, 4, 45).getTime()), new Timestamp(TimestampUtil.createTime(5, 5, 36).getTime()) },
      new Long(2))
  }
 
    @Test public void testInvokeTimestampDiffTime1_ignorecase() {
        helpInvokeMethod("timestampDiff", new Object[] {"SQL_tsi_HOUR"//$NON-NLS-1$ //$NON-NLS-2$
            new Timestamp(TimestampUtil.createTime(3, 4, 45).getTime()), new Timestamp(TimestampUtil.createTime(5, 5, 36).getTime()) },
            new Long(2));  
    }
   
  /**
   * timestamp --> interval=week, time1 = 2002-06-21 03:09:35.100,
   * time2= 2003-05-02 05:19:35.500 return = 45
   */
  @Test public void testInvokeTimestampDiffTimestamp1() {
    helpInvokeMethod("timestampDiff", new Object[] {NonReserved.SQL_TSI_WEEK,  //$NON-NLS-1$
      TimestampUtil.createTimestamp(102, 5, 21, 3, 9, 35, 100), TimestampUtil.createTimestamp(103, 4, 2, 5, 19, 35, 500) },
      new Long(45))
  }

    /**
     * timestamp --> interval=frac_second, time1 = 2002-06-21 03:09:35.000000001,
     * time2= 2002-06-21 03:09:35.100000000 return = 999999999
     */
    @Test public void testInvokeTimestampDiffTimestamp2() {
        helpInvokeMethod("timestampDiff", new Object[] {NonReserved.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
            TimestampUtil.createTimestamp(102, 5, 21, 3, 9, 35, 1), TimestampUtil.createTimestamp(102, 5, 21, 3, 9, 35, 100000000) },
            new Long(99999999))
    }

    /**
     * timestamp --> interval=frac_second, time1 = 2002-06-21 03:09:35.000000002,
     * time2= 2002-06-22 03:09:35.000000001 return =
     */
    @Test public void testInvokeTimestampDiffTimestamp3() {
        helpInvokeMethod("timestampDiff", new Object[] {NonReserved.SQL_TSI_FRAC_SECOND,  //$NON-NLS-1$
            TimestampUtil.createTimestamp(102, 5, 21, 3, 9, 35, 2), TimestampUtil.createTimestamp(102, 5, 22, 3, 9, 35, 1) },
            new Long(86399999999999L))
    }

    @Test public void testInvokeTimestampCreate1() {
        helpInvokeMethod("timestampCreate", new Object[] {TimestampUtil.createDate(103, 4, 15), //$NON-NLS-1$
                                                          TimestampUtil.createTime(23, 59, 59)},
                                                          TimestampUtil.createTimestamp(103, 4, 15, 23, 59, 59, 0));   
    }  
   
    @Test public void testInvokeBitand() {
        helpInvokeMethod("bitand", new Object[] {new Integer(0xFFF), new Integer(0x0F0)}, new Integer(0x0F0)); //$NON-NLS-1$
    }
    @Test public void testInvokeBitor() {
        helpInvokeMethod("bitor", new Object[] {new Integer(0xFFF), new Integer(0x0F0)}, new Integer(0xFFF)); //$NON-NLS-1$
    }
    @Test public void testInvokeBitxor() {
        helpInvokeMethod("bitxor", new Object[] {new Integer(0xFFF), new Integer(0x0F0)}, new Integer(0xF0F)); //$NON-NLS-1$
    }
    @Test public void testInvokeBitnot() {
        helpInvokeMethod("bitnot", new Object[] {new Integer(0xF0F)}, new Integer(0xFFFFF0F0)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeRound1() {
        helpInvokeMethod("round", new Object[] {new Integer(123), new Integer(-1)}, new Integer(120)); //$NON-NLS-1$
    }

    @Test public void testInvokeRound2() {
        helpInvokeMethod("round", new Object[] {new Float(123.456), new Integer(2)}, new Float(123.46)); //$NON-NLS-1$
    }

    @Test public void testInvokeRound3() {
        helpInvokeMethod("round", new Object[] {new Double(123.456), new Integer(2)}, new Double(123.46)); //$NON-NLS-1$
    }

    @Test public void testInvokeRound4() {
        helpInvokeMethod("round", new Object[] {new BigDecimal("123.456"), new Integer(2)}, new BigDecimal("123.460")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

    /** defect 10941 */
    @Test public void testInvokeConvertTime() {
        helpInvokeMethod("convert", new Object[] {"05:00:00", "time"}, TimestampUtil.createTime(5, 0, 0)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$                   
    }

    @Test public void testInvokeXpath1() {
        helpInvokeMethod("xpathValue"//$NON-NLS-1$
                         new Object[] {
                                       "<?xml version=\"1.0\" encoding=\"utf-8\" ?><a><b><c>test</c></b></a>", //$NON-NLS-1$
                                       "a/b/c"}, //$NON-NLS-1$
                         "test"); //$NON-NLS-1$
    }
   
    @Test public void testInvokeXpathWithNill() {
        helpInvokeMethod("xpathValue"//$NON-NLS-1$
                         new Object[] {
                                       "<?xml version=\"1.0\" encoding=\"utf-8\" ?><a xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><b xsi:nil=\"true\"/></a>", //$NON-NLS-1$
                                       "//*[local-name()='b' and not(@*[local-name()='nil' and string()='true'])]"}, //$NON-NLS-1$
                         null);
    }
   
    @Test public void testInvokeXpathWithNill1() {
        helpInvokeMethod("xpathValue"//$NON-NLS-1$
                         new Object[] {
                                       "<?xml version=\"1.0\" encoding=\"utf-8\" ?><a><b>value</b></a>", //$NON-NLS-1$
                                       "//*[local-name()='b' and not(@*[local-name()='nil' and string()='true'])]"}, //$NON-NLS-1$
                         "value"); //$NON-NLS-1$
    }
   
    @Test public void testInvokeModifyTimeZone() {
        Timestamp ts = Timestamp.valueOf("2004-10-03 23:59:59.123"); //$NON-NLS-1$
        Timestamp out = Timestamp.valueOf("2004-10-03 22:59:59.123"); //$NON-NLS-1$
        helpInvokeMethod("modifyTimeZone", new Object[] {ts, "America/Chicago", "America/New_York" }, out); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }

    // TimestampWithTimezone has a static copy the default timezone object which makes this test not execute properly
    public void defer_testInvokeModifyTimeZoneFromLocal() {
        Timestamp ts = Timestamp.valueOf("2004-10-03 23:59:59.123"); //$NON-NLS-1$
        Timestamp out = Timestamp.valueOf("2004-10-03 21:59:59.123"); //$NON-NLS-1$
        helpInvokeMethod("modifyTimeZone", new Object[] {ts, "America/New_York" }, out); //$NON-NLS-1$ //$NON-NLS-2$
    }

    @Test public void testInvokeRand() throws Exception {
        helpInvokeMethod("rand", new Object[] {new Integer(100)}, new Double(0.7220096548596434)); //$NON-NLS-1$
        // this does not actually fail but returns a result
        assertNotNull(helpInvokeMethod("rand", new Class<?>[] {Integer.class}, new Object[] {null}, null)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeUser() throws Exception {
        CommandContext c = new CommandContext();
        c.setUserName("foodude"); //$NON-NLS-1$
        helpInvokeMethod("user", new Class<?>[] {}, new Object[] {}, c, "foodude"); //$NON-NLS-1$ //$NON-NLS-2$
    }
   
    @Test public void testInvokeEnv() throws Exception {
        CommandContext c = new CommandContext();
        Properties props = new Properties();
        props.setProperty("env_test", "env_value"); //$NON-NLS-1$ //$NON-NLS-2$
        c.setEnvironmentProperties(props);
        helpInvokeMethod("env", new Class<?>[] {String.class}, new Object[] {"env_test"}, c, "env_value"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$       
        helpInvokeMethod("env", new Class<?>[] {String.class}, new Object[] {null}, c, null); //$NON-NLS-1$
    }
   
    @Test public void testInvokeCommandPayload() throws Exception {
        CommandContext c = new CommandContext();       
        c.setCommandPayload("payload_too heavy"); //$NON-NLS-1$
        helpInvokeMethod("commandpayload", new Class<?>[] {}, new Object[] {}, c, "payload_too heavy"); //$NON-NLS-1$ //$NON-NLS-2$
        helpInvokeMethod("commandpayload", new Class<?>[] {String.class}, new Object[] {null}, c, null); //$NON-NLS-1$
        Properties props = new Properties();
        props.setProperty("payload", "payload_too heavy"); //$NON-NLS-1$ //$NON-NLS-2$
        c.setCommandPayload(props);
        helpInvokeMethod("commandpayload", new Class<?>[] {String.class}, new Object[] {"payload"}, c, "payload_too heavy"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }   
   
    @Test public void testNullDependent() {
        FunctionDescriptor actual = library.findFunction("concat2", new Class<?>[] {String.class, String.class}); //$NON-NLS-1$
        assertTrue(actual.isNullDependent());
       
        actual = library.findFunction("concat", new Class<?>[] {String.class, String.class}); //$NON-NLS-1$
        assertFalse(actual.isNullDependent());
    }
   
    @Test public void testInvokeCeiling() {
        helpInvokeMethod("ceiling", new Object[] { new Double("3.14") }, new Double("4")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }
   
    @Test public void testInvokeFloor() {
        helpInvokeMethod("floor", new Object[] { new Double("3.14") }, new Double("3")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }
   
    @Test public void testInvokeExp() {
        helpInvokeMethod("exp", new Object[] { new Double("0") }, new Double("1")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }
   
    @Test public void testInvokeLog() {
        helpInvokeMethod("log", new Object[] { new Double("1") }, new Double("0")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }
   
    @Test public void testInvokeLog10() {
        helpInvokeMethod("log10", new Object[] { new Double("10") }, new Double("1")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }
   
    @Test public void testInvokeLog10Error() throws Exception {
        helpInvokeMethodFail("log10", new Object[] { new Double("0") }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }
   
    @Test public void testInvokePower() {
        helpInvokeMethod("power", new Object[] { new Double("10"), new Double("2") }, new Double("100")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
    }
   
    @Test public void testInvokePower1() {
        helpInvokeMethod("power", new Object[] { new BigDecimal("10"), new Integer(2) }, new BigDecimal("100")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }
   
    @Test public void testInvokeSqrt() {
        helpInvokeMethod("sqrt", new Object[] { new Double("4")}, new Double("2")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    }
   
    @Test public void testInvokeDayName() {
        for (int i = 0; i < FunctionMethods.dayNames.length; i++) {
            Date time = TimestampUtil.createDate(100, 0, i + 2);
            helpInvokeMethod("dayName", new Object[] { time }, FunctionMethods.dayNames[i]); //$NON-NLS-1$
        }
    }
   
    @Test public void testInvokeDayOfMonth() {
        Timestamp time = TimestampUtil.createTimestamp(100, 0, 1, 1, 2, 3, 4);
        helpInvokeMethod("dayOfMonth", new Object[] { time }, new Integer(1)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeDayOfWeek() {
        Timestamp time = TimestampUtil.createTimestamp(100, 0, 1, 1, 2, 3, 4);
        helpInvokeMethod("dayOfWeek", new Object[] { time }, new Integer(7)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeDayOfYear() {
        Timestamp time = TimestampUtil.createTimestamp(100, 0, 2, 1, 2, 3, 4);
        helpInvokeMethod("dayOfYear", new Object[] { time }, new Integer(2)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeMonth() {
        Timestamp time = TimestampUtil.createTimestamp(100, 0, 1, 1, 2, 3, 4);
        helpInvokeMethod("month", new Object[] { time }, new Integer(1)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeMonthName() {
        for (int i = 0; i < FunctionMethods.monthNames.length; i++) {
            Date time = TimestampUtil.createDate(100, i, 1);
            helpInvokeMethod("monthName", new Object[] { time }, FunctionMethods.monthNames[i]); //$NON-NLS-1$
        }
    }
   
    @Test public void testInvokeMinute() {
        Timestamp time = TimestampUtil.createTimestamp(100, 0, 1, 1, 2, 3, 4);
        helpInvokeMethod("minute", new Object[] { time }, new Integer(2)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeSecond() {
        Timestamp time = TimestampUtil.createTimestamp(100, 0, 1, 1, 2, 3, 4);
        helpInvokeMethod("second", new Object[] { time }, new Integer(3)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeWeek() {
        Timestamp time = TimestampUtil.createTimestamp(100, 0, 1, 1, 2, 3, 4);
        helpInvokeMethod("week", new Object[] { time }, new Integer(1)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeYear() {
        Timestamp time = TimestampUtil.createTimestamp(100, 0, 1, 1, 2, 3, 4);
        helpInvokeMethod("year", new Object[] { time }, new Integer(2000)); //$NON-NLS-1$
    }
   
    @Test public void testInvokeCoalesce() {
      helpInvokeMethod(FunctionLibrary.COALESCE, new Object[] { Integer.valueOf(0), Integer.valueOf(1), Integer.valueOf(2) }, Integer.valueOf(0));
    }
   
    @Test public void testInvokeCoalesce1() {
      helpInvokeMethod(FunctionLibrary.COALESCE, new Object[] { null, null}, null);
    }
   
    @Test public void testInvokeNull() throws Exception {
        helpInvokeMethod(SourceSystemFunctions.LTRIM, new Class<?>[] {DataTypeManager.DefaultDataClasses.STRING}, new Object[] { null }, null, null)
    }
   
    @Test public void testInvokeNull1() throws Exception {
        helpInvokeMethod(SourceSystemFunctions.CONCAT, new Class<?>[] {DataTypeManager.DefaultDataClasses.STRING, DataTypeManager.DefaultDataClasses.STRING}, new Object[] { null, String.valueOf(1) }, null, null)
   
   
  @Test public void testInvokeXslTransform() throws Exception {
        CommandContext c = new CommandContext();
        c.setBufferManager(BufferManagerFactory.getStandaloneBufferManager());
        ClobType result = (ClobType)helpInvokeMethod("xsltransform", new Class<?>[] {DataTypeManager.DefaultDataClasses.XML, DataTypeManager.DefaultDataClasses.XML},
            new Object[] {DataTypeManager.transformValue("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Catalogs xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Catalog><Items><Item ItemID=\"001\"><Name>Lamp</Name><Quantity>5</Quantity></Item></Items></Catalog></Catalogs>", DataTypeManager.DefaultDataClasses.XML),
            DataTypeManager.transformValue("<?xml version=\"1.0\" encoding=\"UTF-8\"?><xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"><xsl:template match=\"@*|node()\"><xsl:copy><xsl:apply-templates select=\"@*|node()\"/></xsl:copy></xsl:template><xsl:template match=\"Quantity\"/></xsl:stylesheet>", DataTypeManager.DefaultDataClasses.XML)}, c);
       
        String xml = ObjectConverterUtil.convertToString(result.getCharacterStream());
        assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><Catalogs xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Catalog><Items><Item ItemID=\"001\"><Name>Lamp</Name></Item></Items></Catalog></Catalogs>", xml);
    }
 
  @Test public void testInvokeXmlConcat() throws Exception {
        CommandContext c = new CommandContext();
        c.setBufferManager(BufferManagerFactory.getStandaloneBufferManager());
        XMLType result = (XMLType)helpInvokeMethod("xmlconcat", new Class<?>[] {DataTypeManager.DefaultDataClasses.XML, DataTypeManager.DefaultDataClasses.XML},
            new Object[] {DataTypeManager.transformValue("<bar/>", DataTypeManager.DefaultDataClasses.XML), DataTypeManager.transformValue("<Catalogs xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Catalog><Items><Item ItemID=\"001\"><Name>Lamp</Name><Quantity>5</Quantity></Item></Items></Catalog></Catalogs>", DataTypeManager.DefaultDataClasses.XML)}, c);
       
        String xml = ObjectConverterUtil.convertToString(result.getCharacterStream());
        assertEquals("<bar/><Catalogs xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Catalog><Items><Item ItemID=\"001\"><Name>Lamp</Name><Quantity>5</Quantity></Item></Items></Catalog></Catalogs>", xml);
    }
 
  @Test public void testInvokeXmlComment() throws Exception {
        CommandContext c = new CommandContext();
        c.setBufferManager(BufferManagerFactory.getStandaloneBufferManager());
        XMLType result = (XMLType)helpInvokeMethod("xmlcomment", new Class<?>[] {DataTypeManager.DefaultDataClasses.STRING},
            new Object[] {"comment"}, c);
       
        String xml = ObjectConverterUtil.convertToString(result.getCharacterStream());
        assertEquals("<!--comment-->", xml);
    }
 
  @Test public void testToChars() throws Exception {
    Clob result = (Clob)helpInvokeMethod("to_chars", new Class<?>[] {DefaultDataClasses.BLOB, DefaultDataClasses.STRING}, new Object[] { new BlobType(new SerialBlob("hello world".getBytes("ASCII"))), "ASCII" }, null); //$NON-NLS-1$
    String string = result.getSubString(1, (int)result.length());
    assertEquals("hello world", string);
  }
 
  @Test public void testToBytes() throws Exception {
    Blob result = (Blob)helpInvokeMethod("to_bytes", new Class<?>[] {DefaultDataClasses.CLOB, DefaultDataClasses.STRING}, new Object[] { new ClobType(new SerialClob("hello world".toCharArray())), "UTF32" }, null); //$NON-NLS-1$
    assertEquals(44, result.length()); //4 bytes / char
  }
 
  @Test public void testToChars1() throws Exception {
    Clob result = (Clob)helpInvokeMethod("to_chars", new Class<?>[] {DefaultDataClasses.BLOB, DefaultDataClasses.STRING}, new Object[] { new BlobType(new SerialBlob("hello world".getBytes("ASCII"))), "BASE64" }, null); //$NON-NLS-1$
    String string = result.getSubString(1, (int)result.length());
    assertEquals("hello world", new String(Base64.decode(string), "ASCII"));
  }
 
  @Test public void testToChars2() throws Exception {
    Clob result = (Clob)helpInvokeMethod("to_chars", new Class<?>[] {DefaultDataClasses.BLOB, DefaultDataClasses.STRING}, new Object[] { new BlobType(new SerialBlob("hello world".getBytes("ASCII"))), "HEX" }, null); //$NON-NLS-1$
    String string = result.getSubString(1, (int)result.length());
    assertEquals("68656C6C6F20776F726C64", string);
  }
 
  @Test public void testToBytes2() throws Exception {
    Blob result = (Blob)helpInvokeMethod("to_bytes", new Class<?>[] {DefaultDataClasses.CLOB, DefaultDataClasses.STRING}, new Object[] { new ClobType(new SerialClob("68656C6C6F20776F726C64".toCharArray())), "HEX" }, null); //$NON-NLS-1$
    assertEquals("hello world", new String(ObjectConverterUtil.convertToCharArray(result.getBinaryStream(), -1, "ASCII")));
  }
 
  @Test(expected=FunctionExecutionException.class) public void testToBytes3() throws Exception {
    helpInvokeMethod("to_bytes", new Class<?>[] {DefaultDataClasses.CLOB, DefaultDataClasses.STRING}, new Object[] { new ClobType(new SerialClob("a".toCharArray())), "BASE64" }, null); //$NON-NLS-1$
  }
 
  @Test() public void testUnescape() throws Exception {
    assertEquals("\r\t", helpInvokeMethod("unescape", new Class<?>[] {DefaultDataClasses.STRING}, new Object[] { "\r\\\t" }, null)); //$NON-NLS-1$
  }
 
  @Test() public void testUuid() throws Exception {
    assertNotNull(helpInvokeMethod("uuid", new Class<?>[] {}, new Object[] {}, null)); //$NON-NLS-1$
  }
 
  @Test() public void testArrayGet() throws Exception {
    assertEquals(1, helpInvokeMethod("array_get", new Class<?>[] {DefaultDataClasses.OBJECT, DefaultDataClasses.INTEGER}, new Object[] {new Object[] {1}, 1}, null)); //$NON-NLS-1$
  }
 
}
TOP

Related Classes of org.teiid.query.function.TestFunctionLibrary

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.