// Path: de.tototec.cmdoption/src/main/java/de/tototec/cmdoption/internal/LoggerFactory.java
// public static class JavaUtilLogger implements Logger {
// 	private final java.util.logging.Logger underlying;
// 
// 	public JavaUtilLogger(final Class<?> clazz) {
// 		underlying = java.util.logging.Logger.getLogger(clazz.getName());
// 	}
// 
// 	protected Object[] formattedMsgAndCause(final String msg, final Object... args) {
// 		final String formattedMsg;
// 		final Throwable thrown;
// 		if (args != null && args.length > 0) {
// 			final int l;
// 			if (args[args.length - 1] instanceof Throwable) {
// 				l = args.length - 1;
// 				thrown = (Throwable) args[args.length - 1];
// 			}
// 			else {
// 				l = args.length;
// 				thrown = null;
// 			}
// 			if (l > 0) {
// 				final StringBuilder strBuilder = new StringBuilder();
// 
// 				boolean braceOpen = false;
// 				int argNr = 0;
// 				for (int i = 0; i < msg.length(); ++i) {
// 					final char charAt = msg.charAt(i);
// 					if (argNr < l) {
// 						if (braceOpen) {
// 							braceOpen = false;
// 							if (charAt == '}') {
// 								// instead, insert next arg
// 								strBuilder.append(args[argNr]);
// 								++argNr;
// 								continue;
// 							} else {
// 								strBuilder.append("{");
// 							}
// 						} else if (charAt == '{') {
// 							braceOpen = true;
// 							continue;
// 						}
// 					}
// 					strBuilder.append(charAt);
// 				}
// 				if (braceOpen) {
// 					strBuilder.append("{");
// 				}
// 
// 				formattedMsg = strBuilder.toString();
// 			} else {
// 				formattedMsg = msg;
// 			}
// 		} else {
// 			formattedMsg = msg;
// 			thrown = null;
// 		}
// 		return new Object[] { formattedMsg, thrown };
// 	}
// 
// 	private void log(final java.util.logging.Level level, final String msg, final Object... args) {
// 		if (underlying.isLoggable(level)) {
// 			final Object[] formattedMsgAndCause = formattedMsgAndCause(msg, args);
// 			final String formattedMsg = (String) formattedMsgAndCause[0];
// 			final Throwable thrown = (Throwable) formattedMsgAndCause[1];
// 			underlying.log(level, formattedMsg, thrown);
// 		}
// 
// 	}
// 
// 	public boolean isErrorEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.SEVERE);
// 	}
// 
// 	public boolean isWarnEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.WARNING);
// 	}
// 
// 	public boolean isInfoEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.INFO);
// 	}
// 
// 	public boolean isDebugEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.FINE);
// 	}
// 
// 	public boolean isTraceEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.FINER);
// 	}
// 
// 	public void error(final String msg, final Object... args) {
// 		log(java.util.logging.Level.SEVERE, msg, args);
// 	}
// 
// 	public void warn(final String msg, final Object... args) {
// 		log(java.util.logging.Level.WARNING, msg, args);
// 	}
// 
// 	public void info(final String msg, final Object... args) {
// 		log(java.util.logging.Level.INFO, msg, args);
// 	}
// 
// 	public void debug(final String msg, final Object... args) {
// 		log(java.util.logging.Level.FINE, msg, args);
// 	}
// 
// 	public void trace(final String msg, final Object... args) {
// 		log(java.util.logging.Level.FINER, msg, args);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return getClass().getSimpleName() + "(" + underlying + ")";
// 	}
// }


import static de.tobiasroeser.lambdatest.Expect.expectEquals;
import de.tobiasroeser.lambdatest.testng.FreeSpec;
import de.tototec.cmdoption.internal.LoggerFactory.JavaUtilLogger;
package de.tototec.cmdoption.internal;



public class LoggerFactoryJulLoggerTest extends FreeSpec {

	{
		final RuntimeException ex = new RuntimeException();

		testJulFormatter("{}", null, "{}");
		testJulFormatter("{ }", null, "{ }");
		testJulFormatter("{", null, "{");
		testJulFormatter("}", null, "}");
		testJulFormatter("{}", ex, "{}", ex);
		testJulFormatter("{ }", ex, "{ }", ex);
		testJulFormatter("{", ex, "{", ex);
		testJulFormatter("}", ex, "}", ex);
		testJulFormatter("123", null, "1{}3", "2");
		testJulFormatter("123", null, "{}{}3", "1", "2");
		testJulFormatter("123", null, "{}{}{}", "1", "2", "3");
		testJulFormatter("123", ex, "1{}3", "2", ex);
		testJulFormatter("123", ex, "{}{}3", "1", "2", ex);
		testJulFormatter("123", ex, "{}{}{}", "1", "2", "3", ex);
	}

