using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using DataAccessLayer;
using System.Data;
using System.Threading;
using System.IO;
using ICSharpCode.SharpZipLib;
using System.Collections.Generic;
using ICSharpCode.SharpZipLib.Zip;
using GestoreTrimestrale.Logic;
using SmartFTP.Logic;
using AppConfigParser;
using System.Configuration;

namespace GestoreTrimestrale.Test
{

    [TestClass]
    public class UnitTest1
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        public UnitTest1()
        {

        }

        //TEST CONFIGURATION
        private string PDFProcessFolder { get { return @"C:\ReportisticaTrimestrale\PDF"; } }
        private string PDFOutputFolder { get { return @"C:\ReportisticaTrimestrale\PDFtoDB"; } }
        private string ZipFolder { get { return @"C:\ReportisticaTrimestrale\SELECTA\"; } }
        private string ZipBackupFolder { get { return @"C:\ReportisticaTrimestrale\SEND\"; } }
        private string WorkFolder { get { return ZipFolder + @"temp\"; } }
        private string GestorePDFLocation { get { return @"C:\Projekty\Fideuram\ContrattoSEI\GestorePDF_NuoviSviluppi\bin\Debug\GestorePDF.exe"; } }

        string FtpServer = @"10.0.8.22"; //your ftp server
        string FtpUser = "pkowalski@hpe.com";
        string FtpPassword = "password";
        string FtpPath = @"/ddd/aaaa/";

        private int NumberOfConcurrentGestorePDFProcesses { get { return 1; } }
        private int NumberOfFiscalCodesPerFile { get { return 3; } }

        private int ProduceHugeSetTestSample()
        {
            int i;
            using (DataAccessDE d = new DataAccessDE(DBProvider.SqlServerStampeC6))
            {
                i = Int32.Parse(d.ExecuteScalarStoredProcedure(DBProvider.SqlServerStampeC6, "test.GESTIONE_PDF_PREPARE_TEST_SAMPLE3", null).ToString());
            }
            return i;
        }
        

        private string[,] OneTestSample
        {
            get
            {
                string[,] testSamples = new string[1, 2];
                //testSamples[0, 0] = "DRSGRG58P10F241S"; testSamples[0, 1] = "F"; 
                //testSamples[0, 0] = "CRGLRT47D28D332H"; testSamples[0, 1] = "F";
                //testSamples[0, 0] = "CHRGLN62T17H501I"; testSamples[0, 1] = "F";
                testSamples[0, 0] = "DRSGRG58P10F241S"; testSamples[0, 1] = "F";
                return testSamples;

                //F	CRGLRT47D28D332H
            }

        }

        private string[,] QuickTestSamples
        {
            get
            {
                string[,] testSamples = new string[6, 2];
                testSamples[0, 0] = "BBNGCR56R59F817O"; testSamples[0, 1] = "S";
                testSamples[1, 0] = "GGLMCN62M44F112K"; testSamples[1, 1] = "S";
                testSamples[2, 0] = "GZZMLV44P59B328P"; testSamples[2, 1] = "S";
                testSamples[3, 0] = "NSTGNN50L27F205U"; testSamples[3, 1] = "F";
                testSamples[4, 0] = "ZCCLNR58P49H501R"; testSamples[4, 1] = "F";
                testSamples[5, 0] = "BCCFST33L11F453G"; testSamples[5, 1] = "F";
                //testSamples[1, 0] = "BRTMRC46R04D749A"; testSamples[1, 1] = "F";
                //testSamples[2, 0] = "MLPMRA28M55C406X"; testSamples[2, 1] = "F";
                //testSamples[3, 0] = "NGRNGL63E25E648B"; testSamples[3, 1] = "F";

                //testSamples[4, 0] = "DRSGRG58P10F241S"; testSamples[4, 1] = "F";
                //testSamples[5, 0] = "FNCNRM57H15F205I"; testSamples[5, 1] = "F";
                return testSamples;
            }

        }

        private string[,] TestSamples
        {
            get
            {
                string[,] test_samples = new string[40, 2]; //codice,rete
                //string[,] test_samples = new string[3, 2]; //codice,rete
                test_samples[0, 0] = "DRSGRG58P10F241S"; test_samples[0, 1] = "F";
                test_samples[1, 0] = "FNCNRM57H15F205I"; test_samples[1, 1] = "F";
                test_samples[2, 0] = "FRRLRD50D16D150B"; test_samples[2, 1] = "F";
                test_samples[3, 0] = "DLLLCU68C22L682C"; test_samples[3, 1] = "F";
                test_samples[4, 0] = "GLLPRN37C13H473T"; test_samples[4, 1] = "F";
                test_samples[5, 0] = "GDURRT61P13F205Y"; test_samples[5, 1] = "F";
                test_samples[6, 0] = "FRRRST43T21L048T"; test_samples[6, 1] = "F";
                test_samples[7, 0] = "GFNNCL71A31E625V"; test_samples[7, 1] = "F";

                test_samples[8, 0] = "BCCFBA48L19E463D"; test_samples[8, 1] = "F";
                test_samples[9, 0] = "BCCFMN35C62B519D"; test_samples[9, 1] = "F";
                test_samples[10, 0] = "BCCFNC30H12L219Y"; test_samples[10, 1] = "F";
                test_samples[11, 0] = "BCCFNC44C29C814C"; test_samples[11, 1] = "F";
                test_samples[12, 0] = "BCCFNC67D28G568Y"; test_samples[12, 1] = "F";
                test_samples[13, 0] = "BCCFNN35L08H501W"; test_samples[13, 1] = "F";
                test_samples[14, 0] = "BCCFNN70H50L219T"; test_samples[14, 1] = "F";
                test_samples[15, 0] = "BCCFPP78H19G999V"; test_samples[15, 1] = "F";
                test_samples[16, 0] = "BCCFST33L11F453G"; test_samples[16, 1] = "F";
                test_samples[17, 0] = "BCCFST51L26H225B"; test_samples[17, 1] = "F";
                test_samples[18, 0] = "BCCGCR34S26H710X"; test_samples[18, 1] = "F";
                test_samples[19, 0] = "BCCGCR40L30H501U"; test_samples[19, 1] = "F";
                test_samples[20, 0] = "BCCGCR52M16D612E"; test_samples[20, 1] = "F";
                test_samples[21, 0] = "BCCGCR58C10H683W"; test_samples[21, 1] = "F";
                test_samples[22, 0] = "BCCGCR62E31L117P"; test_samples[22, 1] = "F";
                test_samples[23, 0] = "BCCGDU65E08G674V"; test_samples[23, 1] = "F";
                test_samples[24, 0] = "BCCGGG53D13L219Z"; test_samples[24, 1] = "F";
                test_samples[25, 0] = "BCCGLC63C24L219N"; test_samples[25, 1] = "F";
                test_samples[26, 0] = "BCCGLD34D13A182H"; test_samples[26, 1] = "F";
                test_samples[27, 0] = "BCCGLG55E28A182G"; test_samples[27, 1] = "F";
                test_samples[28, 0] = "BCCGLN47P21I187G"; test_samples[28, 1] = "F";
                test_samples[29, 0] = "BCCGLN49L62C750K"; test_samples[29, 1] = "F";
                test_samples[30, 0] = "BCCGMR41P70A163E"; test_samples[30, 1] = "F";
                test_samples[31, 0] = "BCCGNN27L23G337A"; test_samples[31, 1] = "F";
                test_samples[32, 0] = "BCCGNN34E09I512K"; test_samples[32, 1] = "F";
                test_samples[33, 0] = "BCCGNN35T57G713V"; test_samples[33, 1] = "F";
                test_samples[34, 0] = "BCCGNN42R11F205L"; test_samples[34, 1] = "F";
                test_samples[35, 0] = "BCCGPL48A12E730Y"; test_samples[35, 1] = "F";
                test_samples[36, 0] = "BCCGNN44C11A291B"; test_samples[36, 1] = "F";
                test_samples[37, 0] = "BCCGNN45A57F033V"; test_samples[37, 1] = "F";
                test_samples[38, 0] = "BCCGNN56M14C265P"; test_samples[38, 1] = "F";
                test_samples[39, 0] = "BCCGNR49A21L628O"; test_samples[39, 1] = "F";
                //test_samples[40, 0] = "BCCGNN43B12I002A"; test_samples[40, 1] = "F";

/*
test_samples[40, 0] = "PSTBRN29M70G528H"; test_samples[40, 1] = "S";
test_samples[41, 0] = "PLNLSN38P28G401U"; test_samples[41, 1] = "S";
test_samples[42, 0] = "TLICCT55D19C351B"; test_samples[42, 1] = "S";
test_samples[43, 0] = "ZMBDNL49E45H501D"; test_samples[43, 1] = "S";
test_samples[44, 0] = "PGLVCN44C50F817O"; test_samples[44, 1] = "S";
test_samples[45, 0] = "NGRCLD62A47Z404V"; test_samples[45, 1] = "S";
test_samples[46, 0] = "PRTRST58T53L219L"; test_samples[46, 1] = "S";
test_samples[47, 0] = "MRTFRL70D17Z114U"; test_samples[47, 1] = "S";
test_samples[48, 0] = "SVNSVN61R15L295O"; test_samples[48, 1] = "S";
test_samples[49, 0] = "ZPPDRD57E15G493Z"; test_samples[49, 1] = "S";
test_samples[50, 0] = "LZTPCR47S29A017U"; test_samples[50, 1] = "S";
test_samples[51, 0] = "MCCVTR41E09F736B"; test_samples[51, 1] = "S";
test_samples[52, 0] = "MSTDRN62S06H501I"; test_samples[52, 1] = "S";
test_samples[53, 0] = "MRZCLL53B45A794N"; test_samples[53, 1] = "S";
test_samples[54, 0] = "CRRDMN62T04B300J"; test_samples[54, 1] = "S";
test_samples[55, 0] = "MSTMRS55S65A783N"; test_samples[55, 1] = "S";
test_samples[56, 0] = "MRZMNC59P68A794V"; test_samples[56, 1] = "S";
test_samples[57, 0] = "LTTPQL56A05I129D"; test_samples[57, 1] = "S";
test_samples[58, 0] = "CRRCLD58D09L840T"; test_samples[58, 1] = "S";
test_samples[59, 0] = "KPJVDM70H06Z100X"; test_samples[59, 1] = "S";
test_samples[60, 0] = "JCCGRG38T27A326Q"; test_samples[60, 1] = "S";
test_samples[61, 0] = "DBNFNC38L24D969G"; test_samples[61, 1] = "S";
test_samples[62, 0] = "ZPPNGL23M70L633U"; test_samples[62, 1] = "S";
test_samples[63, 0] = "GSPMGR31T69G482B"; test_samples[63, 1] = "S";
test_samples[64, 0] = "LVRDLA25S47B157C"; test_samples[64, 1] = "S";
test_samples[65, 0] = "NCLFNC61R29G482Y"; test_samples[65, 1] = "S";
test_samples[66, 0] = "DBRRFL58B08G902Z"; test_samples[66, 1] = "S";
test_samples[67, 0] = "CRSLRN54D28C847X"; test_samples[67, 1] = "S";
test_samples[68, 0] = "GAIRCE76T49A182F"; test_samples[68, 1] = "S";
test_samples[69, 0] = "CRVDNC70R18H324X"; test_samples[69, 1] = "S";
test_samples[70, 0] = "GMBGLC61C13H223L"; test_samples[70, 1] = "S";*/
                return test_samples;
            }
        }


        [TestMethod]
        public void SetUpTestSamples()
       {            
            if (!Utils.ProduceTestSamples(QuickTestSamples))
                Assert.Fail("can't produce test samples");
            Assert.AreEqual(1, 1);
        }

        [TestMethod]
        public void SetUpZipCases_DoNotUse() //to clean up the mess with statuses
        {           
            string sql = "Update C6MartPeriodico.controllo_trimestrale Set Stato_Report = 6 WHERE Stato_Report = 4 ";
            DataAccess.ExecuteNonQuery(DBProvider.SqlServerStampeC6, CommandType.Text, sql);
            sql = "Update C6MartPeriodico.controllo_trimestrale Set Stato_Report = 4 WHERE ";
            for (int i = 0; i < QuickTestSamples.GetLength(0); i++)
            {
                sql += " (cod_fiscale = '" + QuickTestSamples[i, 0] + "' and rete = '" + QuickTestSamples[i, 1] + "')";
                sql += " or";
            }
            sql = sql.Substring(0, sql.Length - 3);
            DataAccess.ExecuteNonQuery(DBProvider.SqlServerStampeC6, CommandType.Text, sql);
            Assert.AreEqual(1,1);
        }


        //test if process can complete - produce pdf and pack them
        [TestMethod]
        public void ProcessCanComplete_PDFOnly()
        {
            string tempFolder = PDFProcessFolder;
            string zipFolder = ZipFolder;
            string pdfOutputFolder = PDFOutputFolder;

            int maxProcessiGestorePDF = NumberOfConcurrentGestorePDFProcesses;
            string pathProcesso = GestorePDFLocation;

            Utils.DeleteFiles(zipFolder);
            Utils.DeleteFiles(pdfOutputFolder);
            Utils.DeleteFiles(tempFolder);

            if (!Utils.ProduceTestSamples(QuickTestSamples))
            Assert.Fail("can't produce test samples");
    
            int maxGestoreThreads = int.Parse(ConfigurationManager.AppSettings["maxGestoreThreads"]);
            int limit = int.Parse(ConfigurationManager.AppSettings["gestoreThreadsLimit"]);
            if (limit < maxGestoreThreads) maxGestoreThreads = limit;

            GestorePDF.Logic.ThreadManager m = new GestorePDF.Logic.ThreadManager();
            m.Main(maxGestoreThreads);
            int files_ctr = Utils.CountFiles(PDFProcessFolder, "pdf");
            if (files_ctr < OneTestSample.GetLength(0))
                Assert.Fail("Number of records in Output Folder should be greater or equal the number of samples");
            Assert.IsTrue(true);
        }

        [TestMethod]
        public void FlushFilesWaitingForZIP()
        {

            string q1 = "update C6MartPeriodico.controllo_trimestrale set stato_report = 10 where stato_report in (4)";
            //string q4 = "update C6MartPeriodico.controllo_trimestrale set stato_report = 10 where stato_report in (2)";
           // string q5 = "update C6MartPeriodico.controllo_trimestrale set stato_report = 10 where stato_report in (3)";
            string q2 = "update C6MartPeriodico.controllo_trimestrale set stato_report = 10 where stato_report in (1)";
            string q3 = "update C6MartPeriodico.CRUSCOTTO_CONTRATTISEI set elab = 10 where elab in(1,2)";

            using(DataAccessDE de = new DataAccessDE(DBProvider.SqlServerStampeC6))
            {
                de.ExecuteNonQuery(CommandType.Text, q1);
                de.ExecuteNonQuery(CommandType.Text, q2);
                de.ExecuteNonQuery(CommandType.Text, q3);
                //de.ExecuteNonQuery(CommandType.Text, q4);
               // de.ExecuteNonQuery(CommandType.Text, q5);
            }

            Assert.AreNotEqual(1, 2);

        }

        [TestMethod]
        public void ProcessCanComplete_PDFOnly_HugeSet()
        {
            string tempFolder = PDFProcessFolder;
            string zipFolder = ZipFolder;
            string pdfOutputFolder = PDFOutputFolder;

            int maxProcessiGestorePDF = NumberOfConcurrentGestorePDFProcesses;
            string pathProcesso = GestorePDFLocation;

            Utils.DeleteFiles(zipFolder);
            Utils.DeleteFiles(pdfOutputFolder);
            Utils.DeleteFiles(tempFolder);

            int i = ProduceHugeSetTestSample();
            GestorePDF.Logic.ThreadManager m = new GestorePDF.Logic.ThreadManager();
            m.Main();
            int files_ctr = Utils.CountFiles(PDFProcessFolder, "pdf");
            if (files_ctr < i)
                Assert.Fail("Number of records in Output Folder should be greater or equal the number of samples");
            Assert.IsTrue(true);
        }


        [TestMethod]
        public void ProcessCanComplete_ProduceHugeSet()
        {
            string tempFolder = PDFProcessFolder;
            string zipFolder = ZipFolder;
            string pdfOutputFolder = PDFOutputFolder;

            int maxProcessiGestorePDF = NumberOfConcurrentGestorePDFProcesses;
            string pathProcesso = GestorePDFLocation;

            Utils.DeleteFiles(zipFolder);
            Utils.DeleteFiles(pdfOutputFolder);
            Utils.DeleteFiles(tempFolder);

            int i = ProduceHugeSetTestSample();
        
            Assert.IsTrue(i>0);
        }


        [TestMethod]
        public void ProcessCanComplete_ZIPOnly()
        {           
            string tempFolder = PDFProcessFolder;
            string zipFolder = ZipFolder;
            string pdfOutputFolder = PDFOutputFolder;

            int maxProcessiGestorePDF = NumberOfConcurrentGestorePDFProcesses;
            string pathProcesso = GestorePDFLocation;

            Utils.DeleteFiles(zipFolder);
            Utils.DeleteFiles(pdfOutputFolder);            

            using (ZipManagerProcess myZipManager = new ZipManagerProcess(1, @"c:\temp\o.txt",false, null, "APPROVAL", "APP", "NOAPP", true,1))
            {
                //myZipManager.Start(null);
                while (myZipManager.Status != ManagerProcessStatusEnum.Completed)
                {
                    Thread.Sleep(1000);
                }
            }

            int files_ctr = Utils.CountFiles(pdfOutputFolder, "pdf");
            if (files_ctr < QuickTestSamples.GetLength(0))
                Assert.Fail("Number of records in Output Folder should be greater of equal the number of samples");
            Assert.AreEqual(Utils.CountFiles(tempFolder, "*"), 0); //no files remain in temp folder
            Assert.AreEqual(Utils.CountSubFolders(tempFolder), 0); //no subfolders remain in temp folder
        }


        //test if process can complete - produce pdf and pack them
        [TestMethod]
        public void ProcessCanComplete()
        {           
            string tempFolder = PDFProcessFolder;
            string zipFolder = ZipFolder;
            string pdfOutputFolder = PDFOutputFolder;

            int maxProcessiGestorePDF = NumberOfConcurrentGestorePDFProcesses;
            string pathProcesso = GestorePDFLocation;
            
            Utils.DeleteFiles(zipFolder);
            Utils.DeleteFiles(pdfOutputFolder);
            Utils.DeleteFiles(tempFolder);

            //if (!Utils.ProduceTestSamples(TestSamples))
            //    Assert.Fail("can't produce test samples");

            Thread t = new Thread(() => {
                GestorePDF.Logic.ThreadManager m = new GestorePDF.Logic.ThreadManager();
                m.Main();
            });

            t.Start();
            
            using (ZipManagerProcess myZipManager = new ZipManagerProcess(1, @"c:\temp\o.txt"))
            {
                //myZipManager.Start(null);
                while (myZipManager.Status != ManagerProcessStatusEnum.Completed)
                {
                    Thread.Sleep(1000);
                }
            }
            int files_ctr = Utils.CountFiles(pdfOutputFolder, "pdf");
            if (files_ctr < TestSamples.GetLength(0))
                Assert.Fail("Number of records in Output Folder should be greater of equal the number of samples");
            Assert.AreEqual(Utils.CountFiles(tempFolder, "*"), 0); //no files remain in temp folder
            Assert.AreEqual(Utils.CountSubFolders(tempFolder), 0); //no subfolders remain in temp folder
        }

        //check if number of pdf files in zip is the same as in the index file
        [TestMethod]
        public void ZipIntegrity()
        {
            string fileName;
            string zipFolder = ZipFolder;
            string workFolder = WorkFolder;
            if (!Directory.Exists(workFolder))
                Directory.CreateDirectory(workFolder);
            
            foreach (FileInfo f in new DirectoryInfo(zipFolder).GetFiles())
            {
                fileName = f.Name;
                Utils.DeleteFiles(workFolder);
                Utils.Decompress(f, workFolder);
                int numberOfPdfFiles = 0; //number of pdf files
                int numberOfRecordsInIndex = 0; // numble of lines in index file
                foreach (FileInfo a in new DirectoryInfo(workFolder).GetFiles())
                {                    
                    if (a.Extension != ".pdf")
                    {
                        using (TextReader r = a.OpenText())
                        {
                            while (r.ReadLine() != null)
                            {
                                numberOfRecordsInIndex++;
                            }
                        }
                    }
                    else if (a.Name.Substring(a.Name.Length-7, 7) != "_DP.pdf")
                    {
                        string z = a.Name.Substring(a.Name.Length - 7, 7);
                        numberOfPdfFiles++;
                    }
                }
                Assert.AreEqual(numberOfPdfFiles, numberOfRecordsInIndex, "File Integrity check failed for " + fileName);
            }

            if (Directory.Exists(workFolder))
            {
                foreach (string s in Directory.GetFiles(workFolder))
                {
                    FileInfo fi = new FileInfo(s);
                    fi.Delete();
                }
                Directory.Delete(workFolder);
            }
        }

        //check if zip files contain correct pdf documents
        [TestMethod]
        public void NumberOfPackedPDFIsOK()
        {
            string zipFolder = ZipFolder;
            string workFolder = WorkFolder;
            if (!Directory.Exists(workFolder))
                Directory.CreateDirectory(workFolder);

            foreach (FileInfo f in new DirectoryInfo(zipFolder).GetFiles())
            {                
                string name = f.Name.Substring(32, 4);
                string selectPDF = "SELECT nomeFile FROM [C6MartPeriodico].[GESTIONE_PDF_FTP] " +
                    "WHERE id_fk_zip = " + name;
                DataTable rows = DataAccess.ExecuteDataTable(DBProvider.SqlServerStampeC6, CommandType.Text, selectPDF);
                Utils.DeleteFiles(workFolder);
                Utils.Decompress(f, workFolder);
                bool fileExists = false;
                int ctr = 0;
                foreach (DataRow i in rows.Rows)
                {
                    foreach (var j in new DirectoryInfo(workFolder).GetFiles())
                    {
                        string ffile = j.Name.Substring(0, j.Name.IndexOf("."));
                        if (i["nomeFile"].ToString()+"_MP" == j.Name.Substring(0,j.Name.IndexOf(".")))
                        {
                            fileExists = true;
                            break;
                        }
                    }
                    if (fileExists) ctr++;
                }
                Assert.AreEqual(ctr, Directory.GetFiles(workFolder).Length - 1);
            }
            if (Directory.Exists(workFolder)){
                foreach (string s in Directory.GetFiles(workFolder))
                {
                    FileInfo fi = new FileInfo(s);
                    fi.Delete();
                }
                Directory.Delete(workFolder);
            }

        }

        [TestMethod]
        public void TestFTPSendingProcess()
        {
            string zipFolder = ZipFolder;
            string backupFolder = ZipBackupFolder;
            string ftpServer = FtpServer; //your ftp server
            string ftpUser = FtpUser;
            string ftpPassword = FtpPassword;
            string ftpPath = FtpPath;
            int res = FTPProcessSeparated.UploadTrimestraleFiles(zipFolder, ftpServer, ftpPath, ftpUser, ftpPassword, backupFolder);
            Assert.AreEqual(1, res);
        }
        
        [TestMethod]
        public void TestVerifier()
        {
            PDFGenerator.Verifier.Verifier v = new PDFGenerator.Verifier.Verifier();
            var x = v.GetInvalidFiles(@"C:\ReportisticaTrimestrale\PDF_LINE", 30);
            Assert.AreEqual(0, x.Count);
        }

        [TestMethod]
        public void TestAppConfigSaveLoad()
        {
            string directory = Directory.GetCurrentDirectory();
            string defaultAppConfig = String.Concat(directory, @"\", "AppConfig.xml");
            string testAppConfig = String.Concat(directory, @"\", "AppConfig2.xml");

            //values in current config
            string expectedConnString = "Data Source=10.14.152.19; Database=C6StampeCentralizzate_31032016;User Id=F701264; Password=contrsei; Max Pool Size=1000;Pooling=yes;Load Balance Timeout=1000; Connection Timeout=200";
            string expectedEstensioneFile = "IDX";
            string expectedNumeroCfPerZip = "960";

            //values we want to have
            string desiredConnString = "Data Source=10.14.152.191; Database=C6StampeCentralizzate_31032016;User Id=F701264; Password=contrsei; Max Pool Size=1000;Pooling=yes;Load Balance Timeout=1000; Connection Timeout=200";
            string desiredEstensioneFile = "IDXX";
            string desiredNumeroCfPerZip = "9600";
            
            //values after save and load
            string realConnString;
            string realEstensioneFile;
            string realNumeroCfPerZip;

            //making sure AppConfig2.xml does not exists
            if (File.Exists(testAppConfig))
                File.Delete(testAppConfig);

            //loading default config
            using (IAppConfigurationParser parser = new XmlConfigurationParser())
            {
                parser.LoadFrom(defaultAppConfig);
            }

            realConnString = ConfigurationManager.ConnectionStrings["SqlServerStampeC6Connection"].ConnectionString;
            realEstensioneFile = ConfigurationManager.AppSettings["EstensioneFile"].ToString();
            realNumeroCfPerZip = ConfigurationManager.AppSettings["numeroCfPerZip"].ToString();
 
            //checking if values are correct
            Assert.AreEqual(expectedConnString, realConnString);
            Assert.AreEqual(expectedEstensioneFile, realEstensioneFile);
            Assert.AreEqual(expectedNumeroCfPerZip, realNumeroCfPerZip);
 
            //saving modified config
            Configuration config = 
                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            config.ConnectionStrings.ConnectionStrings["SqlServerStampeC6Connection"].ConnectionString =
                desiredConnString;
 
            config.AppSettings.Settings["EstensioneFile"].Value = desiredEstensioneFile;
            config.AppSettings.Settings["numeroCfPerZip"].Value = desiredNumeroCfPerZip;
 
            config.Save(ConfigurationSaveMode.Minimal, true);
 
            //refreshing config to save to file
            ConfigurationManager.RefreshSection("connectionStrings");
            ConfigurationManager.RefreshSection("appSettings");
 
            using (IAppConfigurationParser parser = new XmlConfigurationParser())
            {
                //saving to file
                parser.SaveTo(testAppConfig);
            }

            using (IAppConfigurationParser parser = new XmlConfigurationParser())
            {
                //loading modified config
                parser.LoadFrom(testAppConfig);                
            }

            realConnString = ConfigurationManager.ConnectionStrings["SqlServerStampeC6Connection"].ConnectionString;
            realEstensioneFile = ConfigurationManager.AppSettings["EstensioneFile"].ToString();
            realNumeroCfPerZip = ConfigurationManager.AppSettings["numeroCfPerZip"].ToString();


            //checking if values were saved as expected
            Assert.AreEqual(desiredConnString, realConnString);
            Assert.AreEqual(desiredEstensioneFile, realEstensioneFile);
            Assert.AreEqual(desiredNumeroCfPerZip, realNumeroCfPerZip);

        }

        //TODO
        //[TestMethod]
        public void TestFTPSendingProcess_old()
        {
            string ambiente = "SVILUPPO";
            string tngServer = "";
            string tngJobset = "";
            string tngJob = "";
             SmartFTPThread.Logic.FtpProcessSeparated.StartProcessing(ambiente, tngServer, tngJobset, tngJob);
        }
    }
}