/*
* Copyright (c) 2013 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 javax.annotation.Nullable;
/**
* Utilities for string comparisons.
*
* @author Christian Gruber (cgruber@google.com)
*/
final class StringUtil {
private StringUtil() {}
/**
* Returns a message appropriate for string comparisons.
*
* <p>TODO(cgruber): Do something closer to what JUnit's {@code ComparisonFailure} does.
*/
static String messageFor(String message, CharSequence expected, CharSequence actual) {
return checkNotNull(message)
+ "\n\nExpected:\n"
+ checkNotNull(expected)
+ "\n\nActual:\n"
+ checkNotNull(actual);
}
/**
* Substitutes each {@code %s} in {@code template} with an argument. These are matched by position
* - the first {@code %s} gets {@code args[0]}, etc. If there are more arguments than
* placeholders, the unmatched arguments will be appended to the end of the formatted message in
* square braces.
*
* <p>Cribbed from Guava's {@link com.google.common.base.Preconditions} to allow for a
* GWT-compatible alternative to {@link String#format(String, Object...)}
*
* @param template a string containing 0 or more {@code %s} placeholders
* @param args the arguments to be substituted into the message template. Arguments are converted
* to strings using {@link String#valueOf(Object)}. Arguments can be null.
*/
static String format(@Nullable String template, Object... args) {
template = String.valueOf(template); // null -> "null"
// start substituting the arguments into the '%s' placeholders
StringBuilder builder = new StringBuilder(template.length() + 16 * args.length);
int templateStart = 0;
int i = 0;
while (i < args.length) {
int placeholderStart = template.indexOf("%s", templateStart);
if (placeholderStart == -1) {
break;
}
builder.append(template.substring(templateStart, placeholderStart));
builder.append(args[i++]);
templateStart = placeholderStart + 2;
}
builder.append(template.substring(templateStart));
// if we run out of placeholders, append the extra args in square braces
if (i < args.length) {
builder.append(" [");
builder.append(args[i++]);
while (i < args.length) {
builder.append(", ");
builder.append(args[i++]);
}
builder.append(']');
}
return builder.toString();
}
}