/*
 * 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.api.persistencemanager.fetchplan;

import java.util.Collection;
import java.util.HashSet;
import javax.jdo.FetchPlan;
import org.apache.jdo.tck.JDO_Test;
import org.apache.jdo.tck.pc.mylib.PCPoint;
import org.apache.jdo.tck.pc.mylib.PCRect;

/**
 * This class is an abstract superclass for the fetch plan tests. It contains methods useful for
 * testing the behavior of the fetch plan.
 */
public class AbstractFetchPlanTest extends JDO_Test {

  /*
   * The <code>main</code> method is not defined in this abstract class.
   */

  /** The persistent instances used in the test. */
  protected PCPoint upperLeft;

  protected PCPoint lowerRight;
  protected PCRect pcrect;

  /** The oids of the persistent instances used in the test. */
  protected Object upperLeftoid;

  protected Object lowerRightoid;
  protected Object pcrectoid;

  /** The String arrays used for setting fetch groups. */
  protected final String[] defaultGroup = new String[] {"default"};

  protected final String[] upperLeftGroup = new String[] {"default", "PCRect.upperLeft"};
  protected final String[] lowerRightGroup = new String[] {"default", "PCRect.lowerRight"};
  protected final String[] bothGroup =
      new String[] {"default", "PCRect.upperLeft", "PCRect.lowerRight"};
  /**
   * @see org.apache.jdo.tck.JDO_Test#localSetUp()
   */
  @Override
  protected void localSetUp() {
    addTearDownClass(PCRect.class);
    addTearDownClass(PCPoint.class);
    upperLeft = new PCPoint(0, 10);
    lowerRight = new PCPoint(10, 0);
    pcrect = new PCRect(upperLeft, lowerRight);
    getPM().currentTransaction().begin();
    pm.makePersistent(pcrect); // makes all three persistent
    upperLeftoid = pm.getObjectId(upperLeft);
    lowerRightoid = pm.getObjectId(lowerRight);
    pcrectoid = pm.getObjectId(pcrect);
    pm.currentTransaction().commit();
  }

  /** Set the default plus upper left field as the fetch group. */
  protected void setDefaultGroup() {
    FetchPlan fp = getPM().getFetchPlan();
    fp.setGroups(defaultGroup);
  }

  /** Set the default plus upper left field as the fetch group. */
  protected void setUpperLeftGroup() {
    FetchPlan fp = getPM().getFetchPlan();
    fp.setGroups(upperLeftGroup);
  }

  /** Set the default plus lower right field as the fetch group. */
  protected void setLowerRightGroup() {
    FetchPlan fp = getPM().getFetchPlan();
    fp.setGroups(upperLeftGroup);
  }

  /** Set the default plus both fields as the fetch group. */
  protected void setBothGroup() {
    FetchPlan fp = getPM().getFetchPlan();
    fp.setGroups(bothGroup);
  }

  /**
   * @param location location
   * @param pcrect PCREct instance
   */
  protected void checkBothLoaded(String location, PCRect pcrect) {
    checkUpperLeftLoaded(location, pcrect);
    checkLowerRightLoaded(location, pcrect);
  }

  /**
   * @param location location
   * @param pcrect PCREct instance
   */
  protected void checkUpperLeftLoaded(String location, PCRect pcrect) {
    if (pcrect.upperLeft == null) {
      appendMessage(
          location
              + NL
              + "Upper Left was null."
              + NL
              + "The fetch plan includes PCRect.upperLeft and this field"
              + " should have been loaded.");
    }
  }

  /**
   * @param location location
   * @param pcrect pc instance
   */
  protected void checkLowerRightLoaded(String location, PCRect pcrect) {
    if (pcrect.lowerRight == null) {
      appendMessage(
          location
              + NL
              + "Lower Right was null."
              + NL
              + "The fetch plan includes PCRect.lowerRight and this field"
              + " should have been loaded.");
    }
  }

  /**
   * @param location location
   * @param fetchPlan fetch plan
   * @param groups groups
   */
  @SuppressWarnings("unchecked")
  protected void checkGroups(String location, FetchPlan fetchPlan, String[] groups) {
    Collection<String> expected = new HashSet<>();
    Collection<String> actual = fetchPlan.getGroups();
    for (String group : groups) {
      expected.add(group);
    }
    if (!expected.equals(actual)) {
      appendMessage(
          location
              + NL
              + "Fetch groups differ."
              + NL
              + "expected: "
              + expected
              + NL
              + "actual: "
              + actual
              + NL);
    }
  }
}
