//
// Tests for System.Web.UI.WebControls.WebControl.cs
//
// Author:
// Peter Dennis Bartok (pbartok@novell.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.Collections;
using System.Drawing;
using System.IO;
using System.Globalization;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MonoTests.stand_alone.WebHarness;
#if NET_2_0
using System.Web.UI.Adapters;
using System.Web.UI.WebControls.Adapters;
#endif
namespace MonoTests.System.Web.UI.WebControls
{
[TestFixture]
public class WebControlTest {
private static HtmlTextWriter GetWriter () {
StringWriter sw = new StringWriter ();
sw.NewLine = "\n";
return new HtmlTextWriter (sw);
}
private bool IsEqual(object[] a1, object[] a2, string assertion) {
int matches;
bool[] notfound;
if (a1.Length != a2.Length) {
if (assertion != null) {
Assert.Fail(assertion + "( different length )");
}
return false;
}
matches = 0;
notfound = new bool[a1.Length];
for (int i = 0; i < a1.Length; i++) {
for (int j = 0; j < a2.Length; j++) {
if (a1[i].Equals(a2[j])) {
matches++;
break;
}
}
if ((assertion != null) && (matches != i+1)) {
Assert.Fail(assertion + "( missing " + a1[i].ToString() + " )");
}
}
return matches == a1.Length;
}
public class CustomControl : WebControl
{
public virtual string CustomProperty {
get {
return (string) ViewState ["CustomProperty"];
}
set {
ViewState ["CustomProperty"] = value;
}
}
protected override Style CreateControlStyle () {
return new Style ();
}
public void DoTrackViewState () {
TrackViewState ();
}
public object DoSaveViewState () {
return SaveViewState ();
}
public void DoLoadViewState (object state) {
LoadViewState (state);
}
}
public class CustomControl2 : CustomControl
{
protected override Style CreateControlStyle () {
Style style = new Style (ViewState);
style.BackColor = Color.Blue;
return style;
}
}
public class NamingContainer : WebControl, INamingContainer {
}
public class WebControlTestClass : WebControl {
public WebControlTestClass() : base() {
}
public WebControlTestClass(string tag) : base(tag) {
}
public WebControlTestClass(HtmlTextWriterTag tag) : base(tag) {
}
public new HtmlTextWriterTag TagKey {
get {
return base.TagKey;
}
}
public new string TagName {
get {
return base.TagName;
}
}
public StateBag Bag {
get {
return base.ViewState;
}
}
public override bool EnableViewState {
get {
return base.EnableViewState;
}
}
public string Render () {
HtmlTextWriter writer;
writer = WebControlTest.GetWriter();
base.Render (writer);
return writer.InnerWriter.ToString ();
}
public bool IsTrackingVS ()
{
return IsTrackingViewState;
}
public void SetTrackingVS ()
{
TrackViewState ();
}
public object Save() {
return base.SaveViewState();
}
public void Load(object o) {
base.LoadViewState(o);
}
public string[] KeyValuePairs() {
IEnumerator e;
string[] result;
int item;
e = ViewState.GetEnumerator();
result = new string[ViewState.Keys.Count];
item = 0;
while (e.MoveNext()) {
DictionaryEntry d;
StateItem si;
d = (DictionaryEntry)e.Current;
si = (StateItem)d.Value;
if (si.Value is String[]) {
string[] values;
values = (string[]) si.Value;
result[item] = d.Key.ToString() + "=";
if (values.Length > 0) {
result[item] += values[0];
for (int i = 1; i < values.Length; i++) {
result[item] += ", " + values[i];
}
}
} else {
result[item] = d.Key.ToString() + "=" + si.Value;
}
item++;
}
return result;
}
public Style DoCreateControlStyle () {
return base.CreateControlStyle ();
}
}
[Test]
public void CreateControlStyle () {
WebControlTestClass w = new WebControlTestClass ();
Assert.AreEqual (false, w.ControlStyleCreated, "CreateControlStyle#1");
Style s = w.DoCreateControlStyle ();
Assert.AreEqual (false, w.ControlStyleCreated, "CreateControlStyle#2");
s = w.ControlStyle;
Assert.AreEqual (true, w.ControlStyleCreated, "CreateControlStyle#3");
}
[Test]
public void Constructors ()
{
WebControlTestClass w;
w = new WebControlTestClass();
Assert.AreEqual(Color.Empty, w.BackColor, "C1");
Assert.AreEqual(HtmlTextWriterTag.Span, w.TagKey, "C2");
Assert.AreEqual("span", w.TagName, "C3");
w = new WebControlTestClass("Small");
Assert.AreEqual(HtmlTextWriterTag.Unknown, w.TagKey, "C4");
Assert.AreEqual("Small", w.TagName, "C5");
w = new WebControlTestClass(HtmlTextWriterTag.Small);
Assert.AreEqual(HtmlTextWriterTag.Small, w.TagKey, "C5");
Assert.AreEqual("small", w.TagName, "C6");
}
[Test]
public void StyleCreation () {
WebControlTestClass w;
w = new WebControlTestClass(HtmlTextWriterTag.Small);
Assert.AreEqual(HtmlTextWriterTag.Small, w.TagKey, "C5");
Assert.AreEqual("small", w.TagName, "C6");
Assert.AreEqual(false, w.ControlStyleCreated, "C7"); // No style
Assert.AreEqual(Color.Empty, w.BackColor, "C8"); // Force style creation?
Assert.AreEqual(false, w.ControlStyleCreated, "C9"); // Nope, 'get' access didn't create it
w.BackColor = Color.Red; // Forces style creation!
Assert.AreEqual(Color.Red, w.BackColor, "C10");
Assert.AreEqual(true, w.ControlStyleCreated, "C11"); // Now we have a style
w = new WebControlTestClass(HtmlTextWriterTag.Script);
Assert.AreEqual(HtmlTextWriterTag.Script, w.TagKey, "C12");
Assert.AreEqual("script", w.TagName, "C13");
Assert.AreEqual(false, w.ControlStyleCreated, "C14"); // Double-check
Assert.IsNotNull(w.ControlStyle, "C15"); // Grab style, forcing creation
Assert.AreEqual(true, w.ControlStyleCreated, "C16"); // Double-check
}
[Test]
public void Defaults () {
WebControlTestClass w;
w = new WebControlTestClass(HtmlTextWriterTag.Small);
Assert.AreEqual ("", w.AccessKey, "D1");
Assert.AreEqual (0, w.Attributes.Count, "D2");
Assert.AreEqual (Color.Empty, w.BackColor, "D3");
Assert.AreEqual (Color.Empty, w.BorderColor, "D4");
Assert.AreEqual (BorderStyle.NotSet, w.BorderStyle, "D5");
Assert.AreEqual (Unit.Empty, w.BorderWidth, "D6");
Assert.AreEqual (string.Empty, w.CssClass, "D7");
Assert.AreEqual (true, w.Enabled, "D8");
Assert.AreEqual (Color.Empty, w.ForeColor, "D9");
Assert.AreEqual (Unit.Empty, w.Height, "D10");
Assert.AreEqual (0, w.Style.Count, "D11");
Assert.AreEqual (0, w.TabIndex, "D12");
Assert.AreEqual ("", w.ToolTip, "D13");
Assert.AreEqual (Unit.Empty, w.Width, "D14");
}
[Test]
public void Assignment ()
{
CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture;
try {
CultureInfo ciUS = CultureInfo.GetCultureInfo ("en-US");
Thread.CurrentThread.CurrentCulture = ciUS;
Thread.CurrentThread.CurrentUICulture = ciUS;
RunAssignmentTests ();
} finally {
Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentUICulture;
}
}
void RunAssignmentTests ()
{
WebControlTestClass w;
w = new WebControlTestClass(HtmlTextWriterTag.Small);
w.BackColor = Color.Red;
Assert.AreEqual (Color.Red, w.BackColor, "A1");
w.Attributes["test"] = "testme";
Assert.AreEqual (1, w.Attributes.Count, "A2");
Assert.AreEqual ("testme", w.Attributes["test"], "A3");
w.BorderColor = Color.Green;
Assert.AreEqual (Color.Green, w.BorderColor, "A4");
w.BorderStyle = BorderStyle.Dotted;
Assert.AreEqual (BorderStyle.Dotted, w.BorderStyle, "A5");
w.BorderWidth = new Unit("12px");
Assert.AreEqual (12, w.BorderWidth.Value, "A6");
Assert.AreEqual (string.Empty, w.CssClass, "A7");
w.Enabled = false;
Assert.AreEqual (false, w.Enabled, "A8");
w.ForeColor = Color.BlueViolet;
Assert.AreEqual (Color.BlueViolet, w.ForeColor, "A9");
w.Height = new Unit(6.5);
Assert.AreEqual (6, w.Height.Value, "A10");
Assert.AreEqual (0, w.Style.Count, "A11");
w.TabIndex = 10;
Assert.AreEqual (10, w.TabIndex, "A12");
w.ToolTip = "I am a tip";
Assert.AreEqual ("I am a tip", w.ToolTip, "A13");
w.Width = new Unit(6.5, UnitType.Cm);
Assert.AreEqual (6.5, w.Width.Value, "A14");
Assert.AreEqual(false, w.IsTrackingVS (), "A15");
w.SetTrackingVS ();
Assert.AreEqual(true, w.IsTrackingVS (), "A16");
w.Enabled = true;
Assert.AreEqual(true, w.Enabled, "A17");
w.Save();
w.Attributes["PrivateTag"] = "blah";
Assert.AreEqual(2, w.Attributes.Count, "A18");
w.Attributes.Clear();
w.Attributes["Style"] = "background-color: #ff00ff";
Assert.AreEqual(1, w.Attributes.Count, "A19");
Assert.AreEqual(1, w.Style.Count, "A20");
w.Attributes.Clear();
w.Attributes.Add("Style", "foreground-color=#ff00ff");
Assert.AreEqual(1, w.Attributes.Count, "A21");
Assert.AreEqual(0, w.Style.Count, "A22");
w.Attributes.Clear();
w.Attributes.Add("Style", "background: black; text-align: left;");
Assert.AreEqual(1, w.Attributes.Count, "A23");
Assert.AreEqual(2, w.Style.Count, "A24");
w.Attributes["Style"] = "background: black; text-align: left; foreground: white;";
Assert.AreEqual(1, w.Attributes.Count, "A25");
Assert.AreEqual(3, w.Style.Count, "A26");
w.Style["background-color"] = Color.Purple.ToString();
Assert.AreEqual(4, w.Style.Count, "A27");
w.AccessKey = "I";
Assert.AreEqual("I", w.AccessKey, "A28");
// Check the bag
string[] expect = {
"BorderStyle=Dotted",
"Width=6.5cm",
"Height=6px",
"BorderWidth=12px",
"ForeColor=Color [BlueViolet]",
"BorderColor=Color [Green]",
"ToolTip=I am a tip",
"BackColor=Color [Red]",
"TabIndex=10",
"AccessKey=I",
"Enabled=True" };
IsEqual(expect, w.KeyValuePairs(), "A29");
}
[Test]
public void Methods() {
WebControlTestClass w;
WebControlTestClass w_copy;
w = new WebControlTestClass(HtmlTextWriterTag.Xml);
w_copy = new WebControlTestClass(HtmlTextWriterTag.Xml);
w.Enabled = true;
w.AccessKey = "I";
w.Attributes["Argl"] = "Arglbla";
w.Attributes.Add("Style", "background: black; text-align: left;");
Assert.AreEqual(2, w.Attributes.Count, "M1");
Assert.AreEqual(2, w.Style.Count, "M2");
w_copy.TabIndex = 10;
w_copy.Attributes["Blah"] = "blahblah";
Assert.AreEqual(0, w.TabIndex, "M3");
Assert.AreEqual(10, w_copy.TabIndex, "M4");
w_copy.CopyBaseAttributes(w);
Assert.AreEqual(10, w_copy.TabIndex, "M5");
Assert.AreEqual("blahblah", w_copy.Attributes["Blah"], "M6");
Assert.AreEqual("Arglbla", w_copy.Attributes["Argl"], "M7");
// Styles should make it over, too
Assert.AreEqual("black", w_copy.Style["background"], "M8");
// Check the bag
string[] expect = {
"TabIndex=10",
"AccessKey=I" };
IsEqual(expect, w_copy.KeyValuePairs(), "M9");
Assert.AreEqual("