using System;
using System.Collections.Generic;
using System.Text;
using System.Data.Odbc;

using Xunit;
using Shouldly;

using AccessStudy.Core;

namespace AccessStudy.CoreTest
{
    public class OdbcUtilTest:IDisposable
    {
        private readonly OdbcUtil _dbUtil;
        public OdbcUtilTest()
        {
            _dbUtil = new OdbcUtil();
        }

        [Fact]
        public void DbUtil_NotNull_Test()
        {
            Assert.NotNull(_dbUtil);
        }

        [Fact]
        public void DbConnet_Test()
        {
            var con = _dbUtil.DbConnection;
            Assert.NotNull(con);

            Action action = () =>
            {
                con.Open();
                con.Close();
                con.Dispose();
            };

            Should.NotThrow(action);
        }

        [Fact]
        public void DataSet_Test()
        {
            var ds = _dbUtil.GetDataSet("Student");

            Assert.NotNull(ds);

            Assert.NotNull(ds.Tables);

            Assert.True(ds.Tables.Count > 0);
        }

        [Fact]
        public void DataTable_Test()
        {
            var dt = _dbUtil.GetDataTable("Student");
            Assert.NotNull(dt);
        }

        [Fact]
        public void DataReader_Test()
        {
            Action action = () =>
            {
                var dataReader = _dbUtil.GetDataReader("Student");
                while (dataReader.Read())
                {
                    break;
                }

                dataReader.Close();
            };

            Should.NotThrow(action);
        }

        /// <summary>
        /// 参数使用不同
        /// SQL语句中用?代表参数,按参数顺序传参
        /// 参数名以不用@开头都可以
        /// </summary>
        [Fact]
        public void Scalar_Test()
        {
            //

            var sqlText = @"select count(*) as Total from Student where Age>? ;";
            var paras = new List<OdbcParameter>()
            {
                new OdbcParameter("@Age",1),
            };

            var total = (int)_dbUtil.GetScalar(sqlText, paras);

            Assert.True(total >= 0);
        }


        [Fact]
        public void NonQuery_Test()
        {
            var sqlText = @"update Student Set Age=Age+1 where Age>? AND Name <>?;";
            var paras = new List<OdbcParameter>()
            {
                new OdbcParameter("Age",1),
                new OdbcParameter("Name","王高峰"),
            };

            var total = _dbUtil.ExecuteNonQuery(sqlText, paras);

            Assert.True(total >= 0);
        }

        public void Dispose()
        {
             
        }
    }
}