MultilineRecursiveToStringStyleTest.java
/*
* 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
*
* 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
* limitations under the License.
*/
package org.apache.commons.lang3.builder;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.AbstractLangTest;
import org.junit.jupiter.api.Test;
/**
*/
class MultilineRecursiveToStringStyleTest extends AbstractLangTest {
static class Account {
Customer owner;
List<Transaction> transactions = new ArrayList<>();
public double getBalance() {
double balance = 0;
for (final Transaction tx : transactions) {
balance += tx.amount;
}
return balance;
}
}
static class Bank {
String name;
Bank(final String name) {
this.name = name;
}
}
static class Customer {
String name;
Bank bank;
List<Account> accounts;
Customer(final String name) {
this.name = name;
}
}
static class Transaction {
double amount;
String date;
Transaction(final String datum, final double betrag) {
this.date = datum;
this.amount = betrag;
}
}
static class WithArrays {
boolean[] boolArray;
byte[] byteArray;
char[] charArray;
double[] doubleArray;
float[] floatArray;
int[] intArray;
long[] longArray;
short[] shortArray;
String[] stringArray;
}
private enum WithArraysTestType {
NONE, BOOLEAN, BYTE, CHAR, DOUBLE, FLOAT, INT, LONG, SHORT, STRING
}
private static final String LS = System.lineSeparator();
private static final String BASE_WITH_ARRAYS_TO_STRING = "[" + LS
+ " boolArray=#BOOLEAN#," + LS
+ " byteArray=#BYTE#," + LS
+ " charArray=#CHAR#," + LS
+ " doubleArray=#DOUBLE#," + LS
+ " floatArray=#FLOAT#," + LS
+ " intArray=#INT#," + LS
+ " longArray=#LONG#," + LS
+ " shortArray=#SHORT#," + LS
+ " stringArray=#STRING#" + LS
+ "]";
@Test
public void boolArray() {
final WithArrays wa = new WithArrays();
wa.boolArray = new boolean[] { true, false, true };
final String exp = getExpectedToString(
wa, WithArraysTestType.BOOLEAN,
"{" + LS
+ " true," + LS
+ " false," + LS
+ " true" + LS
+ " }");
assertEquals(exp, toString(wa));
}
@Test
public void byteArray() {
final WithArrays wa = new WithArrays();
wa.byteArray = new byte[] { 1, 2 };
final String exp = getExpectedToString(
wa, WithArraysTestType.BYTE,
"{" + LS
+ " 1," + LS
+ " 2" + LS
+ " }");
assertEquals(exp, toString(wa));
}
@Test
public void charArray() {
final WithArrays wa = new WithArrays();
wa.charArray = new char[] { 'a', 'A' };
final String exp = getExpectedToString(
wa, WithArraysTestType.CHAR,
"{" + LS
+ " a," + LS
+ " A" + LS
+ " }");
assertEquals(exp, toString(wa));
}
@Test
public void doubleArray() {
final WithArrays wa = new WithArrays();
wa.doubleArray = new double[] { 1, 2 };
final String exp = getExpectedToString(
wa, WithArraysTestType.DOUBLE,
"{" + LS
+ " 1.0," + LS
+ " 2.0" + LS
+ " }");
assertEquals(exp, toString(wa));
}
@Test
public void floatArray() {
final WithArrays wa = new WithArrays();
wa.floatArray = new float[] { 1f, 2f };
final String exp = getExpectedToString(
wa, WithArraysTestType.FLOAT,
"{" + LS
+ " 1.0," + LS
+ " 2.0" + LS
+ " }");
assertEquals(exp, toString(wa));
}
private String getClassPrefix(final Object object) {
return object.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(object));
}
/**
* Create an expected to String for the given WithArraysInstance
* @param wa Instance
* @param arrayType Type - empty used to indicate expect all nulls
* @param expectedArrayValue Expected value for the array type
* @return expected toString
*/
private String getExpectedToString(final WithArrays wa, final WithArraysTestType arrayType, final String expectedArrayValue) {
return getClassPrefix(wa)
+ BASE_WITH_ARRAYS_TO_STRING
.replace("#" + arrayType + "#", expectedArrayValue)
.replaceAll("#[A-Z]+#", "<null>");
}
@Test
public void intArray() {
final WithArrays wa = new WithArrays();
wa.intArray = new int[] { 1, 2 };
final String exp = getExpectedToString(
wa, WithArraysTestType.INT,
"{" + LS
+ " 1," + LS
+ " 2" + LS
+ " }");
assertEquals(exp, toString(wa));
}
@Test
public void longArray() {
final WithArrays wa = new WithArrays();
wa.longArray = new long[] { 1L, 2L };
final String exp = getExpectedToString(
wa, WithArraysTestType.LONG,
"{" + LS
+ " 1," + LS
+ " 2" + LS
+ " }");
assertEquals(exp, toString(wa));
}
@Test
public void nestedAndArray() {
final Account acc = new Account();
final Transaction tx1 = new Transaction("2014.10.14", 100);
final Transaction tx2 = new Transaction("2014.10.15", 50);
acc.transactions.add(tx1);
acc.transactions.add(tx2);
final String expected = getClassPrefix(acc) + "[" + LS
+ " owner=<null>," + LS
+ " transactions=" + getClassPrefix(acc.transactions) + "{" + LS
+ " " + getClassPrefix(tx1) + "[" + LS
+ " amount=100.0," + LS
+ " date=2014.10.14" + LS
+ " ]," + LS
+ " " + getClassPrefix(tx2) + "[" + LS
+ " amount=50.0," + LS
+ " date=2014.10.15" + LS
+ " ]" + LS
+ " }" + LS
+ "]";
assertEquals(expected, toString(acc));
}
@Test
public void nestedElements() {
final Customer customer = new Customer("Douglas Adams");
final Bank bank = new Bank("ASF Bank");
customer.bank = bank;
final String exp = getClassPrefix(customer) + "[" + LS
+ " accounts=<null>," + LS
+ " bank=" + getClassPrefix(bank) + "[" + LS
+ " name=ASF Bank" + LS
+ " ]," + LS
+ " name=Douglas Adams" + LS
+ "]";
assertEquals(exp, toString(customer));
}
@Test
public void noArray() {
final WithArrays wa = new WithArrays();
final String exp = getExpectedToString(wa, WithArraysTestType.NONE, "");
assertEquals(exp, toString(wa));
}
@Test
public void shortArray() {
final WithArrays wa = new WithArrays();
wa.shortArray = new short[] { 1, 2 };
final String exp = getExpectedToString(
wa, WithArraysTestType.SHORT,
"{" + LS
+ " 1," + LS
+ " 2" + LS
+ " }");
assertEquals(exp, toString(wa));
}
@Test
public void simpleObject() {
final Transaction tx = new Transaction("2014.10.15", 100);
final String expected = getClassPrefix(tx) + "[" + LS
+ " amount=100.0," + LS
+ " date=2014.10.15" + LS
+ "]";
assertEquals(expected, toString(tx));
}
@Test
public void stringArray() {
final WithArrays wa = new WithArrays();
wa.stringArray = new String[] { "a", "A" };
final String exp = getExpectedToString(
wa, WithArraysTestType.STRING,
"{" + LS
+ " a," + LS
+ " A" + LS
+ " }");
assertEquals(exp, toString(wa));
}
@Test
void testLANG1319() {
final String[] stringArray = {"1", "2"};
final String exp = getClassPrefix(stringArray) + "[" + LS
+ " {" + LS
+ " 1," + LS
+ " 2" + LS
+ " }" + LS
+ "]";
assertEquals(exp, toString(stringArray));
}
private String toString(final Object object) {
return new ReflectionToStringBuilder(object, new MultilineRecursiveToStringStyle()).toString();
}
}