using System;
using System.IO;
using FileHelpers;
using NUnit.Framework;

namespace FileHelpers.Tests.CommonTests
{
	[TestFixture]
	public class IgnoreEmpties
	{
		FileHelperEngine engine;
		FileHelperAsyncEngine asyncEngine;

		[Test]
		public void IgnoreEmpty1()
		{
			engine = new FileHelperEngine(typeof (IgnoreEmptyType1));

			object[] res = TestCommon.ReadTest(engine, "Good", "IgnoreEmpty1.txt");

			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(8, engine.LineNumber);
		}

		[Test]
		public void IgnoreEmpty2()
		{
			engine = new FileHelperEngine(typeof (IgnoreEmptyType1));

			object[] res = TestCommon.ReadTest(engine, "Good", "IgnoreEmpty2.txt");

			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(8, engine.LineNumber);
		}

		[Test]
		public void IgnoreEmpty3()
		{
			engine = new FileHelperEngine(typeof (IgnoreEmptyType1));

			object[] res = TestCommon.ReadTest(engine, "Good", "IgnoreEmpty3.txt");

			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(8, engine.LineNumber);
		}

		[Test]
		public void IgnoreEmpty1Async()
		{
			asyncEngine = new FileHelperAsyncEngine(typeof (IgnoreEmptyType1));

			object[] res = TestCommon.ReadAllAsync(asyncEngine, "Good", "IgnoreEmpty1.txt");

			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(8, asyncEngine.LineNumber);
		}

		[Test]
		public void IgnoreEmpty3Async()
		{
			asyncEngine = new FileHelperAsyncEngine(typeof (IgnoreEmptyType1));

			object[] res = TestCommon.ReadAllAsync(asyncEngine, "Good", "IgnoreEmpty3.txt");

			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(7, asyncEngine.LineNumber);
		}

		[Test]
		public void IgnoreEmpty4Bad()
		{
			engine = new FileHelperEngine(typeof (IgnoreEmptyType1));
			Assert.Throws<BadUsageException>(
                () => TestCommon.ReadTest(engine, "Good", "IgnoreEmpty4.txt"));
		}

		[Test]
		public void IgnoreEmpty4BadAsync()
		{
			asyncEngine = new FileHelperAsyncEngine(typeof (IgnoreEmptyType1));
            Assert.Throws<BadUsageException>(
                () => TestCommon.ReadAllAsync(asyncEngine, "Good", "IgnoreEmpty4.txt"));
		}

		[Test]
		public void IgnoreEmpty4()
		{
			engine = new FileHelperEngine(typeof (IgnoreEmptyType1Spaces));
			object[] res = TestCommon.ReadTest(engine, "Good", "IgnoreEmpty4.txt");
			
			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(7, engine.LineNumber);
		}

		[Test]
		public void IgnoreEmpty5()
		{
			engine = new FileHelperEngine(typeof (IgnoreEmptyType1Spaces));
			object[] res = TestCommon.ReadTest(engine, "Good", "IgnoreEmpty5.txt");
			
			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(7, engine.LineNumber);
		}

		[Test]
		public void IgnoreComment1()
		{
			engine = new FileHelperEngine(typeof (IgnoreCommentsType));
			object[] res = TestCommon.ReadTest(engine, "Good", "IgnoreComments1.txt");
			
			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(7, engine.LineNumber);
		}

		[Test]
		public void IgnoreComment1Async()
		{
			asyncEngine = new FileHelperAsyncEngine(typeof (IgnoreCommentsType));
			object[] res = TestCommon.ReadAllAsync(asyncEngine, "Good", "IgnoreComments1.txt");
			
			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(7, asyncEngine.LineNumber);
		}
		[Test]
		public void IgnoreComment2()
		{
			engine = new FileHelperEngine(typeof (IgnoreCommentsType));
			object[] res = TestCommon.ReadTest(engine, "Good", "IgnoreComments2.txt");
			
			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(7, engine.LineNumber);
		}

		
		[Test]
		public void IgnoreComment3()
		{
			engine = new FileHelperEngine(typeof (IgnoreCommentsType2));
			object[] res = TestCommon.ReadTest(engine, "Good", "IgnoreComments1.txt");
			
			Assert.AreEqual(4, res.Length);
			Assert.AreEqual(7, engine.LineNumber);
		}

		[Test]
		public void IgnoreComment4()
		{
			engine = new FileHelperEngine(typeof (IgnoreCommentsType2));
            Assert.Throws<ConvertException>(
                () =>  TestCommon.ReadTest(engine, "Good", "IgnoreComments2.txt"));
			
			Assert.AreEqual(3, engine.LineNumber);
		}

	

	
		[FixedLengthRecord]
			[IgnoreCommentedLines("//")]
			public class IgnoreCommentsType
		{
			[FieldFixedLength(8)]
			[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
			public DateTime Field1;

			[FieldFixedLength(3)]
			public string Field2;

			[FieldFixedLength(3)]
			[FieldConverter(ConverterKind.Int32)]
			public int Field3;
		}

		[FixedLengthRecord]
			[IgnoreCommentedLines("//", false)]
			public class IgnoreCommentsType2
		{
			[FieldFixedLength(8)]
			[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
			public DateTime Field1;

			[FieldFixedLength(3)]
			public string Field2;

			[FieldFixedLength(3)]
			[FieldConverter(ConverterKind.Int32)]
			public int Field3;
		}

	
	
		[FixedLengthRecord]
			[IgnoreEmptyLines()]
			public class IgnoreEmptyType1
		{
			[FieldFixedLength(8)]
			[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
			public DateTime Field1;

			[FieldFixedLength(3)]
			public string Field2;

			[FieldFixedLength(3)]
			[FieldConverter(ConverterKind.Int32)]
			public int Field3;
		}

		[FixedLengthRecord]
			[IgnoreEmptyLines(true)]
			public class IgnoreEmptyType1Spaces
		{
			[FieldFixedLength(8)]
			[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
			
			public DateTime Field1;

			[FieldFixedLength(3)]
			public string Field2;

			[FieldFixedLength(3)]
			[FieldConverter(ConverterKind.Int32)]
			public int Field3;
		}

	
		[DelimitedRecord("|")]
			[IgnoreEmptyLines()]
			public class IgnoreEmptyType2
		{
			[FieldConverter(ConverterKind.Date, "ddMMyyyy")]
			public DateTime Field1;

			[FieldFixedLength(3)]
			public string Field2;

			public int Field3;
		}
	}
}