/*
 * 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
<<<<<<< Updated upstream
 *
 *     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
=======
 * 
 *     https://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 
>>>>>>> Stashed changes
 * limitations under the License.
 */

package org.apache.jdo.tck.query.jdoql.operators;

import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.Transaction;
import org.apache.jdo.tck.pc.mylib.PrimitiveTypes;
import org.apache.jdo.tck.query.QueryTest;
import org.apache.jdo.tck.util.BatchTestRunner;

/**
 * <B>Title:</B> Promotion of Numeric Operands for Comparisons <br>
 * <B>Keywords:</B> query <br>
 * <B>Assertion ID:</B> A14.6.2-39. <br>
 * <B>Assertion Description: </B> Numeric operands can be promoted for comparison and arithmetic
 * operations.
 */
public class PromotionOfNumericOperands extends QueryTest {

  /** */
  private static final String ASSERTION_FAILED =
      "Assertion A14.6.2-39 (PromotionOfNumericOperands) failed: ";

  /**
   * The <code>main</code> is called when the class is directly executed from the command line.
   *
   * @param args The arguments passed to the program.
   */
  public static void main(String[] args) {
    BatchTestRunner.run(PromotionOfNumericOperands.class);
  }

  /** */
  public void testPositive() {
    PersistenceManager pm = getPM();
    Transaction tx = pm.currentTransaction();
    tx.begin();

    List<PrimitiveTypes> instance9 = pm.newQuery(PrimitiveTypes.class, "id == 9").executeList();

    // comparison double == int
    runSimplePrimitiveTypesQuery("doubleNotNull == 9", pm, instance9, ASSERTION_FAILED);

    // comparison Double == int
    runSimplePrimitiveTypesQuery("doubleNull == 9", pm, instance9, ASSERTION_FAILED);

    // comparison BigInteger == int
    runSimplePrimitiveTypesQuery("bigInteger == 9", pm, instance9, ASSERTION_FAILED);

    // comparison BigDecimal == int
    runSimplePrimitiveTypesQuery("bigDecimal == 9", pm, instance9, ASSERTION_FAILED);

    // promotion in arithmetic operation: int + byte == int
    runSimplePrimitiveTypesQuery("1 + byteNotNull == 10", pm, instance9, ASSERTION_FAILED);

    // promotion in arithmetic operation: int - short == long
    runSimplePrimitiveTypesQuery("10 - shortNotNull == 1L", pm, instance9, ASSERTION_FAILED);

    // promotion in arithmetic operation: long - Integer == int
    runSimplePrimitiveTypesQuery("10L - intNull == 1", pm, instance9, ASSERTION_FAILED);
  }

  /**
   * @see org.apache.jdo.tck.JDO_Test#localSetUp()
   */
  @Override
  protected void localSetUp() {
    addTearDownClass(PrimitiveTypes.class);
    loadAndPersistPrimitiveTypes(getPM());
  }
}
