using System;
using FsCheck;
using FsCheck.Xunit;
using MediaBrowser.Model.Extensions;
using Xunit;

namespace Jellyfin.Model.Tests.Extensions
{
    public class StringHelperTests
    {
        [Theory]
        [InlineData("", "")]
        [InlineData("banana", "Banana")]
        [InlineData("Banana", "Banana")]
        [InlineData("ä", "Ä")]
        [InlineData("\027", "\027")]
        public void StringHelper_ValidArgs_Success(string input, string expectedResult)
        {
            Assert.Equal(expectedResult, StringHelper.FirstToUpper(input));
        }

        [Property]
        public Property FirstToUpper_RandomArg_Correct(NonEmptyString input)
        {
            var result = StringHelper.FirstToUpper(input.Item);

            // We check IsLower instead of IsUpper because both return false for non-letters
            return (!char.IsLower(result[0])).Label("First char is uppercase")
                .And(input.Item.Length == 1 || result[1..].Equals(input.Item[1..], StringComparison.Ordinal)).Label("Remaining chars are unmodified");
        }
    }
}