// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Text;
using System.IO;
using System.Xml;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using NUnit.Framework;
using ICSharpCode.WpfDesign.Designer;
using ICSharpCode.WpfDesign.Designer.Xaml;
using ICSharpCode.WpfDesign.Designer.Services;
namespace ICSharpCode.WpfDesign.Tests.Designer
{
[TestFixture]
public class ModelTests : ModelTestHelper
{
[Test]
public void SetButtonWidth()
{
DesignItem button = CreateCanvasContext("");
button.Properties["Width"].SetValue(100.0);
AssertCanvasDesignerOutput(@"", button.Context);
AssertLog("");
}
[Test]
public void SetButtonWidthElementSyntax()
{
DesignItem button = CreateCanvasContext("");
button.Properties["Width"].SetValue(100.0);
AssertCanvasDesignerOutput("", button.Context);
AssertLog("");
}
[Test]
public void UndoRedoTest()
{
DesignItem button = CreateCanvasContext("");
UndoService s = button.Context.Services.GetService();
Assert.IsFalse(s.CanUndo);
Assert.IsFalse(s.CanRedo);
button.Properties["Width"].SetValue(100.0);
Assert.IsTrue(s.CanUndo);
Assert.IsFalse(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
s.Undo();
Assert.IsFalse(s.CanUndo);
Assert.IsTrue(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
s.Redo();
Assert.IsTrue(s.CanUndo);
Assert.IsFalse(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
AssertLog("");
}
[Test]
public void ButtonClickEventHandler()
{
DesignItem button = CreateCanvasContext("");
Assert.AreEqual("OnClick", button.Properties["Click"].ValueOnInstance);
button.Properties["Click"].Reset();
button.Properties["KeyDown"].SetValue("ButtonKeyDown");
AssertCanvasDesignerOutput(@"", button.Context);
AssertLog("");
}
[Test]
public void ButtonClickEventHandlerUndoRedo()
{
DesignItem button = CreateCanvasContext("");
UndoService s = button.Context.Services.GetService();
Assert.IsFalse(s.CanUndo);
Assert.IsFalse(s.CanRedo);
button.Properties["Click"].SetValue("OnClick");
Assert.IsTrue(s.CanUndo);
Assert.IsFalse(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
button.Properties["Click"].SetValue("OnClick2");
Assert.IsTrue(s.CanUndo);
Assert.IsFalse(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
s.Undo();
Assert.IsTrue(s.CanUndo);
Assert.IsTrue(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
s.Undo();
Assert.IsFalse(s.CanUndo);
Assert.IsTrue(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
s.Redo();
Assert.IsTrue(s.CanUndo);
Assert.IsTrue(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
AssertLog("");
}
[Test]
public void UndoRedoChangeGroupTest()
{
DesignItem button = CreateCanvasContext("");
UndoService s = button.Context.Services.GetService();
Assert.IsFalse(s.CanUndo);
Assert.IsFalse(s.CanRedo);
using (ChangeGroup g = button.OpenGroup("Resize")) {
button.Properties["Width"].SetValue(100.0);
button.Properties["Height"].SetValue(200.0);
g.Commit();
}
Assert.IsTrue(s.CanUndo);
Assert.IsFalse(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
s.Undo();
Assert.IsFalse(s.CanUndo);
Assert.IsTrue(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
s.Redo();
Assert.IsTrue(s.CanUndo);
Assert.IsFalse(s.CanRedo);
AssertCanvasDesignerOutput(@"", button.Context);
AssertLog("");
}
[Test]
public void AddTextBoxToCanvas()
{
DesignItem button = CreateCanvasContext("");
DesignItem canvas = button.Parent;
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
AssertCanvasDesignerOutput("\n", button.Context);
AssertLog("");
}
[Test]
public void AddTextBoxToCanvasExplicitChildrenCollection()
{
DesignItem button = CreateCanvasContext("");
DesignItem canvas = button.Parent;
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
AssertCanvasDesignerOutput("\n \n \n", button.Context);
AssertLog("");
}
[Test]
public void AddTextBoxToCanvasEmptyImplicitPanelChildrenCollection()
{
DesignItem canvas = CreateCanvasContext("");
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
AssertCanvasDesignerOutput("", canvas.Context);
AssertLog("");
}
[Test]
public void AddTextBoxToCanvasEmptyImplicitPanelChildrenCollectionEmptyTag()
{
DesignItem canvas = CreateCanvasContext("");
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
AssertCanvasDesignerOutput("", canvas.Context);
AssertLog("");
}
[Test]
public void AddTextBoxToCanvasEmptyExplicitPanelChildrenCollection()
{
DesignItem canvas = CreateCanvasContext("");
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
AssertCanvasDesignerOutput("", canvas.Context);
AssertLog("");
}
[Test]
public void AddTextBoxToCanvasEmptyExplicitCanvasChildrenCollection()
{
DesignItem canvas = CreateCanvasContext("");
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
AssertCanvasDesignerOutput("", canvas.Context);
AssertLog("");
}
[Test]
public void InsertTextBoxInCanvas()
{
DesignItem button = CreateCanvasContext("5060");
DesignItem canvas = button.Parent;
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
DesignItem checkBox = canvas.Services.Component.RegisterComponentForDesigner(new CheckBox());
canvas.Properties["Children"].CollectionElements.Insert(0, checkBox);
AssertCanvasDesignerOutput("50\n" +
"\n" +
"\n" +
"\n" +
"60", button.Context);
AssertLog("");
}
[Test]
public void ClearImplicitChildCollection()
{
DesignItem canvas = CreateCanvasContext("");
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Clear();
AssertCanvasDesignerOutput("", canvas.Context);
AssertLog("");
}
[Test]
public void AddMultiBindingToTextBox()
{
DesignItem button = CreateCanvasContext("");
DesignItem canvas = button.Parent;
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
textBox.Properties[TextBox.TextProperty].SetValue(new MultiBinding());
DesignItem multiBindingItem = textBox.Properties[TextBox.TextProperty].Value;
multiBindingItem.Properties["Converter"].SetValue(new MyMultiConverter());
DesignItemProperty bindingsProp = multiBindingItem.ContentProperty;
Assert.IsTrue(bindingsProp.IsCollection);
Assert.AreEqual(bindingsProp.Name, "Bindings");
DesignItem bindingItem = canvas.Services.Component.RegisterComponentForDesigner(new Binding());
bindingItem.Properties["Path"].SetValue("SomeProperty");
bindingsProp.CollectionElements.Add(bindingItem);
string expectedXaml = "\n" +
"\n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
"";
AssertCanvasDesignerOutput(expectedXaml, button.Context);
AssertLog("");
}
[Test]
public void AddSimpleBinding()
{
DesignItem button = CreateCanvasContext("");
DesignItem canvas = button.Parent;
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
textBox.Properties[TextBox.TextProperty].SetValue(new Binding());
textBox.Properties[TextBox.TextProperty].Value.Properties["Path"].SetValue("SomeProperty");
string expectedXaml = "\n" +
"\n";
AssertCanvasDesignerOutput(expectedXaml, button.Context);
AssertLog("");
}
[Test]
public void AddBindingWithStaticResource()
{
DesignItem button = CreateCanvasContext("");
DesignItem canvas = button.Parent;
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
DesignItemProperty resProp = canvas.Properties.GetProperty("Resources");
Assert.IsTrue(resProp.IsCollection);
DesignItem exampleClassItem = canvas.Services.Component.RegisterComponentForDesigner(new ExampleClass());
exampleClassItem.Key = "bindingSource";
resProp.CollectionElements.Add(exampleClassItem);
DesignItem bindingItem = canvas.Services.Component.RegisterComponentForDesigner(new Binding());
textBox.Properties[TextBox.TextProperty].SetValue(bindingItem);
bindingItem.Properties["Path"].SetValue("StringProp");
bindingItem.Properties["Source"].SetValue(new StaticResourceExtension());
bindingItem.Properties["Source"].Value.Properties["ResourceKey"].SetValue("bindingSource");
string expectedXaml = "\n" +
" \n" +
"\n" +
"\n" +
"";
AssertCanvasDesignerOutput(expectedXaml, button.Context);
AssertLog("");
}
void AddBindingWithStaticResourceWhereResourceOnSameElement(bool setBindingPropertiesAfterSet)
{
DesignItem button = CreateCanvasContext("");
DesignItem canvas = button.Parent;
DesignItem textBox = canvas.Services.Component.RegisterComponentForDesigner(new TextBox());
canvas.Properties["Children"].CollectionElements.Add(textBox);
DesignItemProperty resProp = textBox.Properties.GetProperty("Resources");
Assert.IsTrue(resProp.IsCollection);
DesignItem exampleClassItem = canvas.Services.Component.RegisterComponentForDesigner(new ExampleClass());
exampleClassItem.Key = "bindingSource";
resProp.CollectionElements.Add(exampleClassItem);
DesignItem bindingItem = canvas.Services.Component.RegisterComponentForDesigner(new Binding());
if (!setBindingPropertiesAfterSet) {
bindingItem.Properties["Path"].SetValue("StringProp");
bindingItem.Properties["Source"].SetValue(new StaticResourceExtension());
bindingItem.Properties["Source"].Value.Properties["ResourceKey"].SetValue("bindingSource");
}
textBox.Properties[TextBox.TextProperty].SetValue(bindingItem);
if (setBindingPropertiesAfterSet) {
bindingItem.Properties["Path"].SetValue("StringProp");
bindingItem.Properties["Source"].SetValue(new StaticResourceExtension());
bindingItem.Properties["Source"].Value.Properties["ResourceKey"].SetValue("bindingSource");
}
string expectedXaml = "\n" +
"\n" +
" \n" +
" \n" +
" \n" +
" \n" +
"";
AssertCanvasDesignerOutput(expectedXaml, button.Context);
AssertLog("");
}
[Test]
public void AddBindingWithStaticResourceWhereResourceOnSameElement()
{
AddBindingWithStaticResourceWhereResourceOnSameElement(false);
}
[Test]
public void AddBindingWithStaticResourceWhereResourceOnSameElementAlt()
{
AddBindingWithStaticResourceWhereResourceOnSameElement(true);
}
}
public class MyMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return new object[targetTypes.Length];
}
}
public class ExampleClass
{
string stringProp;
public string StringProp {
get { return stringProp; }
set { stringProp = value; }
}
}
}