package org.apache.torque.datatypes;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.sql.Types;
import java.util.List;

import org.apache.torque.BaseDatabaseTestCase;
import org.apache.torque.ColumnImpl;
import org.apache.torque.TorqueException;
import org.apache.torque.criteria.Criteria;
import org.apache.torque.criteria.Criterion;
import org.apache.torque.om.StringKey;
import org.apache.torque.test.dbobject.BintBcharType;
import org.apache.torque.test.peer.BintBcharTypePeer;
import org.apache.torque.util.ColumnValues;
import org.apache.torque.util.JdbcTypedValue;

/**
 * Tests the data types BOOLEANINT and BOOLEANCHAR.
 * @version $Id: BooleanIntCharTest.java 1439295 2013-01-28 08:21:41Z tfischer $
 */
public class BooleanIntCharTest extends BaseDatabaseTestCase
{
    /**
     * Checks whether we can read boolean true values.
     *
     * @throws Exception if the test fails
     */
    public void testReadBooleanIntCharTrueValue() throws Exception
    {
        fillTables();

        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        assertEquals(true, bc.getBintValue());
        assertEquals(true, bc.getBcharValue());
        assertEquals(Boolean.TRUE, bc.getBintObjectValue());
        assertEquals(Boolean.TRUE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can read boolean false values.
     *
     * @throws Exception if the test fails
     */
    public void testReadBooleanIntCharFalseValue() throws Exception
    {
        fillTables();

        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("f1"));
        assertEquals(false, bc.getBintValue());
        assertEquals(false, bc.getBcharValue());
        assertEquals(Boolean.FALSE, bc.getBintObjectValue());
        assertEquals(Boolean.FALSE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can read Boolean null values.
     *
     * @throws Exception if the test fails
     */
    public void testReadBooleanIntCharNullValue() throws Exception
    {
        fillTables();

        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("null"));
        assertEquals(null, bc.getBintObjectValue());
        assertEquals(null, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can insert boolean true values.
     *
     * @throws Exception if the test fails
     */
    public void testInsertBooleanIntCharTrueValue() throws Exception
    {
        // prepare
        fillTables();
        BintBcharType bc = new BintBcharType();
        bc.setPrimaryKey("new");
        bc.setBintValue(true);
        bc.setBcharValue(true);
        bc.setBintObjectValue(Boolean.TRUE);
        bc.setBcharObjectValue(Boolean.TRUE);

        // execute
        bc.save();

        // verify
        bc = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(true, bc.getBintValue());
        assertEquals(true, bc.getBcharValue());
        assertEquals(Boolean.TRUE, bc.getBintObjectValue());
        assertEquals(Boolean.TRUE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can insert boolean false values.
     *
     * @throws Exception if the test fails
     */
    public void testInsertBooleanIntCharFalseValue() throws Exception
    {
        // prepare
        fillTables();
        BintBcharType bc = new BintBcharType();
        bc.setPrimaryKey("new");
        bc.setBintValue(false);
        bc.setBcharValue(false);
        bc.setBintObjectValue(Boolean.FALSE);
        bc.setBcharObjectValue(Boolean.FALSE);

        // execute
        bc.save();

        // verify
        bc = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(false, bc.getBintValue());
        assertEquals(false, bc.getBcharValue());
        assertEquals(Boolean.FALSE, bc.getBintObjectValue());
        assertEquals(Boolean.FALSE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can insert Boolean null values.
     *
     * @throws Exception if the test fails
     */
    public void testInserteBooleanIntCharNullValue() throws Exception
    {
        // prepare
        fillTables();
        BintBcharType bc = new BintBcharType();
        bc.setPrimaryKey("new");
        bc.setBintObjectValue(null);
        bc.setBcharObjectValue(null);

        // execute
        bc.save();

        // verify
        bc = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(null, bc.getBintObjectValue());
        assertEquals(null, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can update values to boolean true.
     *
     * @throws Exception if the test fails
     */
    public void testUpdateBooleanIntCharTrueValue() throws Exception
    {
        // prepare
        fillTables();
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("f1"));
        bc.setBintValue(true);
        bc.setBcharValue(true);
        bc.setBintObjectValue(Boolean.TRUE);
        bc.setBcharObjectValue(Boolean.TRUE);

        // execute
        bc.save();

        // verify
        bc = BintBcharTypePeer.retrieveByPK(new StringKey("f1"));
        assertEquals(true, bc.getBintValue());
        assertEquals(true, bc.getBcharValue());
        assertEquals(Boolean.TRUE, bc.getBintObjectValue());
        assertEquals(Boolean.TRUE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can update values to boolean false.
     *
     * @throws Exception if the test fails
     */
    public void testWriteBooleanIntCharFalseValue() throws Exception
    {
        // prepare
        fillTables();
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        bc.setBintValue(false);
        bc.setBcharValue(false);
        bc.setBintObjectValue(Boolean.FALSE);
        bc.setBcharObjectValue(Boolean.FALSE);

        // execute
        bc.save();

        // verify
        bc = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        assertEquals(false, bc.getBintValue());
        assertEquals(false, bc.getBcharValue());
        assertEquals(Boolean.FALSE, bc.getBintObjectValue());
        assertEquals(Boolean.FALSE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can update values to Boolean null.
     *
     * @throws Exception if the test fails
     */
    public void testUpdateBooleanIntCharNullValue() throws Exception
    {
        // prepare
        fillTables();
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        bc.setBintObjectValue(null);
        bc.setBcharObjectValue(null);

        // execute
        bc.save();

        // verify
        bc = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        assertEquals(null, bc.getBintObjectValue());
        assertEquals(null, bc.getBcharObjectValue());
    }

    /**
     * Check whether we can impose the condition Boolean True to
     * booleanint/booleanchar columns.
     *
     * @throws Exception if the test fails
     */
    public void testBooleanTrueSelect() throws Exception
    {
        fillTables();

        Criteria criteria = new Criteria()
                .where(BintBcharTypePeer.BCHAR_VALUE, new Boolean(true))
                .and(BintBcharTypePeer.BINT_VALUE, new Boolean(true))
                .and(BintBcharTypePeer.BCHAR_OBJECT_VALUE, new Boolean(true))
                .and(BintBcharTypePeer.BINT_OBJECT_VALUE, new Boolean(true));
        List<BintBcharType> selectedList
            = BintBcharTypePeer.doSelect(criteria);
        assertEquals(1, selectedList.size());
        BintBcharType bintBcharType = selectedList.get(0);
        assertEquals("t1", bintBcharType.getId());
    }

    /**
     * Check whether we can impose the condition Boolean False to
     * booleanint/booleanchar columns.
     *
     * @throws Exception if the test fails
     */
    public void testBooleanFalseSelect() throws Exception
    {
        fillTables();

        Criteria criteria = new Criteria()
                .where(BintBcharTypePeer.BCHAR_VALUE, new Boolean(false))
                .and(BintBcharTypePeer.BINT_VALUE, new Boolean(false))
                .and(BintBcharTypePeer.BCHAR_OBJECT_VALUE, new Boolean(false))
                .and(BintBcharTypePeer.BINT_OBJECT_VALUE, new Boolean(false));
        List<BintBcharType> selectedList
                = BintBcharTypePeer.doSelect(criteria);
        assertEquals(1, selectedList.size());
        BintBcharType bintBcharType = selectedList.get(0);
        assertEquals("f1", bintBcharType.getId());
    }

    /**
     * Check whether we can impose the condition Boolean Null to
     * booleanint/booleanchar columns and get objects where the columns
     * are null.
     *
     * @throws Exception if the test fails
     */
    public void testBooleanObjectNullSelect() throws Exception
    {
        fillTables();

        Criteria criteria = new Criteria()
                .where(BintBcharTypePeer.BCHAR_OBJECT_VALUE, null)
                .and(BintBcharTypePeer.BINT_OBJECT_VALUE, null);
        List<BintBcharType> selectedList
                = BintBcharTypePeer.doSelect(criteria);
        assertEquals(1, selectedList.size());
        BintBcharType bintBcharType = selectedList.get(0);
        assertEquals("null", bintBcharType.getId());
    }

    /**
     * Check whether we can impose the condition Boolean Null to
     * booleanint/booleanchar primitive columns and get no hit.
     *
     * @throws Exception if the test fails
     */
    public void testPrimitiveNullSelect() throws Exception
    {
        fillTables();

        Criteria criteria = new Criteria()
                .and(BintBcharTypePeer.BCHAR_VALUE, null)
                .and(BintBcharTypePeer.BINT_VALUE, null);
        List<BintBcharType> selectedList
                = BintBcharTypePeer.doSelect(criteria);
        assertTrue("Should have read 0 dataset with both values false "
                + "but read " + selectedList.size(),
                selectedList.size() == 0);
    }

    /**
     * Check whether we can impose a Boolean condition to booleanint/booleanchar
     * columns via joins.
     *
     * @throws Exception if the test fails
     */
    public void testBooleanSelectViaJoins() throws Exception
    {
        fillTables();

        Criteria criteria = new Criteria();
        criteria.addAlias("bc", BintBcharTypePeer.TABLE_NAME);
        criteria.addJoin(
                BintBcharTypePeer.ID,
                new ColumnImpl("bc.id"));
        criteria.where(new ColumnImpl("bc.BINT_VALUE"), new Boolean(false))
                .and(new ColumnImpl("bc.BCHAR_VALUE"), new Boolean(false))
                .and(new ColumnImpl("bc.BINT_OBJECT_VALUE"), new Boolean(false))
                .and(new ColumnImpl("bc.BCHAR_OBJECT_VALUE"), new Boolean(false));
        List<BintBcharType> selectedList
                = BintBcharTypePeer.doSelect(criteria);
        assertTrue("Should have read 1 dataset with both values false "
                + "but read " + selectedList.size(),
                selectedList.size() == 1);
        BintBcharType bintBcharType = selectedList.get(0);
        assertEquals("f1", bintBcharType.getId());
    }

    /**
     * Check whether we can impose a Boolean condition in
     * chained criterions and get no hits using a unfullfillable condition.
     *
     * @throws Exception if the test fails
     */
    public void testBooleanSelectInChainedCriterionsNoHits() throws Exception
    {
        fillTables();

        // check whether complex criteria are overwritten by
        // replaceBooleans
        Criteria criteria = new Criteria();
        Criterion criterion1 = new Criterion(
                BintBcharTypePeer.BCHAR_VALUE,
                Boolean.FALSE,
                Criteria.EQUAL);
        Criterion criterion2 = new Criterion(
                BintBcharTypePeer.BCHAR_VALUE,
                null,
                Criteria.ISNULL);
        criteria.where(criterion1.and(criterion2));
        List<BintBcharType> selectedList
                = BintBcharTypePeer.doSelect(criteria);
        // List should be empty, because and creates unfulfillable condition
        // If BasePeer.correctBooleans() replaces Criterion wrongly,
        // then we get entries in the list.
        assertTrue("List should be empty but contains "
                + selectedList.size() + " datasets",
                selectedList.isEmpty());
    }

    /**
     * Check whether we can impose a Boolean condition in
     * chained criterions and get a hits using OR.
     *
     * @throws Exception if the test fails
     */
    public void testBooleanSelectInChainedCriterionsUsingOr() throws Exception
    {
        fillTables();

        Criteria criteria = new Criteria();
        Criterion criterion1 = new Criterion(
                BintBcharTypePeer.BCHAR_VALUE,
                null,
                Criteria.ISNULL);
        Criterion criterion2 = new Criterion(
                BintBcharTypePeer.BCHAR_VALUE,
                Boolean.FALSE,
                Criteria.EQUAL);
        criteria.where(criterion1.or(criterion2));
        List<BintBcharType> selectedList
                = BintBcharTypePeer.doSelect(criteria);
        assertTrue("Should have read 1 dataset complex Criteria "
                + "but read " + selectedList.size(),
                selectedList.size() == 1);
        BintBcharType selected = selectedList.get(0);
        // use trim() for testkey because some databases will return the
        // testkey filled up with blanks, as it is defined as char(10)
        assertTrue("Primary key of data set should be f1 but is "
                + selected.getId(),
                "f1".equals(selected.getId()));
    }

    /**
     * Check whether CorrectBooleans works also on unqualified columns.
     *
     * @throws Exception if the test fails
     */
    public void testCorrectBooleansInUnqualifiedColumns() throws Exception
    {
        // check whether booleans are replaced with unqualified columns
        Criteria criteria = new Criteria()
            .where(new ColumnImpl("BINT_VALUE"), true)
            .and(new ColumnImpl("BCHAR_VALUE"), true);

        BintBcharTypePeer.correctBooleans(criteria);

        Criterion criterionInt
                = criteria.getTopLevelCriterion().getParts().get(0);
        Object intValue = criterionInt.getRValue();

        assertTrue("The boolean value should be an instance of Integer",
                intValue instanceof Integer);

        Criterion criterionChar
                = criteria.getTopLevelCriterion().getParts().get(1);
        Object charValue = criterionChar.getRValue();

        assertTrue("The boolean value should be an instance of String",
                charValue instanceof String);
    }

    /**
     * Check whether CorrectBooleans leaves unknown columns alone.
     *
     * @throws Exception if the test fails
     */
    public void testCorrectBooleansUnknownColumns() throws Exception
    {
        Criteria criteria = new Criteria()
            .where("BooleanCheck.bint_value", true)
            .and("BooleanCheck.bchar_value", true);

        BintBcharTypePeer.correctBooleans(criteria);

        Criterion criterionBool1
                = criteria.getTopLevelCriterion().getParts().get(0);
        Object boolValue1 = criterionBool1.getRValue();

        assertTrue("The boolean value should be an instance of Boolean",
               boolValue1 instanceof Boolean);

        Criterion criterionBool2
                = criteria.getTopLevelCriterion().getParts().get(1);
        Object boolValue2 = criterionBool2.getRValue();

        assertTrue("The boolean value should be an instance of Boolean",
               boolValue2 instanceof Boolean);
    }

    /**
     * Checks whether we can pass boolean true values to doInsert.
     *
     * @throws Exception if the test fails
     */
    public void testDoInsertBooleanTrueValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("new", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(Boolean.TRUE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue(Boolean.TRUE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(Boolean.TRUE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue(Boolean.TRUE, Types.BIT));

        // execute
        BintBcharTypePeer.doInsert(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(true, bc.getBintValue());
        assertEquals(true, bc.getBcharValue());
        assertEquals(Boolean.TRUE, bc.getBintObjectValue());
        assertEquals(Boolean.TRUE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass native true values to doInsert.
     *
     * @throws Exception if the test fails
     */
    public void testDoInsertNativeTrueValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("new", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(1, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue("Y", Types.CHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(1, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue("Y", Types.CHAR));

        // execute
        BintBcharTypePeer.doInsert(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(true, bc.getBintValue());
        assertEquals(true, bc.getBcharValue());
        assertEquals(Boolean.TRUE, bc.getBintObjectValue());
        assertEquals(Boolean.TRUE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass boolean false values to doInsert.
     *
     * @throws Exception if the test fails
     */
    public void testDoInsertBooleanFalseValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("new", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(Boolean.FALSE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue(Boolean.FALSE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(Boolean.FALSE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue(Boolean.FALSE, Types.BIT));

        // execute
        BintBcharTypePeer.doInsert(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(false, bc.getBintValue());
        assertEquals(false, bc.getBcharValue());
        assertEquals(Boolean.FALSE, bc.getBintObjectValue());
        assertEquals(Boolean.FALSE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass native false values to doInsert.
     *
     * @throws Exception if the test fails
     */
    public void testDoInsertNativeFalseValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("new", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(0, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue("N", Types.CHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(0, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue("N", Types.CHAR));

        // execute
        BintBcharTypePeer.doInsert(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(false, bc.getBintValue());
        assertEquals(false, bc.getBcharValue());
        assertEquals(Boolean.FALSE, bc.getBintObjectValue());
        assertEquals(Boolean.FALSE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass Boolean null values to doInsert.
     *
     * @throws Exception if the test fails
     */
    public void testDoInsertBooleanNullValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("new", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(true, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue(false, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(null, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue(null, Types.BIT));

        // execute
        BintBcharTypePeer.doInsert(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(null, bc.getBintObjectValue());
        assertEquals(null, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass native null values to doInsert.
     *
     * @throws Exception if the test fails
     */
    public void testDoInsertNativeNullValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("new", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(0, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue("N", Types.CHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(null, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue(null, Types.CHAR));

        // execute
        BintBcharTypePeer.doInsert(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("new"));
        assertEquals(null, bc.getBintObjectValue());
        assertEquals(null, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass boolean true values to doUpdate.
     *
     * @throws Exception if the test fails
     */
    public void testDoUpdateBooleanTrueValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("f1", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(Boolean.TRUE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue(Boolean.TRUE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(Boolean.TRUE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue(Boolean.TRUE, Types.BIT));

        // execute
        BintBcharTypePeer.doUpdate(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("f1"));
        assertEquals(true, bc.getBintValue());
        assertEquals(true, bc.getBcharValue());
        assertEquals(Boolean.TRUE, bc.getBintObjectValue());
        assertEquals(Boolean.TRUE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass native true values to doUpdate.
     *
     * @throws Exception if the test fails
     */
    public void testDoUpdateNativeTrueValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("f1", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(1, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue("Y", Types.CHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(1, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue("Y", Types.CHAR));

        // execute
        BintBcharTypePeer.doUpdate(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("f1"));
        assertEquals(true, bc.getBintValue());
        assertEquals(true, bc.getBcharValue());
        assertEquals(Boolean.TRUE, bc.getBintObjectValue());
        assertEquals(Boolean.TRUE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass boolean false values to doUpdate.
     *
     * @throws Exception if the test fails
     */
    public void testDoUpdateBooleanFalseValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("t1", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(Boolean.FALSE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue(Boolean.FALSE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(Boolean.FALSE, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue(Boolean.FALSE, Types.BIT));

        // execute
        BintBcharTypePeer.doUpdate(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        assertEquals(false, bc.getBintValue());
        assertEquals(false, bc.getBcharValue());
        assertEquals(Boolean.FALSE, bc.getBintObjectValue());
        assertEquals(Boolean.FALSE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass native false values to doUpdate.
     *
     * @throws Exception if the test fails
     */
    public void testDoUpdateNativeFalseValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("t1", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_VALUE,
                new JdbcTypedValue(0, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_VALUE,
                new JdbcTypedValue("N", Types.CHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(0, Types.INTEGER));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue("N", Types.CHAR));

        // execute
        BintBcharTypePeer.doUpdate(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        assertEquals(false, bc.getBintValue());
        assertEquals(false, bc.getBcharValue());
        assertEquals(Boolean.FALSE, bc.getBintObjectValue());
        assertEquals(Boolean.FALSE, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass Boolean null values to doUpdate.
     *
     * @throws Exception if the test fails
     */
    public void testDoUpdateBooleanNullValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("t1", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(null, Types.BIT));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue(null, Types.BIT));

        // execute
        BintBcharTypePeer.doUpdate(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        assertEquals(null, bc.getBintObjectValue());
        assertEquals(null, bc.getBcharObjectValue());
    }

    /**
     * Checks whether we can pass native null values to doUpdate.
     *
     * @throws Exception if the test fails
     */
    public void testDoUpdateNativeNullValue() throws Exception
    {
        // prepare
        fillTables();
        ColumnValues columnValues = new ColumnValues();
        columnValues.put(
                BintBcharTypePeer.ID,
                new JdbcTypedValue("t1", Types.VARCHAR));
        columnValues.put(
                BintBcharTypePeer.BINT_OBJECT_VALUE,
                new JdbcTypedValue(null, Types.NUMERIC));
        columnValues.put(
                BintBcharTypePeer.BCHAR_OBJECT_VALUE,
                new JdbcTypedValue(null, Types.CHAR));

        // execute
        BintBcharTypePeer.doUpdate(columnValues);

        // verify
        BintBcharType bc
                = BintBcharTypePeer.retrieveByPK(new StringKey("t1"));
        assertEquals(null, bc.getBintObjectValue());
        assertEquals(null, bc.getBcharObjectValue());
    }

    /**
     * Delete all previous data from the tested tables
     * and re-inserts test data.
     */
    private void fillTables() throws TorqueException
    {
        Criteria criteria = new Criteria();
        BintBcharTypePeer.doDelete(criteria);

        BintBcharType bc = new BintBcharType();
        bc.setId("t1");
        bc.setBintValue(true);
        bc.setBcharValue(true);
        bc.setBintObjectValue(Boolean.TRUE);
        bc.setBcharObjectValue(Boolean.TRUE);
        bc.save();
        bc = new BintBcharType();
        bc.setId("f1");
        bc.setBintValue(false);
        bc.setBcharValue(false);
        bc.setBintObjectValue(Boolean.FALSE);
        bc.setBcharObjectValue(Boolean.FALSE);
        bc.save();
        bc = new BintBcharType();
        bc.setId("null");
        bc.setBintValue(false);
        bc.setBcharValue(true);
        bc.setBintObjectValue(null);
        bc.setBcharObjectValue(null);
        bc.save();
    }
}
