context: //
  // Tests for System.Web.UI.WebControls.DataBoundControl.cs 
  //
  // Author:
  //	Chris Toshok (toshok@ximian.com)
  //
  
  //
  // Copyright (C) 2005 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.IO;
  using System.Globalization;
  using System.Web;
  using System.Web.UI;
  using System.Web.UI.Adapters;
  using System.Web.UI.WebControls;
  using System.Web.UI.WebControls.Adapters;
  using System.Text;
  using System.Collections;
  using System.Data;
  using MonoTests.SystemWeb.Framework;
  
  namespace MonoTests.System.Web.UI.WebControls
  {
  	[TestFixture]	
  	public class DataBoundControlTest {	
  		class Poker : DataBoundControl {
  			protected override void PerformSelect () 
  			{
  				//Console.WriteLine ("PerformSelect\n{0}", Environment.StackTrace);
  				Assert.IsTrue (RequiresDataBinding);
  				base.PerformSelect ();
  				Assert.IsFalse (RequiresDataBinding);
  			}
  
  			protected internal override void PerformDataBinding (IEnumerable data)
  			{
  				Assert.IsFalse (RequiresDataBinding);
  				base.PerformDataBinding (data);
  			}
  
  			public void DoValidateDataSource (object dataSource)
  			{
  				ValidateDataSource (dataSource);
  			}
  			
  			public bool GetInitialized ()
  			{
  				return Initialized;
  			}
  
  			public bool GetRequiresDataBinding ()
  			{
  				return RequiresDataBinding;
  			}
  			
  			public void SetRequiresDataBinding (bool value)
  			{
  				RequiresDataBinding = value;
  			}
  
  			public override void DataBind ()
  			{
  				Assert.IsTrue (RequiresDataBinding);
  				base.DataBind ();
  				Assert.IsFalse (RequiresDataBinding);
  			}
  
  			public void DoEnsureDataBound ()
  			{
  				Assert.IsTrue (RequiresDataBinding);
  				EnsureDataBound ();
  				Assert.IsFalse (RequiresDataBinding);
  			}
  		}
  
  		class MyDataBoundControl : DataBoundControl
  		{
  			public int CreateDataSourceSelectArgumentsCalled;
  			public DataSourceSelectArguments CreatedDataSourceSelectArguments;
  			private StringBuilder dataBindTrace = new StringBuilder ();
  			public string DataBindTrace {
  				get { return dataBindTrace.ToString (); }
  			}
  
  			public override void DataBind () {
  				dataBindTrace = new StringBuilder ();
  				dataBindTrace.Append ("[Start DataBind]");
  				base.DataBind ();
  				dataBindTrace.Append ("[End DataBind]");
  			}
  
  			protected override void PerformSelect () {
  				dataBindTrace.Append ("[Start PerformSelect]");
  				base.PerformSelect ();
  				dataBindTrace.Append ("[End PerformSelect]");
  			}
  			
  			protected internal override void PerformDataBinding (IEnumerable data) {
  				dataBindTrace.Append ("[Start PerformDataBinding]");
  				base.PerformDataBinding (data);
  				dataBindTrace.Append ("[End PerformDataBinding]");
  			}
  
  			protected override void OnDataBinding (EventArgs e) {
  				dataBindTrace.Append ("[Start OnDataBinding]");
  				base.OnDataBinding (e);
  				dataBindTrace.Append ("[End OnDataBinding]");
  			}
  
  			protected override void OnDataBound (EventArgs e) {
  				dataBindTrace.Append ("[Start OnDataBound]");
  				base.OnDataBound (e);
  				dataBindTrace.Append ("[End OnDataBound]");
  			}
  
  			protected override DataSourceView GetData () {
  				dataBindTrace.Append ("[Start GetData]");
  				DataSourceView d = base.GetData ();
  				dataBindTrace.Append ("[End GetData]");
  				return d;
  			}
  
  			public DataSourceView DoGetData () {
  				return GetData ();
  			}
  
  			public IDataSource DoGetDataSource () {
  				return GetDataSource ();
  			}
  
  			public void DoEnsureDataBound () {
  				EnsureDataBound();
  			}
  
  			protected override DataSourceSelectArguments CreateDataSourceSelectArguments () {
  				CreateDataSourceSelectArgumentsCalled++;
  				CreatedDataSourceSelectArguments = base.CreateDataSourceSelectArguments ();
  				return CreatedDataSourceSelectArguments;
  			}
  
  			public DataSourceSelectArguments GetSelectArguments () {
  				return SelectArguments;
  			}
  			
  			internal ControlAdapter controlAdapter;
  			protected override global::System.Web.UI.Adapters.ControlAdapter ResolveAdapter ()
  			{
  				return controlAdapter;
  			}
  
  		}
  
  		[TestFixtureTearDown]
  		public void Unload ()
  		{
  			WebTest.Unload ();
  		}
  
  		[Test]
  		public void DataBoundControl_GetData () {
  			Page p = new Page ();
  			MyDataBoundControl dc = new MyDataBoundControl ();
  			p.Controls.Add (dc);
  
  			DataSourceView data = dc.DoGetData ();
  			Assert.IsNotNull (data, "GetData");
  
  			IDataSource dataSource = dc.DoGetDataSource ();
  			Assert.IsNotNull (dataSource, "GetDataSource");
  		}
  
  		[Test]
  		public void DataBoundControl_DataBindFlow () {
  			Page p = new Page ();
  			MyDataBoundControl dc = new MyDataBoundControl ();
  			p.Controls.Add (dc);
  			dc.DataBind ();
  			string expected = "[Start DataBind][Start PerformSelect][Start OnDataBinding][End OnDataBinding][Start GetData][End GetData][Start PerformDataBinding][End PerformDataBinding][Start OnDataBound][End OnDataBound][End PerformSelect][End DataBind]";
  			Assert.AreEqual (expected, dc.DataBindTrace, "DataBindFlow");
  		}
  		
  		[Test]
  		[Category ("NunitWeb")]
  		public void DataBoundControl_DataBindFlow2 () {
  			new WebTest (PageInvoker.CreateOnLoad (DataBoundControl_DataBindFlow2_Load)).Run ();
  		}
  
  		public static void DataBoundControl_DataBindFlow2_Load(Page p){
  			MyDataBoundControl dc = new MyDataBoundControl ();
  			p.Controls.Add (dc);
  			dc.DataSourceID = "ObjectDataSource1";
  			ObjectDataSource ods = new ObjectDataSource (typeof(Control).FullName, "ToString");
  			ods.ID = "ObjectDataSource1";
  			p.Controls.Add (ods);
  			dc.DataBind ();
  			string expected = "[Start DataBind][Start PerformSelect][Start GetData][End GetData][Start OnDataBinding][End OnDataBinding][Start PerformDataBinding][End PerformDataBinding][Start OnDataBound][End OnDataBound][End PerformSelect][End DataBind]";
  			Assert.AreEqual (expected, dc.DataBindTrace, "DataBindFlow");
  		}
  		
  		[Test]
  		public void DataBoundControl_DataBindFlow3 () {
  			Page p = new Page ();
  			MyDataBoundControl dc = new MyDataBoundControl ();
  			p.Controls.Add (dc);
  			DataSourceSelectArguments arg1 = dc.GetSelectArguments ();
  			Assert.AreEqual (1, dc.CreateDataSourceSelectArgumentsCalled, "CreateDataSourceSelectArgumentsCalled#1");
  			dc.DataBind ();
  			DataSourceSelectArguments argCreated2 = dc.CreatedDataSourceSelectArguments;
  			DataSourceSelectArguments arg2 = dc.GetSelectArguments ();
  			Assert.AreEqual (2, dc.CreateDataSourceSelectArgumentsCalled, "CreateDataSourceSelectArgumentsCalled#2");
  			dc.DataBind ();
  			DataSourceSelectArguments argCreated3 = dc.CreatedDataSourceSelectArguments;
  			Assert.AreEqual (3, dc.CreateDataSourceSelectArgumentsCalled, "CreateDataSourceSelectArgumentsCalled#3");
  			Assert.IsTrue (object.ReferenceEquals (argCreated2, arg2), "CreateDataSourceSelectArgumentsCalled#4");
  		}
  		
  		[Test]
  		public void Defaults ()
  		{
  			Poker p = new Poker ();
  			Assert.AreEqual ("", p.DataMember, "A1");
  			Assert.AreEqual ("", p.DataSourceID, "A2");
  		}
  		
  		[Test]
  		public void ValidateDataSource () {
  			Poker p = new Poker ();
  			// Allows null
  			p.DoValidateDataSource (null);
  		}
  
  		// MSDN: The ConfirmInitState method sets the initialized state of the data-bound 
  		// control. The method is called by the DataBoundControl class in its OnLoad method.
  		[Test]
  		[Category ("NunitWeb")]
  		public void Initialized ()
  		{
  			WebTest t = new WebTest ();
  			PageDelegates pd = new PageDelegates ();
  			pd.Load = Initialized_Load;
  			pd.PreRenderComplete = Initialized_PreRender;
  			t.Invoker = new PageInvoker (pd);
  			t.Run ();
  		}
  
  		public static void Initialized_Load (Page p)
  		{
  			Poker c = new Poker ();
  			p.Form.Controls.Clear ();
  			p.Form.Controls.Add (c);
  			Assert.IsFalse (c.GetInitialized (), "Initialized_Load");
  			Assert.IsFalse (c.GetRequiresDataBinding (), "RequiresDataBinding_Load");
  		}
  
  		public static void Initialized_PreRender (Page p)
  		{
  			Poker c = (Poker) p.Form.Controls [0];
  			Assert.IsTrue (c.GetInitialized (), "Initialized_PreRender");
  			Assert.IsTrue (c.GetRequiresDataBinding (), "RequiresDataBinding_PreRender");
  		}
  		
  		[Test]
  		[Category ("NunitWeb")]
  		public void Initialized2 () {
  			WebTest t = new WebTest ();
  			PageDelegates pd = new PageDelegates ();
  			pd.Init = Initialized2_Init;
  			pd.Load = Initialized2_Load;
  			pd.PreRenderComplete = Initialized2_PreRender;
  			t.Invoker = new PageInvoker (pd);
  			t.Run ();
  		}
  
  		public static void Initialized2_Init (Page p) {
  			Poker c = new Poker ();
  			p.Form.Controls.Clear ();
  			p.Form.Controls.Add (c);
  			Assert.IsFalse (c.GetInitialized (), "Initialized_Init");
  			Assert.IsFalse (c.GetRequiresDataBinding (), "RequiresDataBinding_Init");
  		}
  
  		public static void Initialized2_Load (Page p) {
  			Poker c = (Poker) p.Form.Controls [0];
  			Assert.IsTrue (c.GetInitialized (), "Initialized_Load");
  			Assert.IsTrue (c.GetRequiresDataBinding (), "RequiresDataBinding_Load");
  			c.SetRequiresDataBinding (false);
  		}
  
  		public static void Initialized2_PreRender (Page p) {
  
gt: 			Poker c = (Poker) p.Form.Controls [0];