// DataColumnMappingCollectionTest.cs - NUnit Test Cases for Testing the 
// DataColumnMappingCollection class
//
// Author: Ameya Sailesh Gargesh (ameya_13@yahoo.com)
//
// (C) Ameya Gargesh

//
// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//


using NUnit.Framework;
using System;
using System.Data;
using System.Data.Common;
namespace MonoTests.System.Data.Common
{
	[TestFixture]
	public class DataColumnMappingCollectionTest
	{
		//DataTableMapping tableMap;
		DataColumnMappingCollection columnMapCollection;
		DataColumnMapping [] cols;
		
		[SetUp]
		public void GetReady()
		{
			cols=new DataColumnMapping[5];
			cols[0]=new DataColumnMapping("sourceName", "dataSetName");
			cols[1]=new DataColumnMapping("sourceID", "dataSetID");
			cols[2]=new DataColumnMapping("sourceAddress", "dataSetAddress");
			cols[3]=new DataColumnMapping("sourcePhone", "dataSetPhone");
			cols[4]=new DataColumnMapping("sourcePIN", "dataSetPIN");
			columnMapCollection=new DataColumnMappingCollection();			
		}
		
		[TearDown]
		public void Clean()
		{
			columnMapCollection.Clear();
		}
		
		[Test]
		public void Add()
		{
			DataColumnMapping col1=new DataColumnMapping("sourceName", "dataSetName");
			int t=columnMapCollection.Add((Object)col1);
			Assert.AreEqual (0, t, "test1");
			bool eq1=col1.Equals(columnMapCollection[0]);
			Assert.AreEqual (true, eq1, "test2");
			Assert.AreEqual (1, columnMapCollection.Count, "test3");
			DataColumnMapping col2;
			col2=columnMapCollection.Add("sourceID", "dataSetID");
			bool eq2=col2.Equals(columnMapCollection[1]);
			Assert.AreEqual (true, eq2, "test4");
			Assert.AreEqual (2, columnMapCollection.Count, "test5");
		}
		
		[Test]
		[ExpectedException(typeof(InvalidCastException))]
		public void AddException1()
		{
			DataColumnMappingCollection c=new DataColumnMappingCollection();
			columnMapCollection.Add((Object)c);
		}
		
		[Test]
		public void AddRange()
		{
			columnMapCollection.Add(new DataColumnMapping("sourceAge", "dataSetAge"));
			Assert.AreEqual (1, columnMapCollection.Count, "test1");
			columnMapCollection.AddRange(cols);
			Assert.AreEqual (6, columnMapCollection.Count, "test2");
			bool eq;
			eq=cols[0].Equals(columnMapCollection[1]);
			Assert.AreEqual (true, eq, "test3");
			eq=cols[1].Equals(columnMapCollection[2]);
			Assert.AreEqual (true, eq, "test4");
			
			eq=cols[0].Equals(columnMapCollection[0]);
			Assert.AreEqual (false, eq, "test5");
			eq=cols[1].Equals(columnMapCollection[0]);
			Assert.AreEqual (false, eq, "test6");
		}
		
		[Test]
		public void Clear()
		{
			DataColumnMapping col1=new DataColumnMapping("sourceName", "dataSetName");
			columnMapCollection.Add((Object)col1);
			Assert.AreEqual (1, columnMapCollection.Count, "test1");
			columnMapCollection.Clear();
			Assert.AreEqual (0, columnMapCollection.Count, "test2");
			columnMapCollection.AddRange(cols);
			Assert.AreEqual (5, columnMapCollection.Count, "test3");
			columnMapCollection.Clear();
			Assert.AreEqual (0, columnMapCollection.Count, "test4");
		}
		
		[Test]
		public void Contains()
		{
			DataColumnMapping col1=new DataColumnMapping("sourceName", "dataSetName");
			columnMapCollection.AddRange(cols);
			bool eq;
			eq=columnMapCollection.Contains((Object)cols[0]);
			Assert.AreEqual (true, eq, "test1");
			eq=columnMapCollection.Contains((Object)cols[1]);
			Assert.AreEqual (true, eq, "test2");
			
			eq=columnMapCollection.Contains((Object)col1);
			Assert.AreEqual (false, eq, "test3");
			
			eq=columnMapCollection.Contains(cols[0].SourceColumn);
			Assert.AreEqual (true, eq, "test4");
			eq=columnMapCollection.Contains(cols[1].SourceColumn);
			Assert.AreEqual (true, eq, "test5");
			
			eq=columnMapCollection.Contains(col1.SourceColumn);
			Assert.AreEqual (true, eq, "test6");
			
			eq=columnMapCollection.Contains(cols[0].DataSetColumn);
			Assert.AreEqual (false, eq, "test7");
			eq=columnMapCollection.Contains(cols[1].DataSetColumn);
			Assert.AreEqual (false, eq, "test8");
			
			eq=columnMapCollection.Contains(col1.DataSetColumn);
			Assert.AreEqual (false, eq, "test9");
		}
		
		[Test]
		[ExpectedException(typeof(InvalidCastException))]
		public void ContainsException1()
		{
			Object o = new Object();
			bool a = columnMapCollection.Contains(o);
		}
		
