// Test case for Issue 1507:
// https://github.com/typetools/checker-framework/issues/1507

import java.io.PrintStream;
import java.util.Locale;
import org.checkerframework.checker.formatter.qual.FormatMethod;

public class FormatMethodAnnotation {

  public void example() {
    String ex1 = String.format(Locale.ENGLISH, "%s %d", "cost", 12);
    log("%d", 0);
    log2(Locale.ENGLISH, "%d", 0);
  }

  @FormatMethod
  static void log(String format, Object... args) {
    String ex1 = String.format(format, args);
    String ex2 = String.format(Locale.ENGLISH, format, args);
  }

  @FormatMethod
  static void log2(Locale locale, String format, Object... args) {
    String ex1 = String.format(format, args);
    String ex2 = String.format(locale, format, args);
    String ex3 = String.format(Locale.FRENCH, format, args);
  }

  PrintStream logfile;
  boolean enabled;
  String indent_str;

  @FormatMethod
  void log3(String format, Object... args) {
    if (enabled) {
      logfile.print(indent_str);
      logfile.printf(format, args);
    }
  }

  @com.google.errorprone.annotations.FormatMethod
  void log4(String format, Object... args) {
    if (enabled) {
      logfile.print(indent_str);
      logfile.printf(format, args);
    }
  }
}
