//
// Tests for System.Web.UI.WebControls.ThemeTest.cs
//
// Author:
//	Yoni Klein (yonik@mainsoft.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.

// Additional resources :
// PageWithStyleSheet.aspx; PageWithStyleSheet.aspx.cs;RunTimeSetTheme.aspx;
// RunTimeSetTheme.aspx.cs; PageWithTheme.aspx; PageWithTheme.aspx.cs; Theme1.skin

#if NET_2_0

using System;
using System.Drawing;
using System.IO;
using System.Configuration;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using MyWebControl = System.Web.UI.WebControls;
using System.Reflection;
using NUnit.Framework;
using MonoTests.SystemWeb.Framework;

namespace MonoTests.System.Web.UI.WebControls
{
	[Serializable]
	[TestFixture]
	public class ThemeTest
	{	
		[TestFixtureSetUp]
		public void Set_Up ()
		{
			WebTest.CopyResource (GetType (), "Theme1.skin", "App_Themes/Theme1/Theme1.skin");
			WebTest.CopyResource (GetType (), "WizardTest.skin", "App_Themes/Theme1/WizardTest.skin");
			WebTest.CopyResource (GetType (), "PageWithStyleSheet.aspx", "PageWithStyleSheet.aspx");
			WebTest.CopyResource (GetType (), "PageWithTheme.aspx", "PageWithTheme.aspx");
			WebTest.CopyResource (GetType (), "RunTimeSetTheme.aspx", "RunTimeSetTheme.aspx");
			WebTest.CopyResource (GetType (), "UrlProperty.aspx", "UrlProperty.aspx");
			WebTest.CopyResource (GetType (), "UrlProperty.ascx", "UrlProperty.ascx");
			WebTest.CopyResource (GetType (), "UrlProperty.ascx.cs", "UrlProperty.ascx.cs");
		}

		[SetUp]
		public void SetupTestCase ()
		{
			Thread.Sleep (100);
		}
		
		//Run on page with theme

		[Test]
		[Category ("NunitWeb")]
		public void Theme_TestLabelTheme ()
		{
			WebTest t = new WebTest ("PageWithTheme.aspx");
			t.Invoker = PageInvoker.CreateOnLoad (RenderLabelTest);
			t.Run ();
		}

		public static void RenderLabelTest (Page p)
		{
			Assert.AreEqual (Color.Black,((MyWebControl.Label) p.FindControl ("Label")).BackColor, "Default Theme#1");
			Assert.AreEqual (Color.Red, ((MyWebControl.Label) p.FindControl ("LabelRed")).BackColor, "Red Skin Theme#2");
			Assert.AreEqual (Color.Yellow, ((MyWebControl.Label) p.FindControl ("LabelYellow")).BackColor, "Yellow Skin Theme#3");
			Assert.AreEqual (Color.Black, ((MyWebControl.Label) p.FindControl ("LabelOverride")).BackColor, "Override Skin Theme#4");
		}

		[Test]
		[Category ("NunitWeb")]
		public void Theme_TestImageTheme ()
		{
			WebTest t = new WebTest ("PageWithTheme.aspx");
			t.Invoker = PageInvoker.CreateOnLoad (RenderImageTest);
			t.Run ();
		}

