// Same code (but different expected errors) as test PreventClearProperty.java .

import java.util.Properties;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.common.value.qual.StringVal;

public class PermitClearProperty {

  static final @StringVal("line.separator") String LINE_SEPARATOR = "line.separator";

  static final @StringVal("my.property.name") String MY_PROPERTY_NAME = "my.property.name";

  @NonNull String getLineSeparator1() {
    // :: error: (return)
    return System.getProperty("line.separator");
  }

  @NonNull String getLineSeparator2() {
    // :: error: (return)
    return System.getProperty(LINE_SEPARATOR);
  }

  @NonNull String getMyProperty1() {
    // :: error: (return)
    return System.getProperty("my.property.name");
  }

  @NonNull String getMyProperty2() {
    // :: error: (return)
    return System.getProperty(MY_PROPERTY_NAME);
  }

  @NonNull String getAProperty(String propName) {
    // :: error: (return)
    return System.getProperty(propName);
  }

  @NonNull String clearLineSeparator1() {
    // :: error: (return)
    return System.clearProperty("line.separator");
  }

  @NonNull String clearLineSeparator2() {
    // :: error: (return)
    return System.clearProperty(LINE_SEPARATOR);
  }

  @NonNull String clearMyProperty1() {
    // :: error: (return)
    return System.clearProperty("my.property.name");
  }

  @NonNull String clearMyProperty2() {
    // :: error: (return)
    return System.clearProperty(MY_PROPERTY_NAME);
  }

  @NonNull String clearAProperty(String propName) {
    // :: error: (return)
    return System.clearProperty(propName);
  }

  void callSetProperties(Properties p) {
    System.setProperties(p);
  }

  // All calls to setProperty are legal because they cannot unset a property.

  @NonNull String setLineSeparator1() {
    // :: error: (return)
    return System.setProperty("line.separator", "somevalue");
  }

  @NonNull String setLineSeparator2() {
    // :: error: (return)
    return System.setProperty(LINE_SEPARATOR, "somevalue");
  }

  @NonNull String setMyProperty1() {
    // :: error: (return)
    return System.setProperty("my.property.name", "somevalue");
  }

  @NonNull String setMyProperty2() {
    // :: error: (return)
    return System.setProperty(MY_PROPERTY_NAME, "somevalue");
  }

  @NonNull String setAProperty(String propName) {
    // :: error: (return)
    return System.setProperty(propName, "somevalue");
  }

  // These calls to setProperty are illegal because null is not a permitted value.

  @NonNull String setLineSeparatorNull1() {
    // :: error: (return)
    // :: error: (argument)
    return System.setProperty("line.separator", null);
  }

  @NonNull String setLineSeparatorNull2() {
    // :: error: (argument)
    // :: error: (return)
    return System.setProperty(LINE_SEPARATOR, null);
  }

  @NonNull String setMyPropertyNull1() {
    // :: error: (argument)
    // :: error: (return)
    return System.setProperty("my.property.name", null);
  }

  @NonNull String setMyPropertyNull2() {
    // :: error: (argument)
    // :: error: (return)
    return System.setProperty(MY_PROPERTY_NAME, null);
  }

  @NonNull String setAPropertyNull(String propName) {
    // :: error: (argument)
    // :: error: (return)
    return System.setProperty(propName, null);
  }
}
