/*
* Copyright (c) 2014 Google, Inc.
*
* 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.common.truth;
import static com.google.common.base.Preconditions.checkArgument;
import java.util.List;
import javax.annotation.Nullable;
/**
* A common supertype for Array subjects, abstracting some common display and error infrastructure.
*
* @author Christian Gruber (cgruber@israfil.net)
*/
abstract class AbstractArraySubject<S extends AbstractArraySubject<S, T>, T>
extends Subject<S, T> {
AbstractArraySubject(FailureStrategy failureStrategy, @Nullable T subject) {
super(failureStrategy, subject);
}
/** Fails if the array is not empty (i.e. {@code array.length != 0}). */
public void isEmpty() {
if (!listRepresentation().isEmpty()) {
fail("is empty");
}
}
/** Fails if the array is empty (i.e. {@code array.length == 0}). */
public void isNotEmpty() {
if (listRepresentation().isEmpty()) {
fail("is not empty");
}
}
/**
* Fails if the array does not have the given length.
*
* @throws IllegalArgumentException if {@code length < 0}
*/
public void hasLength(int length) {
checkArgument(length >= 0, "length (%s) must be >= 0");
if (listRepresentation().size() != length) {
fail("has length", length);
}
}
abstract String underlyingType();
/** Returns a List representation suitable for displaying in a string. */
abstract List<?> listRepresentation();
// TODO(cgruber): Kill once displayedAs() exists, since this attempts to make .named() do that.
@Override
protected String actualCustomStringRepresentation() {
return (internalCustomName() == null)
? "(" + underlyingType() + brackets() + ") " + listRepresentation() + ""
: "";
}
void failWithBadType(Object expected) {
String expectedBrackets = "";
Class<?> expectedType = expected.getClass();
while (expectedType.isArray()) {
expectedBrackets += "[]";
expectedType = expectedType.getComponentType();
}
String expectedTypeString = expectedType.getName() + expectedBrackets;
failWithRawMessage(
"Incompatible types compared. expected: %s, actual: %s%s",
Platform.compressType(expectedTypeString), underlyingType(), brackets());
}
/**
* Returns the brackets to put after the underlying type. Multi-dimensional array subjects should
* override this to return the correct number of brackets.
*/
String brackets() {
return "[]";
}
}