		public static void RenderImageTest (Page p)
		{
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("Image")).ImageUrl.IndexOf ("myimageurl") >= 0, "Default Theme#1");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageRed")).ImageUrl.IndexOf ("myredimageurl") >= 0, "RedImage Theme#2");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageYellow")).ImageUrl.IndexOf ("myyellowimageurl") >= 0, "YellowImage Theme#3");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageOverride")).ImageUrl.IndexOf ("myimageurl") >= 0, "OverrideImage Theme#3");
		}

		// Run on page with StyleSheet

		[Test]
		[Category ("NunitWeb")]
		public void Theme_TestLabelStyleSheet ()
		{
			WebTest t = new WebTest ("PageWithStyleSheet.aspx");
			t.Invoker = PageInvoker.CreateOnLoad (StyleSheetRenderLabelTest);
			t.Run ();
		}

		public static void StyleSheetRenderLabelTest (Page p)
		{
			Assert.AreEqual (Color.Black, ((MyWebControl.Label) p.FindControl ("Label")).BackColor, "Default Theme#1");
			Assert.AreEqual (Color.Red, ((MyWebControl.Label) p.FindControl ("LabelRed")).BackColor, "Red Skin Theme#2");
			Assert.AreEqual (Color.Yellow, ((MyWebControl.Label) p.FindControl ("LabelYellow")).BackColor, "Yellow Skin Theme#3");
			Assert.AreEqual (Color.White, ((MyWebControl.Label) p.FindControl ("LabelOverride")).BackColor, "Override Skin Theme#4");
		}

		[Test]
		[Category ("NunitWeb")]
		public void Theme_TestImageStyleSheet ()
		{
			WebTest t = new WebTest ("PageWithStyleSheet.aspx");
			t.Invoker = PageInvoker.CreateOnLoad (StyleSheetRenderImageTest);
			t.Run ();
		}

		public static void StyleSheetRenderImageTest (Page p)
		{
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("Image")).ImageUrl.IndexOf ("myimageurl") >= 0, "Default Theme#1");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageRed")).ImageUrl.IndexOf ("myredimageurl") >= 0, "RedImage Theme#2");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageYellow")).ImageUrl.IndexOf ("myyellowimageurl") >= 0, "YellowImage Theme#3");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageOverride")).ImageUrl.IndexOf ("overridedurl") >= 0, "OverrideImage Theme#3");
		}

		[Test]
		[Category ("NunitWeb")]
		public void Theme_TestRuntimeSetTheme ()
		{
			PageDelegates p = new PageDelegates ();
			p.PreInit = RuntimeSetThemePreInit;
			p.Load = RuntimeSetThemeLoad;
			WebTest t = new WebTest ("RunTimeSetTheme.aspx");
			t.Invoker = new PageInvoker (p);
			t.Run ();
		}

		public static void RuntimeSetThemePreInit (Page p)
		{
			p.Theme = "Theme1";
		}

		public static void RuntimeSetThemeLoad (Page p)
		{
			Assert.AreEqual (Color.Black, ((MyWebControl.Label) p.FindControl ("Label")).BackColor, "Default Theme#1");
			Assert.AreEqual (Color.Red, ((MyWebControl.Label) p.FindControl ("LabelRed")).BackColor, "Red Skin Theme#2");
			Assert.AreEqual (Color.Yellow, ((MyWebControl.Label) p.FindControl ("LabelYellow")).BackColor, "Yellow Skin Theme#3");
			Assert.AreEqual (Color.Black, ((MyWebControl.Label) p.FindControl ("LabelOverride")).BackColor, "Override Skin Theme#4");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("Image")).ImageUrl.IndexOf ("myimageurl") >= 0, "Default Theme#1");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageRed")).ImageUrl.IndexOf ("myredimageurl") >= 0, "RedImage Theme#2");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageYellow")).ImageUrl.IndexOf ("myyellowimageurl") >= 0, "YellowImage Theme#3");
			Assert.IsTrue (((MyWebControl.Image) p.FindControl ("ImageOverride")).ImageUrl.IndexOf ("myimageurl") >= 0, "OverrideImage Theme#3");
		}

		[Test]
		[Category ("NunitWeb")]
		[ExpectedException (typeof (HttpException))]
		public void Theme_SetThemeException ()
		{
			string page=new WebTest (PageInvoker.CreateOnPreInit (SetThemeExeption)).Run ();
			Assert.IsTrue (page.IndexOf("System.Web.HttpException") >= 0, "System.Web.HttpException was expected, actual result: "+page);
		}

		//// Delegate running on Page Load , only before PreInit possible set Theme on running time !
		//[Test]
		//[Category ("NunitWeb")]
		////Use Assert.Fail to print the actual result
		////[ExpectedException (typeof (InvalidOperationException))]
		//[Category ("NotWorking")]
		//public void Theme_SetThemeException ()
		//{
		//        try {
		//                string res=Helper.Instance.RunInPagePreInit (SetThemeExeption);
		//                Assert.Fail ("InvalidOperationException was expected. Result: "+res); 
		//        }
		//        catch (InvalidOperationException e) {
		//                //swallow the expected exception
		//        }
		//}

		public static void SetThemeExeption (Page p)
		{
			p.Theme = "InvalidTheme1";
		}

		[Test]
		[Category ("NunitWeb")]
		public void Theme_EnableTheming ()
		{
			
			PageDelegates pd = new PageDelegates ();
			pd.PreInit = new PageDelegate (SetTheme1);
			pd.Load = new PageDelegate (Theme1Load);
			PageInvoker pi = new PageInvoker (pd);

			string page = new WebTest (pi).Run ();

			Assert.IsTrue (page.IndexOf ("testing") < 0, "Theme_EnableTheming");
		}
		public static void Theme1Load (Page p)
		{
			Table t = new Table ();
			TableRow tr = new TableRow ();
			TableCell cell = new TableCell ();

			cell.Controls.Add (new Button ());
			tr.Cells.Add (cell);
			t.Rows.Add (tr);

			t.EnableTheming = false;
			p.Form.Controls.Add (t);
		}
		public static void SetTheme1 (Page p)
		{
			p.Theme = "Theme1";
		}

		[Test]
		[Category ("NunitWeb")]
		public void Theme_EnableThemingChild ()
		{

			PageDelegates pd = new PageDelegates ();
			pd.PreInit = new PageDelegate (SetTheme1);
			pd.Load = new PageDelegate (Theme1ChildLoad);
			PageInvoker pi = new PageInvoker (pd);

			string page = new WebTest (pi).Run ();

			Assert.IsTrue (page.IndexOf ("testing") > 0, "Theme_EnableThemingChild");
		}
		public static void Theme1ChildLoad (Page p)
		{
			Table t = new Table ();
			TableRow tr = new TableRow ();
			TableCell cell = new TableCell ();

			cell.Controls.Add (new Button ());
			tr.Cells.Add (cell);
			t.Rows.Add (tr);

			t.EnableTheming = false;
			cell.EnableTheming = true;
			p.Form.Controls.Add (t);
		}

		[TestFixtureTearDown]
		public void TearDown ()
		{
			Thread.Sleep (100);
			WebTest.Unload ();
			Thread.Sleep (100);
		}
		
		[Test]
		[Category("NunitWeb")]
		public void UrlPropertyTest ()
		{
			string res = new WebTest ("UrlProperty.aspx").Run ();

			Assert.IsTrue (res.IndexOf ("Property1 = testProp1") != -1,
				"Property1 should be assigned as is, actual result: "+res);
			Assert.IsTrue (res.IndexOf ("UrlProperty2 = ~/App_Themes/Theme1/testProp2") != -1,
				"UrlProperty2 should be assigned including theme subfolder, actual result: "+res);
		}
	}
}
#endif