// Path: src/main/java/net/davidtanzer/jobjectformatter/FormattedStringGenerator.java
// public class FormattedStringGenerator {
// 	private final TypeInfoCache typeInfoCache;
// 	private final ObjectValuesCompiler objectValuesCompiler;
// 	private final ObjectStringFormatter toStringFormatter;
// 
// 	/**
// 	 * Creates a new FormattedStringGenerator that uses a {@link net.davidtanzer.jobjectformatter.formatter.SimpleFormatter} to format the string.
// 	 *
// 	 * @see net.davidtanzer.jobjectformatter.formatter.SimpleFormatter
// 	 */
// 	public FormattedStringGenerator() {
// 		this(new SimpleFormatter(), new TypeInfoCache(), new ObjectValuesCompiler());
// 	}
// 
// 	/**
// 	 * Creates a new FormattedStringGenerator with a given {@link net.davidtanzer.jobjectformatter.formatter.ObjectStringFormatter}.
// 	 *
// 	 * @param toStringFormatter The formatter to use when creating formatted strings.
// 	 * @see net.davidtanzer.jobjectformatter.formatter.ObjectStringFormatter
// 	 */
// 	public FormattedStringGenerator(final ObjectStringFormatter toStringFormatter) {
// 		this(toStringFormatter, new TypeInfoCache(), new ObjectValuesCompiler());
// 	}
// 
// 	FormattedStringGenerator(final ObjectStringFormatter objectStringFormatter, final TypeInfoCache typeInfoCache, final ObjectValuesCompiler objectValuesCompiler) {
// 		if(objectStringFormatter == null) {
// 			throw new IllegalArgumentException("Parameter objectStringFormatter must not be null!");
// 		}
// 		assert typeInfoCache != null : "Parameter typeInfoCache must not be null!";
// 		assert objectValuesCompiler != null : "Parameter objectValuesCompiler must not be null!";
// 
// 		this.toStringFormatter = objectStringFormatter;
// 		this.typeInfoCache = typeInfoCache;
// 		this.objectValuesCompiler = objectValuesCompiler;
// 	}
// 
// 	/**
// 	 * Creates a formatted String representation of an object.
// 	 * 
// 	 * @param object The object to format.
// 	 * @return The formatted String representation.
// 	 */
// 	public String format(final Object object) {
// 		if(object==null) {
// 			throw new IllegalArgumentException("Parameter object must not be null!");
// 		}
// 
// 		final TypeInfo typeInfo = typeInfoCache.typeInfoFor(object.getClass());
// 		final ObjectValuesInfo objectValuesInfo = objectValuesCompiler.compileToStringInfo(typeInfo, object);
// 
// 		return toStringFormatter.format(objectValuesInfo);
// 	}
// }
// 
// Path: src/main/java/net/davidtanzer/jobjectformatter/valuesinfo/ObjectValuesInfo.java
// public class ObjectValuesInfo {
// 	private final List<GroupedValuesInfo> valuesByClass;
// 	private final List<ValueInfo> allValues;
// 	private final Class type;
// 
// 	private ObjectValuesInfo(final List<GroupedValuesInfo> valuesByClass, final List<ValueInfo> allValues, final Class type) {
// 		this.valuesByClass = valuesByClass;
// 		this.allValues = allValues;
// 		this.type = type;
// 	}
// 
// 	/**
// 	 * Get all values of the object's properties, grouped by their declaring class.
// 	 *
// 	 * @return all values of the object's properties, grouped by their declaring class.
// 	 */
// 	public List<GroupedValuesInfo> getValuesByClass() {
// 		return valuesByClass;
// 	}
// 
// 	/**
// 	 * Get all values of the object's properties.
// 	 *
// 	 * @return all values of the object's properties.
// 	 */
// 	public List<ValueInfo> getAllValues() {
// 		return allValues;
// 	}
// 
// 	/**
// 	 * Get the type of the object to format.
// 	 *
// 	 * @return the type of the object to format.
// 	 */
// 	public Class getType() {
// 		return type;
// 	}
// 
// 	static class Builder {
// 		private final List<GroupedValuesInfo> valuesByClass = new ArrayList<>();
// 		private final List<ValueInfo> allValues = new ArrayList<>();
// 		private Class type;
// 
// 		public ObjectValuesInfo buildToStringInfo() {
// 			return new ObjectValuesInfo(
// 					Collections.unmodifiableList(valuesByClass),
// 					Collections.unmodifiableList(allValues),
// 					type);
// 		}
// 
// 		Builder addClassValues(final GroupedValuesInfo groupedValuesInfo) {
// 			valuesByClass.add(groupedValuesInfo);
// 			allValues.addAll(groupedValuesInfo.getValues());
// 			return this;
// 		}
// 
// 		Builder setType(Class type) {
// 			this.type = type;
// 			return this;
// 		}
// 	}
// }


import net.davidtanzer.jobjectformatter.FormattedStringGenerator;
import net.davidtanzer.jobjectformatter.valuesinfo.ObjectValuesInfo;
import org.junit.Test;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
package net.davidtanzer.jobjectformatter.formatter;



