/*
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
 * agreements. See the NOTICE file distributed with this work for additional information regarding
 * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance with the License. You may obtain a
 * copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */

package org.apache.geode.management.internal.cli.converters;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import org.junit.Before;
import org.junit.Test;

import org.apache.geode.management.configuration.ClassName;


public class ClassNameConverterTest {

  private ClassNameConverter converter;

  @Before
  public void before() throws Exception {
    converter = new ClassNameConverter();
  }

  @Test
  public void convertClassOnly() {
    ClassName declarable = converter.convertFromText("abc", ClassName.class, "");
    assertThat(declarable.getClassName()).isEqualTo("abc");
    assertThat(declarable.getInitProperties()).isEmpty();
  }

  @Test
  public void convertClassAndEmptyProp() {
    ClassName declarable = converter.convertFromText("abc{}", ClassName.class, "");
    assertThat(declarable.getClassName()).isEqualTo("abc");
    assertThat(declarable.getInitProperties()).isEmpty();
  }

  @Test
  public void convertWithOnlyDelimiter() {
    assertThat(converter.convertFromText("{", ClassName.class, "")).isEqualTo(ClassName.EMPTY);
  }

  @Test
  public void convertWithInvalidClassName() {
    assertThatThrownBy(() -> converter.convertFromText("abc?{}", ClassName.class, ""))
        .isInstanceOf(IllegalArgumentException.class).hasMessageContaining("Invalid className");
  }

  @Test
  public void convertWithEmptyString() {
    ClassName className = converter.convertFromText("", ClassName.class, "");
    assertThat(className).isEqualTo(ClassName.EMPTY);
  }

  @Test
  public void convertClassAndProperties() {
    String json = "{'k1':'v1','k2':'v2'}";
    ClassName declarable = converter.convertFromText("abc" + json, ClassName.class, "");
    assertThat(declarable.getClassName()).isEqualTo("abc");
    assertThat(declarable.getInitProperties()).containsOnlyKeys("k1", "k2")
        .containsEntry("k1", "v1").containsEntry("k2", "v2");
  }

  @Test
  public void convertClassAndPropertiesWithDoubleQuotes() {
    String json = "{\"k1\":\"v1\",\"k2\":\"v2\"}";
    ClassName declarable = converter.convertFromText("abc" + json, ClassName.class, "");
    assertThat(declarable.getClassName()).isEqualTo("abc");
    assertThat(declarable.getInitProperties()).containsOnlyKeys("k1", "k2")
        .containsEntry("k1", "v1").containsEntry("k2", "v2");
  }
}
