package org.xbib.datastructures.json.iterator.test;

import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.xbib.datastructures.json.iterator.JsonIterator;
import org.xbib.datastructures.json.iterator.test.extra.JacksonCompatibilityMode;
import junit.framework.TestCase;

import java.io.IOException;

public class TestJackson extends TestCase {

    static {
//        JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_WITH_HASH);
    }

    private ObjectMapper objectMapper;

    public void setUp() {
        objectMapper = new ObjectMapper();
    }

    public static class TestObject1 {
        private int _id;
        private String _name;

        @JsonAnySetter
        public void setProperties(String key, Object value) {
            if (key.equals("name")) {
                _name = (String) value;
            } else if (key.equals("id")) {
                _id = ((Number) value).intValue();
            }
        }
    }

    public void test_JsonAnySetter() throws IOException {
        TestObject1 obj = objectMapper.readValue("{\"name\":\"hello\",\"id\":100}", TestObject1.class);
        assertEquals("hello", obj._name);
        assertEquals(100, obj._id);
        obj = JsonIterator.deserialize(new JacksonCompatibilityMode.Builder().build(),
                "{\"name\":\"hello\",\"id\":100}", TestObject1.class);
        assertEquals("hello", obj._name);
        assertEquals(100, obj._id);
    }

    public static class TestObject2 {
        @JsonProperty("field-1")
        public String field1;
    }

    public void test_JsonProperty() throws IOException {
        TestObject2 obj = objectMapper.readValue("{\"field-1\":\"hello\"}", TestObject2.class);
        assertEquals("hello", obj.field1);
        obj = JsonIterator.deserialize(new JacksonCompatibilityMode.Builder().build(),
                "{\"field-1\":\"hello\"}", TestObject2.class);
        assertEquals("hello", obj.field1);
    }

    public static class TestObject3 {
        @JsonIgnore
        public String field1;
    }

    public void test_JsonIgnore() throws IOException {
        TestObject3 obj = objectMapper.readValue("{\"field1\":\"hello\"}", TestObject3.class);
        assertNull(obj.field1);
        obj = JsonIterator.deserialize(new JacksonCompatibilityMode.Builder().build(),
                "{\"field1\":\"hello\"}", TestObject3.class);
        assertNull(obj.field1);
    }
}
