/*
* Copyright (c) 2011 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.checkNotNull;
import com.google.common.annotations.GwtIncompatible;
import com.google.common.base.Optional;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.Table;
import com.google.common.util.concurrent.AtomicLongMap;
import java.math.BigDecimal;
import java.util.Map;
import java.util.SortedMap;
import java.util.SortedSet;
import javax.annotation.Nullable;
/*>>>import org.checkerframework.checker.nullness.compatqual.NullableType;*/
public class TestVerb extends AbstractVerb<TestVerb> {
public TestVerb(FailureStrategy failureStrategy) {
this(failureStrategy, null);
}
public TestVerb(FailureStrategy failureStrategy, @Nullable String message) {
this(
failureStrategy,
message == null ? null : "%s",
message == null ? new Object[0] : new Object[] {message});
}
public TestVerb(
FailureStrategy failureStrategy, @Nullable String format, Object /*@NullableType*/... args) {
super(checkNotNull(failureStrategy), format, args);
}
@SuppressWarnings({"unchecked", "rawtypes"})
public <T extends Comparable<?>> ComparableSubject<?, T> that(@Nullable T target) {
return new ComparableSubject(getFailureStrategy(), target) {};
}
public BigDecimalSubject that(@Nullable BigDecimal target) {
return new BigDecimalSubject(getFailureStrategy(), target);
}
public Subject<DefaultSubject, Object> that(@Nullable Object target) {
return new DefaultSubject(getFailureStrategy(), target);
}
@GwtIncompatible("ClassSubject.java")
public ClassSubject that(@Nullable Class<?> target) {
return new ClassSubject(getFailureStrategy(), target);
}
public ThrowableSubject that(@Nullable Throwable target) {
return ThrowableSubject.create(getFailureStrategy(), target);
}
public LongSubject that(@Nullable Long target) {
return new LongSubject(getFailureStrategy(), target);
}
public DoubleSubject that(@Nullable Double target) {
return new DoubleSubject(getFailureStrategy(), target);
}
public FloatSubject that(@Nullable Float target) {
return new FloatSubject(getFailureStrategy(), target);
}
public IntegerSubject that(@Nullable Integer target) {
return new IntegerSubject(getFailureStrategy(), target);
}
public BooleanSubject that(@Nullable Boolean target) {
return new BooleanSubject(getFailureStrategy(), target);
}
public StringSubject that(@Nullable String target) {
return new StringSubject(getFailureStrategy(), target);
}
public IterableSubject that(@Nullable Iterable<?> target) {
return new IterableSubject(getFailureStrategy(), target);
}
public SortedSetSubject that(@Nullable SortedSet<?> target) {
return new SortedSetSubject(getFailureStrategy(), target);
}
public <T> ObjectArraySubject<T> that(@Nullable T[] target) {
return new ObjectArraySubject<T>(getFailureStrategy(), target);
}
public PrimitiveBooleanArraySubject that(@Nullable boolean[] target) {
return new PrimitiveBooleanArraySubject(getFailureStrategy(), target);
}
public PrimitiveShortArraySubject that(@Nullable short[] target) {
return new PrimitiveShortArraySubject(getFailureStrategy(), target);
}
public PrimitiveIntArraySubject that(@Nullable int[] target) {
return new PrimitiveIntArraySubject(getFailureStrategy(), target);
}
public PrimitiveLongArraySubject that(@Nullable long[] target) {
return new PrimitiveLongArraySubject(getFailureStrategy(), target);
}
public PrimitiveCharArraySubject that(@Nullable char[] target) {
return new PrimitiveCharArraySubject(getFailureStrategy(), target);
}
public PrimitiveByteArraySubject that(@Nullable byte[] target) {
return new PrimitiveByteArraySubject(getFailureStrategy(), target);
}
public PrimitiveFloatArraySubject that(@Nullable float[] target) {
return new PrimitiveFloatArraySubject(getFailureStrategy(), target);
}
public PrimitiveDoubleArraySubject that(@Nullable double[] target) {
return new PrimitiveDoubleArraySubject(getFailureStrategy(), target);
}
public GuavaOptionalSubject that(@Nullable Optional<?> target) {
return new GuavaOptionalSubject(getFailureStrategy(), target);
}
public MapSubject that(@Nullable Map<?, ?> target) {
return new MapSubject(getFailureStrategy(), target);
}
public SortedMapSubject that(@Nullable SortedMap<?, ?> target) {
return new SortedMapSubject(getFailureStrategy(), target);
}
public MultimapSubject that(@Nullable Multimap<?, ?> target) {
return new MultimapSubject(getFailureStrategy(), target);
}
public ListMultimapSubject that(@Nullable ListMultimap<?, ?> target) {
return new ListMultimapSubject(getFailureStrategy(), target);
}
public SetMultimapSubject that(@Nullable SetMultimap<?, ?> target) {
return new SetMultimapSubject(getFailureStrategy(), target);
}
public MultisetSubject that(@Nullable Multiset<?> target) {
return new MultisetSubject(getFailureStrategy(), target);
}
public TableSubject that(@Nullable Table<?, ?, ?> target) {
return new TableSubject(getFailureStrategy(), target);
}
public AtomicLongMapSubject that(@Nullable AtomicLongMap<?> target) {
return new AtomicLongMapSubject(getFailureStrategy(), target);
}
@Override
public TestVerb withFailureMessage(@Nullable String failureMessage) {
return new TestVerb(getFailureStrategy(), "%s", failureMessage); // Must be a new instance.
}
/**
* Returns a {@link TestVerb} that will prepend the formatted message using the specified
* arguments to the failure message in the event of a test failure.
*
* <p><b>Note:</b> The failure message template string only supports the {@code "%s"} specifier,
* not the full range of {@link java.util.Formatter} specifiers.
*
* @throws IllegalArgumentException if the number of placeholders in the format string does not
* equal the number of given arguments
*/
// TODO(kak): This probably should go on AbstractVerb, but that's a breaking change and will
// require an atomic migration of the codebase.
@Override
public TestVerb withFailureMessage(@Nullable String format, Object /* @NullableType */... args) {
return new TestVerb(getFailureStrategy(), format, args); // Must be a new instance.
}
}