public void PASS_Create()
        {
            DocumentSource source = new DocumentSource()
            {
                IsEnabled = false,
                IsCompressed = true,
                Excludes = new List<string>()
                {
                    "ex1", "ex2"
                },
                Includes = new List<string>()
                {
                    "in1", "in2"
                },
                CompressionThreshold = new CompressionThreshold(10, SizeUnitEnum.Byte)
            };

            Assert.IsNotNull(source);
            Assert.AreEqual(false, source.IsEnabled);
            Assert.AreEqual(true, source.IsCompressed);
            Assert.AreEqual("ex1", source.Excludes.First());
            Assert.AreEqual("ex2", source.Excludes.Last());
            Assert.AreEqual("in1", source.Includes.First());
            Assert.AreEqual("in2", source.Includes.Last());
            Assert.AreEqual((Int64)10, source.CompressionThreshold.Size);
            Assert.AreEqual(SizeUnitEnum.Byte, source.CompressionThreshold.Unit);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Dictionary<string, object> fieldDict = serializer.Deserialize<Dictionary<string, object>>(reader);
            DocumentSource source = new DocumentSource();

            source.IsCompressed = fieldDict.GetBool(_IS_COMPRESSED, DocumentSource._IS_COMPRESSED_DEFAULT);
            if (fieldDict.ContainsKey(_COMPRESSION_THRESHOLD))
            {
                source.CompressionThreshold = new CompressionThreshold(fieldDict.GetString(_COMPRESSION_THRESHOLD));
            }
                
            if(fieldDict.ContainsKey(_EXCLUDES))
            {
                source.Excludes = JsonConvert.DeserializeObject<IEnumerable<string>>(fieldDict.GetString(_EXCLUDES));
            }

            if (fieldDict.ContainsKey(_INCLUDES))
            {
                source.Includes = JsonConvert.DeserializeObject<IEnumerable<string>>(fieldDict.GetString(_INCLUDES));
            }

            source.IsEnabled = fieldDict.GetBool(_IS_ENABLED, DocumentSource._IS_ENABLED_DEFAULT);

            return source;
        }
        public void PASS_Serialize()
        {
            DocumentSource source = new DocumentSource()
            {
                IsEnabled = false,
                IsCompressed = true,
                Excludes = new List<string>()
                {
                    "ex1", "ex2"
                },
                Includes = new List<string>()
                {
                    "in1", "in2"
                },
                CompressionThreshold = new CompressionThreshold(10, SizeUnitEnum.Byte)
            };

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

            string expectedJson = "{\"enabled\":false,\"compress\":true,\"compress_threshold\":\"10b\",\"includes\":[\"in1\",\"in2\"],\"excludes\":[\"ex1\",\"ex2\"]}";
            Assert.AreEqual(expectedJson, json);
        }