package com.fasterxml.jackson.databind.introspect;

import com.fasterxml.jackson.annotation.Nulls;
import com.fasterxml.jackson.databind.*;

public class PropertyMetadataTest extends BaseMapTest
{
    public void testPropertyName()
    {
        PropertyName name = PropertyName.NO_NAME;
        
        assertFalse(name.hasSimpleName());
        assertFalse(name.hasNamespace());
        assertSame(name, name.internSimpleName());
        assertSame(name, name.withSimpleName(null));
        assertSame(name, name.withSimpleName(""));
        assertSame(name, name.withNamespace(null));
        assertEquals("", name.toString());
        assertTrue(name.isEmpty());
        assertFalse(name.hasSimpleName("foo"));
        // just to trigger it, ensure to exception
        name.hashCode();

        PropertyName newName = name.withNamespace("");
        assertNotSame(name, newName);
        assertTrue(name.equals(name));
        assertFalse(name.equals(newName));
        assertFalse(newName.equals(name));

        name = name.withSimpleName("foo");
        assertEquals("foo", name.toString());
        assertTrue(name.hasSimpleName("foo"));
        assertFalse(name.isEmpty());
        newName = name.withNamespace("ns");
        assertEquals("{ns}foo", newName.toString());
        assertFalse(newName.equals(name));
        assertFalse(name.equals(newName));

        // just to trigger it, ensure to exception
        name.hashCode();
    }

    public void testPropertyMetadata()
    {
        PropertyMetadata md = PropertyMetadata.STD_OPTIONAL;
        assertNull(md.getValueNulls());
        assertNull(md.getContentNulls());
        assertNull(md.getDefaultValue());
        assertEquals(Boolean.FALSE, md.getRequired());

        md = md.withNulls(Nulls.AS_EMPTY,
                Nulls.FAIL);
        assertEquals(Nulls.AS_EMPTY, md.getValueNulls());
        assertEquals(Nulls.FAIL, md.getContentNulls());

        assertFalse(md.hasDefaultValue());
        assertSame(md, md.withDefaultValue(null));
        assertSame(md, md.withDefaultValue(""));
        md = md.withDefaultValue("foo");
        assertEquals("foo", md.getDefaultValue());
        assertTrue(md.hasDefaultValue());
        assertSame(md, md.withDefaultValue("foo"));
        md = md.withDefaultValue(null);
        assertFalse(md.hasDefaultValue());
        assertNull(md.getDefaultValue());

        md = md.withRequired(null);
        assertNull(md.getRequired());
        assertFalse(md.isRequired());
        md = md.withRequired(Boolean.TRUE);
        assertTrue(md.isRequired());
        assertSame(md, md.withRequired(Boolean.TRUE));
        md = md.withRequired(null);
        assertNull(md.getRequired());
        assertFalse(md.isRequired());
 
        assertFalse(md.hasIndex());
        md = md.withIndex(Integer.valueOf(3));
        assertTrue(md.hasIndex());
        assertEquals(Integer.valueOf(3), md.getIndex());
    }
}