		[Test]
		public void CopyTo()
		{
			DataColumnMapping [] colcops=new DataColumnMapping[5];
			columnMapCollection.AddRange(cols);
			columnMapCollection.CopyTo(colcops, 0);
			bool eq;
			for (int i=0;i<5;i++)
			{
				eq=columnMapCollection[i].Equals(colcops[i]);
				Assert.AreEqual (true, eq, "test1" + i);
			}
			colcops=null;
			colcops=new DataColumnMapping[7];
			columnMapCollection.CopyTo(colcops, 2);
			for (int i=0;i<5;i++)
			{
				eq=columnMapCollection[i].Equals(colcops[i+2]);
				Assert.AreEqual (true, eq, "test2" + i);
			}
			eq=columnMapCollection[0].Equals(colcops[0]);
			Assert.AreEqual (false, eq, "test31");
			eq=columnMapCollection[0].Equals(colcops[1]);
			Assert.AreEqual (false, eq, "test32");
		}
		
		[Test]
		public void Equals()
		{
//			DataColumnMappingCollection collect2=new DataColumnMappingCollection();
			columnMapCollection.AddRange(cols);
//			collect2.AddRange(cols);
			DataColumnMappingCollection copy1;
			copy1=columnMapCollection;
			
//			Assert.AreEqual (false, columnMapCollection.Equals(collect2), "test1");
			Assert.AreEqual (true, columnMapCollection.Equals(copy1), "test2");
//			Assert.AreEqual (false, collect2.Equals(columnMapCollection), "test3");
			Assert.AreEqual (true, copy1.Equals(columnMapCollection), "test4");
//			Assert.AreEqual (false, collect2.Equals(copy1), "test5");
			Assert.AreEqual (true, copy1.Equals(columnMapCollection), "test6");
			Assert.AreEqual (true, columnMapCollection.Equals(columnMapCollection), "test7");
//			Assert.AreEqual (true, collect2.Equals(collect2), "test8");
			Assert.AreEqual (true, copy1.Equals(copy1), "test9");
			
//			Assert.AreEqual (false, Object.Equals(collect2, columnMapCollection), "test10");
			Assert.AreEqual (true, Object.Equals(copy1, columnMapCollection), "test11");
//			Assert.AreEqual (false, Object.Equals(columnMapCollection, collect2), "test12");
			Assert.AreEqual (true, Object.Equals(columnMapCollection, copy1), "test13");
//			Assert.AreEqual (false, Object.Equals(copy1, collect2), "test14");
			Assert.AreEqual (true, Object.Equals(columnMapCollection, copy1), "test15");
			Assert.AreEqual (true, Object.Equals(columnMapCollection, columnMapCollection), "test16");
//			Assert.AreEqual (true, Object.Equals(collect2, collect2), "test17");
			Assert.AreEqual (true, Object.Equals(copy1, copy1), "test18");
//			Assert.AreEqual (false, Object.Equals(columnMapCollection, collect2), "test10");
			Assert.AreEqual (true, Object.Equals(columnMapCollection, copy1), "test11");
//			Assert.AreEqual (false, Object.Equals(collect2, columnMapCollection), "test12");
			Assert.AreEqual (true, Object.Equals(copy1, columnMapCollection), "test13");
//			Assert.AreEqual (false, Object.Equals(collect2, copy1), "test14");
			Assert.AreEqual (true, Object.Equals(copy1, columnMapCollection), "test15");
		}
		
		[Test]
		public void GetByDataSetColumn()
		{
			columnMapCollection.AddRange(cols);
			bool eq;
			DataColumnMapping col1;
			col1=columnMapCollection.GetByDataSetColumn("dataSetName");
			eq=(col1.DataSetColumn.Equals("dataSetName") && col1.SourceColumn.Equals("sourceName"));
			Assert.AreEqual (true, eq, "test1");
			col1=columnMapCollection.GetByDataSetColumn("dataSetID");
			eq=(col1.DataSetColumn.Equals("dataSetID") && col1.SourceColumn.Equals("sourceID"));
			Assert.AreEqual (true, eq, "test2");
						
			col1=columnMapCollection.GetByDataSetColumn("datasetname");
			eq=(col1.DataSetColumn.Equals("dataSetName") && col1.SourceColumn.Equals("sourceName"));
			Assert.AreEqual (true, eq, "test3");
			col1=columnMapCollection.GetByDataSetColumn("datasetid");
			eq=(col1.DataSetColumn.Equals("dataSetID") && col1.SourceColumn.Equals("sourceID"));
			Assert.AreEqual (true, eq, "test4");
		}
		
