public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Dictionary<string, object> propDict = serializer.Deserialize<Dictionary<string, object>>(reader);
            Dictionary<string, object> fieldDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(propDict.First().Value.ToString());

            ObjectProperty objProp = new ObjectProperty(propDict.First().Key);
            ObjectProperty.Deserialize(objProp, fieldDict);

            TypeMapping prop = new TypeMapping(objProp);
            prop.Fields = DocumentMapping.Deserialize(fieldDict);
            prop.Analyzer = PropertyAnalyzer.Deserialize(fieldDict);
            prop.DetectDates = fieldDict.GetBool(TypeMapping.DETECT_DATES, TypeMapping._DETECT_DATES_DEFAULT);
            prop.DetectNumbers = fieldDict.GetBool(TypeMapping.DETECT_NUMBERS, TypeMapping._DETECT_NUMBERS_DEFAULT);
            if (fieldDict.ContainsKey(TypeMapping.DYNAMIC_DATE_FORMATS))
            {
                prop.DynamicDateFormats = JsonConvert.DeserializeObject<IEnumerable<DateFormat>>(fieldDict.GetString(TypeMapping.DYNAMIC_DATE_FORMATS));
            }
            if (fieldDict.ContainsKey(TypeMapping.DYNAMIC_TEMPLATES))
            {
                prop.DynamicTemplates = JsonConvert.DeserializeObject<IEnumerable<DynamicTemplate>>(fieldDict.GetString(TypeMapping.DYNAMIC_TEMPLATES));
            }
            if (fieldDict.ContainsKey(TypeMapping.META))
            {
                prop.MetaData = JsonConvert.DeserializeObject<Dictionary<string, object>>(fieldDict.GetString(TypeMapping.META));
            }
            return prop;
        }
        public void PASS_Serialize()
        {
            TypeMapping prop = new TypeMapping("entity")
            {
                Analyzer = new PropertyAnalyzer(new StandardAnalyzer("standard")),
                DetectDates = false,
                DetectNumbers = true,
                Dynamic = DynamicSettingEnum.Strict,
                DynamicDateFormats = new List<DateFormat>() { new DateFormat("format1"), new DateFormat("format2") },
                DynamicTemplates = new List<DynamicTemplate>()
                {
                    new DynamicTemplate("template1", new StringProperty("string-prop"))
                },
                Properties = new List<IDocumentProperty>()
                {
                    new StringProperty("name")
                }
            };

            IndexMapping indexMapping = new IndexMapping("1234index", new List<TypeMapping>() { prop });

            string json = JsonConvert.SerializeObject(indexMapping);
            Assert.IsNotNull(json);

            string expectedJson = "{\"1234index\":{\"entity\":{\"analyzer\":\"standard\",\"date_detection\":false,\"numeric_detection\":true,\"dynamic_date_formats\":[\"format1\",\"format2\"],\"dynamic_templates\":[{\"template1\":{\"match\":\"*\",\"mapping\":{\"type\":\"string\"}}}],\"dynamic\":\"strict\",\"properties\":{\"name\":{\"type\":\"string\"}}}}}";

            Assert.AreEqual(expectedJson, json);
        }
        public void PASS_Create()
        {
            TypeMapping prop = new TypeMapping("entity")
            {
                Analyzer = new PropertyAnalyzer(new StandardAnalyzer("standard")),
                DetectDates = false,
                DetectNumbers = true,
                Dynamic = DynamicSettingEnum.Strict,
                DynamicDateFormats = new List<DateFormat>() { new DateFormat("format1"), new DateFormat("format2") },
                DynamicTemplates = new List<DynamicTemplate>()
                {
                    new DynamicTemplate("template1", new StringProperty("string-prop"))
                },
                Properties = new List<IDocumentProperty>()
                {
                    new StringProperty("name")
                }
            };

            Assert.IsNotNull(prop);
            Assert.AreEqual("standard", prop.Analyzer.Analyzer.Name);
            Assert.AreEqual(false, prop.DetectDates);
            Assert.AreEqual(true, prop.DetectNumbers);
            Assert.AreEqual(DynamicSettingEnum.Strict, prop.Dynamic);
            Assert.AreEqual("format1", prop.DynamicDateFormats.First().Format);
            Assert.AreEqual("format2", prop.DynamicDateFormats.Last().Format);
            DynamicTemplate template = prop.DynamicTemplates.First();
            Assert.AreEqual("template1", template.Name);
            Assert.AreEqual("string-prop", template.Mapping.Name);
            Assert.AreEqual(PropertyTypeEnum.String, template.Mapping.PropertyType);
            Assert.AreEqual("name", prop.Properties.First().Name);
            Assert.AreEqual(PropertyTypeEnum.String, prop.Properties.First().PropertyType);
        }