public void DataReaderToCsvTest_SanitizeColumnHeaders()
        {
            var dt = new DataTable();

            dt.Columns.Add(new DataColumn("COL_STRING", typeof(string)));
            dt.Rows.Add("test");

            var options = new SaveQueryToCSVOptions {
                SanitizeColumnHeaders = true
            };

            using (var writer = new StringWriter())
                using (var csvFile = QueryToFileTask.CreateCsvWriter(options.GetFieldDelimeterAsString(), writer))
                    using (var reader = new DataTableReader(dt))
                    {
                        QueryToFileTask.DataReaderToCsv(reader, csvFile, options, new System.Threading.CancellationToken());
                        csvFile.Flush();
                        var result      = writer.ToString();
                        var resultLines = result.Split("\r\n", StringSplitOptions.None);

                        // 3 lines = 1 header lines + 1 data lines + 1 newline at end of file
                        Assert.AreEqual(3, resultLines.Length);
                        Assert.AreEqual("col_string", resultLines[0]);
                    }
        }
        public void DataReaderToCsvTest_1mRows()
        {
            var rowAmount = 1000000;
            var processingMaxTimeSeconds = 2d;
            var dt = new DataTable();

            dt.Columns.AddRange(new[]
            {
                new DataColumn("col_string", typeof(string)),
                new DataColumn("col_datetime", typeof(DateTime)),
                new DataColumn("col_float", typeof(float)),
                new DataColumn("col_double", typeof(double)),
                new DataColumn("col_decimal", typeof(decimal)),
            });

            for (var i = 0; i < rowAmount; i++)
            {
                dt.Rows.Add($"Hello, mister {i}", DateTime.Now, i, i, i);
            }

            var options = new SaveQueryToCSVOptions
            {
                DateFormat       = "MM-dd-yyyy HH:mm:ss",
                ColumnsToInclude = new[] { "col_string", "col_float" },
                FieldDelimiter   = CsvFieldDelimiter.Pipe
            };

            using (var writer = new StringWriter())
                using (var csvFile = QueryToFileTask.CreateCsvWriter(options.GetFieldDelimeterAsString(), writer))
                    using (var reader = new DataTableReader(dt))
                    {
                        var sw = Stopwatch.StartNew();
                        QueryToFileTask.DataReaderToCsv(reader, csvFile, options, new System.Threading.CancellationToken());
                        csvFile.Flush();
                        sw.Stop();
                        Console.WriteLine("Elapsed={0}", sw.Elapsed);
                        var result      = writer.ToString();
                        var resultLines = result.Split("\r\n", StringSplitOptions.None);

                        // rowAmout + 1 header row + 1 newline at end
                        Assert.AreEqual(rowAmount + 2, resultLines.Length);

                        // Check execution time
                        Assert.IsTrue(
                            sw.Elapsed.TotalSeconds < processingMaxTimeSeconds,
                            $"DataReaderToCsv completed in {sw.Elapsed.TotalSeconds} seconds. Processing max time: {processingMaxTimeSeconds} seconds");
                    }
        }
        public void DataReaderToCsvTest_AllColumns()
        {
            var dt = new DataTable();

            dt.Columns.AddRange(new[]
            {
                new DataColumn("col_string", typeof(string)),
                new DataColumn("col_datetime", typeof(DateTime)),
                new DataColumn("col_float", typeof(float))
            });

            dt.Rows.Add("Hello\"semicolon1", DateTime.Parse("2018-12-31T11:22:33"), 3000.212);
            dt.Rows.Add("Hello\"semicolon2", DateTime.Parse("2018-12-31T11:22:34"), 3000.212);

            var options = new SaveQueryToCSVOptions
            {
                DateFormat       = "MM-dd-yyyy",
                DateTimeFormat   = "MM-dd-yyyy HH:mm:ss",
                ColumnsToInclude = new string[0],
                FieldDelimiter   = CsvFieldDelimiter.Semicolon,
                AddQuotesToDates = false
            };

            using (var writer = new StringWriter())
                using (var csvFile = QueryToFileTask.CreateCsvWriter(options.GetFieldDelimeterAsString(), writer))
                    using (var reader = new DataTableReader(dt))
                    {
                        var entries = QueryToFileTask.DataReaderToCsv(reader, csvFile, options, new System.Threading.CancellationToken());
                        csvFile.Flush();
                        var result      = writer.ToString();
                        var resultLines = result.Split("\r\n", StringSplitOptions.None);

                        // 4 lines = 1 header line + 2 data lines + 1 newline at end of file
                        Assert.AreEqual(4, resultLines.Length);
                        Assert.AreEqual(2, entries);
                        Assert.AreEqual("col_string;col_datetime;col_float", resultLines[0]);
                        Assert.AreEqual("\"Hello\\\"semicolon1\";12-31-2018 11:22:33;3000.212", resultLines[1]);
                        Assert.AreEqual("\"Hello\\\"semicolon2\";12-31-2018 11:22:34;3000.212", resultLines[2]);
                    }
        }