using System.Text.Json;
using Bit.Core.Utilities;
using Xunit;

namespace Bit.Core.Test.Helpers;

public class JsonHelpersTests
{
    private static void CompareJson<T>(T value, JsonSerializerOptions options, Newtonsoft.Json.JsonSerializerSettings settings)
    {
        var stgJson = JsonSerializer.Serialize(value, options);
        var nsJson = Newtonsoft.Json.JsonConvert.SerializeObject(value, settings);

        Assert.Equal(stgJson, nsJson);
    }


    [Fact]
    public void DefaultJsonOptions()
    {
        var testObject = new SimpleTestObject
        {
            Id = 0,
            Name = "Test",
        };

        CompareJson(testObject, JsonHelpers.Default, new Newtonsoft.Json.JsonSerializerSettings());
    }

    [Fact]
    public void IndentedJsonOptions()
    {
        var testObject = new SimpleTestObject
        {
            Id = 10,
            Name = "Test Name"
        };

        CompareJson(testObject, JsonHelpers.Indented, new Newtonsoft.Json.JsonSerializerSettings
        {
            Formatting = Newtonsoft.Json.Formatting.Indented,
        });
    }

    [Fact]
    public void NullValueHandlingJsonOptions()
    {
        var testObject = new SimpleTestObject
        {
            Id = 14,
            Name = null,
        };

        CompareJson(testObject, JsonHelpers.IgnoreWritingNull, new Newtonsoft.Json.JsonSerializerSettings
        {
            NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
        });
    }
}

public class SimpleTestObject
{
    public int Id { get; set; }
    public string Name { get; set; }
}