// Path: jdcallgraph/src/main/java/com/dkarv/jdcallgraph/util/config/Config.java
// public abstract class Config {
// 
//   static Config instance;
// 
//   public static Config getInst() {
//     return instance;
//   }
// 
//   @Option
//   public abstract String outDir();
// 
//   @Option
//   public abstract int logLevel();
// 
//   @Option
//   public abstract boolean logConsole();
// 
//   @Option
//   public abstract GroupBy groupBy();
// 
//   @Option
//   public abstract Target[] writeTo();
// 
//   @Option
//   public abstract DuplicateDetection duplicateDetection();
// 
//   @Option
//   public abstract String format();
// 
//   @Option
//   public abstract boolean javassist();
// 
//   /**
//    * Check whether everything is set and fix options if necessary.
//    */
//   void check() {
//     if (!outDir().endsWith(File.separator)) {
//       // TODO get rid of this by checking each location it is used
//       throw new IllegalArgumentException("outDir " + outDir() + " does not end with a file separator");
//     }
// 
//     if (logLevel() < 0 || logLevel() > 6) {
//       throw new IllegalArgumentException("Invalid log level: " + logLevel());
//     }
//   }
// }
// 
// Path: jdcallgraph/src/test/java/com/dkarv/jdcallgraph/util/config/ConfigUtils.java
// public class ConfigUtils {
// 
//   public static void replace(boolean addDefaults, String... options) throws IOException {
//     if (addDefaults) {
//       new ConfigReader(
//           ConfigUtils.class.getResourceAsStream("/com/dkarv/jdcallgraph/defaults.ini"),
//           write(options)).read();
//     } else {
//       new ConfigReader(
//           write(options)).read();
//     }
//   }
// 
//   public static InputStream write(String... options) throws IOException {
//     StringBuilder str = new StringBuilder();
//     for (String opt : options) {
//       str.append(opt);
//       str.append('\n');
//     }
//     return TestUtils.writeInputStream(str.toString());
//   }
// 
//   public static void inject(Config config) {
//     Config.instance = config;
//   }
// }
// 
// Path: jdcallgraph/src/main/java/com/dkarv/jdcallgraph/util/options/Formatter.java
// public class Formatter {
//   private static final Logger LOG = new Logger(Formatter.class);
//   private static final Pattern P = Pattern.compile("\\{(.+?)}");
// 
//   public static String format(StackItem item) {
//     Matcher m = P.matcher(Config.getInst().format());
//     StringBuffer result = new StringBuffer();
//     while (m.find()) {
//       String replacement = replace(m.group(1), item);
//       replacement = Matcher.quoteReplacement(replacement);
//       m.appendReplacement(result, replacement);
//     }
//     return result.toString();
//   }
// 
//   public static String replace(String id, StackItem item) {
//     switch (id) {
//       case "package":
//         return item.getPackageName();
//       case "class":
//         return item.getClassName();
//       case "classname":
//         return item.getShortClassName();
//       case "line":
//         return Integer.toString(item.getLineNumber());
//       case "method":
//         return item.getMethodName();
//       case "methodname":
//         return item.getShortMethodName();
//       case "parameters":
//         return item.getMethodParameters();
//       default:
//         LOG.error("Unknown pattern: {}", id);
//         // Unknown pattern, return without modification
//         return '{' + id + '}';
//     }
//   }
// }


import com.dkarv.jdcallgraph.util.config.Config;
import com.dkarv.jdcallgraph.util.config.ConfigUtils;
import com.dkarv.jdcallgraph.util.options.Formatter;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
package com.dkarv.jdcallgraph.util;


public class FormatterTest {

  private String METHOD = "method";
  private String PARAMETERS = "int,String,int";
  private String PACKAGE = "abc.def";
  private String CLASS = "Example";
  private int LINE = 111;

  private StackItem item;
  private Config config;