public class ConfigurableObjectStringFormatterTest {
	@Test
	public void ungroupedCurlyBracedOutputWithClassNameTest() {
		final ConfigurableObjectStringFormatter formatter = ConfigurableObjectStringFormatter.UNGROUPED_CURLY_BRACED_OUTPUT_WITH_CLASS_NAME;
// Path: src/main/java/net/davidtanzer/jobjectformatter/FormattedStringGenerator.java
// public class FormattedStringGenerator {
// 	private final TypeInfoCache typeInfoCache;
// 	private final ObjectValuesCompiler objectValuesCompiler;
// 	private final ObjectStringFormatter toStringFormatter;
// 
// 	/**
// 	 * Creates a new FormattedStringGenerator that uses a {@link net.davidtanzer.jobjectformatter.formatter.SimpleFormatter} to format the string.
// 	 *
// 	 * @see net.davidtanzer.jobjectformatter.formatter.SimpleFormatter
// 	 */
// 	public FormattedStringGenerator() {
// 		this(new SimpleFormatter(), new TypeInfoCache(), new ObjectValuesCompiler());
// 	}
// 
// 	/**
// 	 * Creates a new FormattedStringGenerator with a given {@link net.davidtanzer.jobjectformatter.formatter.ObjectStringFormatter}.
// 	 *
// 	 * @param toStringFormatter The formatter to use when creating formatted strings.
// 	 * @see net.davidtanzer.jobjectformatter.formatter.ObjectStringFormatter
// 	 */
// 	public FormattedStringGenerator(final ObjectStringFormatter toStringFormatter) {
// 		this(toStringFormatter, new TypeInfoCache(), new ObjectValuesCompiler());
// 	}
// 
// 	FormattedStringGenerator(final ObjectStringFormatter objectStringFormatter, final TypeInfoCache typeInfoCache, final ObjectValuesCompiler objectValuesCompiler) {
// 		if(objectStringFormatter == null) {
// 			throw new IllegalArgumentException("Parameter objectStringFormatter must not be null!");
// 		}
// 		assert typeInfoCache != null : "Parameter typeInfoCache must not be null!";
// 		assert objectValuesCompiler != null : "Parameter objectValuesCompiler must not be null!";
// 
// 		this.toStringFormatter = objectStringFormatter;
// 		this.typeInfoCache = typeInfoCache;
// 		this.objectValuesCompiler = objectValuesCompiler;
// 	}
// 
// 	/**
// 	 * Creates a formatted String representation of an object.
// 	 * 
// 	 * @param object The object to format.
// 	 * @return The formatted String representation.
// 	 */
// 	public String format(final Object object) {
// 		if(object==null) {
// 			throw new IllegalArgumentException("Parameter object must not be null!");
// 		}
// 
// 		final TypeInfo typeInfo = typeInfoCache.typeInfoFor(object.getClass());
// 		final ObjectValuesInfo objectValuesInfo = objectValuesCompiler.compileToStringInfo(typeInfo, object);
// 
// 		return toStringFormatter.format(objectValuesInfo);
// 	}
// }
// 
// Path: src/main/java/net/davidtanzer/jobjectformatter/valuesinfo/ObjectValuesInfo.java
// public class ObjectValuesInfo {
// 	private final List<GroupedValuesInfo> valuesByClass;
// 	private final List<ValueInfo> allValues;
// 	private final Class type;
// 
// 	private ObjectValuesInfo(final List<GroupedValuesInfo> valuesByClass, final List<ValueInfo> allValues, final Class type) {
// 		this.valuesByClass = valuesByClass;
// 		this.allValues = allValues;
// 		this.type = type;
// 	}
// 
// 	/**
// 	 * Get all values of the object's properties, grouped by their declaring class.
// 	 *
// 	 * @return all values of the object's properties, grouped by their declaring class.
// 	 */
// 	public List<GroupedValuesInfo> getValuesByClass() {
// 		return valuesByClass;
// 	}
// 
// 	/**
// 	 * Get all values of the object's properties.
// 	 *
// 	 * @return all values of the object's properties.
// 	 */
// 	public List<ValueInfo> getAllValues() {
// 		return allValues;
// 	}
// 
// 	/**
// 	 * Get the type of the object to format.
// 	 *
// 	 * @return the type of the object to format.
// 	 */
// 	public Class getType() {
// 		return type;
// 	}
// 
// 	static class Builder {
// 		private final List<GroupedValuesInfo> valuesByClass = new ArrayList<>();
// 		private final List<ValueInfo> allValues = new ArrayList<>();
// 		private Class type;
// 
// 		public ObjectValuesInfo buildToStringInfo() {
// 			return new ObjectValuesInfo(
// 					Collections.unmodifiableList(valuesByClass),
// 					Collections.unmodifiableList(allValues),
// 					type);
// 		}
// 
// 		Builder addClassValues(final GroupedValuesInfo groupedValuesInfo) {
// 			valuesByClass.add(groupedValuesInfo);
// 			allValues.addAll(groupedValuesInfo.getValues());
// 			return this;
// 		}
// 
// 		Builder setType(Class type) {
// 			this.type = type;
// 			return this;
// 		}
// 	}
// }


// Path: src/test/java/net/davidtanzer/jobjectformatter/formatter/ConfigurableObjectStringFormatterTest.java
import net.davidtanzer.jobjectformatter.FormattedStringGenerator;
import net.davidtanzer.jobjectformatter.valuesinfo.ObjectValuesInfo;
import org.junit.Test;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

package net.davidtanzer.jobjectformatter.formatter;



public class ConfigurableObjectStringFormatterTest {
	@Test
	public void ungroupedCurlyBracedOutputWithClassNameTest() {
		final ConfigurableObjectStringFormatter formatter = ConfigurableObjectStringFormatter.UNGROUPED_CURLY_BRACED_OUTPUT_WITH_CLASS_NAME;
		FormattedStringGenerator generator = new FormattedStringGenerator(formatter);