		[Test]
		public void GetColumnMappingBySchemaAction()
		{
			columnMapCollection.AddRange(cols);
			bool eq;
			DataColumnMapping col1;
			col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceName", MissingMappingAction.Passthrough);
			eq=(col1.DataSetColumn.Equals("dataSetName") && col1.SourceColumn.Equals("sourceName"));
			Assert.AreEqual (true, eq, "test1");
			col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceID", MissingMappingAction.Passthrough);
			eq=(col1.DataSetColumn.Equals("dataSetID") && col1.SourceColumn.Equals("sourceID"));
			Assert.AreEqual (true, eq, "test2");
			
			col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceData", MissingMappingAction.Passthrough);
			eq=(col1.DataSetColumn.Equals("sourceData") && col1.SourceColumn.Equals("sourceData"));
			Assert.AreEqual (true, eq, "test3");
			eq=columnMapCollection.Contains(col1);
			Assert.AreEqual (false, eq, "test4");
			col1=DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceData", MissingMappingAction.Ignore);
			Assert.AreEqual (null, col1, "test5");
		}
		
		[Test]
		[ExpectedException(typeof(InvalidOperationException))]
		public void GetColumnMappingBySchemaActionException1()
		{
			DataColumnMappingCollection.GetColumnMappingBySchemaAction(columnMapCollection, "sourceName", MissingMappingAction.Error);
		}
		
		[Test]
		public void IndexOf()
		{
			columnMapCollection.AddRange(cols);
			int ind;
			ind=columnMapCollection.IndexOf(cols[0]);
			Assert.AreEqual (0, ind, "test1");
			ind=columnMapCollection.IndexOf(cols[1]);
			Assert.AreEqual (1, ind, "test2");
					
			ind=columnMapCollection.IndexOf(cols[0].SourceColumn);
			Assert.AreEqual (0, ind, "test3");
			ind=columnMapCollection.IndexOf(cols[1].SourceColumn);
			Assert.AreEqual (1, ind, "test4");
		}
		
		[Test]
		public void IndexOfDataSetColumn()
		{
			columnMapCollection.AddRange(cols);
			int ind;
			ind=columnMapCollection.IndexOfDataSetColumn(cols[0].DataSetColumn);
			Assert.AreEqual (0, ind, "test1");
			ind=columnMapCollection.IndexOfDataSetColumn(cols[1].DataSetColumn);
			Assert.AreEqual (1, ind, "test2");
			
			ind=columnMapCollection.IndexOfDataSetColumn("datasetname");
			Assert.AreEqual (0, ind, "test3");
			ind=columnMapCollection.IndexOfDataSetColumn("datasetid");
			Assert.AreEqual (1, ind, "test4");
						
			ind=columnMapCollection.IndexOfDataSetColumn("sourcedeter");
			Assert.AreEqual (-1, ind, "test5");
		}
		
		[Test]
		public void Insert()
		{
			columnMapCollection.AddRange(cols);
			DataColumnMapping mymap=new DataColumnMapping("sourceAge", "dataSetAge");
			columnMapCollection.Insert(3, mymap);
			int ind=columnMapCollection.IndexOfDataSetColumn("dataSetAge");
			Assert.AreEqual (3, ind, "test1");
		}
		
		[Test]
		[Ignore ("This test is wrong. A mapping in a DataColumnMappingCollection must be identical.")]
		public void Remove()
		{
			columnMapCollection.AddRange(cols);
			DataColumnMapping mymap=new DataColumnMapping("sourceName", "dataSetName");
			columnMapCollection.Add(mymap);
			columnMapCollection.Remove((Object)mymap);
			bool eq=columnMapCollection.Contains((Object)mymap);
			Assert.AreEqual (false, eq, "test1");
		}
		
		[Test]
		[ExpectedException(typeof(InvalidCastException))]
		public void RemoveException1()
		{
			String te="testingdata";
			columnMapCollection.AddRange(cols);
			columnMapCollection.Remove(te);			
		}
		
		[Test]
		[ExpectedException(typeof(ArgumentException))]
		public void RemoveException2()
		{
			columnMapCollection.AddRange(cols);
			DataColumnMapping mymap=new DataColumnMapping("sourceAge", "dataSetAge");
			columnMapCollection.Remove(mymap);
		}
		
		[Test]
		public void RemoveAt()
		{
			columnMapCollection.AddRange(cols);
			bool eq;
			columnMapCollection.RemoveAt(0);
			eq=columnMapCollection.Contains(cols[0]);
			Assert.AreEqual (false, eq, "test1");
			eq=columnMapCollection.Contains(cols[1]);
			Assert.AreEqual (true, eq, "test2");
						
			columnMapCollection.RemoveAt("sourceID");
			eq=columnMapCollection.Contains(cols[1]);
			Assert.AreEqual (false, eq, "test3");
			eq=columnMapCollection.Contains(cols[2]);
			Assert.AreEqual (true, eq, "test4");
		}
		
		[Test]
		[ExpectedException(typeof(IndexOutOfRangeException))]
		public void RemoveAtException1()
		{
			columnMapCollection.RemoveAt(3);			
		}
		
		[Test]
		[ExpectedException(typeof(IndexOutOfRangeException))]
		public void RemoveAtException2()
		{
			columnMapCollection.RemoveAt("sourceAge");			
		}
		
		[Test]
		public void ToStringTest()
		{
			Assert.AreEqual ("System.Data.Common.DataColumnMappingCollection", columnMapCollection.ToString(), "test1");
		}
	}
}