@SuppressWarnings("unchecked")
  static SelMap of(Map<String, Object> input) {
    if (input == null) {
      return new SelMap(null);
    }
    SelMap map = new SelMap(new HashMap<>());
    for (Map.Entry<String, Object> entry : input.entrySet()) {
      if (entry.getValue() instanceof String) {
        map.val.put(SelString.of(entry.getKey()), SelString.of((String) entry.getValue()));
      } else if (entry.getValue() instanceof Long || entry.getValue() instanceof Integer) {
        map.val.put(
            SelString.of(entry.getKey()), SelLong.of(((Number) entry.getValue()).longValue()));
      } else if (entry.getValue() instanceof Double || entry.getValue() instanceof Float) {
        map.val.put(
            SelString.of(entry.getKey()), SelDouble.of(((Number) entry.getValue()).doubleValue()));
      } else if (entry.getValue() instanceof Boolean) {
        map.val.put(SelString.of(entry.getKey()), SelBoolean.of((Boolean) entry.getValue()));
      } else if (entry.getValue() instanceof Map) {
        map.val.put(
            SelString.of(entry.getKey()), SelMap.of((Map<String, Object>) entry.getValue()));
      } else if (entry.getValue() instanceof String[]) {
        map.val.put(
            SelString.of(entry.getKey()), SelArray.of(entry.getValue(), SelTypes.STRING_ARRAY));
      } else if (entry.getValue() instanceof long[]) {
        map.val.put(
            SelString.of(entry.getKey()), SelArray.of(entry.getValue(), SelTypes.LONG_ARRAY));
      } else if (entry.getValue() instanceof double[]) {
        map.val.put(
            SelString.of(entry.getKey()), SelArray.of(entry.getValue(), SelTypes.DOUBLE_ARRAY));
      } else if (entry.getValue() instanceof boolean[]) {
        map.val.put(
            SelString.of(entry.getKey()), SelArray.of(entry.getValue(), SelTypes.BOOLEAN_ARRAY));
      } else {
        throw new IllegalArgumentException(
            "Invalid map entry type ("
                + (entry.getValue() == null ? "null" : entry.getValue().getClass().getName())
                + ") for Map constructor");
      }
    }
    return map;
  }
@Test(expected = IllegalArgumentException.class)
  public void testInvalidTypeNullValue() {
    SelMap.of(Collections.singletonMap("bar", null));
  }