  @Before
  public void mock() {
    item = Mockito.mock(StackItem.class);
    Mockito.when(item.getMethodName()).thenReturn(METHOD + "(" + PARAMETERS + ")");
    Mockito.when(item.getMethodParameters()).thenReturn(PARAMETERS);
    Mockito.when(item.getShortMethodName()).thenReturn(METHOD);
    Mockito.when(item.getClassName()).thenReturn(PACKAGE + "." + CLASS);
    Mockito.when(item.getPackageName()).thenReturn(PACKAGE);
    Mockito.when(item.getShortClassName()).thenReturn(CLASS);
    Mockito.when(item.getLineNumber()).thenReturn(LINE);

    config = Mockito.mock(Config.class);
// Path: jdcallgraph/src/main/java/com/dkarv/jdcallgraph/util/config/Config.java
// public abstract class Config {
// 
//   static Config instance;
// 
//   public static Config getInst() {
//     return instance;
//   }
// 
//   @Option
//   public abstract String outDir();
// 
//   @Option
//   public abstract int logLevel();
// 
//   @Option
//   public abstract boolean logConsole();
// 
//   @Option
//   public abstract GroupBy groupBy();
// 
//   @Option
//   public abstract Target[] writeTo();
// 
//   @Option
//   public abstract DuplicateDetection duplicateDetection();
// 
//   @Option
//   public abstract String format();
// 
//   @Option
//   public abstract boolean javassist();
// 
//   /**
//    * Check whether everything is set and fix options if necessary.
//    */
//   void check() {
//     if (!outDir().endsWith(File.separator)) {
//       // TODO get rid of this by checking each location it is used
//       throw new IllegalArgumentException("outDir " + outDir() + " does not end with a file separator");
//     }
// 
//     if (logLevel() < 0 || logLevel() > 6) {
//       throw new IllegalArgumentException("Invalid log level: " + logLevel());
//     }
//   }
// }
// 
// Path: jdcallgraph/src/test/java/com/dkarv/jdcallgraph/util/config/ConfigUtils.java
// public class ConfigUtils {
// 
//   public static void replace(boolean addDefaults, String... options) throws IOException {
//     if (addDefaults) {
//       new ConfigReader(
//           ConfigUtils.class.getResourceAsStream("/com/dkarv/jdcallgraph/defaults.ini"),
//           write(options)).read();
//     } else {
//       new ConfigReader(
//           write(options)).read();
//     }
//   }
// 
//   public static InputStream write(String... options) throws IOException {
//     StringBuilder str = new StringBuilder();
//     for (String opt : options) {
//       str.append(opt);
//       str.append('\n');
//     }
//     return TestUtils.writeInputStream(str.toString());
//   }
// 
//   public static void inject(Config config) {
//     Config.instance = config;
//   }
// }
// 
// Path: jdcallgraph/src/main/java/com/dkarv/jdcallgraph/util/options/Formatter.java
// public class Formatter {
//   private static final Logger LOG = new Logger(Formatter.class);
//   private static final Pattern P = Pattern.compile("\\{(.+?)}");
// 
//   public static String format(StackItem item) {
//     Matcher m = P.matcher(Config.getInst().format());
//     StringBuffer result = new StringBuffer();
//     while (m.find()) {
//       String replacement = replace(m.group(1), item);
//       replacement = Matcher.quoteReplacement(replacement);
//       m.appendReplacement(result, replacement);
//     }
//     return result.toString();
//   }
// 
//   public static String replace(String id, StackItem item) {
//     switch (id) {
//       case "package":
//         return item.getPackageName();
//       case "class":
//         return item.getClassName();
//       case "classname":
//         return item.getShortClassName();
//       case "line":
//         return Integer.toString(item.getLineNumber());
//       case "method":
//         return item.getMethodName();
//       case "methodname":
//         return item.getShortMethodName();
//       case "parameters":
//         return item.getMethodParameters();
//       default:
//         LOG.error("Unknown pattern: {}", id);
//         // Unknown pattern, return without modification
//         return '{' + id + '}';
//     }
//   }
// }


// Path: jdcallgraph/src/test/java/com/dkarv/jdcallgraph/util/FormatterTest.java
import com.dkarv.jdcallgraph.util.config.Config;
import com.dkarv.jdcallgraph.util.config.ConfigUtils;
import com.dkarv.jdcallgraph.util.options.Formatter;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

package com.dkarv.jdcallgraph.util;


public class FormatterTest {

  private String METHOD = "method";
  private String PARAMETERS = "int,String,int";
  private String PACKAGE = "abc.def";
  private String CLASS = "Example";
  private int LINE = 111;

  private StackItem item;
  private Config config;

  @Before
  public void mock() {
    item = Mockito.mock(StackItem.class);
    Mockito.when(item.getMethodName()).thenReturn(METHOD + "(" + PARAMETERS + ")");
    Mockito.when(item.getMethodParameters()).thenReturn(PARAMETERS);
    Mockito.when(item.getShortMethodName()).thenReturn(METHOD);
    Mockito.when(item.getClassName()).thenReturn(PACKAGE + "." + CLASS);
    Mockito.when(item.getPackageName()).thenReturn(PACKAGE);
    Mockito.when(item.getShortClassName()).thenReturn(CLASS);
    Mockito.when(item.getLineNumber()).thenReturn(LINE);

    config = Mockito.mock(Config.class);
    ConfigUtils.inject(config);