using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Topten.JsonKit;
using System.IO;
using System.Reflection;
using Xunit;

namespace TestCases
{
    [Obfuscation(Exclude = true, ApplyToMembers = true)]
    public class TestExcludeIfEmpty
    {
        class Thing
        {
            [Json("array", ExcludeIfEmpty = true)]
            public string[] Array;

            [Json("dictionary", ExcludeIfEmpty = true)]
            public Dictionary<string, object> Dictionary;

            [Json("list", ExcludeIfEmpty = true)]
            public List<string> List;
        }

        [Fact]
        public void TestDoesntWriteNull()
        {
            var thing = new Thing();

            // Save it
            var json = Json.Format(thing);

            // Check the object kinds were written out
            Assert.DoesNotContain("\"array\":", json);
            Assert.DoesNotContain("\"dictionary\":", json);
            Assert.DoesNotContain("\"list\":", json);
        }

        [Fact]
        public void TestDoesntWriteEmpty()
        {
            var thing = new Thing()
            {
                Array = new string[0],
                Dictionary = new Dictionary<string, object>(),
                List = new List<string>(),
            };

            // Save it
            var json = Json.Format(thing);

            // Check the object kinds were written out
            Assert.DoesNotContain("\"array\":", json);
            Assert.DoesNotContain("\"dictionary\":", json);
            Assert.DoesNotContain("\"list\":", json);
        }

        [Fact]
        public void TestDoesWriteNonEmpty()
        {
            var thing = new Thing()
            {
                Array = new string[] { "apples" },
                Dictionary = new Dictionary<string, object>() { { "pears", true } },
                List = new List<string> { "bananas" },
            };

            // Save it
            var json = Json.Format(thing);

            // Check the object kinds were written out
            Assert.Contains("\"array\":", json);
            Assert.Contains("\"dictionary\":", json);
            Assert.Contains("\"list\":", json);
            Assert.Contains("\"apples\"", json);
            Assert.Contains("\"pears\"", json);
            Assert.Contains("\"bananas\"", json);
        }
    }
}