using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;

using StackExchange.Redis;
using Xunit;
using Xunit.Extensions;
using Xunit.Serialization;
using Xunit.Abstractions;
using Xunit.Sdk;

using RedisStudyModel;
using RedisStuy;

namespace RedisStudyTest
{
    [Trait("RedisString", "All")]
    public class RedisListStudyTest : IDisposable
    {
        #region 初始化
        private readonly ITestOutputHelper testOutput;
        private IDatabase redisDatabase = null;
        private RedisListStudy redisListStudy = null;
        private TimeSpan defaultExpiry = TimeSpan.FromSeconds(20);
        private string defaultRedisKey = "RedisStudy:List:xUnitTest";

        /// <summary>
        /// 构造
        /// </summary>
        public RedisListStudyTest(ITestOutputHelper output)
        {
            this.testOutput = output;
            redisDatabase = RedisHelper.GetRedisDatabase();
            redisListStudy = new RedisListStudy();

        }
        #endregion

        #region ListLeftPush
        [Fact]
        public void ListLeftPushTest()
        {
            var listLength = redisListStudy.ListLeftPush(defaultRedisKey, "first");
            Assert.Equal(1, listLength);

            listLength = redisListStudy.ListLeftPush(defaultRedisKey, "second");
            Assert.Equal(2, listLength);

            var second = redisListStudy.ListLeftPop(defaultRedisKey);
            Assert.Equal("second", second);

            var first = redisListStudy.ListLeftPop(defaultRedisKey);
            Assert.Equal("first", first);
        }

        #endregion

        #region ListRightPush
        [Fact]
        public void ListRightPushTest()
        {
            var listLength = redisListStudy.ListRightPush(defaultRedisKey, "first");
            Assert.Equal(1, listLength);

            listLength = redisListStudy.ListRightPush(defaultRedisKey, "second");
            Assert.Equal(2, listLength);

            var second = redisListStudy.ListRightPop(defaultRedisKey);
            Assert.Equal("second", second);

            var first = redisListStudy.ListRightPop(defaultRedisKey);
            Assert.Equal("first", first);
        }
        #endregion

        #region 清理
        public void Dispose()
        {
            redisDatabase.KeyDelete(defaultRedisKey);
        }
        #endregion
    }
}