// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed 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.
package com.google.api.ads.adwords.axis.utils.v201702.shopping;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import com.google.api.ads.adwords.axis.v201702.cm.ProductBrand;
import com.google.api.ads.adwords.axis.v201702.cm.ProductDimension;
import java.util.Comparator;
import java.util.List;
import org.hamcrest.Matchers;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
/**
* Base class for ProductDimension comparator tests.
*/
public abstract class BaseProductDimensionComparatorTest {
/** Subclass of ProductDimension that the comparator will not recognize. */
private static class UnsupportedDimensionType extends ProductDimension {
}
protected final Comparator<ProductDimension> comparator = new ProductDimensionComparator();
@Rule public ExpectedException thrown = ExpectedException.none();
/**
* Returns an instance of D for the "other" case, a.k.a. the "everything else" case.
*/
abstract ProductDimension createOtherProductDimension();
/**
* Returns at least two instances of D that are <em>not</em> the "other" case. The list
* should be ordered.
*/
abstract List<? extends ProductDimension> createNonOtherProductDimensions();
@Test
public void testIdentityComparison() {
ProductDimension dimension = createOtherProductDimension();
int result = comparator.compare(dimension, dimension);
assertEquals("Comparing a dimension to itself should return 0", 0, result);
}
@Test
public void testBothNull() {
assertEquals("Comparing null to null should return 0", 0, comparator.compare(null, null));
}
@Test
public void testOnlyOneNull() {
ProductDimension dimension = createOtherProductDimension();
assertThat("Null should be greater than non-null", comparator.compare(null, dimension),
Matchers.greaterThan(0));
assertThat("Non-null should be less than null", comparator.compare(dimension, null),
Matchers.lessThan(0));
}
@Test
public void testNeitherNull() {
ProductDimension otherDimension = createOtherProductDimension();
List<? extends ProductDimension> nonOtherDimensions = createNonOtherProductDimensions();
if (nonOtherDimensions == null) {
return;
}
int result = comparator.compare(otherDimension, nonOtherDimensions.get(0));
assertThat("The 'other' case should be > the non-other case", result,
Matchers.greaterThan(0));
}
@Test
public void testCompareToDifferentDimensionType() {
ProductDimension dimension = createOtherProductDimension();
ProductDimension otherTypeOfDimension =
dimension instanceof ProductBrand ? ProductDimensions.createOfferId("abc")
: ProductDimensions.createBrand("google");
assertThat("Comparing dimensions of different types should return a non-zero result",
comparator.compare(dimension, otherTypeOfDimension), Matchers.not(0));
assertThat("Comparing dimensions of different types should return a non-zero result",
comparator.compare(otherTypeOfDimension, dimension), Matchers.not(0));
}
/**
* Tests that the comparator throws an IllegalArgumentException when passed two non-null instances
* of an unsupported subclass of ProductDimension.
*/
@Test
public void testCompareUnsupportedDimensionTypes_bothNonNull_fails() {
// Compare two instances of the subclass.
ProductDimension otherTypeOfDimension1 = new UnsupportedDimensionType();
ProductDimension otherTypeOfDimension2 = new UnsupportedDimensionType();
thrown.expect(IllegalArgumentException.class);
comparator.compare(otherTypeOfDimension1, otherTypeOfDimension2);
}
/**
* Tests that the comparator throws an IllegalArgumentException when passed a non-null instance
* of an unsupported subclass of ProductDimension as the first argument, and null as the second
* argument.
*/
@Test
public void testCompareUnsupportedDimensionTypes_firstNonNull_fails() {
// Compare an unsupported type to null.
ProductDimension unsupportedTypeOfDimension = new UnsupportedDimensionType();
thrown.expect(IllegalArgumentException.class);
comparator.compare(unsupportedTypeOfDimension, null);
}
/**
* Tests that the comparator throws an IllegalArgumentException when passed null as the first
* argument, and a non-null instance of an unsupported subclass of ProductDimension as the second
* argument.
*/
@Test
public void testCompareUnsupportedDimensionTypes_secondNonNull_fails() {
// Compare null to an unsupported type.
ProductDimension unsupportedTypeOfDimension = new UnsupportedDimensionType();
thrown.expect(IllegalArgumentException.class);
comparator.compare(null, unsupportedTypeOfDimension);
}
/**
* Tests that the comparator throws an IllegalArgumentException when passed an instance of an
* unsupported subclass of ProductDimension as the first argument, and an instance of a supported
* type as the second argument.
*/
@Test
public void testCompareUnsupportedDimensionTypes_firstUnsupported_fails() {
// Compare an unsupported type to null.
ProductDimension unsupportedTypeOfDimension = new UnsupportedDimensionType();
thrown.expect(IllegalArgumentException.class);
comparator.compare(unsupportedTypeOfDimension, createOtherProductDimension());
}
/**
* Tests that the comparator throws an IllegalArgumentException when passed an instance of a
* supported type as the first argument, and an instance of an unsupported subclass of
* ProductDimension as the second argument.
*/
@Test
public void testCompareUnsupportedDimensionTypes_secondUnsupported_fails() {
// Compare null to an unsupported type.
ProductDimension unsupportedTypeOfDimension = new UnsupportedDimensionType();
thrown.expect(IllegalArgumentException.class);
comparator.compare(createOtherProductDimension(), unsupportedTypeOfDimension);
}
}