package software.amazon.awssdk.enhanced.dynamodb;

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

import java.util.Collections;
import org.junit.jupiter.api.Test;

public class NestedAttributeNameTest {

    private static final String ATTRIBUTE_NAME = "attributeName";

    @Test
    public void testNullAttributeNames_fails() {
        assertThatThrownBy(() -> NestedAttributeName.builder().build())
            .isInstanceOf(IllegalStateException.class)
            .hasMessageContaining("nestedAttributeNames must not be null");
        assertThatThrownBy(() -> NestedAttributeName.builder().addElement(null).build())
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessageContaining("nestedAttributeNames must not contain null values");
        assertThatThrownBy(() -> NestedAttributeName.builder().elements(ATTRIBUTE_NAME).addElement(null).build())
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessageContaining("nestedAttributeNames must not contain null values");
        assertThatThrownBy(() -> NestedAttributeName.create())
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessageContaining("nestedAttributeNames must not be empty");
    }

    @Test
    public void testEmptyAttributeNameList_fails() {
        assertThatThrownBy(() -> NestedAttributeName.builder().elements(Collections.emptyList()).build())
            .isInstanceOf(IllegalArgumentException.class);
        assertThatThrownBy(() -> NestedAttributeName.create(Collections.emptyList()))
            .isInstanceOf(IllegalArgumentException.class);
    }

    @Test
    public void testEmptyAttributeNames_allowed() {
        NestedAttributeName.builder().elements(Collections.singletonList("")).build();
        NestedAttributeName.create(Collections.singletonList(""));
    }

    @Test
    public void testEmptyAttributeNames_toString() {
        NestedAttributeName nestedAttribute = NestedAttributeName.create("Attribute1", "Attribute*2", "Attribute-3");
        assertThat(nestedAttribute.toString()).isEqualTo("Attribute1.Attribute*2.Attribute-3");
    }

    @Test
    public void toBuilder() {
        NestedAttributeName builtObject = NestedAttributeName.builder().addElement(ATTRIBUTE_NAME).build();
        NestedAttributeName copiedObject = builtObject.toBuilder().build();
        assertThat(copiedObject).isEqualTo(builtObject);
    }

}
