﻿using System;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml;
using OfficeOpenXml.FormulaParsing;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Database;

namespace EPPlusTest.FormulaParsing.Excel.Functions.Database
{
    [TestClass]
    public class ExcelDatabaseTests
    {
        [TestMethod]
        public void DatabaseShouldReadFields()
        {
            using (var package = new ExcelPackage())
            {
                var database = GetDatabase(package);

                Assert.AreEqual(2, database.Fields.Count(), "count was not 2");
                Assert.AreEqual("col1", database.Fields.First().FieldName, "first fieldname was not 'col1'");
                Assert.AreEqual("col2", database.Fields.Last().FieldName, "last fieldname was not 'col12'");
            }
        }

        [TestMethod]
        public void HasMoreRowsShouldBeTrueWhenInitialized()
        {
            using (var package = new ExcelPackage())
            {
                var database = GetDatabase(package);

                Assert.IsTrue(database.HasMoreRows);
            }
            
        }

        [TestMethod]
        public void HasMoreRowsShouldBeFalseWhenLastRowIsRead()
        {
            using (var package = new ExcelPackage())
            {
                var database = GetDatabase(package);
                database.Read();

                Assert.IsFalse(database.HasMoreRows);
            }

        }

        [TestMethod]
        public void DatabaseShouldReadFieldsInRow()
        {
            using (var package = new ExcelPackage())
            {
                var database = GetDatabase(package);
                var row = database.Read();

                Assert.AreEqual(1, row["col1"]);
                Assert.AreEqual(2, row["col2"]);
            }

        }

        private static ExcelDatabase GetDatabase(ExcelPackage package)
        {
            var provider = new EpplusExcelDataProvider(package);
            var sheet = package.Workbook.Worksheets.Add("test");
            sheet.Cells["A1"].Value = "col1";
            sheet.Cells["A2"].Value = 1;
            sheet.Cells["B1"].Value = "col2";
            sheet.Cells["B2"].Value = 2;
            var database = new ExcelDatabase(provider, "A1:B2");
            return database;
        }
    }
}