	public void testJulFormatter(final String expectedMsg, final Throwable expectedCause, final String msg,
			final Object... args) {
// Path: de.tototec.cmdoption/src/main/java/de/tototec/cmdoption/internal/LoggerFactory.java
// public static class JavaUtilLogger implements Logger {
// 	private final java.util.logging.Logger underlying;
// 
// 	public JavaUtilLogger(final Class<?> clazz) {
// 		underlying = java.util.logging.Logger.getLogger(clazz.getName());
// 	}
// 
// 	protected Object[] formattedMsgAndCause(final String msg, final Object... args) {
// 		final String formattedMsg;
// 		final Throwable thrown;
// 		if (args != null && args.length > 0) {
// 			final int l;
// 			if (args[args.length - 1] instanceof Throwable) {
// 				l = args.length - 1;
// 				thrown = (Throwable) args[args.length - 1];
// 			}
// 			else {
// 				l = args.length;
// 				thrown = null;
// 			}
// 			if (l > 0) {
// 				final StringBuilder strBuilder = new StringBuilder();
// 
// 				boolean braceOpen = false;
// 				int argNr = 0;
// 				for (int i = 0; i < msg.length(); ++i) {
// 					final char charAt = msg.charAt(i);
// 					if (argNr < l) {
// 						if (braceOpen) {
// 							braceOpen = false;
// 							if (charAt == '}') {
// 								// instead, insert next arg
// 								strBuilder.append(args[argNr]);
// 								++argNr;
// 								continue;
// 							} else {
// 								strBuilder.append("{");
// 							}
// 						} else if (charAt == '{') {
// 							braceOpen = true;
// 							continue;
// 						}
// 					}
// 					strBuilder.append(charAt);
// 				}
// 				if (braceOpen) {
// 					strBuilder.append("{");
// 				}
// 
// 				formattedMsg = strBuilder.toString();
// 			} else {
// 				formattedMsg = msg;
// 			}
// 		} else {
// 			formattedMsg = msg;
// 			thrown = null;
// 		}
// 		return new Object[] { formattedMsg, thrown };
// 	}
// 
// 	private void log(final java.util.logging.Level level, final String msg, final Object... args) {
// 		if (underlying.isLoggable(level)) {
// 			final Object[] formattedMsgAndCause = formattedMsgAndCause(msg, args);
// 			final String formattedMsg = (String) formattedMsgAndCause[0];
// 			final Throwable thrown = (Throwable) formattedMsgAndCause[1];
// 			underlying.log(level, formattedMsg, thrown);
// 		}
// 
// 	}
// 
// 	public boolean isErrorEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.SEVERE);
// 	}
// 
// 	public boolean isWarnEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.WARNING);
// 	}
// 
// 	public boolean isInfoEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.INFO);
// 	}
// 
// 	public boolean isDebugEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.FINE);
// 	}
// 
// 	public boolean isTraceEnabled() {
// 		return underlying.isLoggable(java.util.logging.Level.FINER);
// 	}
// 
// 	public void error(final String msg, final Object... args) {
// 		log(java.util.logging.Level.SEVERE, msg, args);
// 	}
// 
// 	public void warn(final String msg, final Object... args) {
// 		log(java.util.logging.Level.WARNING, msg, args);
// 	}
// 
// 	public void info(final String msg, final Object... args) {
// 		log(java.util.logging.Level.INFO, msg, args);
// 	}
// 
// 	public void debug(final String msg, final Object... args) {
// 		log(java.util.logging.Level.FINE, msg, args);
// 	}
// 
// 	public void trace(final String msg, final Object... args) {
// 		log(java.util.logging.Level.FINER, msg, args);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return getClass().getSimpleName() + "(" + underlying + ")";
// 	}
// }


// Path: de.tototec.cmdoption/src/test/java/de/tototec/cmdoption/internal/LoggerFactoryJulLoggerTest.java
import static de.tobiasroeser.lambdatest.Expect.expectEquals;
import de.tobiasroeser.lambdatest.testng.FreeSpec;
import de.tototec.cmdoption.internal.LoggerFactory.JavaUtilLogger;

package de.tototec.cmdoption.internal;



public class LoggerFactoryJulLoggerTest extends FreeSpec {

	{
		final RuntimeException ex = new RuntimeException();

		testJulFormatter("{}", null, "{}");
		testJulFormatter("{ }", null, "{ }");
		testJulFormatter("{", null, "{");
		testJulFormatter("}", null, "}");
		testJulFormatter("{}", ex, "{}", ex);
		testJulFormatter("{ }", ex, "{ }", ex);
		testJulFormatter("{", ex, "{", ex);
		testJulFormatter("}", ex, "}", ex);
		testJulFormatter("123", null, "1{}3", "2");
		testJulFormatter("123", null, "{}{}3", "1", "2");
		testJulFormatter("123", null, "{}{}{}", "1", "2", "3");
		testJulFormatter("123", ex, "1{}3", "2", ex);
		testJulFormatter("123", ex, "{}{}3", "1", "2", ex);
		testJulFormatter("123", ex, "{}{}{}", "1", "2", "3", ex);
	}

	public void testJulFormatter(final String expectedMsg, final Throwable expectedCause, final String msg,
			final Object... args) {
		final JavaUtilLogger logger = new LoggerFactory.JavaUtilLogger(getClass());