Index: Application/Application.Ringtoets/Application.Ringtoets.csproj =================================================================== diff -u -r6e613570fb69ad93ca5fe269e6f48c8f6ceb1bab -r1c526b820be6d88285ac58ff819944b208966f39 --- Application/Application.Ringtoets/Application.Ringtoets.csproj (.../Application.Ringtoets.csproj) (revision 6e613570fb69ad93ca5fe269e6f48c8f6ceb1bab) +++ Application/Application.Ringtoets/Application.Ringtoets.csproj (.../Application.Ringtoets.csproj) (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -601,7 +601,7 @@ xcopy /S /D /Y /Q "$(SolutionDir)\lib\Common\SharpMap\*" .\ xcopy /S /D /Y /Q "$(SolutionDir)\lib\Common\SharpMap.Extensions\*" .\ -copy "$(SolutionDir)\src\DeltaShell\DeltaShell.Core\bin\$(ConfigurationName)\DeltaShell.Core.XmlSerializers.dll" .\ +copy "$(SolutionDir)\Core\Common\src\Core.Common.Base\bin\$(ConfigurationName)\DeltaShell.Core.XmlSerializers.dll" .\ copy "$(SolutionDir)\lib\*.dll" .\ Index: Core/Common/test/Core.Common.DelftTools.Tests/App.config =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/App.config (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/App.config (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,71 @@ + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/CSV/CsvImportTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/CSV/CsvImportTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/CSV/CsvImportTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using DelftTools.TestUtils; +using DelftTools.Utils.Csv.Importer; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.CSV +{ + [TestFixture] + public class CsvImportTest + { + [Test] + public void ConvertCsvFile() + { + var csvToDataTableConverter = new CsvImporter(); + + var dataTable = csvToDataTableConverter.SplitToTable(TestHelper.GetTestFilePath("Timeseries.csv"), + new CsvSettings + { + Delimiter = ',', + FirstRowIsHeader = true, + SkipEmptyLines = true + }); + + var customDTFormat = (DateTimeFormatInfo) CultureInfo.InvariantCulture.DateTimeFormat.Clone(); + customDTFormat.FullDateTimePattern = "dd/MM/yyyy"; + + var csvMapping = new Dictionary + { + { + new CsvRequiredField("Date time", typeof(DateTime)), new CsvColumnInfo(0, customDTFormat) + }, + { + new CsvRequiredField("Value (m AD)", typeof(double)), new CsvColumnInfo(1, new NumberFormatInfo()) + } + }; + + var typedDataTable = csvToDataTableConverter.Extract(dataTable, csvMapping); + + Assert.AreEqual(2, typedDataTable.Columns.Count); + Assert.AreEqual(4, typedDataTable.Rows.Count); + Assert.IsTrue(typedDataTable.Rows[0][0] is DateTime); + Assert.AreEqual(10.005, typedDataTable.Rows[0][1]); + } + + [Test] + public void ParseCsvFileAndFilterColumn() + { + var csvToDataTableConverter = new CsvImporter(); + + var dataTable = csvToDataTableConverter.SplitToTable(TestHelper.GetTestFilePath("Timeseries.csv"), + new CsvSettings + { + Delimiter = ',', + FirstRowIsHeader = true, + SkipEmptyLines = true + }); + + var csvMapping = new Dictionary + { + { + new CsvRequiredField("Value (m AD)", typeof(double)), new CsvColumnInfo(1, new NumberFormatInfo()) + } + }; + var filteredDataTable = csvToDataTableConverter.Extract(dataTable, csvMapping, new[] + { + new CsvPassIfEqualFilter(0, "14/07/1990") + }); + + Assert.AreEqual(1, filteredDataTable.Columns.Count); + Assert.AreEqual(1, filteredDataTable.Rows.Count); + Assert.AreEqual(15.0, filteredDataTable.Rows[0][0]); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/ChartTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/ChartTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/ChartTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,103 @@ +using System; +using System.IO; +using DelftTools.Controls.Swf.Charting; +using DelftTools.Controls.Swf.Charting.Series; +using DelftTools.TestUtils; +using DelftTools.Utils.Collections; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Charting +{ + [TestFixture] + public class ChartTest + { + [Test] + public void AddingSeriesToChartTriggersChartCollectionChanged() + { + var chart = new Chart(); + var count = 0; + + ((INotifyCollectionChanged) chart).CollectionChanged += (s, e) => { count++; }; + + chart.Series.Add(new AreaChartSeries()); + + Assert.AreEqual(1, count); + } + + [Test] + public void ExportAsImageWorks() + { + SaveDeleteAndAssertExport("test.png"); + } + + [Test] + public void ExportAsVectorGraphicsImageWorks() + { + SaveDeleteAndAssertExport("test.svg"); + } + + [Test] + public void ExportAsVectorGraphicsImagesGivesWarningForIgnoringHatchStyle() + { + var chart = new Chart(); + var areaSeries = new AreaChartSeries + { + UseHatch = true + }; + chart.Series.Add(areaSeries); + + TestHelper.AssertLogMessageIsGenerated(() => SaveDeleteAndAssertExport("test.svg", chart), "Hatch style is not supported for exports and will be ignored.", 1); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Argument did not contain a filename\r\nParameter name: filename")] + public void ExportAsImageThrowsOnIncompleteFileName() + { + SaveDeleteAndAssertExport(".noname"); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Extension (.ext) not supported\r\nParameter name: filename")] + public void ExportAsImageThrowsOnUnSupportedExtension() + { + SaveDeleteAndAssertExport("incorrect.ext"); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Argument should not be null\r\nParameter name: filename")] + public void ExportAsImageThrowsOnNullArgument() + { + SaveDeleteAndAssertExport(null); + } + + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Argument should have an extension\r\nParameter name: filename")] + public void ExportAsImageThrowsOnMissingExtension() + { + SaveDeleteAndAssertExport("noextension"); + } + + private static void SaveDeleteAndAssertExport(string exportFileName, IChart chart = null) + { + try + { + if (chart == null) + { + new Chart().ExportAsImage(exportFileName, null, null); + } + else + { + chart.ExportAsImage(exportFileName, null, null); + } + Assert.IsTrue(File.Exists(exportFileName)); + } + finally + { + if (File.Exists(exportFileName)) + { + File.Delete(exportFileName); + } + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/QuarterViewDateTimeFormatProviderTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/QuarterViewDateTimeFormatProviderTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/QuarterViewDateTimeFormatProviderTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,22 @@ +using System; +using DelftTools.Controls.Swf.Charting; +using NUnit.Framework; +using SharpTestsEx; + +namespace DelftTools.Tests.Controls.Swf.Charting +{ + [TestFixture] + public class QuarterViewDateTimeFormatProviderTest + { + [Test] + public void CheckQuarterViewDateTimeFormatProviderOutput() + { + var provider = new QuarterNavigatableLabelFormatProvider(); + + var minDate = new DateTime(2001, 1, 1); + var maxDate = new DateTime(2002, 7, 1); + + provider.GetRangeLabel(minDate, maxDate).Should("Unexpected quarter datetime string.").Be.EqualTo("1st Qtr 2001 till 3rd Qtr 2002"); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/AreaChartSeriesTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/AreaChartSeriesTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/AreaChartSeriesTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,47 @@ +using DelftTools.Controls.Swf.Charting.Series; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Charting.Series +{ + [TestFixture] + public class AreaChartSeriesTest + { + [Test] + public void TestMaximumValueClipping() + { + const int maximum = 999999; + var series = new AreaChartSeries + { + LineWidth = maximum, + PointerSize = maximum, + }; + Assert.AreEqual(maximum, series.LineWidth); + Assert.AreEqual(maximum, series.PointerSize); + + series.LineWidth = maximum + 1; + series.PointerSize = maximum + 1; + + Assert.AreEqual(maximum, series.LineWidth); + Assert.AreEqual(maximum, series.PointerSize); + } + + [Test] + public void TestMinimumValueClipping() + { + const int minimum = 0; + var series = new AreaChartSeries + { + LineWidth = minimum, + PointerSize = minimum, + }; + Assert.AreEqual(minimum, series.LineWidth); + Assert.AreEqual(minimum, series.PointerSize); + + series.LineWidth = minimum - 1; + series.PointerSize = minimum - 1; + + Assert.AreEqual(minimum, series.LineWidth); + Assert.AreEqual(minimum, series.PointerSize); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/BarSeriesTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/BarSeriesTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/BarSeriesTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,39 @@ +using DelftTools.Controls.Swf.Charting.Series; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Charting.Series +{ + [TestFixture] + public class BarSeriesTest + { + [Test] + public void TestMaximumValueClipping() + { + const int maximum = 999999; + var series = new BarSeries + { + LineWidth = maximum + }; + Assert.AreEqual(maximum, series.LineWidth); + + series.LineWidth = maximum + 1; + + Assert.AreEqual(maximum, series.LineWidth); + } + + [Test] + public void TestMinimumValueClipping() + { + const int minimum = 0; + var series = new BarSeries + { + LineWidth = minimum, + }; + Assert.AreEqual(minimum, series.LineWidth); + + series.LineWidth = minimum - 1; + + Assert.AreEqual(minimum, series.LineWidth); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/LineChartSeriesTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/LineChartSeriesTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/LineChartSeriesTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,47 @@ +using DelftTools.Controls.Swf.Charting.Series; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Charting.Series +{ + [TestFixture] + public class LineChartSeriesTest + { + [Test] + public void TestMaximumValueClipping() + { + const int maximum = 999999; + var series = new LineChartSeries + { + Width = maximum, + PointerSize = maximum, + }; + Assert.AreEqual(maximum, series.Width); + Assert.AreEqual(maximum, series.PointerSize); + + series.Width = maximum + 1; + series.PointerSize = maximum + 1; + + Assert.AreEqual(maximum, series.Width); + Assert.AreEqual(maximum, series.PointerSize); + } + + [Test] + public void TestMinimumValueClipping() + { + const int minimum = 0; + var series = new LineChartSeries + { + Width = minimum, + PointerSize = minimum, + }; + Assert.AreEqual(minimum, series.Width); + Assert.AreEqual(minimum, series.PointerSize); + + series.Width = minimum - 1; + series.PointerSize = minimum - 1; + + Assert.AreEqual(minimum, series.Width); + Assert.AreEqual(minimum, series.PointerSize); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/PointChartSeriesTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/PointChartSeriesTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/PointChartSeriesTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,39 @@ +using DelftTools.Controls.Swf.Charting.Series; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Charting.Series +{ + [TestFixture] + public class PointChartSeriesTest + { + [Test] + public void TestMaximumValueClipping() + { + const int maximum = 999999; + var series = new PointChartSeries + { + Size = maximum + }; + Assert.AreEqual(maximum, series.Size); + + series.Size = maximum + 1; + + Assert.AreEqual(maximum, series.Size); + } + + [Test] + public void TestMinimumValueClipping() + { + const int minimum = 0; + var series = new PointChartSeries + { + Size = minimum + }; + Assert.AreEqual(minimum, series.Size); + + series.Size = minimum - 1; + + Assert.AreEqual(minimum, series.Size); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/PolygonChartSeriesTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/PolygonChartSeriesTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/PolygonChartSeriesTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,39 @@ +using DelftTools.Controls.Swf.Charting.Series; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Charting.Series +{ + [TestFixture] + public class PolygonChartSeriesTest + { + [Test] + public void TestMaximumValueClipping() + { + const int maximum = 999999; + var series = new PolygonChartSeries + { + LineWidth = maximum + }; + Assert.AreEqual(maximum, series.LineWidth); + + series.LineWidth = maximum + 1; + + Assert.AreEqual(maximum, series.LineWidth); + } + + [Test] + public void TestMinimumValueClipping() + { + const int minimum = 0; + var series = new PolygonChartSeries + { + LineWidth = minimum + }; + Assert.AreEqual(minimum, series.LineWidth); + + series.LineWidth = minimum - 1; + + Assert.AreEqual(minimum, series.LineWidth); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/TeeChartSeriesDecoratorTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/TeeChartSeriesDecoratorTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/Series/TeeChartSeriesDecoratorTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,19 @@ +using System; +using System.Linq; +using DelftTools.Controls.Swf.Charting.Series; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Charting.Series +{ + [TestFixture] + public class TeeChartSeriesDecoratorTest + { + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Invalid argument for series datasource. Are you passing IEnumerable? IList and IListSource are supported")] + public void ThrowExceptionOnSettingInvalidDataSource() + { + ILineChartSeries lineChartSeries = ChartSeriesFactory.CreateLineSeries(); + lineChartSeries.DataSource = Enumerable.Range(1, 3); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/YearViewDateTimeFormatProviderTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/YearViewDateTimeFormatProviderTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Charting/YearViewDateTimeFormatProviderTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,24 @@ +using System; +using DelftTools.Controls.Swf.Charting; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Charting +{ + [TestFixture] + public class YearViewDateTimeFormatProviderTest + { + private static readonly YearNavigatableLabelFormatProvider Provider = new YearNavigatableLabelFormatProvider(); + + [Test] + public void GetLabel() + { + Assert.AreEqual("1991", Provider.GetLabel(new DateTime(1991, 11, 11), TimeSpan.Zero)); + } + + [Test] + public void GetAxisAnnotation() + { + Assert.AreEqual("1991 till 2010", Provider.GetRangeLabel(new DateTime(1991, 11, 11), new DateTime(2010, 1, 1))); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/CustomInputDialogTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/CustomInputDialogTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/CustomInputDialogTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Windows.Forms; +using DelftTools.Controls.Swf; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf +{ + [TestFixture] + public class CustomInputDialogTest + { + [Test] + public void CreateCustomDialog() + { + var dialog = new CustomInputDialog(); + dialog.AddInput("Name"); + dialog.AddInput("Lastname"); + dialog.AddInput("Age").ValidationMethod = (o, v) => ((double) v) < 0 ? "Must be positive" : ""; + dialog.AddInput("Is employee1"); + dialog.AddInput("Is employee2"); + dialog.AddInput("Is employee3"); + dialog.AddInput("Is employee4"); + dialog.AddInput("Result", DialogResult.Retry); + var valueInput = dialog.AddInput("Value", 10.0); + valueInput.ToolTip = "Value of item"; + valueInput.UnitSymbol = "m"; + + Assert.AreEqual(10.0, dialog["Value"]); + Assert.AreEqual(DialogResult.Retry, dialog["Result"]); + } + + [Test] + public void CreateCustomDialogWithDropDownBox() + { + var dialog = new CustomInputDialog(); + dialog.AddInput("Name"); + dialog.AddChoice("Occupation", new List + { + "Construction", "IT", "Management", "Finance" + }); + dialog.AddChoice("Years of experience", new List + { + 0, 1, 2, 3 + }).ToolTip = "Number of years experience, choose 3 if 3 or more year"; + + Assert.AreEqual("", dialog["Name"]); + Assert.AreEqual("Construction", dialog["Occupation"]); + Assert.AreEqual(0, dialog["Years of experience"]); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/DataEditorGenerator/SelfCollapsingGroupboxTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/DataEditorGenerator/SelfCollapsingGroupboxTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/DataEditorGenerator/SelfCollapsingGroupboxTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,86 @@ +using System.Windows.Forms; +using DelftTools.Controls.Swf.DataEditorGenerator; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.DataEditorGenerator +{ + [TestFixture] + public class SelfCollapsingGroupboxTest + { + [Test] + public void OneChildTest() + { + var box = new SelfCollapsingGroupbox(); + + var panel = new FlowLayoutPanel(); + box.Controls.Add(panel); + box.SetChildContainer(panel); + + var child1 = new SelfCollapsingPanel(); + panel.Controls.Add(child1); + box.SubscribeChild(child1); + + Assert.IsTrue(box.Visible); + + child1.Visible = false; + Assert.IsFalse(box.Visible); + } + + [Test] + public void TwoChildrenTest() + { + var box = new SelfCollapsingGroupbox(); + + var panel = new FlowLayoutPanel(); + box.Controls.Add(panel); + box.SetChildContainer(panel); + + var child1 = new SelfCollapsingPanel(); + panel.Controls.Add(child1); + box.SubscribeChild(child1); + + var child2 = new SelfCollapsingPanel(); + panel.Controls.Add(child2); + box.SubscribeChild(child2); + + Assert.IsTrue(box.Visible); + + child1.Visible = false; + Assert.IsTrue(box.Visible); + + child2.Visible = false; + Assert.IsFalse(box.Visible); + } + + [Test] + public void AlreadyInvisibleTest() + { + var box = new SelfCollapsingGroupbox(); + + var panel = new FlowLayoutPanel(); + box.Controls.Add(panel); + box.SetChildContainer(panel); + + var child1 = new SelfCollapsingPanel + { + Visible = false + }; + + panel.Controls.Add(child1); + box.SubscribeChild(child1); + + var child2 = new SelfCollapsingPanel + { + Visible = false + }; + + panel.Controls.Add(child2); + box.SubscribeChild(child2); + + Assert.IsFalse(box.Visible); + + child1.Visible = true; + Assert.IsTrue(box.Visible); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/FileSystemTreeViewTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/FileSystemTreeViewTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/FileSystemTreeViewTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,24 @@ +using System.IO; +using DelftTools.Controls.Swf; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf +{ + [TestFixture] + public class FileSystemTreeViewTest + { + [Test] + public void ExpandTo() + { + var treeView = new FileSystemTreeView(); + Assert.IsTrue(treeView.ExpandTo(Path.GetTempPath())); + } + + [Test] + public void ExpandToWithEmptyString() + { + var treeView = new FileSystemTreeView(); + Assert.IsFalse(treeView.ExpandTo("")); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/FindAndReplaceControlTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/FindAndReplaceControlTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/FindAndReplaceControlTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,61 @@ +using DelftTools.Controls.Swf; +using DelftTools.Utils.Reflection; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf +{ + [TestFixture] + public class FindAndReplaceControlTest + { + [TestCase(true)] // search for third "Test" occurrence (index 23) + [TestCase(false)] // search for second "Test" occurrence (index 11) + public void FindNextText(bool check2) + { + var text = "Test text\n Test text2\n Test text2"; + var findAndReplaceControl = new FindAndReplaceControl + { + GetTextToSearch = () => text, + GetCurrentPosition = () => (!check2) ? 4 : 11, + SelectText = (start, length) => + { + Assert.AreEqual(check2 ? 23 : 11, start); + Assert.AreEqual(4, length); + }, + HighLightText = t => Assert.AreEqual("Test", t) + }; + + findAndReplaceControl.FindTextBox.Text = "Test"; + + TypeUtils.CallPrivateMethod(findAndReplaceControl, "FindNext"); + } + + [Test] + public void ReplaceText() + { + var text = "Test text\n Test text2\n Test text2"; + var findAndReplaceControl = new FindAndReplaceControl + { + GetTextToSearch = () => text, + GetCurrentPosition = () => 11, + ReplaceText = (start, length, newText) => + { + Assert.AreEqual(11, start); + Assert.AreEqual(4, length); + Assert.AreEqual("New test", newText); + }, + SelectText = (start, length) => + { + Assert.AreEqual(23, start); + Assert.AreEqual(4, length); + }, + HighLightText = t => Assert.AreEqual("Test", t) + }; + + findAndReplaceControl.FindTextBox.Text = "Test"; + findAndReplaceControl.ReplaceTextBox.Text = "New test"; + + // replace second "Test" occurrence (index 11) with "New test" + TypeUtils.CallPrivateMethod(findAndReplaceControl, "Replace"); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/MessageBoxTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/MessageBoxTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/MessageBoxTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,30 @@ +using System.Windows.Forms; +using DelftTools.Controls.Swf; +using NUnit.Framework; +using Rhino.Mocks; +using MessageBox = DelftTools.Controls.Swf.MessageBox; + +namespace DelftTools.Tests.Controls.Swf +{ + [TestFixture] + public class MessageBoxTest + { + [Test] + public void UseCustomMessageBoxIfDefined() + { + var mockRepository = new MockRepository(); + var customMessageBox = mockRepository.StrictMock(); + customMessageBox.Expect(m => m.Show("text", "caption", MessageBoxButtons.OK)).Return(DialogResult.OK); + MessageBox.CustomMessageBox = customMessageBox; + + mockRepository.ReplayAll(); + + MessageBox.Show("text", "caption", MessageBoxButtons.OK); + + mockRepository.VerifyAll(); + + //don't forget to reset! + MessageBox.CustomMessageBox = null; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewCopyPasteTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewCopyPasteTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewCopyPasteTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,290 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using DelftTools.Controls.Swf.Table; +using DelftTools.Tests.Controls.Swf.Table.TestClasses; +using DelftTools.TestUtils; +using DelftTools.Utils; +using DevExpress.XtraGrid; +using NUnit.Framework; +using Category = NUnit.Framework.CategoryAttribute; + +namespace DelftTools.Tests.Controls.Swf.Table +{ + [TestFixture] + public class TableViewCopyPasteTest + { + [Test] + public void CopyPasteDateTimeTools8628() + { + using (var tableView = new TableView()) + { + using (var dataset = new DataSet()) + { + using (var dataTable = dataset.Tables.Add()) + { + dataTable.Columns.Add("A", typeof(DateTime)); + dataTable.Columns.Add("B", typeof(double)); + dataTable.Rows.Add(new DateTime(2000, 1, 31), 10.0); + dataTable.Rows.Add(new DateTime(2000, 2, 1), 15.0); + + tableView.Data = dataTable; + + tableView.SelectRows(new[] + { + 0, + 1 + }); //select all + tableView.CopySelectionToClipboard(); + dataTable.Clear(); + + tableView.SelectRow(0); + tableView.PasteClipboardContents(); + + Assert.AreEqual(2, dataTable.Rows.Count); + Assert.AreEqual(new DateTime(2000, 1, 31), dataTable.Rows[0][0]); + Assert.AreEqual(10.0, dataTable.Rows[0][1]); + } + } + } + } + + [Test] + public void PasteLargeAmountOfDataShouldBeFast() + { + using (var dataset = new DataSet()) + { + using (var dataTable = dataset.Tables.Add()) + { + dataTable.Columns.Add("A", typeof(DateTime)); + dataTable.Columns.Add("B", typeof(double)); + + var view = new TableView + { + Data = dataTable + }; + + var file = TestHelper.GetTestFilePath("TestPasteData.txt"); + var contents = File.ReadAllText(file); + Clipboard.SetText(contents); + + TestHelper.AssertIsFasterThan(17500, view.PasteClipboardContents); + + Assert.Greater(dataTable.Rows.Count, 5); + } + } + } + + [Test] + public void PasteDutchDateTimeShouldWorkFineTools8878() + { + using (var dataset = new DataSet()) + { + using (var dataTable = dataset.Tables.Add()) + { + dataTable.Columns.Add("A", typeof(DateTime)); + dataTable.Columns.Add("B", typeof(double)); + + var view = new TableView + { + Data = dataTable + }; + + Clipboard.SetText(File.ReadAllText(TestHelper.GetTestFilePath("TestPasteData_DutchDates.txt"))); + + using (CultureUtils.SwitchToCulture("nl-NL")) + { + view.PasteClipboardContents(); + } + + var dateTimes = dataTable.AsEnumerable().Select(r => r.Field("A")).ToList(); + + Assert.AreEqual(60, dateTimes.Count); + Assert.AreEqual(new DateTime(2001, 1, 1), dateTimes.Min()); + Assert.AreEqual(new DateTime(2001, 3, 1), dateTimes.Max()); + } + } + } + + [Test] + public void PasteClipboardContentsCanAddRows() + { + var person = new List + { + new Person + { + Age = 12, Name = "Hoi" + }, + new Person + { + Age = 11, Name = "keers" + } + }; + //set two persons in clipboard + const string clipBoardContents = "cees anton\t34\r\nsaifon\t66\r\nmartijn\t31\r\n"; + Clipboard.SetText(clipBoardContents); + //setup a tableview + var tableView = new TableView + { + Data = person + }; + + tableView.PasteClipboardContents(); + + Assert.AreEqual("martijn", person[2].Name); + Assert.AreEqual(31, person[2].Age); + } + + [Test] + public void PasteIntoEmptyTableView() + { + var persons = new List(); + //set two persons in clipboard + const string clipBoardContents = "cees anton\t34\r\nsaifon\t66\r\nmartijn\t31\r\n"; + Clipboard.SetText(clipBoardContents); + //setup a tableview + var tableView = new TableView + { + Data = persons + }; + + //action! + tableView.PasteClipboardContents(); + + Assert.AreEqual("martijn", persons[2].Name); + Assert.AreEqual(31, persons[2].Age); + Assert.AreEqual(3, persons.Count); + } + + [Test] + public void PasteColumnIntoEmptyTableView() + { + var persons = new List(); + //set two persons in clipboard + const string clipBoardContents = "1\r\n2\r\n3\r\n"; + Clipboard.SetText(clipBoardContents); + //setup a tableview + var tableView = new TableView + { + Data = persons + }; + + //action! + tableView.PasteClipboardContents(); + + Assert.AreEqual(new[] + { + "1", + "2", + "3" + }, persons.Select(p => p.Name).ToArray()); + //assert the data is not pasted into the other column + Assert.AreEqual(new[] + { + 0, + 0, + 0 + }, persons.Select(p => p.Age).ToArray()); + } + + [Test] + public void PasteClipboardContentsOverwritesExistingRows() + { + var person = new List + { + new Person + { + Age = 12, Name = "Hoi" + }, + new Person + { + Age = 11, Name = "keers" + } + }; + //set two persons in clipboard + const string clipBoardContents = "cees anton\t34\r\nsaifon\t66\r\n"; + Clipboard.SetText(clipBoardContents); + //setup a tableview + var tableView = new TableView + { + Data = person + }; + + tableView.PasteClipboardContents(); + + Assert.AreEqual("cees anton", person[0].Name); + Assert.AreEqual(34, person[0].Age); + Assert.AreEqual("saifon", person[1].Name); + Assert.AreEqual(66, person[1].Age); + } + + [Test] + public void CopySelectionIntoClipBoard() + { + var table = new DataTable(); + table.Columns.Add("column1", typeof(string)); + table.Columns.Add("column2", typeof(string)); + table.Rows.Add("1", "2"); + table.Rows.Add("3", "4"); + + var tableView = new TableView + { + Data = table + }; + + //select two rows + tableView.SelectCells(0, 0, 1, 1); + + //action! copy selection to clipboard + //tableView.CopySelection + tableView.CopySelectionToClipboard(); + + Assert.AreEqual("1\t2\r\n3\t4\r\n", Clipboard.GetText()); + } + + [Test] + public void PasteIntoNewRow() + { + //this test relates to issue 3069...demonstrating a problem paste lines when rowselect is enabled. + var table = new DataTable(); + table.Columns.Add("column1", typeof(string)); + table.Columns.Add("column2", typeof(string)); + table.Rows.Add("1", "2"); + table.Rows.Add("3", "4"); + + var tableView = new TableView + { + Data = table, RowSelect = true + }; + + const string clipBoardContents = "5\t6\r\n"; + Clipboard.SetText(clipBoardContents); + + //first select the 1st row + tableView.SelectRow(0); + + //add a new row + table.Rows.Add(); + + //focus on the left cell of the new row + tableView.SetFocus(GridControl.NewItemRowHandle, 0); + + tableView.PasteClipboardContents(); + + //check a new row was added to the table + Assert.AreEqual(3, table.Rows.Count); + + //check that the first row equals the clip board contents + var rowView = tableView.CurrentFocusedRowObject as DataRowView; + var rowData = (rowView == null) ? null : rowView.Row.ItemArray; + Assert.AreEqual(rowData, new object[] + { + "5", + "6" + }); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewCsvImportWizardDialogTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewCsvImportWizardDialogTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewCsvImportWizardDialogTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using DelftTools.Controls.Swf.Table; +using DelftTools.Utils.Csv.Importer; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Table +{ + [TestFixture] + public class TableViewCsvImportWizardDialogTest + { + [Test] + public void ImportDataFromClipboard() + { + var tableView = new TableView(); + var dataTable = new DataTable(); + dataTable.Columns.Add("Foo", typeof(int)); + dataTable.Columns.Add("Bar", typeof(int)); + tableView.Data = dataTable; + + var dialog = new TableViewCsvImportWizardDialog(tableView, "0\t0\n" + + "1\t2\n"); + + Assert.AreEqual(0, tableView.RowCount); + + dialog.DoImport(new CsvMappingData + { + Settings = new CsvSettings + { + Delimiter = '\t', FirstRowIsHeader = false, SkipEmptyLines = true + }, + Filters = new CsvFilter[0], + FieldToColumnMapping = new Dictionary + { + { + new CsvRequiredField("Foo", typeof(int)), + new CsvColumnInfo(0, CultureInfo.CurrentCulture.NumberFormat) + }, + { + new CsvRequiredField("Bar", typeof(int)), + new CsvColumnInfo(1, CultureInfo.CurrentCulture.NumberFormat) + } + }, + }); + + Assert.AreEqual(2, tableView.RowCount); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewPasteControllerTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewPasteControllerTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewPasteControllerTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,511 @@ +using System; +using System.ComponentModel; +using System.Data; +using System.Linq; +using System.Windows.Forms; +using DelftTools.Controls; +using DelftTools.Controls.Swf.Editors; +using DelftTools.Controls.Swf.Table; +using DelftTools.Tests.Controls.Swf.Table.TestClasses; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.Table +{ + [TestFixture] + public class TableViewPasteControllerTest + { + [Test] + public void PasteFailsOnSortedColumn() + { + TableView tableView = GetTableViewWithTwoStringColumnsAndOneRow(); + + //hook up a copy paste controller + var tableViewCopyPasteController = new TableViewPasteController(tableView); + + //sort on the second column + tableView.Columns[1].SortOrder = SortOrder.Ascending; + + //setup eventhandler for failed paste checking error message + int callCount = 0; + tableViewCopyPasteController.PasteFailed += (s, e) => + { + Assert.AreEqual("Cannot paste into sorted column", + e.Value); + callCount++; + }; + //action! paste in the first column..second column is hit so should fail + tableView.SelectCells(0, 0, 0, 0); + tableViewCopyPasteController.PasteLines(new[] + { + "kaas\tmelk" + }); + + //we should have failed + Assert.AreEqual(1, callCount); + } + + [Test] + public void PasteFailsInFilterGrid() + { + TableView tableView = GetTableViewWithTwoStringColumnsAndOneRow(); + + //hook up a copy paste controller + var tableViewCopyPasteController = new TableViewPasteController(tableView); + + //filter first column + tableView.Columns[0].FilterString = "[Name] Like 'Jaap%'"; + + //setup eventhandler for failed paste checking error message + int callCount = 0; + tableViewCopyPasteController.PasteFailed += (s, e) => + { + Assert.AreEqual("Cannot paste into filtered tableview.", + e.Value); + callCount++; + }; + + //action! paste in the first column.. + tableView.SelectCells(0, 0, 0, 0); + tableViewCopyPasteController.PasteLines(new[] + { + "kaas" + }); + + //we should have failed + Assert.AreEqual(1, callCount); + } + + [Test] + public void PasteDoesNotAddNewRowsToSortedTableView() + { + TableView tableView = GetTableViewWithTwoStringColumnsAndOneRow(); + + //hook up a copy paste controller + var tableViewCopyPasteController = new TableViewPasteController(tableView); + + //select the first cell of the second column + tableView.SelectCells(0, 1, 0, 1); + //sort fist column + tableView.Columns[0].SortOrder = SortOrder.Ascending; + + //action paste a possible 3 lines + tableViewCopyPasteController.PasteLines(new[] + { + "kaas\tmelk", + "noot\tmies", + "appel\tflap" + }); + + //assert rowcount is still one..no new rows are added on a sorted grid + Assert.AreEqual(1, tableView.RowCount); + //make sure we did something + Assert.AreEqual("kaas", tableView.GetCellValue(0, 1)); + } + + [Test] + public void PasteDataWithEmptyLinesIsMaintained() + { + var list = new BindingList() + { + new Person + { + Name = "jan", Age = 25 + }, + new Person + { + Name = "fon", Age = 33 + }, + new Person + { + Name = "peer", Age = 25 + }, + new Person + { + Name = "fo", Age = 33 + } + }; + + var tableView = new TableView + { + Data = list + }; + + //select all cells in first column + tableView.SelectCells(0, 0, 3, 0); + + //hook up a copy paste controller + var tableViewCopyPasteController = new TableViewPasteController(tableView); + //this should set the first column to kees,anton,kees,anton + Clipboard.SetText("kees\r\nanton\r\n\r\npeer"); + + tableViewCopyPasteController.PasteClipboardContents(); + //asert the names are now like this + Assert.AreEqual(new[] + { + "kees", + "anton", + "", + "peer" + }, list.Select(p => p.Name).ToArray()); + } + + [Test] + public void PasteFillsSelection() + { + var list = new BindingList() + { + new Person + { + Name = "jan", Age = 25 + }, + new Person + { + Name = "fon", Age = 33 + }, + new Person + { + Name = "peer", Age = 25 + }, + new Person + { + Name = "fo", Age = 33 + } + }; + + var tableView = new TableView + { + Data = list + }; + + //select all cells in first column + tableView.SelectCells(0, 0, 3, 0); + + //hook up a copy paste controller + var tableViewCopyPasteController = new TableViewPasteController(tableView); + //this should set the first column to kees,anton,kees,anton + tableViewCopyPasteController.PasteLines(new[] + { + "kees", + "anton" + }); + + //asert the names are now like this + Assert.AreEqual(new[] + { + "kees", + "anton", + "kees", + "anton" + }, list.Select(p => p.Name).ToArray()); + } + + [Test] + public void PasteFailsIntoNonSquareSelection() + { + var list = new BindingList() + { + new Person + { + Name = "jan", Age = 25 + }, + new Person + { + Name = "fon", Age = 33 + }, + new Person + { + Name = "peer", Age = 25 + }, + new Person + { + Name = "fo", Age = 33 + } + }; + + var tableView = new TableView + { + Data = list + }; + //make a diagonal selection + tableView.SelectedCells.Add(new TableViewCell(0, tableView.Columns.FirstOrDefault(c => c.DisplayIndex == 0))); + tableView.SelectedCells.Add(new TableViewCell(1, tableView.Columns.FirstOrDefault(c => c.DisplayIndex == 1))); + + var tableViewCopyPasteController = new TableViewPasteController(tableView); + int callCount = 0; + tableViewCopyPasteController.PasteFailed += (s, e) => + { + callCount++; + Assert.AreEqual( + "Cannot paste into non rectangular selection", + e.Value); + }; + //this should a paste failed event + tableViewCopyPasteController.PasteLines(new[] + { + "kees", + "anton" + }); + + Assert.AreEqual(1, callCount); + } + + [Test] + public void CopyPasteEnumInBindingList() + { + var list = new BindingList + { + new ClassWithEnum + { + Type = FruitType.Banaan + }, + new ClassWithEnum + { + Type = FruitType.Peer + } + }; + var tableView = new TableView + { + Data = list + }; + + var editor = new ComboBoxTypeEditor + { + Items = Enum.GetValues(typeof(FruitType)) + }; + tableView.Columns[0].Editor = editor; + + var tableViewCopyPasteController = new TableViewPasteController(tableView); + //select 2nd row + tableView.SelectCells(1, 0, 1, 0); + + //paste twee bananen en een peer ;) + tableViewCopyPasteController.PasteLines(new[] + { + "Banaan", + "Banaan", + "Peer" + }); + + //we should have 3 bananas and a pear + Assert.AreEqual("Banaan", "Banaan", "Banaan", "Peer", list.Select(c => c.Type).ToArray()); + //WindowsFormsTestHelper.ShowModal(tableView); + } + + [Test] + public void PasteTakesInvisibleColumnsIntoAccount() + { + //if a possible paste is too big it is important to not exceed the visiblecolcount - 1 + var list = new BindingList() + { + new Person + { + Name = "jan", Age = 25 + }, + new Person + { + Name = "fon", Age = 33 + }, + new Person + { + Name = "peer", Age = 25 + }, + new Person + { + Name = "fo", Age = 33 + } + }; + + var tableView = new TableView + { + Data = list + }; + //hide the age column + tableView.Columns[1].Visible = false; + //select top left + tableView.SelectCells(0, 0, 0, 0); + var tableViewCopyPasteController = new TableViewPasteController(tableView); + + //paste some non sense + tableViewCopyPasteController.PasteLines(new[] + { + "kees\tkan\twel" + }); + + //first person should be kees now + Assert.AreEqual("kees", list[0].Name); + } + + [Test] + public void PasteIntoGridBoundToDataTable() + { + var tableWithTwoStrings = new DataTable(); + tableWithTwoStrings.Columns.Add("A", typeof(string)); + tableWithTwoStrings.Columns.Add("B", typeof(string)); + tableWithTwoStrings.Rows.Add("a", "b"); + + var tableView = new TableView + { + Data = tableWithTwoStrings + }; + + Clipboard.SetText(string.Format("{0}\t{1}" + Environment.NewLine + "{0}\t{1}", "oe", "oe1")); + + tableView.PasteClipboardContents(); + + //WindowsFormsTestHelper.ShowModal(tableView); + + //should overwrite existing row and add another one + Assert.AreEqual(2, tableWithTwoStrings.Rows.Count); + Assert.AreEqual("oe", tableWithTwoStrings.Rows[0][0]); + Assert.AreEqual("oe1", tableWithTwoStrings.Rows[0][1]); + Assert.AreEqual("oe", tableWithTwoStrings.Rows[1][0]); + Assert.AreEqual("oe1", tableWithTwoStrings.Rows[1][1]); + } + + [Test] + public void PastingIntoReadOnlyCellsDoesNotChangeTheValues() + { + var tableWithTwoStrings = new DataTable(); + tableWithTwoStrings.Columns.Add("A", typeof(string)); + tableWithTwoStrings.Columns.Add("B", typeof(string)); + tableWithTwoStrings.Rows.Add("a", "b"); + + var tableView = new TableView + { + Data = tableWithTwoStrings + }; + //values in the first column are read only + tableView.ReadOnlyCellFilter = delegate(TableViewCell cell) { return cell.Column.AbsoluteIndex == 0; }; + + //select top row + tableView.SelectCells(0, 0, 0, 1); + + var tableViewCopyPasteController = new TableViewPasteController(tableView); + + //paste some non sense. + tableViewCopyPasteController.PasteLines(new[] + { + "c\td" + }); + + //only column b should have changed + Assert.AreEqual("a", tableWithTwoStrings.Rows[0][0]); + Assert.AreEqual("d", tableWithTwoStrings.Rows[0][1]); + } + + [Test] + public void PasteIntoARowSelection() + { + var tableWithTwoStrings = new DataTable(); + tableWithTwoStrings.Columns.Add("A", typeof(string)); + tableWithTwoStrings.Columns.Add("B", typeof(string)); + tableWithTwoStrings.Rows.Add("a", "b"); + + var tableView = new TableView + { + Data = tableWithTwoStrings + }; + var tableViewCopyPasteController = new TableViewPasteController(tableView); + + //select top row + tableView.SelectCells(0, 0, 0, 1); + + //paste some non sense. + tableViewCopyPasteController.PasteLines(new[] + { + "c" + }); + + //first line should now be [c c] + Assert.AreEqual("c", tableWithTwoStrings.Rows[0][0]); + Assert.AreEqual("c", tableWithTwoStrings.Rows[0][1]); + } + + [Test] + public void UseValidatorToIgnorePaste() + { + var tableView = new TableView(); + var tableWithTwoStrings = new DataTable(); + tableWithTwoStrings.Columns.Add("Name", typeof(string)); + tableWithTwoStrings.Columns.Add("B", typeof(string)); + tableWithTwoStrings.Rows.Add("a", "b"); + tableView.Data = tableWithTwoStrings; + + tableView.InputValidator += TableViewEditorValidator; + + var tableViewCopyPasteController = new TableViewPasteController(tableView); + Assert.AreEqual("b", tableWithTwoStrings.Rows[0][1]); + + //select top right cell + tableView.SelectCells(0, 1, 0, 1); + + // paste "c" and check result + tableViewCopyPasteController.PasteLines(new[] + { + "c" + }); + Assert.AreEqual("c", tableWithTwoStrings.Rows[0][1]); + + // check paste of d fails + tableViewCopyPasteController.PasteLines(new[] + { + "d" + }); + Assert.AreEqual("c", tableWithTwoStrings.Rows[0][1]); + } + + [Test] + public void UseValidatorToIgnoreRow() + { + var tableView = new TableView(); + var dataTable = new DataTable(); + dataTable.Columns.Add("Alpha", typeof(string)); + dataTable.Columns.Add("Numeric", typeof(int)); + dataTable.Rows.Add("a", 1); + tableView.Data = dataTable; + + tableView.PasteController.PasteBehaviour = TableViewPasteBehaviourOptions.SkipRowWhenValueIsInvalid; + tableView.InputValidator = (c, v) => + { + if (c.Column.AbsoluteIndex == 0 && (v.ToString() == "b")) + { + return new Utils.Tuple("b not allowed", false); + } + + return new Utils.Tuple("", true); + }; + + var tableViewCopyPasteController = new TableViewPasteController(tableView); + Assert.AreEqual(1, dataTable.Rows[0][1]); + + //select top left cell + tableView.SelectCells(1, 0, 0, 0); + + // paste "c" and check result + tableViewCopyPasteController.PasteLines(new[] + { + "b\t2", + "c\t3" + }); + Assert.AreEqual(2, dataTable.Rows.Count); + Assert.AreEqual("c", dataTable.Rows[1][0]); + } + + private static TableView GetTableViewWithTwoStringColumnsAndOneRow() + { + var tableView = new TableView(); + var tableWithTwoStrings = new DataTable(); + tableWithTwoStrings.Columns.Add("Name", typeof(string)); + tableWithTwoStrings.Columns.Add("B", typeof(string)); + tableWithTwoStrings.Rows.Add("a", "b"); + tableView.Data = tableWithTwoStrings; + return tableView; + } + + private static Utils.Tuple TableViewEditorValidator(TableViewCell tableViewCell, object value) + { + // do not accept "d" + return ((string) value).Contains("d") ? new Utils.Tuple("", false) : new Utils.Tuple("", true); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TableViewTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,2044 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Windows.Forms; +using DelftTools.Controls; +using DelftTools.Controls.Swf.Editors; +using DelftTools.Controls.Swf.Table; +using DelftTools.Tests.Controls.Swf.Table.TestClasses; +using DelftTools.TestUtils; +using DelftTools.Utils.Collections.Generic; +using DelftTools.Utils.Globalization; +using DelftTools.Utils.Reflection; +using DevExpress.XtraEditors.Repository; +using DevExpress.XtraGrid.Columns; +using DevExpress.XtraGrid.Views.Grid; +using DevExpress.XtraGrid.Views.Grid.ViewInfo; +using NUnit.Framework; +using Rhino.Mocks; +using SharpTestsEx; +using Category = NUnit.Framework.CategoryAttribute; + +namespace DelftTools.Tests.Controls.Swf.Table +{ + [TestFixture] + public class TableViewTest + { + [Test] + public void PinColumns() + { + using (var dataset = new DataSet()) + { + using (var dataTable = dataset.Tables.Add()) + { + dataTable.Columns.Add("A", typeof(double)); + dataTable.Columns.Add("B", typeof(double)); + dataTable.Columns.Add("C", typeof(double)); + dataTable.Columns.Add("D", typeof(double)); + dataTable.Columns.Add("E", typeof(double)); + + dataTable.Rows.Add(1, 2, 3, 4, 5); + dataTable.Rows.Add(6, 7, 8, 9, 10); + dataTable.Rows.Add(11, 12, 13, 14, 15); + dataTable.Rows.Add(16, 17, 18, 19, 20); + dataTable.Rows.Add(21, 22, 23, 24, 25); + + var tableView = new TableView + { + Data = dataTable + }; + + var column0 = tableView.Columns[0]; + var column1 = tableView.Columns[1]; + var column3 = tableView.Columns[3]; + var column4 = tableView.Columns[4]; + + column3.ReadOnly = true; + + var index3 = column3.DisplayIndex; + var index4 = column4.DisplayIndex; + + column3.Pinned = true; + column4.Pinned = true; + + column3.Pinned = false; + + // expect original index + pinned column 4 + Assert.AreEqual(index3 + 1, column3.DisplayIndex); + + column4.Pinned = false; + + // expect original indices (no pinned columns) + Assert.AreEqual(index3, column3.DisplayIndex); + Assert.AreEqual(index4, column4.DisplayIndex); + + column0.Pinned = true; + column1.Pinned = true; + Assert.AreEqual(0, column0.DisplayIndex, "display index of first pinned column"); + Assert.AreEqual(1, column1.DisplayIndex, "display index of second pinned column"); + + column0.Pinned = false; + Assert.AreEqual(1, column0.DisplayIndex, "display index of first unpinned column"); + Assert.AreEqual(0, column1.DisplayIndex, "display index of pinned column"); + } + } + } + + [Test] + public void FilterIntegerValues() + { + var tableView = new TableView + { + Data = new[] + { + 1, + 2, + 3, + 4, + 5 + }, + ReadOnly = true + }; + + int callCount = 0; + + tableView.ColumnFilterChanged += (s, e) => { callCount++; }; + + tableView.Columns[0].FilterString = "Column > 2"; + + Assert.AreEqual(1, callCount); + Assert.AreEqual(3, tableView.RowCount); + } + + [Test] + public void EmptyTableViewHasNoFocusedCell() + { + var tableView = new TableView(); + var cell = TypeUtils.CallPrivateMethod(tableView, "GetFocusedCell"); + Assert.AreEqual(null, cell); + } + + [Test] + public void TableViewWithNoDataHasNoFocusedCell() + { + var tableView = new TableView + { + Data = new List() + }; + var cell = TypeUtils.CallPrivateMethod(tableView, "GetFocusedCell"); + Assert.AreEqual(null, cell); + } + + [Test] + public void DefaultFocusedCellIsTopLeft() + { + //tableview with a single row + var tableView = new TableView + { + Data = new List + { + new Person + { + Age = 10, Name = "Piet" + } + } + }; + + var cell = TypeUtils.CallPrivateMethod(tableView, "GetFocusedCell"); + + Assert.AreEqual(0, cell.Column.DisplayIndex); + Assert.AreEqual(0, cell.RowIndex); + } + + [Test] + public void TableViewShouldUseDefaultValuesWhenDeleting() + { + using (var dataset = new DataSet()) + { + using (var dataTable = dataset.Tables.Add()) + { + dataTable.Columns.Add("A", typeof(double)); + dataTable.Columns.Add("B", typeof(double)); + dataTable.Columns.Add("C", typeof(double)); + + dataTable.Rows.Add(1, 2, 3); + dataTable.Rows.Add(4, 5, 6); + dataTable.Rows.Add(7, 8, 9); + dataTable.Rows.Add(10, 11, 12); + + var tableView = new TableView + { + Data = dataTable + }; + + tableView.Columns[1].ReadOnly = false; + tableView.Columns[1].DefaultValue = 99.9; + tableView.Columns[2].ReadOnly = false; + tableView.Columns[2].DefaultValue = double.NaN; + + tableView.AllowColumnSorting = false; + tableView.AllowColumnFiltering = false; + + tableView.SelectCells(1, 1, 1, 2); + tableView.DeleteCurrentSelection(); + + var secondIndexValue = (double) tableView.GetCellValue(1, 1); + Assert.AreEqual(99.9, secondIndexValue, "the deleted double column value becomes the given default value."); + var thirdIndexValue = (double) tableView.GetCellValue(1, 2); + Assert.AreEqual(double.NaN, thirdIndexValue, "the deleted double column value becomes the given default value."); + } + } + } + + [Test] //devexpress code modified to prevent pascal casing to be split into words + public void TableViewShouldUpdateColums() + { + var table = new DataTable("tablename"); + var view = new TableView + { + Data = table + }; + //view.Show(); + var column = new DataColumn("testName", typeof(double)) + { + Caption = "testCaption" + }; + table.Columns.Add(column); + Assert.AreEqual(1, view.Columns.Count); + Assert.AreEqual("testName", view.Columns[0].Name); + Assert.AreEqual("testCaption", view.Columns[0].Caption); + + column.Caption = "newTestCaption"; + view.ResetBindings(); + + Assert.AreEqual("newTestCaption", view.Columns[0].Caption); + } + + [Test] + public void FilterDateTimeColumn() + { + var oldCulture = Thread.CurrentThread.CurrentCulture; + Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + + var tableView = new TableView(); + var table = new DataTable(); + + table.Columns.Add("A", typeof(DateTime)); + table.Columns.Add("B", typeof(double)); + + var row = table.NewRow(); + + var dateTime = DateTime.Now; + var dateTimeMinus1Day = dateTime - new TimeSpan(1, 0, 0, 0); + var dateTimePlus1Day = dateTime.AddDays(1); + + row["A"] = dateTime; + row["B"] = 0; + + table.Rows.Add(row); + tableView.Data = table; + + tableView.SetColumnFilter("A", string.Format("[A] >= #{0}# And [A] < #{1}#", dateTimeMinus1Day, dateTimePlus1Day)); + + Assert.AreEqual(1, tableView.RowCount); + + Thread.CurrentThread.CurrentCulture = oldCulture; + } + + [Test] + public void SetTextToTableViewWithDateTimeColumnUsCulture() + { + var oldCulture = Thread.CurrentThread.CurrentCulture; + var specificCulture = CultureInfo.CreateSpecificCulture("en-US"); + specificCulture.NumberFormat.NumberGroupSeparator = ","; + specificCulture.NumberFormat.NumberDecimalSeparator = "."; + + Thread.CurrentThread.CurrentCulture = specificCulture; + + var tableView = new TableView(); + + var table = new DataTable(); + + table.Columns.Add("A", typeof(DateTime)); + table.Columns.Add("B", typeof(double)); + var row = table.NewRow(); + row["A"] = DateTime.Now; + row["B"] = 0; + table.Rows.Add(row); + tableView.Data = table; + + tableView.SetCellValue(0, 0, "2010/11/18 01:02:03"); + var dateTime = DateTime.Parse(tableView.GetCellValue(0, 0).ToString()); + Assert.AreEqual(new DateTime(2010, 11, 18, 01, 02, 03), dateTime); + + tableView.SetCellValue(0, 1, "1,234.5"); + var value = double.Parse(tableView.GetCellValue(0, 1).ToString()); + + Assert.AreEqual(1234.5, value, "Expects uncustomized en-US number formatting; " + + "If this fails, please check if local number format for en-US culture was modified."); + + Thread.CurrentThread.CurrentCulture = oldCulture; + } + + [Test] + public void SetTextToTableViewWithDateTimeColumnNlCulture() + { + var oldCulture = Thread.CurrentThread.CurrentCulture; + var specificCulture = CultureInfo.CreateSpecificCulture("nl-NL"); + specificCulture.NumberFormat.NumberGroupSeparator = "."; + specificCulture.NumberFormat.NumberDecimalSeparator = ","; + + Thread.CurrentThread.CurrentCulture = specificCulture; + + var tableView = new TableView(); + + var table = new DataTable(); + + table.Columns.Add("A", typeof(DateTime)); + table.Columns.Add("B", typeof(double)); + var row = table.NewRow(); + row["A"] = DateTime.Now; + row["B"] = 0; + table.Rows.Add(row); + tableView.Data = table; + + tableView.SetCellValue(0, 0, "2010/11/18 01:02:03"); + var dateTime = DateTime.Parse(tableView.GetCellValue(0, 0).ToString()); + Assert.AreEqual(new DateTime(2010, 11, 18, 01, 02, 03), dateTime); + + tableView.SetCellValue(0, 1, "1.234,5"); + + var value = double.Parse(tableView.GetCellValue(0, 1).ToString()); + + Assert.AreEqual(1234.5, value); + + Thread.CurrentThread.CurrentCulture = oldCulture; + } + + [Test] + public void ExportToCsv() + { + var tableView = new TableView(); + + var table = new DataTable(); + + table.Columns.Add("A", typeof(DateTime)); + table.Columns.Add("B", typeof(int)); + for (int i = 0; i < 50; i++) + { + DataRow row = table.NewRow(); + row["A"] = DateTime.Now; + row["B"] = i; + table.Rows.Add(row); + } + + tableView.Data = table; + + var path = "ExportToCsv.csv"; + tableView.ExportAsCsv(path); + + var exportedLines = File.ReadAllLines(path); + + Assert.AreEqual(51, exportedLines.Length); + Assert.AreEqual("A, B", exportedLines[0]); + } + + [Test] + public void SetDataSource() + { + var table = new DataTable("table1"); + + var tableView = new TableView + { + Data = table + }; + + Assert.AreEqual(table, tableView.Data, "Data assigned to TableView must not change by itself"); + } + + [Test] + [Ignore("Doesn't work on buildserver because next test is started before previous one is finished")] + public void Copy1Paste1Cell() + { + DataTable table = CreateTableForCopyPaste(); + + Assert.AreEqual(0, table.Rows[0].ItemArray[1]); + Assert.AreEqual(1, table.Rows[1].ItemArray[1]); + + var tableView = new TableView + { + Data = table + }; + Action
onShown = delegate + { + tableView.Focus(); + SendKeys.SendWait("{RIGHT}"); // goto row 1 column 2 + SendKeys.SendWait("^c"); // copy cell + SendKeys.SendWait("{DOWN}"); // navigate to cell below + SendKeys.SendWait("^v"); // paste + }; + WindowsFormsTestHelper.ShowModal(tableView, onShown); + Assert.AreEqual(0, table.Rows[0].ItemArray[1]); + Assert.AreEqual(0, table.Rows[1].ItemArray[1]); + } + + [Test] + [Ignore("Doesn't work on buildserver because next test is started before previous one is finished")] + public void Copy1Paste2Cell() + { + DataTable table = CreateTableForCopyPaste(); + + Assert.AreEqual(0, table.Rows[0].ItemArray[1]); + Assert.AreEqual(1, table.Rows[1].ItemArray[1]); + Assert.AreEqual(2, table.Rows[2].ItemArray[1]); + + var tableView = new TableView + { + Data = table + }; + Action onShown = delegate + { + tableView.Focus(); + SendKeys.SendWait("{RIGHT}"); // goto row 1 column 2 + SendKeys.SendWait("^c"); // copy cell + SendKeys.SendWait("{DOWN}"); // navigate to cell below + SendKeys.SendWait("+{DOWN}"); // also select cell below + SendKeys.SendWait("^v"); // paste + }; + WindowsFormsTestHelper.ShowModal(tableView, onShown); + Assert.AreEqual(0, table.Rows[0].ItemArray[1]); + Assert.AreEqual(0, table.Rows[1].ItemArray[1]); + Assert.AreEqual(0, table.Rows[2].ItemArray[1]); + } + + [Test] + [Ignore("Doesn't work on buildserver because next test is started before previous one is finished")] + public void Copy2Paste3Cell() + { + DataTable table = CreateTableForCopyPaste(); + + Assert.AreEqual(0, table.Rows[0].ItemArray[1]); + Assert.AreEqual(1, table.Rows[1].ItemArray[1]); + Assert.AreEqual(2, table.Rows[2].ItemArray[1]); + Assert.AreEqual(3, table.Rows[3].ItemArray[1]); + Assert.AreEqual(4, table.Rows[4].ItemArray[1]); + + var tableView = new TableView + { + Data = table + }; + Action onShown = delegate + { + tableView.Focus(); + SendKeys.SendWait("{RIGHT}"); // goto row 1 column 2 + SendKeys.SendWait("+{DOWN}"); // also select cell below + SendKeys.SendWait("^c"); // copy cells + SendKeys.SendWait("{DOWN}"); // navigate to cell below + SendKeys.SendWait("+{DOWN}+{DOWN}"); // also select 2 cells below + SendKeys.SendWait("^v"); // paste + }; + WindowsFormsTestHelper.ShowModal(tableView, onShown); + Assert.AreEqual(0, table.Rows[0].ItemArray[1]); + Assert.AreEqual(1, table.Rows[1].ItemArray[1]); + Assert.AreEqual(0, table.Rows[2].ItemArray[1]); // paste 0 1 to 2 3 4 expects pattern 0 1 0 + Assert.AreEqual(1, table.Rows[3].ItemArray[1]); + Assert.AreEqual(0, table.Rows[4].ItemArray[1]); + } + + [Test] + [Ignore("Doesn't work on buildserver because next test is started before previous one is finished")] + public void Copy1Paste1CellEnumValue() + { + DataTable table = new DataTable(); + + table.Columns.Add("A", typeof(FruitType)); + + DataRow row = table.NewRow(); + row["A"] = FruitType.Appel; + table.Rows.Add(row); + row = table.NewRow(); + row["A"] = FruitType.Banaan; + table.Rows.Add(row); + + var tableView = new TableView + { + Data = table + }; + Assert.AreEqual("Een Appel", tableView.GetCellDisplayText(0, 0)); + Assert.AreEqual("Een Banaan", tableView.GetCellDisplayText(1, 0)); + + Action onShown = delegate + { + tableView.Focus(); + tableView.SelectRow(1); //Select Banaan + tableView.FocusedRowIndex = 1; + SendKeys.SendWait("^c"); + tableView.SelectRow(0); + tableView.FocusedRowIndex = 0; + SendKeys.SendWait("^v"); + + Assert.AreEqual("Een Banaan", tableView.GetCellDisplayText(0, 0)); + Assert.AreEqual("Een Banaan", tableView.GetCellDisplayText(1, 0)); + }; + WindowsFormsTestHelper.ShowModal(tableView, onShown); + } + + [Test] + public void CopyOriginalValuesToClipBoard() + { + var table = new DataTable(); + table.Columns.Add("A", typeof(double)); + table.Columns.Add("B", typeof(double)); + + var double1 = 1.1111111111; + var double2 = 2.22222222; + var double3 = 3.33333333333333; + var double4 = 4.44444444444; + var double5 = 5.5555555; + var double6 = 6.6666666666; + + DataRow row = table.NewRow(); + row["A"] = double1; + row["B"] = double2; + table.Rows.Add(row); + + row = table.NewRow(); + row["A"] = double3; + row["B"] = double4; + table.Rows.Add(row); + + row = table.NewRow(); + row["A"] = double5; + row["B"] = double6; + table.Rows.Add(row); + + RegionalSettingsManager.RealNumberFormat = "N2"; + + var tableView = new TableView + { + Data = table + }; + + Assert.AreEqual(double1.ToString("N2"), tableView.GetCellDisplayText(0, 0)); + + tableView.SelectCells(1, 0, 2, 1); + + Assert.AreEqual(4, tableView.SelectedCells.Count); + + tableView.CopySelectionToClipboard(); + + var clipBoardText = Clipboard.GetText(); + + Assert.AreEqual(RegionalSettingsManager.ConvertToString(double3, false) + + "\t" + RegionalSettingsManager.ConvertToString(double4, false) + + "\r\n" + RegionalSettingsManager.ConvertToString(double5, false) + + "\t" + RegionalSettingsManager.ConvertToString(double6, false) + "\r\n", + clipBoardText); + } + + [Test] + public void CopyOriginalValuesToClipBoardFromSortedTable() + { + var table = new DataTable(); + table.Columns.Add("A", typeof(double)); + table.Columns.Add("B", typeof(double)); + + var double1 = 1.1111111111; + var double2 = 2.22222222; + var double3 = 3.33333333333333; + var double4 = 4.44444444444; + var double5 = 5.5555555; + var double6 = 6.6666666666; + + DataRow row = table.NewRow(); + row["A"] = double1; + row["B"] = double2; + table.Rows.Add(row); + + row = table.NewRow(); + row["A"] = double3; + row["B"] = double4; + table.Rows.Add(row); + + row = table.NewRow(); + row["A"] = double5; + row["B"] = double6; + table.Rows.Add(row); + + RegionalSettingsManager.RealNumberFormat = "N2"; + + var tableView = new TableView + { + Data = table + }; + + tableView.Columns[1].SortOrder = SortOrder.Descending; + + Assert.AreEqual(double5.ToString("N2"), tableView.GetCellDisplayText(0, 0)); + + tableView.SelectCells(1, 0, 2, 1); + + Assert.AreEqual(4, tableView.SelectedCells.Count); + + tableView.CopySelectionToClipboard(); + + var clipBoardText = Clipboard.GetText(); + + Assert.AreEqual(RegionalSettingsManager.ConvertToString(double3, false) + + "\t" + RegionalSettingsManager.ConvertToString(double4, false) + + "\r\n" + RegionalSettingsManager.ConvertToString(double1, false) + + "\t" + RegionalSettingsManager.ConvertToString(double2, false) + "\r\n", + clipBoardText); + } + + [Test] + public void CopyOriginalValuesAndHeadersToClipBoard() + { + var table = new DataTable(); + table.Columns.Add("A", typeof(double)); + table.Columns.Add("B", typeof(double)); + + var double1 = 1.1111111111; + var double2 = 2.22222222; + var double3 = 3.33333333333333; + var double4 = 4.44444444444; + var double5 = 5.5555555; + var double6 = 6.6666666666; + + DataRow row = table.NewRow(); + row["A"] = double1; + row["B"] = double2; + table.Rows.Add(row); + + row = table.NewRow(); + row["A"] = double3; + row["B"] = double4; + table.Rows.Add(row); + + row = table.NewRow(); + row["A"] = double5; + row["B"] = double6; + table.Rows.Add(row); + + RegionalSettingsManager.RealNumberFormat = "N2"; + + var tableView = new TableView + { + Data = table + }; + tableView.IncludeHeadersOnCopy = true; + + Assert.AreEqual(double1.ToString("N2"), tableView.GetCellDisplayText(0, 0)); + + tableView.SelectCells(0, 0, 2, 1); + + Assert.AreEqual(6, tableView.SelectedCells.Count); + + tableView.CopySelectionToClipboard(); + + var clipBoardText = Clipboard.GetText(); + Assert.AreEqual("A\tB\r\n" + RegionalSettingsManager.ConvertToString(double1, false) + + "\t" + RegionalSettingsManager.ConvertToString(double2, false) + + "\r\n" + RegionalSettingsManager.ConvertToString(double3, false) + + "\t" + RegionalSettingsManager.ConvertToString(double4, false) + + "\r\n" + RegionalSettingsManager.ConvertToString(double5, false) + + "\t" + RegionalSettingsManager.ConvertToString(double6, false) + "\r\n", + clipBoardText); + } + + [Test] + public void ComboBoxTypeEditorNonMandatoryWithCustomFormatter_ShouldNotOverwriteColumnFormatting_Tools7594() + { + // types of the item, to be shown in the combo box + var itemTypes = new[] + { + new ItemType + { + Name = "item type1" + }, + new ItemType + { + Name = "item type2" + }, + new ItemType + { + Name = "item type3" + } + }; + + // default items + var items = new EventedList + { + new Item + { + Name = "item1", Type = itemTypes[0] + }, + new Item + { + Name = "item2", Type = itemTypes[1] + } + }; + + var tableView = new TableView + { + Data = new BindingList(items) + }; + + var comboBoxTypeEditor = new ComboBoxTypeEditor + { + CustomFormatter = new AddBracketTestFormatter(), + Items = itemTypes, + ItemsMandatory = false + }; + + tableView.Columns[1].CustomFormatter = new AddDashTestFormatter(); + tableView.Columns[1].Editor = comboBoxTypeEditor; // inject it under the 2nd column + + WindowsFormsTestHelper.ShowModal(tableView, f => tableView.GetCellDisplayText(0, 1).Should().Be.EqualTo("-item type1-")); + } + + [Test] + public void ComboBoxTypeEditorNonMandatoryWithCustomFormatter_ShouldWork_Tools7594() + { + // types of the item, to be shown in the combo box + var itemTypes = new[] + { + new ItemType + { + Name = "item type1" + }, + new ItemType + { + Name = "item type2" + }, + new ItemType + { + Name = "item type3" + } + }; + + // default items + var items = new EventedList + { + new Item + { + Name = "item1", Type = itemTypes[0] + }, + new Item + { + Name = "item2", Type = itemTypes[1] + } + }; + + var tableView = new TableView + { + Data = new BindingList(items) + }; + + var comboBoxTypeEditor = new ComboBoxTypeEditor + { + CustomFormatter = new AddBracketTestFormatter(), + Items = itemTypes, + ItemsMandatory = false + }; + + tableView.Columns[1].CustomFormatter = new AddDashTestFormatter(); + tableView.Columns[1].Editor = comboBoxTypeEditor; // inject it under the 2nd column + + WindowsFormsTestHelper.ShowModal(tableView, f => + { + var dxColumn = tableView.Columns[1].FieldValue("dxColumn"); + var dxEditor = (RepositoryItemComboBox) dxColumn.ColumnEdit; + TypeUtils.GetPropertyValue(dxEditor.Items[0], "DisplayText").Should().Be.EqualTo("[item type1]"); + }); + } + + [Test] + public void ComboBoxTypeEditorWithCustomFormatter_ShouldNotOverwriteColumnFormatting_Tools7594() + { + // types of the item, to be shown in the combo box + var itemTypes = new[] + { + new ItemType + { + Name = "item type1" + }, + new ItemType + { + Name = "item type2" + }, + new ItemType + { + Name = "item type3" + } + }; + + // default items + var items = new EventedList + { + new Item + { + Name = "item1", Type = itemTypes[0] + }, + new Item + { + Name = "item2", Type = itemTypes[1] + } + }; + + var tableView = new TableView + { + Data = new BindingList(items) + }; + + var comboBoxTypeEditor = new ComboBoxTypeEditor + { + CustomFormatter = new AddBracketTestFormatter(), + Items = itemTypes + }; + + tableView.Columns[1].CustomFormatter = new AddDashTestFormatter(); + tableView.Columns[1].Editor = comboBoxTypeEditor; // inject it under the 2nd column + + // Test (What should be visible in the GUI): + // * Table view should show to entries using 'AddDashTestFormatter' in 2nd column only. + // * Editor of 2nd column should show entries using 'AddBrackerTestFormatter'. + // * Transitioning between editing (dropdown box visible) and non-editing (no dropdown box visible) should work with the correct custom formatter. + WindowsFormsTestHelper.ShowModal(tableView, f => tableView.GetCellDisplayText(0, 1).Should().Be.EqualTo("-item type1-")); + } + + [Test] + [Ignore("Known issue: see TOOLS-7594")] + public void ComboBoxTypeEditorWithCustomFormatter_ShouldWork() + { + // types of the item, to be shown in the combo box + var itemTypes = new[] + { + new ItemType + { + Name = "item type1" + }, + new ItemType + { + Name = "item type2" + }, + new ItemType + { + Name = "item type3" + } + }; + + // default items + var items = new EventedList + { + new Item + { + Name = "item1", Type = itemTypes[0] + }, + new Item + { + Name = "item2", Type = itemTypes[1] + } + }; + + var tableView = new TableView + { + Data = new BindingList(items) + }; + + var comboBoxTypeEditor = new ComboBoxTypeEditor + { + CustomFormatter = new AddBracketTestFormatter(), + Items = itemTypes + }; + + tableView.Columns[1].Editor = comboBoxTypeEditor; // inject it under the 2nd column + + Assert.IsNull(tableView.Columns[1].CustomFormatter); // Injection should not have affected CustomFormatter on Column itself + + // Test (What should be visible in the GUI): + // * Table view should show to entries using no custom formatters at all. + // * Editor of 2nd column should show entries using 'AddBrackerTestFormatter'. + // * Transitioning between editing (dropdown box visible) and non-editing (no dropdown box visible) should show only custom editor for combo box is used. + WindowsFormsTestHelper.ShowModal(tableView, f => + { + var dxColumn = tableView.Columns[1].FieldValue("dxColumn"); + var dxEditor = (RepositoryItemLookUpEdit) dxColumn.ColumnEdit; + var list = dxEditor.DataSource as IEnumerable; + Assert.IsNotNull(list); + TypeUtils.GetPropertyValue(list.OfType().First(), "DisplayText").Should().Be.EqualTo("[item type1]"); // Only have formatting in ComboBox + tableView.GetCellDisplayText(0, 1).Should().Be.EqualTo("item type1"); // No formatting should be visible in TableView + }); + } + + [Test] + public void DefaultSelectionIsEmpty() + { + var table = new DataTable(); + table.Columns.Add("column1", typeof(string)); + table.Columns.Add("column2", typeof(string)); + table.Rows.Add("1", "2"); + table.Rows.Add("3", "4"); + + var tableView = new TableView + { + Data = table + }; + + tableView.SelectedCells + .Should().Be.Empty(); + } + + [Test] + public void SetRowCellValue() + { + var persons = new BindingList + { + new Person + { + Age = 22, Name = "Jan" + } + }; + var tableView = new TableView + { + Data = persons + }; + + //action! change the top left cell + tableView.SetCellValue(0, 0, "Kees"); + + Assert.AreEqual("Kees", persons[0].Name); + } + + [Test] + public void SetRowCellValueIsBasedOnVisibleIndexes() + { + var persons = new BindingList + { + new Person + { + Age = 22, Name = "Jan" + } + }; + var tableView = new TableView + { + Data = persons + }; + + //hide the first column + tableView.Columns[0].Visible = false; + + //action! change the top left cell + tableView.SetCellValue(0, 0, "23"); + + Assert.AreEqual(23, persons[0].Age); + } + + [Test] + public void SetRowCellValueForCustomColumnOrder() + { + var tableView = new TableView(); + var persons = new List + { + new Person + { + Age = 12, Name = "Hoi" + }, + new Person + { + Age = 11, Name = "keers" + } + }; + tableView.Data = persons; + //set the age first and name second + tableView.Columns[0].DisplayIndex = 1; + tableView.Columns[1].DisplayIndex = 0; + + tableView.SetCellValue(0, 1, "jantje"); + Assert.AreEqual("jantje", persons[0].Name); + } + + [Test] + public void SetRowCellValueDoesNotWorkOnReadOnlyTableView() + { + var table = new DataTable(); + table.Columns.Add("readonlycolumn", typeof(string)); + + table.Rows.Add("1"); + + var tableView = new TableView + { + Data = table + }; + + //read only first column + tableView.ReadOnly = true; + + tableView.SetCellValue(0, 0, "2"); + + Assert.AreEqual("1", tableView.GetCellValue(0, 0)); + } + + [Test] + public void SetRowCellValueDoesNotWorkOnReadOnlyColumns() + { + var table = new DataTable(); + table.Columns.Add("readonlycolumn", typeof(string)); + + table.Rows.Add("1"); + + var tableView = new TableView + { + Data = table + }; + + //read only first column + tableView.Columns[0].ReadOnly = true; + + tableView.SetCellValue(0, 0, "2"); + + Assert.AreEqual("1", tableView.GetCellValue(0, 0)); + } + + [Test] + public void SetRowCellValueDoesNotWorkOnReadOnlyCell() + { + var table = new DataTable(); + table.Columns.Add("readonlycolumn", typeof(string)); + + table.Rows.Add("1"); + + var tableView = new TableView + { + Data = table + }; + + //read only cell + tableView.ReadOnlyCellFilter += delegate { return true; }; + + tableView.SetCellValue(0, 0, "2"); + + Assert.AreEqual("1", tableView.GetCellValue(0, 0)); + } + + [Test] + public void SetRowCellValueOnInvalidCellDoesNotCommit() + { + var persons = new List + { + new Person + { + Age = 12, Name = "Hoi" + }, + new Person + { + Age = 11, Name = "keers" + } + }; + var tableView = new TableView + { + Data = persons, + InputValidator = (tvc, obj) => new Utils.Tuple("first", false) + }; + + //try to set the name on the first column...should fail + + tableView.SetCellValue(0, 0, "oeps"); + + //assert the new value did not get commited + Assert.AreEqual("Hoi", persons[0].Name); + } + + [Test] + public void RowCount() + { + //empty tableview should have 0 rowcount + var persons = new BindingList(); + var tableView = new TableView + { + Data = persons + }; + Assert.AreEqual(0, tableView.RowCount); + + //1 person one row right? + persons = new BindingList + { + new Person + { + Age = 22, Name = "Jan" + } + }; + tableView = new TableView + { + Data = persons + }; + Assert.AreEqual(1, tableView.RowCount); + } + + [Test] + public void SelectCells() + { + //empty tableview should have 0 rowcount + var persons = new BindingList(); + for (int i = 0; i < 10; i++) + { + persons.Add(new Person()); + } + var tableView = new TableView + { + Data = persons + }; + + //select cells + tableView.SelectCells(5, 0, 9, 1); + + //check the bottom cells are all selected + Assert.AreEqual(10, tableView.SelectedCells.Count); + } + + [Test] + public void ChangeSelection() + { + //empty tableview should have 0 rowcount + var persons = new BindingList(); + for (int i = 0; i < 10; i++) + { + persons.Add(new Person()); + } + var tableView = new TableView + { + Data = persons + }; + var selectionChangedCount = 0; + var selectionChangedRowsCount = 0; + + tableView.SelectionChanged += delegate(object sender, TableSelectionChangedEventArgs e) + { + selectionChangedCount++; + selectionChangedRowsCount = e.Cells.Count; + }; + //select cells + tableView.SelectCells(5, 0, 9, 1); + + Assert.AreEqual(1, selectionChangedCount); + Assert.AreEqual(10, selectionChangedRowsCount); + } + + [Test] + public void SortTableViewWhenSettingSortOrder() + { + var person = new List + { + new Person + { + Age = 12, Name = "Aaltje" + }, + new Person + { + Age = 11, Name = "Berend" + } + }; + var tableView = new TableView + { + Data = person + }; + + //first sort descending..the first value should be berend + tableView.Columns[0].SortOrder = SortOrder.Descending; + Assert.AreEqual("Berend", tableView.GetCellValue(0, 0)); + + //sort ascending..the first value should be aaltje + tableView.Columns[0].SortOrder = SortOrder.Ascending; + + Assert.AreEqual("Aaltje", tableView.GetCellValue(0, 0)); + } + + [Test] + public void FilterTableOnSettingFilterText() + { + var person = new List + { + new Person + { + Age = 12, Name = "Aaltje" + }, + new Person + { + Age = 11, Name = "Berend" + } + }; + var tableView = new TableView + { + Data = person + }; + + //action! set a filter + tableView.Columns[0].FilterString = "[Name] Like 'Jaap%'"; + + //no row should be visible + Assert.AreEqual(0, tableView.RowCount); + } + + [Test] + public void IsSorted() + { + var person = new List(); + var tableView = new TableView + { + Data = person + }; + + //should be false first + Assert.IsFalse(TypeUtils.CallPrivateMethod(tableView, "IsSorted")); + + //action! set a sort + tableView.Columns[0].SortOrder = SortOrder.Descending; + + Assert.IsTrue(TypeUtils.CallPrivateMethod(tableView, "IsSorted")); + } + + [Test] + public void DeleteSelectionRemovesValueIfCellWasSelect() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + + //select the twelve + tableView.SelectCells(0, 1, 0, 1); + + //action! delete the row + tableView.DeleteCurrentSelection(); + + //assert we 'deleted' the age + Assert.AreEqual(0, persons[0].Age); + } + + [Test] + public void DeleteSelectionRemovesRowIfAllCellsInARowAreSelected() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + + tableView.SelectCells(0, 0, 0, 3); // Select the whole Aaltje row + tableView.SelectCells(1, 0, 1, 0, false); // Append to selection only the Berends name cell + + tableView.DeleteCurrentSelection(); + + // Selection does not form a complete selection of rows: cell-deletion expected + Assert.AreEqual("", persons[0].Name); + Assert.AreEqual(0, persons[0].Age); + Assert.AreEqual("", persons[1].Name); + Assert.AreEqual(11, persons[1].Age); + + tableView.SelectCells(0, 0, 1, 3); // Select all cells: row deletion + tableView.DeleteCurrentSelection(); + + Assert.AreEqual(0, persons.Count); + } + + [Test] + public void RowDeleteHandlerTest() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + tableView.RowDeleteHandler += delegate + { + persons.RemoveAt(0); + return true; + }; + + tableView.SelectRow(1); // Selection should not matter. + tableView.DeleteCurrentSelection(); + + Assert.AreEqual(1, persons.Count); + Assert.AreEqual("Berend", persons[0].Name); + } + + [Test] + public void DeleteSelectionRemovesRowIfRowSelectedAndRowSelectIsEnabled() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + tableView.RowSelect = true; + + //select the top row + tableView.SelectRow(0); + + //action! delete the row + tableView.DeleteCurrentSelection(); + + //assert we only have berend now + Assert.AreEqual(new[] + { + "Berend" + }, persons.Select(p => p.Name).ToArray()); + } + + [Test] + public void DeleteSelectionTakesAllowDeleteRowsIntoAccount() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + + //select the top row + tableView.SelectCells(0, 0, 0, 1); + + //action! delete the row + tableView.AllowDeleteRow = false; + tableView.DeleteCurrentSelection(); + + //assert aaltje got 'reset' + Assert.AreEqual(new[] + { + "", + "Berend" + }, persons.Select(p => p.Name).ToArray()); + Assert.AreEqual(new[] + { + 0, + 11 + }, persons.Select(p => p.Age).ToArray()); + } + + [Test] + public void DeleteSelectionOnReadOnlyTableViewDoesNothing() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + + //select the top row + tableView.SelectCells(0, 0, 0, 1); + tableView.ReadOnly = true; + + //action! try to delete something + tableView.DeleteCurrentSelection(); + + //assert all is well + Assert.AreEqual("Aaltje", persons[0].Name); + Assert.AreEqual(2, persons.Count); + } + + [Test] + public void DeleteSelectionOnReadOnlyColumnDoesNothing() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + + //select the top row + tableView.SelectCells(0, 1, 0, 1); + tableView.Columns[1].ReadOnly = true; + + //action! try to delete something + tableView.DeleteCurrentSelection(); + + //assert all is well + Assert.AreEqual(12, persons[0].Age); + Assert.AreEqual(2, persons.Count); + } + + [Test] + public void CanDeleteCurrentSelectionTest() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + tableView.CanDeleteCurrentSelection += () => false; // Cannot delete things + + // Select the cell for Aaltje's age + tableView.SelectCells(0, 1, 0, 1); + tableView.DeleteCurrentSelection(); + + Assert.AreEqual(12, persons[0].Age, "Age should not be affected."); + + tableView.CanDeleteCurrentSelection += () => true; + tableView.DeleteCurrentSelection(); + + Assert.AreEqual(0, persons[0].Age, "Age should be cleared"); + } + + [Test] + public void ColumnReadOnly() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + var tableView = new TableView + { + Data = persons + }; + + tableView.Columns[0].ReadOnly = true; + Assert.IsTrue(tableView.Columns[0].ReadOnly); + } + + [Test] + public void AllowAddNewRowShouldBeDeducedFromBindingSource() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12 + }, + new Person + { + Name = "Berend", Age = 11 + } + }; + + var tableView = new TableView + { + Data = new BindingList(persons) + { + AllowNew = false + } + }; + //WindowsFormsTestHelper.ShowModal(tableView); + Assert.IsFalse(tableView.AllowAddNewRow); + } + + [Test] + public void SetRowCellValueGeneratesCellChangedEvent() + { + var table = new DataTable(); + + table.Columns.Add("column", typeof(string)); + table.Rows.Add("1"); + + var tableView = new TableView + { + Data = table + }; + + int callCount = 0; + tableView.CellChanged += (s, e) => + { + callCount++; + Assert.AreEqual(0, e.Value.Column.AbsoluteIndex); + Assert.AreEqual(0, e.Value.RowIndex); + }; + tableView.SetCellValue(0, 0, "2"); + Assert.AreEqual(1, callCount); + } + + [Test] + public void FormatStringsShouldWorkCorrectly() + { + var dateOfBirth = new DateTime(1980, 1, 1); + var dateOfDeath = new DateTime(2060, 2, 3); + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12, DateOfBirth = dateOfBirth, DateOfDeath = dateOfDeath + }, + new Person + { + Name = "Berend", Age = 11, DateOfBirth = new DateTime(1990, 1, 1), DateOfDeath = new DateTime(2061, 2, 3) + } + }; + + var tableView = new TableView + { + ColumnAutoWidth = true, Data = persons + }; + + var dtFormat1 = "dd-MMM-yyyy"; + var dtFormat2 = "yyyy (MMM-dd)"; + + tableView.GetColumnByName("Name").DisplayFormat = "Name = {0}"; + tableView.GetColumnByName("Age").DisplayFormat = "D3"; + tableView.GetColumnByName("DateOfBirth").DisplayFormat = dtFormat1; + tableView.GetColumnByName("DateOfDeath").DisplayFormat = dtFormat2; + + tableView.GetColumnByName("Name").DisplayFormat.Should().Be.EqualTo("Name = {0}"); + + tableView.GetCellDisplayText(0, 0).Should().Be.EqualTo("Name = Aaltje"); + tableView.GetCellDisplayText(0, 1).Should().Be.EqualTo("012"); + tableView.GetCellDisplayText(0, 2).Should().Be.EqualTo(dateOfBirth.ToString(dtFormat1)); + tableView.GetCellDisplayText(0, 3).Should().Be.EqualTo(dateOfDeath.ToString(dtFormat2)); + } + + [Test] + public void FormatStringsShouldAlsoTakeCustomFormatter() + { + var dateOfBirth = new DateTime(1980, 1, 1); + var dateOfDeath = new DateTime(2060, 2, 3); + + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12, DateOfBirth = dateOfBirth, DateOfDeath = dateOfDeath + }, + new Person + { + Name = "Berend", Age = 11, DateOfBirth = new DateTime(1990, 1, 1), DateOfDeath = new DateTime(2061, 2, 3) + } + }; + + var tableView = new TableView + { + ColumnAutoWidth = true, Data = persons + }; + + var dtFormat1 = "dd-MMM-yyyy"; + var dtFormatter = new TestDateTimeColumnFormatter(); + + tableView.GetColumnByName("Name").DisplayFormat = "Name = {0}"; + tableView.GetColumnByName("Age").DisplayFormat = "D3"; + tableView.GetColumnByName("DateOfBirth").DisplayFormat = dtFormat1; + tableView.GetColumnByName("DateOfDeath").CustomFormatter = dtFormatter; + + tableView.GetColumnByName("Name").DisplayFormat.Should().Be.EqualTo("Name = {0}"); + + tableView.GetCellDisplayText(0, 0).Should().Be.EqualTo("Name = Aaltje"); + tableView.GetCellDisplayText(0, 1).Should().Be.EqualTo("012"); + tableView.GetCellDisplayText(0, 2).Should().Be.EqualTo(dateOfBirth.ToString(dtFormat1)); + tableView.GetCellDisplayText(0, 3).Should().Be.EqualTo(dtFormatter.Format("", dateOfDeath, null)); + } + + [Test] + public void CustomFormattingShouldWorkCorrectly() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12, DateOfBirth = new DateTime(1980, 1, 1) + }, + new Person + { + Name = "Berend", Age = 11, DateOfBirth = new DateTime(1990, 1, 1) + } + }; + + var tableView = new TableView + { + ColumnAutoWidth = true, Data = persons + }; + + var nameColumn = tableView.GetColumnByName("Name"); + + nameColumn.DisplayFormat = "Name = {0}"; + nameColumn.CustomFormatter = new NameTableCellFormatter(); + + tableView.GetCellDisplayText(0, 0).Should().Be.EqualTo("Name with custom formatter : Aaltje"); + } + + [Test] + [ExpectedException(typeof(InvalidOperationException), ExpectedMessage = "Unable to select cells when tableView has RowSelect enabled. Use SelectRow instead.")] + public void SelectCellsForTableViewWithRowSelectThrowsException() + { + //this test relates to issue 3069...demonstrating a problem paste lines when rowselect is enabled. + //had to do with a call to SelectCells for a table with RowSelect. Therefore tableView.gridView.GetSelectedCells() was no longer in synch with tablveView.SelectedCells + //causing a error when pasting + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12, DateOfBirth = new DateTime(1980, 1, 1) + }, + new Person + { + Name = "Berend", Age = 11, DateOfBirth = new DateTime(1990, 1, 1) + } + }; + + var tableView = new TableView + { + ColumnAutoWidth = true, Data = persons, RowSelect = true + }; + + //should throw because tableview is in RowSelect modus. + tableView.SelectCells(0, 0, 0, 1); + } + + [Test] + public void ClickingColumnHeaderWithRowSelectShouldNotThrow() + { + var persons = new List + { + new Person + { + Name = "Aaltje", Age = 12, DateOfBirth = new DateTime(1980, 1, 1) + }, + new Person + { + Name = "Berend", Age = 11, DateOfBirth = new DateTime(1990, 1, 1) + } + }; + + var mock = new MockRepository(); + var gridView = mock.Stub(); + var hitInfo = mock.Stub(); + + hitInfo.Column = null; + Expect.Call(hitInfo.InColumn).Return(true); + Expect.Call(hitInfo.InColumnPanel).Return(true); + Expect.Call(gridView.CalcHitInfo(new Point(0, 0))).IgnoreArguments().Return(hitInfo).Repeat.Any(); + + mock.ReplayAll(); + + var tableView = new TableView + { + ColumnAutoWidth = true, Data = persons, RowSelect = true + }; + + TypeUtils.SetField(tableView, "dxGridView", gridView); + TypeUtils.CallPrivateMethod(tableView, "DxGridViewClick", null, new EventArgs()); // Should not throw + mock.VerifyAll(); + } + + [Test] + public void TableViewAllowSortingColumnPropertyShouldBeAddedToNewColumns() + { + var table = new DataTable(); + + table.Columns.Add("A", typeof(double)); + table.Columns.Add("B", typeof(int)); + + for (int i = 0; i < 50; i++) + { + DataRow row = table.NewRow(); + row["A"] = i*10.0; + row["B"] = i; + table.Rows.Add(row); + } + + var tableView = new TableView + { + Data = table, AllowColumnSorting = false + }; + + Assert.IsFalse(tableView.Columns[0].SortingAllowed); + + table.Columns.Add("C", typeof(int)); + + Assert.IsFalse(tableView.Columns[2].SortingAllowed); + + tableView.AllowColumnSorting = true; + + Assert.IsTrue(tableView.Columns[2].SortingAllowed); + + table.Columns.Add("D", typeof(int)); + + Assert.IsTrue(tableView.Columns[3].SortingAllowed); + } + + [Test] + [Ignore("Hangs on buildserver")] + public void TableViewCursorKeysWhileInCellEditModeShouldWorkLikeExcel() + { + var table = new DataTable(); + + table.Columns.Add("A", typeof(double)); + table.Columns.Add("B", typeof(int)); + + for (int i = 0; i < 5; i++) + { + DataRow row = table.NewRow(); + row["A"] = i*10.0; + row["B"] = i; + table.Rows.Add(row); + } + + var tableView = new TableView + { + Data = table, AllowColumnSorting = false + }; + + WindowsFormsTestHelper.ShowModal(tableView, + f => + { + tableView.Focus(); + + var cell = TypeUtils.CallPrivateMethod(tableView, "GetFocusedCell"); + + Assert.AreEqual(0, cell.RowIndex); + Assert.AreEqual(0, cell.Column.DisplayIndex); + SendKeys.SendWait("{F2}"); //enter cell edit modus + SendKeys.SendWait("{RIGHT}"); //cursor to right: we want to stay in the same cell! + + cell = TypeUtils.CallPrivateMethod(tableView, "GetFocusedCell"); + Assert.AreEqual(0, cell.RowIndex); + Assert.AreEqual(0, cell.Column.DisplayIndex); + }); + } + + [Test] + public void TableViewCellSelectionShouldUpdateSelectedColumns() + { + var table = new DataTable(); + + table.Columns.Add("A", typeof(double)); + table.Columns.Add("B", typeof(int)); + + for (int i = 0; i < 5; i++) + { + DataRow row = table.NewRow(); + row["A"] = i*10.0; + row["B"] = i; + table.Rows.Add(row); + } + + var tableView = new TableView + { + Data = table, AllowColumnSorting = false + }; + tableView.Columns[0].Visible = false; //hide one column + tableView.SelectCells(0, 0, 0, 0); + + Assert.AreEqual(1, tableView.SelectedColumnsIndices.Length); + Assert.AreEqual(1, tableView.Columns[tableView.SelectedColumnsIndices[0]].AbsoluteIndex); + } + + [Test] + public void TestAddFocusedColumnInGridViewColumnFilterChanged() + { + var table = new DataTable(); + + table.Columns.Add("A", typeof(double)); + table.Columns.Add("B", typeof(int)); + + for (int i = 0; i < 5; i++) + { + var row = table.NewRow(); + row["A"] = i*10.0; + row["B"] = i; + table.Rows.Add(row); + } + + var tableView = new TableView + { + Data = table, AllowColumnSorting = false + }; + + var filterChangedCount = 0; + ITableViewColumn selectedColumn = null; + + tableView.ColumnFilterChanged += (s, e) => + { + filterChangedCount++; + selectedColumn = e.Value; + }; + + tableView.Columns[0].FilterString = "A = 50"; + + Assert.AreEqual(1, filterChangedCount); + Assert.AreEqual(tableView.Columns[0], selectedColumn); + } + + [Test] + [Ignore("Known issue: see TOOLS-9526")] + public void ColumnVisibilityPropertyShouldNotAffectDisplayIndexTools() + { + var tableView = new TableView(); + tableView.AddColumn("propertyName1", "Property name 1"); + tableView.AddColumn("propertyName2", "Property name 2"); + + var propertyName1Column = tableView.Columns[0]; + var propertyName2Column = tableView.Columns[1]; + + Assert.AreEqual(0, propertyName1Column.AbsoluteIndex); + Assert.AreEqual(1, propertyName2Column.AbsoluteIndex); + Assert.AreEqual(0, propertyName1Column.DisplayIndex); + Assert.AreEqual(1, propertyName2Column.DisplayIndex); + + propertyName2Column.Visible = false; + + Assert.AreEqual(0, propertyName1Column.AbsoluteIndex); + Assert.AreEqual(1, propertyName2Column.AbsoluteIndex); + Assert.AreEqual(0, propertyName1Column.DisplayIndex); + Assert.AreEqual(-1, propertyName2Column.DisplayIndex); + + propertyName2Column.Visible = true; + + Assert.AreEqual(0, propertyName1Column.AbsoluteIndex); + Assert.AreEqual(1, propertyName2Column.AbsoluteIndex); + Assert.AreEqual(0, propertyName1Column.DisplayIndex, "Display indexes are expected to be identical to starting situation."); + Assert.AreEqual(1, propertyName2Column.DisplayIndex, "Display indexes are expected to be identical to starting situation."); + } + + [Test] + public void GetRowObjectAtWithIndexOutOfRangeGivesNull() + { + var list = new List + { + "AA", "BB", "CC" + }; + var tableView = new TableView + { + Data = list + }; + + Assert.IsNull(tableView.GetRowObjectAt(-1)); + Assert.IsNull(tableView.GetRowObjectAt(10)); + } + + [Test] + public void GetRowObjectAtWithSorting() + { + var list = new List + { + "AA", "BB", "CC" + }; + var tableView = new TableView + { + Data = list + }; + + tableView.Columns[0].SortOrder = SortOrder.Descending; + Assert.AreEqual(list[0], tableView.GetRowObjectAt(2)); + } + + [Test] + public void GetRowObjectAtWithoutSorting() + { + var list = new List + { + "AA", "BB", "CC" + }; + var tableView = new TableView + { + Data = list + }; + + Assert.AreEqual(list[2], tableView.GetRowObjectAt(2)); + } + + [Test] + public void ClickingCheckboxColumnShouldChangeSelection() + { + var table = new DataTable(); + + table.Columns.Add("A", typeof(string)); + table.Columns.Add("B", typeof(bool)); + + for (int i = 0; i < 5; i++) + { + var row = table.NewRow(); + row["A"] = "Option " + i; + row["B"] = i%2 != 0; + table.Rows.Add(row); + } + + var tableView = new TableView + { + Data = table, MultiSelect = true, RowSelect = true, ReadOnly = true + }; + var gridView = TypeUtils.GetField(tableView, "dxGridView"); + WindowsFormsTestHelper.ShowModal(tableView, f => + { + TypeUtils.CallPrivateMethod(gridView, "RaiseMouseDown", new MouseEventArgs(MouseButtons.Left, 1, 156, 76, 0)); + + Assert.AreEqual(3, tableView.SelectedRowsIndices.First()); + }); + } + + [TestFixtureSetUp] + public void TestFixtureSetUp() + { + LogHelper.ConfigureLogging(); + } + + [TestFixtureTearDown] + public void TestFixtureTearDown() + { + LogHelper.ResetLogging(); + } + + private static DataTable CreateTableForCopyPaste() + { + var table = new DataTable(); + + table.Columns.Add("A", typeof(int)); + table.Columns.Add("B", typeof(int)); + + for (int i = 0; i < 5; i++) + { + DataRow row = table.NewRow(); + row["A"] = i; + row["B"] = i; + table.Rows.Add(row); + } + return table; + } + + public class ItemType + { + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + } + + public class Item + { + public string Name { get; set; } + public ItemType Type { get; set; } + } + + private class AddBracketTestFormatter : ICustomFormatter + { + public string Format(string format, object arg, IFormatProvider formatProvider) + { + return String.Format("[{0}]", arg); + } + } + + private class AddDashTestFormatter : ICustomFormatter + { + public string Format(string format, object arg, IFormatProvider formatProvider) + { + return String.Format("-{0}-", arg); + } + } + + private class NameTableCellFormatter : ICustomFormatter + { + /// + /// Converts the value of a specified object to an equivalent string representation using specified format and culture-specific formatting information. + /// + /// + /// The string representation of the value of , formatted as specified by and . + /// + /// A format string containing formatting specifications. + /// An object to format. + /// An object that supplies format information about the current instance. + /// 2 + public string Format(string format, object arg, IFormatProvider formatProvider) + { + return "Name with custom formatter : " + arg; + } + } + } + + public class TestDateTimeColumnFormatter : ICustomFormatter + { + public string Format(string format, object arg, IFormatProvider formatProvider) + { + return "Test format"; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TestClasses/ClassWithEnum.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TestClasses/ClassWithEnum.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TestClasses/ClassWithEnum.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,53 @@ +using System; +using System.ComponentModel; +using System.Globalization; + +namespace DelftTools.Tests.Controls.Swf.Table.TestClasses +{ + internal class ClassWithEnum + { + public FruitType Type { get; set; } + } + + //Type converter is needed when the enum is used in a datatable for xtragrid + [TypeConverter(typeof(EnumToInt32TypeConverter))] + internal enum FruitType + { + [Description("Een Appel")] + Appel, + + [Description("Een Peer")] + Peer, + + [Description("Een Banaan")] + Banaan + } + + public class EnumToInt32TypeConverter : EnumConverter + { + public EnumToInt32TypeConverter(Type type) + : base(type) + { + // since generic type parameters can't be constrained to enums, + // this asset is required to perform the logic check + } + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(int)) + { + return true; + } + return base.CanConvertFrom(context, sourceType); + } + + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + if (value.GetType() == typeof(int)) + { + return (TEnum) value; + } + return base.ConvertFrom(context, culture, value); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TestClasses/Person.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TestClasses/Person.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/Table/TestClasses/Person.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,15 @@ +using System; + +namespace DelftTools.Tests.Controls.Swf.Table.TestClasses +{ + public class Person + { + public string Name { get; set; } + + public int Age { get; set; } + + public DateTime DateOfBirth { get; set; } + + public DateTime DateOfDeath { get; set; } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeNodeGraphicExtensionsTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeNodeGraphicExtensionsTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeNodeGraphicExtensionsTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,66 @@ +using System.Drawing; +using DelftTools.Controls; +using DelftTools.Controls.Swf.TreeViewControls; +using NUnit.Framework; +using Rhino.Mocks; + +namespace DelftTools.Tests.Controls.Swf.TreeViewControls +{ + [TestFixture] + public class TreeNodeGraphicExtensionsTest + { + [Test] + public void TestIsOnCheckbox() + { + var mocks = new MockRepository(); + var treeNode = mocks.Stub(); + + treeNode.ShowCheckBox = false; + + mocks.ReplayAll(); + + var pointOnCheckbox = new Point(25, 5); + var bounds = new Rectangle(40, 0, 200, 16); + + Assert.IsFalse(TreeNodeGraphicExtensions.IsOnCheckBox(null, new Point())); + Assert.IsFalse(treeNode.IsOnCheckBox(pointOnCheckbox)); + + // Change node expectations to have a checkbox + mocks.BackToRecord(treeNode, BackToRecordOptions.PropertyBehavior); + treeNode.ShowCheckBox = true; + Expect.Call(treeNode.Bounds).Return(bounds); + Expect.Call(((ITreeNode) treeNode).Bounds).Return(bounds); + treeNode.Replay(); + + Assert.IsTrue(treeNode.IsOnCheckBox(pointOnCheckbox)); + } + + [Test] + public void TestIsOnExpandButton() + { + var mocks = new MockRepository(); + var treeNode = mocks.Stub(); + + treeNode.HasChildren = true; + Expect.Call(treeNode.TreeView).Return(new TreeView()); + + mocks.ReplayAll(); + + var pointOnExpandButton = new Point(5, 5); + var bounds = new Rectangle(40, 0, 200, 16); + + Assert.IsFalse(TreeNodeGraphicExtensions.IsOnExpandButton(null, new Point())); + Assert.IsFalse(treeNode.IsOnExpandButton(pointOnExpandButton)); + + // Change node expectations to have a checkbox + mocks.BackToRecord(treeNode, BackToRecordOptions.PropertyBehavior); + + treeNode.HasChildren = true; + Expect.Call(treeNode.Bounds).Return(bounds); + Expect.Call(((ITreeNode) treeNode).Bounds).Return(bounds); + treeNode.Replay(); + + Assert.IsTrue(treeNode.IsOnExpandButton(pointOnExpandButton)); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeNodeTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeNodeTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeNodeTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,71 @@ +using DelftTools.Controls.Swf.TreeViewControls; +using NUnit.Framework; +using SharpTestsEx; + +namespace DelftTools.Tests.Controls.Swf.TreeViewControls +{ + [TestFixture] + public class TreeNodeTest + { + private TreeView treeView; + + [SetUp] + public void SetUp() + { + treeView = new TreeView(); + } + + [Test] + public void GetParentOfLevel() + { + var node1 = treeView.NewNode(); + var node11 = treeView.NewNode(); + var node12 = treeView.NewNode(); + + treeView.Nodes.Add(node1); + node1.Nodes.Add(node11); + node1.Nodes.Add(node12); + + var node = node12.GetParentOfLevel(0); + + node.Should().Be.EqualTo(node1); + } + + [Test] + public void TestTextLengthLimit() + { + var node = treeView.NewNode(); + + treeView.Nodes.Add(node); + + var hugeText = ""; + for (var i = 0; i <= 99; i++) + { + hugeText += "1834567890"; // hundred times 10 symbols = 1000 symbols + } + Assert.AreEqual(hugeText.Length, 1000); + + node.Text = hugeText; + Assert.AreEqual(node.Text.Length, hugeText.Length); + + node.Text = hugeText + "123"; + + Assert.AreEqual(node.Text.Length, hugeText.Length); + } + + [Test] + public void TestTextSetToNull() + { + var node = treeView.NewNode(); + + treeView.Nodes.Add(node); + + var originalText = "tst"; + node.Text = originalText; + Assert.AreEqual(originalText, node.Text); + + node.Text = null; + Assert.AreEqual("", node.Text); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewControllerTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewControllerTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewControllerTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,661 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using DelftTools.Controls; +using DelftTools.Controls.Swf.TreeViewControls; +using DelftTools.Tests.TestObjects; +using DelftTools.Utils.Collections; +using DelftTools.Utils.Reflection; +using NUnit.Framework; +using Rhino.Mocks; +using Category = NUnit.Framework.CategoryAttribute; +using Child = DelftTools.Tests.Controls.Swf.UndoRedoTestClasses.Child; +using Parent = DelftTools.Tests.Controls.Swf.UndoRedoTestClasses.Parent; + +namespace DelftTools.Tests.Controls.Swf.TreeViewControls +{ + [TestFixture] + public class TreeViewControllerTest + { + [Test] + [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Tree view can't be null")] + public void ConstructWithoutTreeView() + { + new TreeViewController(null); + } + + [Test] + public void ResolveNodePresenterForDataWalksUpClassHierarchy() + { + var mocks = new MockRepository(); + var treeview = mocks.StrictMock(); + + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null); + + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview); + var baseClassNodePresenter = new BaseClassNodePresenter(); + var subClassNodePresenter = new SubClassNodePresenter(); + + presenter.NodePresenters.AddRange(new ITreeNodePresenter[] + { + baseClassNodePresenter, + subClassNodePresenter + }); + + Assert.AreEqual(subClassNodePresenter, presenter.ResolveNodePresenterForData(new SubClass())); + + mocks.VerifyAll(); + } + + [Test] + public void ResolveNodePresenterForDataReturnsNullIfNotFound() + { + var mocks = new MockRepository(); + var treeview = mocks.StrictMock(); + + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null); + + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview); + Assert.IsNull(presenter.ResolveNodePresenterForData(new SubClass())); + + mocks.VerifyAll(); + } + + [Test] + public void ResolveNodePresenterForDataReturnsNullIfItemIsNull() + { + var mocks = new MockRepository(); + var treeview = mocks.StrictMock(); + + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview); + Assert.IsNull(presenter.ResolveNodePresenterForData(null)); + + mocks.VerifyAll(); + } + + [Test] + public void ResolveNodePresenterCanMatchOnInterface() + { + var mocks = new MockRepository(); + var treeview = mocks.StrictMock(); + + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null); + + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview); + + var interfaceNodePresenter = new SomeInterfaceNodePresenter(); + var interfaceImplementor = new SubClass(); + presenter.NodePresenters.AddRange(new[] + { + interfaceNodePresenter + }); + + Assert.AreEqual(interfaceNodePresenter, presenter.ResolveNodePresenterForData(interfaceImplementor)); + + mocks.VerifyAll(); + } + + [Test] + public void TestOnNodeChecked() + { + var mocks = new MockRepository(); + + var treeNode = mocks.Stub(); + var treeview = mocks.StrictMock(); + var nodePresenter = mocks.StrictMock(); + + nodePresenter.TreeView = treeview; + treeNode.Presenter = nodePresenter; + + Expect.Call(() => nodePresenter.OnNodeChecked(treeNode)); + //Expect.Call(nodePresenter.NodeTagType).Return(typeof(object)); + //Expect.Call(nodePresenter.IsPresenterForNode(null)).IgnoreArguments().Return(true); + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + + treeNode.Tag = new object(); + Expect.Call(treeNode.IsUpdating).Return(true); + + mocks.ReplayAll(); + + var controller = new TreeViewController(treeview); + controller.NodePresenters.Add(nodePresenter); + + controller.OnNodeChecked(treeNode); + + mocks.BackToRecord(treeNode); + treeNode.Tag = new object(); + treeNode.Presenter = nodePresenter; + Expect.Call(treeNode.IsUpdating).Return(false); + mocks.Replay(treeNode); + + controller.OnNodeChecked(treeNode); + + mocks.VerifyAll(); + } + + [Test] + [ExpectedException(ExpectedMessage = "Unable to resolve node presenter for null data")] + public void TestOnNodeCheckedWithNodeWithoutTagValue() + { + var mocks = new MockRepository(); + + var treeNode = mocks.Stub(); + var treeview = mocks.StrictMock(); + + treeNode.Tag = null; + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview); + + mocks.VerifyAll(); + + presenter.OnNodeChecked(treeNode); + } + + [Test] + public void TestSetData() + { + var mocks = new MockRepository(); + + var treeview = mocks.StrictMock(); + var nodePresenter = mocks.StrictMock(); + var nodes = new List(); + + nodePresenter.TreeView = treeview; + + Expect.Call(treeview.Nodes).Return(nodes).Repeat.Any(); + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + treeview.SelectedNode = null; + LastCall.On(treeview).IgnoreArguments(); + + Expect.Call(nodePresenter.NodeTagType).Return(typeof(object)).Repeat.Any(); + Expect.Call(nodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(Enumerable.Empty()); + Expect.Call(() => nodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview); + presenter.NodePresenters.Add(nodePresenter); + + presenter.Data = new object(); + + Assert.AreEqual(1, nodes.Count); + mocks.VerifyAll(); + } + + [Test] + public void TestSetDataWithNull() + { + var mocks = new MockRepository(); + + var treeview = mocks.Stub(); + var nodes = new List(); + + Expect.Call(treeview.Nodes).Return(nodes).Repeat.Any(); + + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview) + { + Data = null + }; + + Assert.IsNull(presenter.Data); + + Assert.AreEqual(0, nodes.Count); + mocks.VerifyAll(); + } + + [Test] + public void TestRegisterAndUnRegisterOnPropertyChangedOnSetData() + { + var mocks = new MockRepository(); + + var treeview = mocks.StrictMock(); + var nodePresenter = mocks.StrictMock(); + var nodes = new List(); + var parent = new Parent(); + + nodePresenter.TreeView = treeview; + + Expect.Call(treeview.GetNodeByTag(parent)).Return(nodes.FirstOrDefault(n => n.Tag == parent)).Repeat.Any(); + Expect.Call(treeview.Nodes).Return(nodes).Repeat.Any(); + Expect.Call(treeview.Refresh).IgnoreArguments().Repeat.Any(); + treeview.SelectedNode = null; + LastCall.On(treeview).IgnoreArguments(); + + Expect.Call(nodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); + Expect.Call(nodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(Enumerable.Empty()); + Expect.Call(() => nodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + + // Property changed is bubbled to nodePresenter => expect 1 call during parent.Name = "Test" + // not that in some cases Full refresh can be called + Expect.Call(() => nodePresenter.OnPropertyChanged(parent, null, new PropertyChangedEventArgs(""))).IgnoreArguments().Repeat.Any(); + + mocks.ReplayAll(); + + var controller = new TreeViewController(treeview); + controller.NodePresenters.Add(nodePresenter); + + controller.OnTreeViewHandleCreated(); + + controller.Data = parent; + + // generate property changed with listeners enabled + parent.Name = "Test"; + + controller.Data = null; + + // generate property changed with listeners disabled + parent.Name = "Test 2"; + + mocks.VerifyAll(); + } + + [Test] + public void TestRegisterAndUnRegisterOnCollectionChangedOnSetData() + { + var mocks = new MockRepository(); + + var treeview = mocks.StrictMock(); + var parentNodePresenter = mocks.StrictMock(); + var childNodePresenter = mocks.StrictMock(); + + var controller = new TreeViewController(treeview); + var treeViewNodes = new List(); + + var parent = new Parent(); + var child1 = new Child(); + var child2 = new Child(); + + parent.Children.AddRange(new[] + { + child1, + child2 + }); + treeview.Expect(tv => tv.RefreshChildNodes(null)).IgnoreArguments().Repeat.Once(); + treeview.Expect(tv => tv.Visible).IgnoreArguments().Return(false).Repeat.Any(); + treeview.Expect(tv => tv.BeginUpdate()).IgnoreArguments().Repeat.Any(); + treeview.Expect(tv => tv.Refresh()).IgnoreArguments().Repeat.Any(); + + treeview.SelectedNode = null; + LastCall.On(treeview).IgnoreArguments(); + + Expect.Call(treeview.Nodes).Return(treeViewNodes).Repeat.Any(); + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + + parentNodePresenter.TreeView = treeview; + Expect.Call(parentNodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); + Expect.Call(parentNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(new[] + { + child1, + child2 + }); + Expect.Call(() => parentNodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + + childNodePresenter.TreeView = treeview; + Expect.Call(childNodePresenter.NodeTagType).Return(typeof(Child)).Repeat.Any(); + + // Collection changed is bubbled to nodePresenter => expect 1 call during parent.Children.Remove(child2); + // not that in some cases Full refresh can be called + Expect.Call(() => childNodePresenter.OnCollectionChanged(parent, new NotifyCollectionChangingEventArgs())).IgnoreArguments().Repeat.Any(); + + mocks.ReplayAll(); + + controller.OnTreeViewHandleCreated(); + + controller.NodePresenters.AddRange(new[] + { + parentNodePresenter, + childNodePresenter + }); + controller.Data = parent; + + // generate collection changed with listeners enabled + parent.Children.Remove(child2); + + controller.Data = null; + + // generate collection changed with listeners disabled + parent.Children.Add(child2); + + mocks.VerifyAll(); + } + + [Test] + public void TestRefreshChildNodesOfNodeWithoutChildren() + { + var mocks = new MockRepository(); + + var treeView = mocks.Stub(); + + var treeViewController = new TreeViewController(treeView); + + var parentNodePresenter = mocks.Stub(); + treeViewController.NodePresenters.AddRange(new[] + { + parentNodePresenter + }); + + var nodes = new List(); + Expect.Call(treeView.Nodes).Return(nodes).Repeat.Any(); + Expect.Call(treeView.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + treeView.Expect(tv => tv.RefreshChildNodes(null)).IgnoreArguments().Repeat.Once(); + + Expect.Call(parentNodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); + Expect.Call(parentNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(Enumerable.Empty()).Repeat.Twice(); + Expect.Call(() => parentNodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + mocks.ReplayAll(); + + treeViewController.Data = new Parent(); + + // should not create create sub nodes + treeViewController.RefreshChildNodes(nodes[0]); + + Assert.AreEqual(0, nodes[0].Nodes.Count); + + mocks.VerifyAll(); + } + + [Test] + public void TestRefreshChildNodesOfExpandedNode() + { + var mocks = new MockRepository(); + var parentNodePresenter = mocks.StrictMock(); + var childNodePresenter = mocks.StrictMock(); + + var treeview = new TreeView(); + var parent = new Parent(); + var child1 = new Child(); + var child2 = new Child(); + + parent.Children.AddRange(new[] + { + child1, + child2 + }); + + parentNodePresenter.TreeView = treeview; + Expect.Call(parentNodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); + Expect.Call(() => parentNodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + Expect.Call(parentNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(parent.Children).Repeat.Any(); + + childNodePresenter.TreeView = treeview; + Expect.Call(childNodePresenter.NodeTagType).Return(typeof(Child)).Repeat.Any(); + Expect.Call(() => childNodePresenter.UpdateNode(null, null, null)).IgnoreArguments().Repeat.Times(5); + Expect.Call(childNodePresenter.GetChildNodeObjects(parent, null)).Return(parent.Children).Repeat.Any(); + Expect.Call(childNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(Enumerable.Empty()).Repeat.Any(); + + mocks.ReplayAll(); + + var controller = TypeUtils.GetField(treeview, "controller"); + controller.NodePresenters.AddRange(new[] + { + parentNodePresenter, + childNodePresenter + }); + + controller.Data = parent; + + var parentNode = treeview.Nodes[0]; + + // setting the controller.Data creates a root node and expands it if it has children + Assert.AreEqual(2, parentNode.Nodes.Count); + + // simulate removing child2 from parent by changing the number of children returned by the parent node presenter + parentNodePresenter.BackToRecord(BackToRecordOptions.All); + Expect.Call(parentNodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); + Expect.Call(parentNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(new[] + { + child1 + }); + parentNodePresenter.Replay(); + + // updates the tree view to the new parent node state (parent has 1 child item) + controller.RefreshChildNodes(parentNode); + + Assert.AreEqual(1, parentNode.Nodes.Count); + + mocks.VerifyAll(); + } + + [Test] + public void TestRefreshChildNodesOfUnExpandedNode() + { + var mocks = new MockRepository(); + + var parentNodePresenter = mocks.StrictMock(); + var childNodePresenter = mocks.StrictMock(); + + var treeview = new TreeView(); + var parent = new Parent(); + var child1 = new Child(); + var child2 = new Child(); + + parentNodePresenter.TreeView = treeview; + Expect.Call(parentNodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); + Expect.Call(() => parentNodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + Expect.Call(parentNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(new[] + { + child1, + child2 + }).Repeat.Any(); + + childNodePresenter.TreeView = treeview; + Expect.Call(childNodePresenter.NodeTagType).Return(typeof(Child)).Repeat.Any(); + Expect.Call(() => childNodePresenter.UpdateNode(null, null, null)).IgnoreArguments().Repeat.Times(6); + Expect.Call(childNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(Enumerable.Empty()).Repeat.Any(); + + mocks.ReplayAll(); + + var controller = TypeUtils.GetField(treeview, "controller"); + controller.NodePresenters.AddRange(new[] + { + parentNodePresenter, + childNodePresenter + }); + + controller.Data = parent; + + var parentNode = treeview.Nodes[0]; + + parentNode.Collapse(); + controller.RefreshChildNodes(parentNode); + + Assert.AreEqual(2, parentNode.Nodes.Count); + + mocks.VerifyAll(); + } + + [Test] + public void TestRefreshUnLoadedNode() + { + var mocks = new MockRepository(); + + var treeNode = mocks.StrictMock(); + var treeview = mocks.StrictMock(); + var nodePresenter = mocks.StrictMock(); + + var tag = new object(); + + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + Expect.Call(treeview.BeginUpdate).IgnoreArguments().Repeat.Any(); + Expect.Call(treeview.EndUpdate).IgnoreArguments().Repeat.Any(); + + treeNode.HasChildren = true; + Expect.Call(((ITreeNode) treeNode).Tag).Return(tag).Repeat.Any(); + Expect.Call(((ITreeNode) treeNode).IsLoaded).Return(false).Repeat.Any(); + Expect.Call(((ITreeNode) treeNode).Parent).Return(null); + Expect.Call(((ITreeNode) treeNode).Presenter).Return(nodePresenter).Repeat.Any(); + + nodePresenter.TreeView = treeview; + Expect.Call(nodePresenter.NodeTagType).Return(typeof(object)).Repeat.Any(); + Expect.Call(nodePresenter.GetChildNodeObjects(tag, null)).IgnoreArguments().Return(new[] + { + new object() + }); + Expect.Call(() => nodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview); + presenter.NodePresenters.Add(nodePresenter); + + presenter.UpdateNode(treeNode); + + mocks.VerifyAll(); + } + + [Test] + public void TestRefreshLoadedNode() + { + var mocks = new MockRepository(); + + var parentTreeNode = mocks.StrictMock(); + var childTreeNode = mocks.StrictMock(); + var treeview = mocks.StrictMock(); + var parentNodePresenter = mocks.StrictMock(); + var childNodePresenter = mocks.StrictMock(); + + var parent = new Parent(); + var child = new Child(); + var subNodes = new List + { + childTreeNode + }; + + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + Expect.Call(treeview.BeginUpdate).IgnoreArguments().Repeat.Any(); + Expect.Call(treeview.EndUpdate).IgnoreArguments().Repeat.Any(); + + parentTreeNode.HasChildren = true; + Expect.Call(((ITreeNode) parentTreeNode).Tag).Return(parent).Repeat.Any(); + Expect.Call(((ITreeNode) parentTreeNode).IsLoaded).Return(true).Repeat.Any(); + Expect.Call(((ITreeNode) parentTreeNode).Parent).Return(null); + Expect.Call(((ITreeNode) parentTreeNode).Nodes).Return(subNodes).Repeat.Any(); + Expect.Call(((ITreeNode) parentTreeNode).Presenter).Return(parentNodePresenter).Repeat.Any(); + + childTreeNode.HasChildren = false; + Expect.Call(((ITreeNode) childTreeNode).Tag).Return(child).Repeat.Any(); + Expect.Call(((ITreeNode) childTreeNode).IsLoaded).Return(false).Repeat.Any(); + Expect.Call(((ITreeNode) childTreeNode).Parent).Return(parentTreeNode).Repeat.Any(); + Expect.Call(((ITreeNode) childTreeNode).Nodes).Return(new List()).Repeat.Any(); + Expect.Call(((ITreeNode) childTreeNode).Presenter).Return(childNodePresenter).Repeat.Any(); + + parentNodePresenter.TreeView = treeview; + Expect.Call(parentNodePresenter.NodeTagType).Return(typeof(Parent)).Repeat.Any(); + Expect.Call(parentNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(new[] + { + child + }).Repeat.Any(); + + childNodePresenter.TreeView = treeview; + Expect.Call(childNodePresenter.NodeTagType).Return(typeof(Child)).Repeat.Any(); + Expect.Call(childNodePresenter.GetChildNodeObjects(null, null)).IgnoreArguments().Return(Enumerable.Empty()).Repeat.Any(); + + // expect 1 update call for the parent & child + Expect.Call(() => parentNodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + Expect.Call(() => childNodePresenter.UpdateNode(null, null, null)).IgnoreArguments(); + + mocks.ReplayAll(); + + var controller = new TreeViewController(treeview); + controller.NodePresenters.Add(parentNodePresenter); + controller.NodePresenters.Add(childNodePresenter); + + controller.UpdateNode(parentTreeNode); + + mocks.VerifyAll(); + } + + [Test] + public void TestCanRenameNode() + { + var mocks = new MockRepository(); + var treeview = mocks.StrictMock(); + var treeNode = mocks.StrictMock(); + var nodePresenter = mocks.StrictMock(); + var tag = new object(); + + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + Expect.Call(treeNode.Tag).Return(tag).Repeat.Any(); + Expect.Call(treeNode.Presenter).Return(null).Repeat.Once(); + Expect.Call(treeNode.Presenter).Return(nodePresenter).Repeat.Once(); + + nodePresenter.TreeView = treeview; + //Expect.Call(nodePresenter.IsPresenterForNode(null)).IgnoreArguments().Return(true); + Expect.Call(nodePresenter.NodeTagType).Return(typeof(object)).Repeat.Any(); + + // node presenter decides if a node can be renamed + Expect.Call(nodePresenter.CanRenameNode(null)).IgnoreArguments().Return(true); + + mocks.ReplayAll(); + + var presenter = new TreeViewController(treeview); + + // no node + Assert.IsFalse(presenter.CanRenameNode(null)); + + // no node presenter + Assert.IsFalse(presenter.CanRenameNode(treeNode)); + + presenter.NodePresenters.Add(nodePresenter); + + // node presenter decides + Assert.IsTrue(presenter.CanRenameNode(treeNode)); + + mocks.VerifyAll(); + } + + [Test] + public void TestCanDeleteNode() + { + var mocks = new MockRepository(); + var nodePresenter = mocks.StrictMock(); + var treeNode = mocks.StrictMock(); + var treeview = mocks.StrictMock(); + var tag = new object(); + + nodePresenter.TreeView = treeview; + //Expect.Call(nodePresenter.IsPresenterForNode(null)).IgnoreArguments().Return(true); + Expect.Call(nodePresenter.NodeTagType).Return(typeof(object)).Repeat.Any(); + + // node presenter decides if a node can be removed + Expect.Call(nodePresenter.CanRemove(null, null)).IgnoreArguments().Return(true); + + Expect.Call(treeview.GetNodeByTag(null)).IgnoreArguments().Return(null).Repeat.Any(); + Expect.Call(treeNode.Tag).Return(tag).Repeat.Any(); + Expect.Call(treeNode.Parent).Return(null); + Expect.Call(treeNode.Presenter).Return(null).Repeat.Once(); + Expect.Call(treeNode.Presenter).Return(nodePresenter).Repeat.Once(); + + mocks.ReplayAll(); + + var controller = new TreeViewController(treeview); + + // no node + Assert.IsFalse(controller.CanDeleteNode(null)); + + // no node presenter + Assert.IsFalse(controller.CanDeleteNode(treeNode)); + + controller.NodePresenters.Add(nodePresenter); + + // node presenter decides + Assert.IsTrue(controller.CanDeleteNode(treeNode)); + + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewNodePresenterBaseTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewNodePresenterBaseTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewNodePresenterBaseTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,322 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using DelftTools.Controls; +using DelftTools.Controls.Swf.TreeViewControls; +using DelftTools.TestUtils; +using DelftTools.Utils.Aop; +using DelftTools.Utils.Aop.Markers; +using DelftTools.Utils.Collections; +using DelftTools.Utils.Collections.Generic; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf.TreeViewControls +{ + [TestFixture] + public class TreeViewNodePresenterBaseTest + { + private static IEnumerable GetAllNodes(IEnumerable nodes) + { + var result = new List(); + if (nodes == null) + { + return result; + } + + foreach (var node in nodes) + { + result.Add(node); + result.AddRange(GetAllNodes(node.Nodes)); + } + return result; + } + + #region Remove + + [Test] + public void OnCollectionRemoveWithCollectionBasedNodePresenter() + { + var group = new TestGroup(); + var child1 = new TestPerson + { + Name = "child1" + }; + var child2 = new TestPerson + { + Name = "child2" + }; + group.Children.Add(child1); + group.Children.Add(child2); + + using (var treeView = new TreeView()) + { + treeView.NodePresenters.Add(new GroupNodePresenterUsingCollection()); + treeView.NodePresenters.Add(new PersonNodePresenter()); + treeView.Data = group; + + WindowsFormsTestHelper.Show(treeView); + + Assert.AreEqual(3, GetAllNodes(treeView.Nodes).Count()); + + group.Children.Remove(child1); + + treeView.WaitUntilAllEventsAreProcessed(); + + Assert.AreEqual(2, GetAllNodes(treeView.Nodes).Count()); + + WindowsFormsTestHelper.CloseAll(); + } + } + + [Test] + public void ModifyCollectionShouldUpdateNodeHasChildren() + { + var group = new TestGroup(); + var child1 = new TestPerson + { + Name = "child1" + }; + group.Children.Add(child1); + + using (var treeView = new TreeView()) + { + treeView.NodePresenters.Add(new GroupNodePresenterUsingCollection()); + treeView.NodePresenters.Add(new PersonNodePresenter()); + treeView.Data = group; + + var groupNode = (TreeNode) treeView.Nodes[0]; + Assert.AreEqual(true, groupNode.HasChildren); + + WindowsFormsTestHelper.Show(treeView); + + group.Children.Remove(child1); + + treeView.WaitUntilAllEventsAreProcessed(); + + Assert.AreEqual(false, groupNode.HasChildren); + + group.Children.Add(child1); + + treeView.WaitUntilAllEventsAreProcessed(); + + Assert.AreEqual(true, groupNode.HasChildren); + + WindowsFormsTestHelper.CloseAll(); + } + } + + [Test] + public void OnCollectionRemoveWithPropertyBasedNodePresenter() + { + var group = new TestGroup(); + var child1 = new TestPerson + { + Name = "child1" + }; + var child2 = new TestPerson + { + Name = "child2" + }; + group.Children.Add(child1); + group.Children.Add(child2); + + using (var treeView = new TreeView()) + { + treeView.NodePresenters.Add(new GroupNodePresenterUsingProperty()); + treeView.NodePresenters.Add(new PersonNodePresenter()); + treeView.Data = group; + + WindowsFormsTestHelper.Show(treeView); + + Assert.AreEqual(3, GetAllNodes(treeView.Nodes).Count()); + + group.Children.Remove(child1); + + treeView.WaitUntilAllEventsAreProcessed(); + + Assert.AreEqual(2, GetAllNodes(treeView.Nodes).Count()); + + WindowsFormsTestHelper.CloseAll(); + } + } + + [Test] + public void OnWrongCollectionRemove() + { + var group = new TestGroup(); + var person = new TestPerson + { + Name = "adolecent" + }; + group.Children.Add(person); + group.Adults.Add(person); + + using (var treeView = new TreeView()) + { + treeView.NodePresenters.Add(new GroupNodePresenterUsingCollection()); + treeView.NodePresenters.Add(new PersonNodePresenter()); + treeView.Data = group; + + Assert.AreEqual(2, GetAllNodes(treeView.Nodes).Count()); + + group.Adults.Remove(person); + + Assert.AreEqual(2, GetAllNodes(treeView.Nodes).Count()); + } + } + + #endregion Remove + + #region Add + + [Test] + public void OnCollectionAddWithCollectionBasedNodePresenter() + { + var group = new TestGroup(); + var child1 = new TestPerson + { + Name = "child1" + }; + var child2 = new TestPerson + { + Name = "child2" + }; + + using (var treeView = new TreeView()) + { + treeView.NodePresenters.Add(new GroupNodePresenterUsingCollection()); + treeView.NodePresenters.Add(new PersonNodePresenter()); + treeView.Data = group; + + WindowsFormsTestHelper.Show(treeView); + + group.Children.Add(child1); + + treeView.WaitUntilAllEventsAreProcessed(); + + Assert.AreEqual(2, GetAllNodes(treeView.Nodes).Count()); + + group.Children.Add(child2); + treeView.WaitUntilAllEventsAreProcessed(); + + Assert.AreEqual(3, GetAllNodes(treeView.Nodes).Count()); + + WindowsFormsTestHelper.CloseAll(); + } + } + + [Test] + public void OnCollectionAddWithPropertyBasedNodePresenter() + { + var group = new TestGroup(); + var child1 = new TestPerson + { + Name = "child1" + }; + var child2 = new TestPerson + { + Name = "child2" + }; + + using (var treeView = new TreeView()) + { + treeView.NodePresenters.Add(new GroupNodePresenterUsingProperty()); + treeView.NodePresenters.Add(new PersonNodePresenter()); + treeView.Data = group; + + WindowsFormsTestHelper.Show(treeView); + + Assert.AreEqual(1, GetAllNodes(treeView.Nodes).Count()); + + group.Children.Add(child1); + treeView.WaitUntilAllEventsAreProcessed(); + + Assert.AreEqual(2, GetAllNodes(treeView.Nodes).Count()); + + group.Children.Add(child2); + treeView.WaitUntilAllEventsAreProcessed(); + + Assert.AreEqual(3, GetAllNodes(treeView.Nodes).Count()); + + WindowsFormsTestHelper.CloseAll(); + } + } + + #endregion Add + + #region Test Classes + + [Entity(FireOnCollectionChange = false)] + private class TestPerson + { + public string Name { get; set; } + + [NoNotifyPropertyChange] + public TestGroup TestGroup { get; set; } + } + + [Entity] + private class TestGroup + { + public TestGroup() + { + Children = new EventedList(); + Children.CollectionChanged += CollectionChanged; + Adults = new EventedList(); + Adults.CollectionChanged += CollectionChanged; + } + + public string Name { get; set; } + public IEventedList Children { get; set; } + public IEventedList Adults { get; set; } + + private void CollectionChanged(object sender, NotifyCollectionChangingEventArgs e) + { + if (e.Action == NotifyCollectionChangeAction.Add) + { + ((TestPerson) e.Item).TestGroup = this; + } + else if (e.Action == NotifyCollectionChangeAction.Remove) + { + ((TestPerson) e.Item).TestGroup = null; + } + } + } + + private class GroupNodePresenterUsingCollection : TreeViewNodePresenterBase + { + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, TestGroup nodeData) + { + node.Text = nodeData.Name; + } + + public override IEnumerable GetChildNodeObjects(TestGroup parentNodeData, ITreeNode node) + { + return parentNodeData.Children; + } + } + + private class GroupNodePresenterUsingProperty : TreeViewNodePresenterBase + { + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, TestGroup nodeData) + { + node.Text = nodeData.Name; + } + + public override IEnumerable GetChildNodeObjects(TestGroup parentNodeData, ITreeNode node) + { + return parentNodeData.Children; + } + } + + private class PersonNodePresenter : TreeViewNodePresenterBase + { + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, TestPerson nodeData) + { + node.Text = nodeData.Name; + } + } + + #endregion + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,331 @@ +using System.Collections; +using System.Linq; +using DelftTools.Controls; +using DelftTools.Controls.Swf.TreeViewControls; +using DelftTools.Tests.TestObjects; +using DelftTools.TestUtils; +using NUnit.Framework; +using Rhino.Mocks; +using SharpTestsEx; + +namespace DelftTools.Tests.Controls.Swf.TreeViewControls +{ + [TestFixture] + public class TreeViewTest + { + private readonly MockRepository mockRepository = new MockRepository(); + + /// + /// Assure the correct node is returned containing a specific tag + /// + [Test] + public void GetNodeByTag() + { + var o1 = new object(); + + var treeView = new TreeView(); + ITreeNode node = treeView.NewNode(); + node.Tag = o1; + treeView.Nodes.Add(node); + ITreeNode node1 = treeView.GetNodeByTag(o1); + Assert.AreEqual(node, node1); + } + + /// + /// Assure a nodepresenter is returned that corresponds to the given datatype + /// + [Test] + public void GetNodePresenterForDataType() + { + var presenter = mockRepository.Stub(); + Expect.Call(presenter.NodeTagType).Return(typeof(object)); + var treeView = new TreeView(); + + //treeview is assigned to presenter when it's added to the list of nodepresenters + treeView.NodePresenters.Add(presenter); + Assert.AreEqual(treeView, presenter.TreeView); + + mockRepository.ReplayAll(); + Assert.AreEqual(presenter, treeView.GetTreeViewNodePresenter(new object(), null)); + mockRepository.VerifyAll(); + } + + [Test] + public void HideSelectionIsFalseByDefault() + { + new TreeView().HideSelection.Should().Be.False(); + } + + [Test] + public void RefreshShouldNotRefreshNodesWhichAreNotLoaded() + { + var treeView = new TreeView(); + + var parent = new Parent + { + Name = "parent1" + }; + var child = new Child(); + parent.Children.Add(child); + + var parentNodePresenter = new ParentNodePresenter(); + var childNodePresenter = new ChildNodePresenter(); + + treeView.NodePresenters.Add(parentNodePresenter); + treeView.NodePresenters.Add(childNodePresenter); + + childNodePresenter.AfterUpdate += + delegate { Assert.Fail("Child nodes which are not loaded should not be updated"); }; + + treeView.Refresh(); + } + + [Test] + public void GetAllLoadedNodes() + { + /* + * RootNode + |-LoadedChild + |-NotLoadedChild + |-LoadedChild2 + |-LoadedGrandChild + |-NotLoadedChild2 + |-LoadedGrandChild2 + */ + var treeView = new TreeView(); + + ITreeNode rootNode = new MockTestNode(treeView, true) + { + Text = "RootNode" + }; + var loadedChild = new MockTestNode(treeView, true) + { + Text = "LoadedChild" + }; + rootNode.Nodes.Add(loadedChild); + var notLoadedChild = new MockTestNode(treeView, false) + { + Text = "NotLoadedChild" + }; + rootNode.Nodes.Add(notLoadedChild); + + var loadedChild2 = new MockTestNode(treeView, true) + { + Text = "LoadedChild2" + }; + rootNode.Nodes.Add(loadedChild2); + var loadedGrandChild = new MockTestNode(treeView, true) + { + Text = "LoadedGrandChild" + }; + loadedChild2.Nodes.Add(loadedGrandChild); + + var notLoadedChild2 = new MockTestNode(treeView, false) + { + Text = "NotLoadedChild2" + }; + rootNode.Nodes.Add(notLoadedChild2); + notLoadedChild2.Nodes.Add(new MockTestNode(treeView, true) + { + Text = "LoadedGrandChild2" + }); + //reset the loaded flag. It was set set to true by the previous call + notLoadedChild2.SetLoaded(false); + + treeView.Nodes.Add(rootNode); + + Assert.AreEqual( + new[] + { + rootNode, + loadedChild, + notLoadedChild, + loadedChild2, + loadedGrandChild, + notLoadedChild2 + }, + treeView.AllLoadedNodes.ToArray()); + } + + [Test] + public void NodeShouldRememberExpansionHistory() + { + // create tree view with 3 nodes + // + // node1 + // node2 + // node3 + var treeView = new TreeView(); + + var node1 = treeView.NewNode(); + + var node2 = treeView.NewNode(); + node1.Nodes.Add(node2); + + var node3 = treeView.NewNode(); + node2.Nodes.Add(node3); + + treeView.Nodes.Add(node1); + + // expand all nodes + treeView.ExpandAll(); + + // collapse and expand root node + node1.Collapse(); + node1.Expand(); + + // asserts + Assert.IsTrue(node2.IsExpanded, "node2 should remain expanded after parent node is collapsed/expanded"); + } + + [Test] + public void NodeCreatedWithNodePresentersShouldRememberExpansionHistory() + { + // n1 + // n2 + // n3 + var parent = new Child + { + Name = "n1", Children = + { + new Child + { + Name = "n2", Children = + { + new Child + { + Name = "n3" + } + } + } + } + }; + + var treeView = new TreeView + { + NodePresenters = + { + new ChildNodePresenter() + }, + Data = parent + }; + + // expand / collapse / expand + treeView.ExpandAll(); + + treeView.Nodes[0].Collapse(); + treeView.Nodes[0].Expand(); + + // checks + Assert.IsTrue(treeView.Nodes[0].Nodes[0].IsExpanded, "n2 remains expanded after collapse / expand of parent node"); + } + + [Test] + public void AddChildNodes() + { + var treeView = new TreeView(); + + var node1 = treeView.NewNode(); + treeView.Nodes.Add(node1); + + var node2 = treeView.NewNode(); + var node3 = treeView.NewNode(); + node1.Nodes.Add(node2); + node1.Nodes.Add(node3); + + node1.Nodes.Count + .Should().Be.EqualTo(2); + } + + [Test] + public void NodesAreNotClearedAfterExpand() + { + var treeView = new TreeView(); + + var node1 = treeView.NewNode(); + treeView.Nodes.Add(node1); + + var node2 = treeView.NewNode(); + var node3 = treeView.NewNode(); + node1.Nodes.Add(node2); + node1.Nodes.Add(node3); + + node1.Expand(); + + node1.Nodes.Count + .Should().Be.EqualTo(2); + } + + [Test] + public void SelectedNodeSetToRootNodeAfterDataSet() + { + var treeView = new TreeView + { + NodePresenters = + { + new ParentNodePresenter() + } + }; + + var rootObject = new Parent(); + + // set data to tree view + treeView.Data = rootObject; + + treeView.SelectedNode.Should().Not.Be.Null(); + treeView.SelectedNode.Tag.Should().Be.SameInstanceAs(rootObject); + } + + /// + /// In some cases every refresh of the tree view returns a new object as a child item (e.g. folder which does not exist in the Data objects). + /// + /// Actually this is a design problem, objects which do not exist in the + /// + [Test] + public void TreeNodesRemainExpandedForDynamicNodes() + { + var treeView = new TreeView + { + NodePresenters = + { + new DynamicParentNodePresenter(), + new ChildNodePresenter() + } + }; + + var parent = new Parent(); + treeView.Data = parent; + + WindowsFormsTestHelper.Show(treeView); // show it to make sure that expand / refresh node really loads nodes. + + treeView.ExpandAll(); + treeView.Refresh(); + + // asserts + treeView.Nodes[0].Nodes[0].IsExpanded.Should("node remains expanded").Be.True(); + } + + private class DynamicParentNodePresenter : TreeViewNodePresenterBase + { + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, Parent nodeData) + { + node.Text = nodeData.Name; + } + + public override IEnumerable GetChildNodeObjects(Parent parentNodeData, ITreeNode node) + { + // always returns a single child with the same name + yield return new Child + { + Name = "child", Children = + { + new Child + { + Name = "grandchild" + } + } + }; + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/UndoRedoTestClasses/Child.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/UndoRedoTestClasses/Child.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/UndoRedoTestClasses/Child.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,45 @@ +using DelftTools.Utils.Aop; +using DelftTools.Utils.Editing; + +namespace DelftTools.Tests.Controls.Swf.UndoRedoTestClasses +{ + [Entity(FireOnCollectionChange = false)] + public class Child : IEditableObject + { + public string Name { get; set; } + + public bool IsEditing { get; private set; } + + public bool EditWasCancelled + { + get + { + return false; + } + } + + public IEditAction CurrentEditAction { get; private set; } + + public override string ToString() + { + return Name; + } + + public void BeginEdit(IEditAction action) + { + CurrentEditAction = action; + IsEditing = true; + } + + public void EndEdit() + { + IsEditing = false; + CurrentEditAction = null; + } + + public void CancelEdit() + { + EndEdit(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/UndoRedoTestClasses/Parent.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/UndoRedoTestClasses/Parent.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/UndoRedoTestClasses/Parent.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,50 @@ +using DelftTools.Utils.Aop; +using DelftTools.Utils.Aop.Markers; +using DelftTools.Utils.Collections.Generic; +using DelftTools.Utils.Editing; + +namespace DelftTools.Tests.Controls.Swf.UndoRedoTestClasses +{ + [Entity] + public class Parent : IEditableObject + { + public Parent() + { + Children = new EventedList(); + } + + public IEventedList Children { get; set; } + + public string Name { get; set; } + + public bool IsEditing { get; set; } + + public bool EditWasCancelled + { + get + { + return false; + } + } + + [NoNotifyPropertyChange] + public IEditAction CurrentEditAction { get; private set; } + + public void BeginEdit(IEditAction action) + { + CurrentEditAction = action; + IsEditing = true; + } + + public void EndEdit() + { + IsEditing = false; + CurrentEditAction = null; + } + + public void CancelEdit() + { + EndEdit(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/WindowsFormsHelperTests.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/WindowsFormsHelperTests.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Controls/Swf/WindowsFormsHelperTests.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,18 @@ +using System.Windows.Forms; +using DelftTools.Controls; +using DelftTools.Controls.Swf; +using NUnit.Framework; + +namespace DelftTools.Tests.Controls.Swf +{ + [TestFixture] + public class WindowsFormsHelperTests + { + [Test] + public void DragDropEffectsFromDragOperation() + { + Assert.AreEqual(DragDropEffects.Move, WindowsFormsHelper.ToDragDropEffects(DragOperations.Move)); + Assert.AreEqual(DragDropEffects.None, WindowsFormsHelper.ToDragDropEffects(DragOperations.None)); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Core.Common.DelftTools.Tests.csproj =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Core.Common.DelftTools.Tests.csproj (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Core.Common.DelftTools.Tests.csproj (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,251 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {FAFDB463-9612-41F4-B3DD-FF9C6E7023BA} + Library + Properties + DelftTools.Tests + DelftTools.Tests + v4.0 + 512 + + + 3.5 + + false + false + + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + True + + + true + bin\Debug\ + 4 + x86 + MinimumRecommendedRules.ruleset + TRACE;DEBUG + + + bin\Release\ + 4 + x86 + MinimumRecommendedRules.ruleset + TRACE + true + + + + ..\..\..\lib\DevExpress.Data.v9.3.dll + + + ..\..\..\lib\DevExpress.Utils.v9.3.dll + + + ..\..\..\lib\DevExpress.XtraEditors.v9.3.dll + + + ..\..\..\lib\DevExpress.XtraGrid.v9.3.dll + + + False + ..\..\..\lib\log4net.dll + + + False + ..\..\..\lib\nunit.framework.dll + + + ..\..\..\packages\PostSharp.2.1.7.28\lib\net20\PostSharp.dll + + + False + ..\..\..\lib\Rhino.Mocks.dll + + + ..\..\..\lib\SharpTestsEx.dll + + + + + 3.5 + + + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {30E4C2AE-719E-4D70-9FA9-668A9767FBFA} + Core.Common.Gui + + + {016DBD27-99BF-489A-81B5-50D66964BB90} + Core.GIS.GeoApi.Extensions + + + {FFB69466-79DE-466A-ADA7-5C47C5C5CA3A} + Core.GIS.GeoApi + + + {3DBD23CE-5C4A-4A49-B51C-B268CB2B510E} + Core.Common.Controls.Swf + + + {9A2D67E6-26AC-4D17-B11A-2B4372F2F572} + Core.Common.Controls + + + {82B61D20-FD4B-49BE-9252-5BF6E3EE4666} + Core.Common.BaseDelftTools + + + {08205620-D756-4533-922C-D6A4C0038535} + Core.Common.Gui.Swf + + + {A3C9DF74-978A-44B1-B55D-A72AC4221E3A} + SharpMap.Api + + + {C83777FC-AABB-47D9-911F-D76255D4D541} + SharpMap + + + {EFA25023-CF6A-4FF7-8C42-B24D7F9509E1} + Core.Common.TestUtils + + + {F49BD8B2-332A-4C91-A196-8CCE0A2C7D98} + Core.Common.Utils + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/ModelBaseStub.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/ModelBaseStub.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/ModelBaseStub.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,23 @@ +using DelftTools.Shell.Core.Workflow; + +namespace DelftTools.Tests.Core.Mocks +{ + // TODO: Remove this "stub" and use real stubs in the tests + public class ModelBaseStub : ModelBase + { + protected override void OnInitialize() + { + + } + + protected override bool OnExecute() + { + return true; + } + + public void SetOutputOutOfSync() + { + MarkOutputOutOfSync(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/ModelBaseTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/ModelBaseTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/ModelBaseTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,57 @@ +using DelftTools.Tests.Core.Mocks; +using NUnit.Framework; + +namespace DelftTools.Tests.Core.WorkFlow +{ + [TestFixture] + public class ModelBaseTest + { + [Test] + public void TestOutputIsEmpty() + { + // Create a model base model: OutputIsEmpty should be true + var modelBase = new ModelBaseStub(); + Assert.IsTrue(modelBase.OutputIsEmpty); + + // Run the model: OutputIsEmpty should become false + modelBase.Execute(); + Assert.IsFalse(modelBase.OutputIsEmpty); + + // Clear the output: OutputIsEmpty should become true + modelBase.ClearOutput(); + Assert.IsTrue(modelBase.OutputIsEmpty); + } + + [Test] + public void TestOutputIsOutOfSync() + { + // Create a model base model: OutputOutOfSync should be false + var modelBase = new ModelBaseStub(); + Assert.IsFalse(modelBase.OutputOutOfSync); + + // Mark output out of sync: OutputOutOfSync should still be false => no output yet + modelBase.SetOutputOutOfSync(); + Assert.IsFalse(modelBase.OutputOutOfSync); + + // Run the model: OutputOutOfSync should still be false + modelBase.Execute(); + Assert.IsFalse(modelBase.OutputOutOfSync); + + // Mark output out of sync: OutputOutOfSync should be true + modelBase.SetOutputOutOfSync(); + Assert.IsTrue(modelBase.OutputOutOfSync); + + // Run the model again: OutputOutOfSync should become false => new output + modelBase.Execute(); + Assert.IsFalse(modelBase.OutputOutOfSync); + + // Mark output out of sync: OutputOutOfSync should be true + modelBase.SetOutputOutOfSync(); + Assert.IsTrue(modelBase.OutputOutOfSync); + + // Clear the output: OutputOutOfSync should become false again => no output left + modelBase.ClearOutput(); + Assert.IsFalse(modelBase.OutputOutOfSync); + } + } +} Index: Core/Common/test/Core.Common.DelftTools.Tests/ProjectStructureValidation.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/ProjectStructureValidation.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/ProjectStructureValidation.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,57 @@ +using System.IO; +using System.Linq; +using DelftTools.TestUtils; +using DelftTools.Utils.IO; +using log4net; +using NUnit.Framework; + +namespace DelftTools.Tests +{ + [TestFixture] + public class ProjectStructureValidation + { + private static readonly ILog log = LogManager.GetLogger(typeof(ProjectStructureValidation)); + + private static readonly string[] ignoreList = new[] + { + ".svn", + "bin" + }; // TODO: should not be required to put .svn here! + + [Test] + [Ignore("WIP")] + public void ValidateTestTreeHasSameStructureAsSrc() + { + LogHelper.ConfigureLogging(); + ValidateDirectoriesAreMirrored(@"..\..\..\..\..\src", @"..\..\..\..\..\test"); + } + + private static void ValidateDirectoriesAreMirrored(string sourceDir, string mirrorDir) + { + //brearth first directory structure matching + //validate local directory structure + //check if each dir of the mirror is available in source + var relativeSourceSubDirectories = FileUtils.GetDirectoriesRelative(sourceDir); + var relativeMirrorSubDirectories = FileUtils.GetDirectoriesRelative(mirrorDir); + log.DebugFormat("Comparing {0} to {1}", sourceDir, mirrorDir); + + foreach (string mirrorSubDir in relativeMirrorSubDirectories) + { + if (!relativeSourceSubDirectories.Contains(mirrorSubDir)) + { + Assert.Fail("Directory \n {0} \n does not exist in \n {1} \n but does exist in mirror \n {2} ", Path.GetFullPath(Path.Combine(mirrorDir, mirrorSubDir)) + , Path.GetFullPath(sourceDir), Path.GetFullPath(mirrorDir)); + } + } + //traverse into the subdirs of the mirror which are not in our ignore list + var subdirs = from d in Directory.GetDirectories(mirrorDir) + where !ignoreList.Any(d.EndsWith) + select d; + foreach (string mirrorSubDir in subdirs) + { + var sourceSubDir = mirrorSubDir.Replace(mirrorDir, sourceDir); + ValidateDirectoriesAreMirrored(sourceSubDir, mirrorSubDir); + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Properties/AssemblyInfo.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Properties/AssemblyInfo.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Properties/AssemblyInfo.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,41 @@ +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +using System.Reflection; +using System.Runtime.InteropServices; +using NUnit.Framework; + +[assembly: AssemblyTitle("DelftTools.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Deltares")] +[assembly: AssemblyProduct("DelftTools.Tests")] +[assembly: AssemblyCopyright("Copyright © Deltares 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("2eaa90e8-ad27-4130-919b-4a043f2526cb")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: RequiresSTA] \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Properties/Resources.Designer.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Properties/Resources.Designer.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Properties/Resources.Designer.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.18444 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DelftTools.Tests.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DelftTools.Tests.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap alarm_clock_blue { + get { + object obj = ResourceManager.GetObject("alarm_clock_blue", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} Index: Core/Common/test/Core.Common.DelftTools.Tests/Properties/Resources.resx =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Properties/Resources.resx (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Properties/Resources.resx (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\alarm-clock-blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Resources/alarm-clock-blue.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ApplicationPluginTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ApplicationPluginTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ApplicationPluginTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,125 @@ +using System; +using System.Linq; +using DelftTools.Shell.Core; +using NUnit.Framework; + +namespace DelftTools.Tests.Shell.Core +{ + [TestFixture] + public class ApplicationPluginTest + { + [Test] + public void DefaultConstructor_ExpectedValues() + { + // call + var applicationPlugin = new SimpleApplicationPlugin(); + + // assert + Assert.IsFalse(applicationPlugin.IsActive); + Assert.IsNull(applicationPlugin.Image); + Assert.IsNull(applicationPlugin.Resources); + Assert.IsNull(applicationPlugin.Application); + } + + [Test] + public void GetFileImporters_ReturnEmptyEnummerable() + { + // setup + var applicationPlugin = new SimpleApplicationPlugin(); + + // call + var importers = applicationPlugin.GetFileImporters().ToArray(); + + // assert + CollectionAssert.IsEmpty(importers); + } + + [Test] + public void GetFileExporters_ReturnEmptyEnummerable() + { + // setup + var applicationPlugin = new SimpleApplicationPlugin(); + + // call + var importers = applicationPlugin.GetFileExporters().ToArray(); + + // assert + CollectionAssert.IsEmpty(importers); + } + + [Test] + public void GetDataItemInfos_ReturnEmptyEnummerable() + { + // setup + var applicationPlugin = new SimpleApplicationPlugin(); + + // call + var importers = applicationPlugin.GetDataItemInfos().ToArray(); + + // assert + CollectionAssert.IsEmpty(importers); + } + + [Test] + public void Activate_PluginWasNotActivated_SetIsActiveTrue() + { + // setup + var applicationPlugin = new SimpleApplicationPlugin(); + + // call + applicationPlugin.Activate(); + + // assert + Assert.IsTrue(applicationPlugin.IsActive); + } + + [Test] + public void Deactivate_PluginWasActivated_SetIsActiveFalse() + { + // setup + var applicationPlugin = new SimpleApplicationPlugin(); + applicationPlugin.Activate(); + + // call + applicationPlugin.Deactivate(); + + // assert + Assert.IsFalse(applicationPlugin.IsActive); + } + } + + internal class SimpleApplicationPlugin : ApplicationPlugin + { + public override string Name + { + get + { + throw new NotImplementedException(); + } + } + + public override string DisplayName + { + get + { + throw new NotImplementedException(); + } + } + + public override string Description + { + get + { + throw new NotImplementedException(); + } + } + + public override string Version + { + get + { + throw new NotImplementedException(); + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/DataItemInfoTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/DataItemInfoTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/DataItemInfoTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,147 @@ +using System.Drawing; +using DelftTools.Shell.Core; +using DelftTools.Tests.Properties; +using NUnit.Framework; + +namespace DelftTools.Tests.Shell.Core +{ + [TestFixture] + public class DataItemInfoTest + { + [Test] + public void DefaultConstructor_NonGeneric_ExpectedValues() + { + // call + var info = new DataItemInfo(); + + // assert + Assert.IsNull(info.ValueType); + Assert.IsNull(info.Name); + Assert.IsNull(info.Category); + Assert.IsNull(info.Image); + Assert.IsNull(info.AdditionalOwnerCheck); + Assert.IsNull(info.CreateData); + Assert.IsNull(info.AddExampleData); + } + + [Test] + public void DefaultConstructor_Generic_ExpectedValues() + { + // call + var info = new DataItemInfo(); + + // assert + Assert.AreEqual(typeof(double), info.ValueType); + Assert.IsNull(info.Name); + Assert.IsNull(info.Category); + Assert.IsNull(info.Image); + Assert.IsNull(info.AdditionalOwnerCheck); + Assert.IsNull(info.CreateData); + Assert.IsNull(info.AddExampleData); + } + + [Test] + public void GetSetAutomaticProperties_NonGeneric_ExpectedBehavior() + { + // setup & call + bool addExampleDataCalled = false; + var info = new DataItemInfo + { + ValueType = typeof(double), + Name = "Some double", + Category = "Nice category", + Image = new Bitmap(Resources.alarm_clock_blue), + AdditionalOwnerCheck = o => true, + CreateData = o => 1.2, + AddExampleData = delegate { addExampleDataCalled = true; } + }; + info.AddExampleData(null); + + // assert + Assert.AreEqual(typeof(double), info.ValueType); + Assert.AreEqual("Some double", info.Name); + Assert.AreEqual("Nice category", info.Category); + Assert.IsNotNull(info.Image); + Assert.IsTrue(info.AdditionalOwnerCheck(null)); + Assert.AreEqual(1.2, info.CreateData(null)); + Assert.IsTrue(addExampleDataCalled); + } + + [Test] + public void GetSetAutomaticProperties_Generic_ExpectedBehavior() + { + // setup & call + bool addExampleDataNotCalled = true; + var info = new DataItemInfo + { + Name = "Some integer", + Category = "Better category", + Image = new Bitmap(Resources.alarm_clock_blue), + AdditionalOwnerCheck = o => false, + CreateData = o => -1, + AddExampleData = delegate { addExampleDataNotCalled = false; } + }; + info.AddExampleData(1); + + // assert + Assert.AreEqual(typeof(int), info.ValueType); + Assert.AreEqual("Some integer", info.Name); + Assert.AreEqual("Better category", info.Category); + Assert.IsNotNull(info.Image); + Assert.IsFalse(info.AdditionalOwnerCheck(null)); + Assert.AreEqual(-1, info.CreateData(null)); + Assert.IsFalse(addExampleDataNotCalled); + } + + [Test] + public void ImplicitConversion_FromGenericToNonGeneric_ShouldCopyValues() + { + // setup + bool addExampleDataCalled = false; + var info = new DataItemInfo + { + Name = "Some integer", + Category = "Better category", + Image = new Bitmap(Resources.alarm_clock_blue), + AdditionalOwnerCheck = o => false, + CreateData = o => -1, + AddExampleData = delegate { addExampleDataCalled = true; } + }; + + // call + var nonGenericInfo = (DataItemInfo) info; + + // assert + Assert.AreEqual(info.ValueType, nonGenericInfo.ValueType); + Assert.AreEqual(info.Name, nonGenericInfo.Name); + Assert.AreEqual(info.Category, nonGenericInfo.Category); + Assert.AreEqual(info.AdditionalOwnerCheck(1), nonGenericInfo.AdditionalOwnerCheck(1)); + Assert.AreEqual(info.CreateData(null), nonGenericInfo.CreateData(null)); + nonGenericInfo.AddExampleData(1); + Assert.IsTrue(addExampleDataCalled); + } + + [Test] + public void ImplicitConversion_FromGenericToNonGenericWithoutMethodsSet_MethodsShouldBeNull() + { + // setup + var info = new DataItemInfo + { + Name = "Some integer", + Category = "Better category", + Image = new Bitmap(Resources.alarm_clock_blue) + }; + + // call + var nonGenericInfo = (DataItemInfo) info; + + // assert + Assert.AreEqual(info.ValueType, nonGenericInfo.ValueType); + Assert.AreEqual(info.Name, nonGenericInfo.Name); + Assert.AreEqual(info.Category, nonGenericInfo.Category); + Assert.IsNull(nonGenericInfo.AdditionalOwnerCheck); + Assert.IsNull(nonGenericInfo.CreateData); + Assert.IsNull(nonGenericInfo.AddExampleData); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/Extensions/CompositeActivityExtensionsTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/Extensions/CompositeActivityExtensionsTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/Extensions/CompositeActivityExtensionsTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,179 @@ +using System.Linq; +using DelftTools.Shell.Core.Extensions; +using DelftTools.Shell.Core.Workflow; +using DelftTools.Utils.Collections.Generic; +using NUnit.Framework; +using Rhino.Mocks; + +namespace DelftTools.Tests.Shell.Core.Extensions +{ + [TestFixture] + public class CompositeActivityExtensionsTest + { + [Test] + public void GetAllActivitiesRecursive_CompositeActivityWithoutChildren_ReturnOnlyCompositeActivity() + { + // setup + var activitiesList = new EventedList(); + + var mocks = new MockRepository(); + var compositeActivityMock = mocks.StrictMock(); + compositeActivityMock.Expect(ca => ca.Activities).Return(activitiesList); + mocks.ReplayAll(); + + // call + var allActivities = compositeActivityMock.GetAllActivitiesRecursive().ToArray(); + + // assert + CollectionAssert.AreEqual(new[] + { + compositeActivityMock + }, allActivities); + mocks.VerifyAll(); + } + + [Test] + public void GetAllActivitiesRecursive_CompositeActivityWithoutChildrenNotMatchingRequestedActivityType_ReturnEmptyEnummerable() + { + // setup + var activitiesList = new EventedList(); + + var mocks = new MockRepository(); + var compositeActivityMock = mocks.StrictMock(); + compositeActivityMock.Expect(ca => ca.Activities).Return(activitiesList); + mocks.ReplayAll(); + + // call + var allActivities = compositeActivityMock.GetAllActivitiesRecursive().ToArray(); + + // assert + CollectionAssert.IsEmpty(allActivities); + mocks.VerifyAll(); + } + + [Test] + public void GetAllActivitiesRecursive_CompositeActivityWithChildren_ReturnCompositeActivityAndChildren() + { + // setup + var activitiesList = new EventedList(); + + var mocks = new MockRepository(); + var compositeActivityMock = mocks.StrictMock(); + compositeActivityMock.Expect(ca => ca.Activities).Return(activitiesList); + var childActivity1 = mocks.StrictMock(); + var childActivity2 = mocks.StrictMock(); + mocks.ReplayAll(); + + activitiesList.AddRange(new[] + { + childActivity1, + childActivity2 + }); + + // call + var allActivities = compositeActivityMock.GetAllActivitiesRecursive().ToArray(); + + // assert + var expected = new[] + { + compositeActivityMock, + childActivity1, + childActivity2 + }; + CollectionAssert.AreEqual(expected, allActivities); + mocks.VerifyAll(); + } + + [Test] + public void GetAllActivitiesRecursive_CompositeActivityWithSomeChildrenMatching_ReturnOnlyMatchingChildren() + { + // setup + var activitiesList = new EventedList(); + + var mocks = new MockRepository(); + var compositeActivityMock = mocks.StrictMock(); + compositeActivityMock.Expect(ca => ca.Activities).Return(activitiesList); + var childActivity1 = mocks.StrictMock(); + var childActivity2 = mocks.StrictMock(); + mocks.ReplayAll(); + + activitiesList.AddRange(new[] + { + childActivity1, + childActivity2 + }); + + // call + var allActivities = compositeActivityMock.GetAllActivitiesRecursive().ToArray(); + + // assert + CollectionAssert.AreEqual(new[] + { + childActivity2 + }, allActivities); + mocks.VerifyAll(); + } + + [Test] + public void GetAllActivitiesRecursive_NestedCompositeActivities_ReturnAllActivities() + { + // setup + var activitiesList1 = new EventedList(); + var activitiesList2 = new EventedList(); + var activitiesList3 = new EventedList(); + + var mocks = new MockRepository(); + var compositeActivityMock1 = mocks.StrictMock(); + compositeActivityMock1.Expect(ca => ca.Activities).Return(activitiesList1); + + var childActivity1 = mocks.StrictMock(); + childActivity1.Expect(ca => ca.Activities).Return(activitiesList2); + + var childActivity2 = mocks.StrictMock(); + childActivity2.Expect(ca => ca.Activities).Return(activitiesList3); + + var sub1ChildActivity1 = mocks.StrictMock(); + var sub1ChildActivity2 = mocks.StrictMock(); + + var sub2ChildActivity1 = mocks.StrictMock(); + var sub2ChildActivity2 = mocks.StrictMock(); + + mocks.ReplayAll(); + + activitiesList1.AddRange(new[] + { + childActivity1, + childActivity2 + }); + activitiesList2.AddRange(new[] + { + sub1ChildActivity1, + sub1ChildActivity2 + }); + activitiesList3.AddRange(new[] + { + sub2ChildActivity1, + sub2ChildActivity2 + }); + + // call + var allActivities = compositeActivityMock1.GetAllActivitiesRecursive().ToArray(); + + // assert + var expected = new[] + { + compositeActivityMock1, + childActivity1, + sub1ChildActivity1, + sub1ChildActivity2, + childActivity2, + sub2ChildActivity1, + sub2ChildActivity2 + }; + CollectionAssert.AreEqual(expected, allActivities); + mocks.VerifyAll(); + } + + public interface ISomeActivity : IActivity {} + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ObservableListTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ObservableListTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ObservableListTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,63 @@ +using System.Collections.Generic; + +using DelftTools.Shell.Core; + +using NUnit.Framework; + +using Rhino.Mocks; + +namespace DelftTools.Tests.Shell.Core +{ + [TestFixture] + public class ObservableListTest + { + [Test] + public void DefaultConstructor_ExpectedValues() + { + // Call + var list = new ObservableList(); + + // Assert + Assert.IsInstanceOf>(list); + Assert.IsInstanceOf(list); + } + + [Test] + public void NotifyObservers_WithObserverAttached_ObserverIsNotified() + { + // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + observer.Expect(o => o.UpdateObserver()); // Expect to be called once + mocks.ReplayAll(); + + var list = new ObservableList(); + list.Attach(observer); + + // Call + list.NotifyObservers(); + + // Assert + mocks.VerifyAll(); + } + + [Test] + public void NotifyObserver_AttachedObserverDetachedAgain_ObserverNoLongerNotified() + { + // Setup + var mocks = new MockRepository(); + var observer = mocks.StrictMock(); + mocks.ReplayAll(); + + var list = new ObservableList(); + list.Attach(observer); + list.Detach(observer); + + // Call + list.NotifyObservers(); + + // Assert + mocks.VerifyAll(); // Expect no calls on 'observer' + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ProjectTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ProjectTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/ProjectTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,100 @@ +using System.ComponentModel; +using DelftTools.Shell.Core; +using NUnit.Framework; +using Rhino.Mocks; + +namespace DelftTools.Tests.Shell.Core +{ + [TestFixture] + public class ProjectTest + { + [Test] + public void DefaultConstructor_ExpectedValue() + { + // call + var project = new Project(); + + // assert + Assert.IsInstanceOf(project); + Assert.IsInstanceOf(project); + Assert.IsInstanceOf(project); + + Assert.AreEqual("Project", project.Name); + Assert.IsNull(project.Description); + CollectionAssert.IsEmpty(project.Items); + } + + [Test] + public void NameConstructor_SetNameAndInitializeOtherProperties() + { + // setup + const string someName = ""; + + // call + var project = new Project(someName); + + // assert + Assert.AreEqual(someName, project.Name); + Assert.IsNull(project.Description); + CollectionAssert.IsEmpty(project.Items); + } + + [Test] + public void AutomaticProperties_SetAndGettingValue_ShouldReturnSetValue() + { + // setup & Call + const string niceProjectName = "Nice project name"; + const string nicerDescription = "Nicer description"; + + var project = new Project + { + Name = niceProjectName, + Description = nicerDescription, + }; + + // assert + Assert.AreEqual(niceProjectName, project.Name); + Assert.AreEqual(nicerDescription, project.Description); + } + + [Test] + public void NotifyObservers_WithObserverAttached_ObserverIsNotified() + { + // setup + var mocks = new MockRepository(); + var observerMock = mocks.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()); + mocks.ReplayAll(); + + var project = new Project(); + project.Attach(observerMock); + + // call + project.NotifyObservers(); + + // assert + mocks.VerifyAll(); + } + + [Test] + public void NotifyObservers_AttachedObserverHasBeenDetached_ObserverShouldNoLongerBeNotified() + { + // setup + var mocks = new MockRepository(); + var observerMock = mocks.StrictMock(); + observerMock.Expect(o => o.UpdateObserver()).Repeat.Once(); + mocks.ReplayAll(); + + var project = new Project(); + project.Attach(observerMock); + project.NotifyObservers(); + + // call + project.Detach(observerMock); + project.NotifyObservers(); + + // assert + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/UrlTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/UrlTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/UrlTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,27 @@ +using DelftTools.Utils; +using NUnit.Framework; + +namespace DelftTools.Tests.Shell.Core +{ + [TestFixture] + public class UrlTest + { + [Test] + public void Initialization() + { + Url url = new Url("Deltares", "http://www.deltares.com"); + + Assert.AreEqual("Deltares", url.Name); + Assert.AreEqual("http://www.deltares.com", url.Path); + } + + [Test] + public void Cloning() + { + Url url = new Url("Deltares", "http://www.deltares.com"); + Url urlClone = (Url) url.Clone(); + Assert.AreEqual(urlClone.Name, url.Name); + Assert.AreEqual(urlClone.Path, url.Path); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/ActivityRunnerTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/ActivityRunnerTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/ActivityRunnerTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,108 @@ +using System.Threading; +using DelftTools.Shell.Core.Workflow; +using NUnit.Framework; + +namespace DelftTools.Tests.Shell.Core.WorkFlow +{ + [TestFixture] + public class ActivityRunnerTest + { + [Test] + public void ActivityIsRemovedAfterItIsFinished() + { + var activity = new SimpleActivity(); + + var runner = new ActivityRunner(); + runner.Enqueue(activity); + + while (runner.IsRunning) + { + Thread.Sleep(0); + } + + Assert.AreEqual(0, runner.Activities.Count, "Activity is removed from the list of running activities after it is finished"); + } + + [Test] + public void CancelActivityRemovesItFromActivityRunner() + { + var activity = new InfiniteActivity(); + + var runner = new ActivityRunner(); + runner.Enqueue(activity); + + while (activity.Status != ActivityStatus.Executing) + { + Thread.Sleep(1); + } + + runner.Cancel(activity); + + Thread.Sleep(200); // HACK: API should allow some other way + + Assert.AreEqual(0, runner.Activities.Count); + } + + [Test] + public void CancelAllActivitiesRemovesThemFromActivityRunner() + { + var activity = new InfiniteActivity(); + var activity2 = new InfiniteActivity(); + + var runner = new ActivityRunner(); + runner.Enqueue(activity); + runner.Enqueue(activity2); + + while (activity.Status != ActivityStatus.Executing) + { + Thread.Sleep(1); + } + + runner.CancelAll(); + + Thread.Sleep(200); // HACK: API should allow some other way + + Assert.AreEqual(0, runner.Activities.Count); + } + + public class SimpleActivity : Activity + { + public SimpleActivity() + { + Name = "simple activity"; + } + + protected override void OnInitialize() {} + + protected override void OnExecute() + { + Status = ActivityStatus.Done; + } + + protected override void OnCancel() {} + + protected override void OnCleanUp() {} + + protected override void OnFinish() {} + } + } + + public class InfiniteActivity : Activity + { + private bool shouldCancel; + + protected override void OnInitialize() {} + + protected override void OnExecute() + { + Thread.Sleep(100); + Status = ActivityStatus.Done; + } + + protected override void OnCancel() {} + + protected override void OnCleanUp() {} + + protected override void OnFinish() {} + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/ActivityTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/ActivityTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/ActivityTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,379 @@ +using System; +using DelftTools.Shell.Core.Workflow; +using DelftTools.TestUtils; +using NUnit.Framework; + +namespace DelftTools.Tests.Shell.Core.WorkFlow +{ + [TestFixture] + public class ActivityTest + { + [Test] + public void DefaultConstructor_ExpectedValues() + { + // call + var activity = new SimpleActivity(); + + // assert + Assert.IsInstanceOf(activity); + Assert.IsNull(activity.Name); + CollectionAssert.IsEmpty(activity.DependsOn); + Assert.AreEqual(ActivityStatus.None, activity.Status); + Assert.IsNull(activity.ProgressText); + } + + [Test] + public void Name_SetAndGetValue_ReturnSetValue() + { + // setup & call + const string someName = "Some name"; + var activity = new SimpleActivity + { + Name = someName + }; + + // assert + Assert.AreEqual(someName, activity.Name); + } + + [Test] + public void Status_SetNewValue_ChangeStatusAndBroadcastEvent() + { + // setup + int callCount = 0; + const ActivityStatus newStatus = ActivityStatus.Done; + + var activity = new SimpleActivity(); + ActivityStatus originalStatus = activity.Status; + activity.StatusChanged += (sender, args) => + { + callCount++; + Assert.AreEqual(originalStatus, args.OldStatus); + Assert.AreEqual(newStatus, args.NewStatus); + Assert.AreSame(activity, sender); + }; + + // call + activity.SetStatus(newStatus); + + // assert + Assert.AreEqual(newStatus, activity.Status); + Assert.AreEqual(1, callCount); + } + + [Test] + public void Status_SetSameValue_DoNothing() + { + // setup + int callCount = 0; + + var activity = new SimpleActivity(); + ActivityStatus originalStatus = activity.Status; + activity.StatusChanged += (sender, args) => { callCount++; }; + + // call + activity.SetStatus(originalStatus); + + // assert + Assert.AreEqual(originalStatus, activity.Status); + Assert.AreEqual(0, callCount); + } + + [Test] + public void Initialize_ActivityNotYetInitialized_UpdateStatusAndPerformInitialization() + { + // setup + int statusChangeCount = 0; + int onInitializeCallCount = 0; + + var activity = new SimpleActivity + { + OnInitializeInjection = () => onInitializeCallCount++ + }; + ActivityStatus originalStatus = activity.Status; + activity.StatusChanged += (sender, args) => + { + if (statusChangeCount == 0) + { + // 1st transition + Assert.AreEqual(originalStatus, args.OldStatus); + Assert.AreEqual(ActivityStatus.Initializing, args.NewStatus); + } + else if (statusChangeCount == 1) + { + // 2nd transition + Assert.AreEqual(ActivityStatus.Initializing, args.OldStatus); + Assert.AreEqual(ActivityStatus.Initialized, args.NewStatus); + } + else + { + Assert.Fail("Expect 2 status updates."); + } + Assert.AreSame(activity, sender); + + statusChangeCount++; + }; + + // call + activity.Initialize(); + + // assert + Assert.AreEqual(2, statusChangeCount); + Assert.AreEqual(1, onInitializeCallCount); + } + + [Test] + public void Initialize_ActivityNotYetInitializedAndInitalizationCausesException_CatchExceptionAndUpdateStatusToFailedAndLogException() + { + // setup + int statusChangeCount = 0; + const string someErrorMessage = "Some error message"; + + var activity = new SimpleActivity + { + OnInitializeInjection = () => { throw new Exception(someErrorMessage); } + }; + ActivityStatus originalStatus = activity.Status; + activity.StatusChanged += (sender, args) => + { + if (statusChangeCount == 0) + { + // 1st transition + Assert.AreEqual(originalStatus, args.OldStatus); + Assert.AreEqual(ActivityStatus.Initializing, args.NewStatus); + } + else if (statusChangeCount == 1) + { + // 2nd transition + Assert.AreEqual(ActivityStatus.Initializing, args.OldStatus); + Assert.AreEqual(ActivityStatus.Failed, args.NewStatus); + } + else + { + Assert.Fail("Expect 2 status updates."); + } + Assert.AreSame(activity, sender); + + statusChangeCount++; + }; + + // call + Action call = () => activity.Initialize(); + + // assert + TestHelper.AssertLogMessageIsGenerated(call, someErrorMessage, 1); + Assert.AreEqual(2, statusChangeCount); + } + + [Test] + public void Initialize_ActivityNotYetInitializedAndInitializationEncountersError_UpdateStatusAndEarlyExit() + { + // setup + int statusChangeCount = 0; + + var activity = new SimpleActivity(); + + activity.OnInitializeInjection = () => activity.SetStatus(ActivityStatus.Failed); + ActivityStatus originalStatus = activity.Status; + + activity.StatusChanged += (sender, args) => + { + if (statusChangeCount == 0) + { + // 1st transition + Assert.AreEqual(originalStatus, args.OldStatus); + Assert.AreEqual(ActivityStatus.Initializing, args.NewStatus); + } + else if (statusChangeCount == 1) + { + // 2nd transition + Assert.AreEqual(ActivityStatus.Initializing, args.OldStatus); + Assert.AreEqual(ActivityStatus.Failed, args.NewStatus); + } + else + { + Assert.Fail("Expect 2 status updates."); + } + Assert.AreSame(activity, sender); + + statusChangeCount++; + }; + + // call + activity.Initialize(); + + // assert + Assert.AreEqual(2, statusChangeCount); + } + + [Test] + public void Cancel_ActivityNotYetCancelled_UpdateStatusAndPerformCancel() + { + // setup + int statusChangeCount = 0; + int onCancelCallCount = 0; + + var activity = new SimpleActivity + { + OnCancelInjection = () => onCancelCallCount++ + }; + ActivityStatus originalStatus = activity.Status; + activity.StatusChanged += (sender, args) => + { + if (statusChangeCount == 0) + { + // 1st transition + Assert.AreEqual(originalStatus, args.OldStatus); + Assert.AreEqual(ActivityStatus.Cancelling, args.NewStatus); + } + else if (statusChangeCount == 1) + { + // 2nd transition + Assert.AreEqual(ActivityStatus.Cancelling, args.OldStatus); + Assert.AreEqual(ActivityStatus.Cancelled, args.NewStatus); + } + else + { + Assert.Fail("Expect 2 status updates."); + } + Assert.AreSame(activity, sender); + + statusChangeCount++; + }; + + // call + activity.Cancel(); + + // assert + Assert.AreEqual(2, statusChangeCount); + Assert.AreEqual(1, onCancelCallCount); + } + + [Test] + public void Cancel_ActivityNotYetCancelledAndCancellingCausesException_CatchExceptionAndUpdateStatusToFailedAndLogException() + { + // setup + int statusChangeCount = 0; + const string someErrorMessage = "Some error message"; + + var activity = new SimpleActivity + { + OnCancelInjection = () => { throw new Exception(someErrorMessage); } + }; + ActivityStatus originalStatus = activity.Status; + activity.StatusChanged += (sender, args) => + { + if (statusChangeCount == 0) + { + // 1st transition + Assert.AreEqual(originalStatus, args.OldStatus); + Assert.AreEqual(ActivityStatus.Cancelling, args.NewStatus); + } + else if (statusChangeCount == 1) + { + // 2nd transition + Assert.AreEqual(ActivityStatus.Cancelling, args.OldStatus); + Assert.AreEqual(ActivityStatus.Failed, args.NewStatus); + } + else + { + Assert.Fail("Expect 2 status updates."); + } + Assert.AreSame(activity, sender); + + statusChangeCount++; + }; + + // call + Action call = () => activity.Cancel(); + + // assert + TestHelper.AssertLogMessageIsGenerated(call, someErrorMessage, 1); + Assert.AreEqual(2, statusChangeCount); + } + + [Test] + public void Cancel_ActivityNotYetCancelledAndCancellingEncountersError_UpdateStatusAndEarlyExit() + { + // setup + int statusChangeCount = 0; + + var activity = new SimpleActivity(); + + activity.OnCancelInjection = () => activity.SetStatus(ActivityStatus.Failed); + ActivityStatus originalStatus = activity.Status; + + activity.StatusChanged += (sender, args) => + { + if (statusChangeCount == 0) + { + // 1st transition + Assert.AreEqual(originalStatus, args.OldStatus); + Assert.AreEqual(ActivityStatus.Cancelling, args.NewStatus); + } + else if (statusChangeCount == 1) + { + // 2nd transition + Assert.AreEqual(ActivityStatus.Cancelling, args.OldStatus); + Assert.AreEqual(ActivityStatus.Failed, args.NewStatus); + } + else + { + Assert.Fail("Expect 2 status updates."); + } + Assert.AreSame(activity, sender); + + statusChangeCount++; + }; + + // call + activity.Cancel(); + + // assert + Assert.AreEqual(2, statusChangeCount); + } + + private class SimpleActivity : Activity + { + /// + /// Sets the implementation of . + /// + public Action OnInitializeInjection { private get; set; } + + /// + /// Sets the implementation of . + /// + public Action OnCancelInjection { private get; set; } + + public void SetStatus(ActivityStatus newStatus) + { + Status = newStatus; + } + + protected override void OnInitialize() + { + OnInitializeInjection(); + } + + protected override void OnExecute() + { + throw new NotImplementedException(); + } + + protected override void OnCancel() + { + OnCancelInjection(); + } + + protected override void OnCleanUp() + { + throw new NotImplementedException(); + } + + protected override void OnFinish() + { + throw new NotImplementedException(); + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/AsyncActivityRunnerTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/AsyncActivityRunnerTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/AsyncActivityRunnerTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,78 @@ +using System.Globalization; +using System.Threading; +using System.Windows.Forms; +using DelftTools.Shell.Core.Workflow; +using NUnit.Framework; +using Rhino.Mocks; + +namespace DelftTools.Tests.Shell.Core.WorkFlow +{ + [TestFixture] + public class AsyncActivityRunnerTest + { + private static readonly MockRepository mocks = new MockRepository(); + + [Test] + public void DoesNotCompleteSuccesfullyIfAnExceptionWasThrown() + { + var activity = new CrashingActivity(); + + var asynchTask = new AsyncActivityRunner(activity, a => a.Execute()); + int callCount = 0; + asynchTask.Completed += (s, e) => + { + callCount++; + Assert.IsFalse(((AsyncActivityRunner) s).CompletedSuccesfully); + }; + asynchTask.Run(); + + Thread.Sleep(100); + + //do events...otherwise taskcompleted wont run + Application.DoEvents(); + + Assert.AreEqual(1, callCount); + } + + [Test] + public void ShouldSetUICultureAsInMainThread() + { + var activityFinished = false; + var uiCultureIsSet = false; + var activity = mocks.Stub(); + + var oldUICulture = Thread.CurrentThread.CurrentUICulture; + Assert.AreNotEqual("nl-NL", oldUICulture.Name); + + try + { + Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); + + activity.Expect(a => a.Execute()).Callback( + delegate + { + uiCultureIsSet = "nl-NL" == Thread.CurrentThread.CurrentUICulture.Name; + activityFinished = true; + return false; + }); + + mocks.ReplayAll(); + + var task = new AsyncActivityRunner(activity, a => a.Execute()); + task.Run(); + } + finally + { + // restore culture + Thread.CurrentThread.CurrentUICulture = oldUICulture; + } + + while (!activityFinished) + { + Thread.Sleep(0); + } + + Assert.AreEqual(true, uiCultureIsSet, "UI culture is not set in background thread"); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/BackgroundWorkerTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/BackgroundWorkerTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/BackgroundWorkerTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,70 @@ +using System.Globalization; +using System.Threading; +using System.Windows.Forms; +using DelftTools.Shell.Core.Workflow; +using NUnit.Framework; + +namespace DelftTools.Tests.Shell.Core.WorkFlow +{ + [TestFixture] + public class BackgroundWorkerTest + { + private CultureInfo originalCulture; + private CultureInfo originalUICulture; + + [Test] + public void TestCultureWhileDoingWork() // Note: this test fails when using System.ComponentModel.BackgroundWorker + { + var testFailed = false; + + // Set the thread culture before creating the background worker + var currentCulture = new CultureInfo("nl-NL"); + var currentUiCulture = new CultureInfo("tr-TR"); + + Thread.CurrentThread.CurrentCulture = currentCulture; + Thread.CurrentThread.CurrentUICulture = currentUiCulture; + + // Create the background worker + var backGroundWorker = new BackgroundWorker(); + + backGroundWorker.DoWork += (sender, args) => + { + if (!Thread.CurrentThread.CurrentCulture.Equals(currentCulture) || + !Thread.CurrentThread.CurrentUICulture.Equals(currentUiCulture)) + { + testFailed = true; + } + }; + + // Run the background worker + backGroundWorker.RunWorkerAsync(); + + while (backGroundWorker.IsBusy) + { + Application.DoEvents(); + Thread.Sleep(100); + } + + // The correct culture should have been used while "doing work" + Assert.IsFalse(testFailed); + } + + # region SetUp/TearDown + + [SetUp] + public void SetUp() + { + originalCulture = Thread.CurrentThread.CurrentCulture; + originalUICulture = Thread.CurrentThread.CurrentUICulture; + } + + [TearDown] + public void TearDown() + { + Thread.CurrentThread.CurrentCulture = originalCulture; + Thread.CurrentThread.CurrentUICulture = originalUICulture; + } + + # endregion + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/CompositeActivityTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/CompositeActivityTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/CompositeActivityTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,220 @@ +using System; +using DelftTools.Shell.Core.Workflow; +using NUnit.Framework; +using SharpTestsEx; + +namespace DelftTools.Tests.Shell.Core.WorkFlow +{ + [TestFixture] + public class CompositeActivityTest + { + [Test] + public void ExecuteInParallelModeUsingSimpleActivities() + { + var a1 = new SimpleActivity + { + Input = 2 + }; + var a2 = new SimpleActivity + { + Input = 3 + }; + + var workflow = new ParallelActivity + { + Activities = + { + a1, a2 + } + }; + + workflow.Initialize(); + workflow.Execute(); + + a1.Output.Should().Be.EqualTo(4); + a2.Output.Should().Be.EqualTo(6); + a1.Status.Should().Be.EqualTo(ActivityStatus.Done); + a2.Status.Should().Be.EqualTo(ActivityStatus.Done); + } + + [Test] + public void ExecuteInSequentialModeUsingSimpleActivities() + { + var a1 = new SimpleActivity + { + Input = 2 + }; + var a2 = new SimpleActivity + { + Input = 3 + }; + var workflow = new SequentialActivity + { + Activities = + { + a1, a2 + } + }; + + workflow.Initialize(); + workflow.Execute(); // initializes 1st activity + workflow.Execute(); + + workflow.Finish(); + + a1.Output.Should().Be.EqualTo(4); + a2.Output.Should().Be.EqualTo(6); + a1.Status.Should().Be.EqualTo(ActivityStatus.Finished); + a2.Status.Should().Be.EqualTo(ActivityStatus.Finished); + + workflow.Cleanup(); + + a1.Status.Should().Be.EqualTo(ActivityStatus.Cleaned); + a2.Status.Should().Be.EqualTo(ActivityStatus.Cleaned); + } + + [Test] + public void ExecuteInSequentialModeUsingSimpleTwoStepActivities() + { + var a1 = new SimpleTwoStepActivity + { + Input = 2 + }; + var a2 = new SimpleTwoStepActivity + { + Input = 3 + }; + var workflow = new SequentialActivity + { + Activities = + { + a1, a2 + } + }; + + workflow.Initialize(); + while (workflow.Status != ActivityStatus.Done) + { + workflow.Execute(); + + if (workflow.Status == ActivityStatus.Failed) + { + Assert.Fail("failed!"); + } + } + + workflow.Finish(); + + a1.Output.Should().Be.EqualTo(16); + a2.Output.Should().Be.EqualTo(12); + a1.Status.Should().Be.EqualTo(ActivityStatus.Finished); + a2.Status.Should().Be.EqualTo(ActivityStatus.Finished); + a1.Initialized.Should().Be.True(); + a2.Initialized.Should().Be.True(); + + workflow.Cleanup(); + + a1.Status.Should().Be.EqualTo(ActivityStatus.Cleaned); + a2.Status.Should().Be.EqualTo(ActivityStatus.Cleaned); + } + + [Test] + public void ParallelAndSequentialActivityExample() + { + var a1 = new SimpleActivity(); + var a2 = new SimpleActivity(); + var a3 = new SimpleActivity(); + var a4 = new SimpleActivity(); + + var workflow = new ParallelActivity + { + Activities = + { + a1, + new SequentialActivity + { + Activities = + { + a2, a3 + } + }, + a4 + } + }; + + workflow.Initialize(); + workflow.Execute(); + workflow.Execute(); + + workflow.Finish(); + + a1.Status.Should().Be.EqualTo(ActivityStatus.Finished); + a2.Status.Should().Be.EqualTo(ActivityStatus.Finished); + + workflow.Cleanup(); + + a1.Status.Should().Be.EqualTo(ActivityStatus.Cleaned); + a2.Status.Should().Be.EqualTo(ActivityStatus.Cleaned); + } + + private class SimpleActivity : Activity + { + public int Input { get; set; } + + public int Output { get; set; } + + protected override void OnInitialize() + { + Output = 0; + } + + protected override void OnExecute() + { + Output = Input*2; + Status = ActivityStatus.Done; + } + + protected override void OnCancel() {} + + protected override void OnCleanUp() {} + + protected override void OnFinish() {} + } + + private class SimpleTwoStepActivity : Activity + { + public int Input { get; set; } + + public int Output { get; set; } + + public bool Initialized { get; set; } + + protected override void OnInitialize() + { + if (Initialized) + { + throw new InvalidOperationException(); + } + Output = Input; + + Initialized = true; + } + + protected override void OnExecute() + { + Output *= 2; + + if (Output > 10) + { + Status = ActivityStatus.Done; + } + } + + protected override void OnCancel() {} + + protected override void OnCleanUp() {} + + protected override void OnFinish() {} + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/CrashingActivity.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/CrashingActivity.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/CrashingActivity.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,33 @@ +using System; +using DelftTools.Shell.Core.Workflow; + +namespace DelftTools.Tests.Shell.Core.WorkFlow +{ + public class CrashingActivity : Activity + { + protected override void OnInitialize() + { + throw new NotImplementedException(); + } + + protected override void OnExecute() + { + throw new NotImplementedException(); + } + + protected override void OnCancel() + { + throw new NotImplementedException(); + } + + protected override void OnCleanUp() + { + throw new NotImplementedException(); + } + + protected override void OnFinish() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/FileImportActivityTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/FileImportActivityTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Core/WorkFlow/FileImportActivityTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,30 @@ +using DelftTools.Shell.Core; +using DelftTools.Shell.Core.Workflow; +using NUnit.Framework; +using Rhino.Mocks; + +namespace DelftTools.Tests.Shell.Core.WorkFlow +{ + [TestFixture] + public class FileImportActivityTest + { + [Test] + public void ShouldCancelOfImporterIsResetDuringInitialize() + { + var mockRepository = new MockRepository(); + var importerStub = mockRepository.Stub(); + + mockRepository.ReplayAll(); + + importerStub.ShouldCancel = true; // Fake the importer being cancelled + + var fileImportActivity = new FileImportActivity(importerStub); + + fileImportActivity.Initialize(); + + Assert.IsFalse(importerStub.ShouldCancel); // ShouldCancel should be reset + + mockRepository.VerifyAll(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/ExpandableArrayConverterTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/ExpandableArrayConverterTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/ExpandableArrayConverterTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,45 @@ +using System.ComponentModel; +using System.Globalization; + +using DelftTools.Shell.Gui; + +using NUnit.Framework; + +namespace DelftTools.Tests.Shell.Gui +{ + [TestFixture] + public class ExpandableArrayConverterTest + { + [Test] + public void DefaultConstructor_ExpectedValues() + { + // Call + var converter = new ExpandableArrayConverter(); + + // Assert + Assert.IsInstanceOf(converter); + } + + [Test] + public void ConvertTo_ObjectIsArrayAndConvertingToString_ReturnElementCount() + { + // Setup + var converter = new ExpandableArrayConverter(); + + var array = new[] + { + 1, + 2, + 3, + 4 + }; + + // Call + object result = converter.ConvertTo(null, CultureInfo.CurrentCulture, array, typeof(string)); + + // Assert + var textResult = (string)result; + Assert.AreEqual("Aantal (4)", textResult); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/MapLayerProviderHelperTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/MapLayerProviderHelperTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/MapLayerProviderHelperTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,272 @@ +using System.Collections.Generic; +using DelftTools.Shell.Core; +using DelftTools.Shell.Gui; +using DelftTools.Utils.Collections; +using DelftTools.Utils.Collections.Generic; +using NUnit.Framework; +using Rhino.Mocks; +using SharpMap.Api; +using SharpMap.Api.Layers; +using SharpMap.Layers; + +namespace DelftTools.Tests.Shell.Gui +{ + [TestFixture] + public class MapLayerProviderHelperTest + { + [Test] + public void CreateLayerRecursive() + { + var mocks = new MockRepository(); + + var layerProvider = mocks.StrictMock(); + var projectItemGroupLayer = mocks.Stub(); + var projectItemLayer = mocks.Stub(); + var projectItem = mocks.StrictMock(); + var projectItemName = "Project item"; + + projectItemGroupLayer.Layers = new EventedList(); + + layerProvider.Expect(lp => lp.CanCreateLayerFor(projectItem, null)).Return(true); + layerProvider.Expect(lp => lp.CanCreateLayerFor(projectItemName, projectItem)).Return(true); + layerProvider.Expect(lp => lp.CreateLayer(projectItem, null)).Return(projectItemGroupLayer); + layerProvider.Expect(lp => lp.CreateLayer(projectItemName, projectItem)).Return(projectItemLayer); + layerProvider.Expect(lp => lp.ChildLayerObjects(projectItem)).Return(new[] + { + projectItemName + }); + + mocks.ReplayAll(); + + var layerDataDictionary = new Dictionary(); + + var layer = MapLayerProviderHelper.CreateLayersRecursive(projectItem, null, new[] + { + layerProvider + }, layerDataDictionary); + + Assert.AreEqual(layer, projectItemGroupLayer); + Assert.AreEqual(1, projectItemGroupLayer.Layers.Count); + Assert.AreEqual(projectItemLayer, projectItemGroupLayer.Layers[0]); + + Assert.AreEqual(projectItemName, layerDataDictionary[projectItemLayer]); + + mocks.VerifyAll(); + } + + [Test] + public void ProviderGivingChildObjectGetsFirstChanceAtProvidingLayer() + { + var mocks = new MockRepository(); + + var firstChanceProvider = mocks.StrictMock(); + var otherProvider = mocks.StrictMock(); + + var projectItem = mocks.StrictMock(); + var projectItemName = "Project item"; + + var objLayer = new GroupLayer(); + var subLayer = new VectorLayer(); + + otherProvider.Expect(lp => lp.CanCreateLayerFor(projectItem, null)).Return(false); + firstChanceProvider.Expect(lp => lp.CanCreateLayerFor(projectItem, null)).Return(true); + firstChanceProvider.Expect(lp => lp.CreateLayer(projectItem, null)).Return(objLayer); + firstChanceProvider.Expect(lp => lp.ChildLayerObjects(projectItem)).Return(new[] + { + projectItemName + }); + // this is the important part; we don't want 'otherProvider' to be called here: + firstChanceProvider.Expect(lp => lp.CanCreateLayerFor(projectItemName, projectItem)).Return(true); + firstChanceProvider.Expect(lp => lp.CreateLayer(projectItemName, projectItem)).Return(subLayer); + + mocks.ReplayAll(); + + MapLayerProviderHelper.CreateLayersRecursive(projectItem, null, new[] + { + otherProvider, + firstChanceProvider + }); + + mocks.VerifyAll(); + } + + [Test] + public void RefreshLayersRecursive() + { + var mocks = new MockRepository(); + + var layerProvider = mocks.StrictMock(); + var projectItemGroupLayer = new GroupLayer(); + var projectItemLayer = mocks.Stub(); + + var projectItem = mocks.StrictMock(); + var projectItemName = "Project item"; + + layerProvider.Expect(lp => lp.CanCreateLayerFor(projectItem, null)).Return(true); + layerProvider.Expect(lp => lp.CanCreateLayerFor(projectItemName, projectItem)).Return(true); + layerProvider.Expect(lp => lp.CreateLayer(projectItemName, projectItem)).Return(projectItemLayer); + layerProvider.Expect(lp => lp.ChildLayerObjects(projectItem)).Return(new[] + { + projectItemName + }); + + mocks.ReplayAll(); + + // Start with only a group layer + var layerDataDictionary = new Dictionary + { + { + projectItemGroupLayer, projectItem + } + }; + + // RefreshLayersRecursive should detect that the layer is out of sync, and add the project item mlayer + MapLayerProviderHelper.RefreshLayersRecursive(projectItemGroupLayer, layerDataDictionary, new[] + { + layerProvider + }, null); + + Assert.AreEqual(1, projectItemGroupLayer.Layers.Count); + Assert.AreEqual(projectItemLayer, projectItemGroupLayer.Layers[0]); + + Assert.AreEqual(projectItemName, layerDataDictionary[projectItemLayer]); + + mocks.VerifyAll(); + } + + [Test] + public void RefreshLayersRecursiveDoesNotNeedlesslyRemoveLayer() + { + var mocks = new MockRepository(); + + var layerProvider = mocks.StrictMock(); + var projectItemGroupLayer = new GroupLayer(); + var projectItemLayer1 = mocks.Stub(); + var projectItemLayer2 = mocks.Stub(); + + var projectItem = mocks.StrictMock(); + var projectItemName1 = "Project item 1"; + var projectItemName2 = "Project item 2"; + + // first time (create) + layerProvider.Expect(lp => lp.CanCreateLayerFor(projectItem, null)).Return(true).Repeat.Twice(); + layerProvider.Expect(lp => lp.CanCreateLayerFor(projectItemName1, projectItem)).Return(true); + layerProvider.Expect(lp => lp.CreateLayer(projectItem, null)).Return(projectItemGroupLayer); + layerProvider.Expect(lp => lp.CreateLayer(projectItemName1, projectItem)).Return(projectItemLayer1); + layerProvider.Expect(lp => lp.ChildLayerObjects(projectItem)).Return(new[] + { + projectItemName1 + }); + + // second time (refresh) + layerProvider.Expect(lp => lp.ChildLayerObjects(projectItem)).Return(new[] + { + projectItemName1, + projectItemName2 + }); + layerProvider.Expect(lp => lp.CanCreateLayerFor(projectItemName2, projectItem)).Return(true); + layerProvider.Expect(lp => lp.CreateLayer(projectItemName2, projectItem)).Return(projectItemLayer2); + + mocks.ReplayAll(); + + var layerDataDictionary = new Dictionary(); + var mapLayerProviders = new[] + { + layerProvider + }; + + // create + MapLayerProviderHelper.CreateLayersRecursive(projectItem, null, mapLayerProviders, layerDataDictionary); + + var layerAdded = 0; + projectItemGroupLayer.Layers.CollectionChanged += (s, e) => + { + if (e.Action == NotifyCollectionChangeAction.Remove) + { + Assert.Fail("No remove should occur"); + } + else if (e.Action == NotifyCollectionChangeAction.Add) + { + layerAdded++; + } + }; + + // refresh (but it should not remove layer for project item 1) + MapLayerProviderHelper.RefreshLayersRecursive(projectItemGroupLayer, layerDataDictionary, mapLayerProviders, null); + + Assert.AreEqual(1, layerAdded); + Assert.AreEqual(2, projectItemGroupLayer.Layers.Count); + + Assert.AreEqual(projectItemName1, layerDataDictionary[projectItemLayer1]); + + mocks.VerifyAll(); + } + + [Test] + public void RefreshLayersRecursiveShouldDisposeLayersOnRemove() + { + var mocks = new MockRepository(); + + var layerProvider = mocks.StrictMock(); + var modelLayer = new GroupLayer(); + + var oldDataSource = mocks.StrictMock(); + var oldModelItemLayer = new VectorLayer(); + var newModelItemLayer = mocks.Stub(); + + var projectItem = mocks.StrictMock(); + var projectItemNameOld = "Project item old"; + var projectItemNameNew = "Project item new"; + + // verify the datasource is disposed (this happens through Layer.Dispose right now): + oldDataSource.Expect(fp => fp.Dispose()); + oldDataSource.Expect(fp => fp.AddNewFeatureFromGeometryDelegate); + oldDataSource.Expect(fp => fp.FeaturesChanged += null).IgnoreArguments().Repeat.Once(); + oldDataSource.Expect(fp => fp.FeaturesChanged -= null).IgnoreArguments().Repeat.Twice(); + oldDataSource.Expect(fp => fp.CoordinateSystemChanged += null).IgnoreArguments().Repeat.Once(); + oldDataSource.Expect(fp => fp.CoordinateSystemChanged -= null).IgnoreArguments().Repeat.Twice(); + + // make sure the layerprovider does the right stuff: + layerProvider.Expect(lp => lp.CanCreateLayerFor(null, projectItem)).IgnoreArguments().Repeat.Any().Return(true); + layerProvider.Expect(lp => lp.CreateLayer(projectItemNameOld, projectItem)).Return(oldModelItemLayer); + layerProvider.Expect(lp => lp.CreateLayer(projectItemNameNew, projectItem)).Return(newModelItemLayer); + layerProvider.Expect(lp => lp.ChildLayerObjects(projectItem)).Return(new[] + { + projectItemNameOld + }); + layerProvider.Expect(lp => lp.ChildLayerObjects(projectItem)).Return(new[] + { + projectItemNameNew + }); + + mocks.ReplayAll(); + + oldModelItemLayer.DataSource = oldDataSource; + + // Start with only a modelLayer + var layerDataDictionary = new Dictionary + { + { + modelLayer, projectItem + } + }; + + // RefreshLayersRecursive should detect that the layer is out of sync, and add the old layer + MapLayerProviderHelper.RefreshLayersRecursive(modelLayer, layerDataDictionary, new[] + { + layerProvider + }, null); + + // expect the old layer to be removed (and thus diposed), and a new layer added: + MapLayerProviderHelper.RefreshLayersRecursive(modelLayer, layerDataDictionary, new[] + { + layerProvider + }, null); + + Assert.AreEqual(1, modelLayer.Layers.Count); + Assert.AreEqual(newModelItemLayer, modelLayer.Layers[0]); + + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/Swf/ControlExtensionTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/Swf/ControlExtensionTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/Shell/Gui/Swf/ControlExtensionTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,56 @@ +using System.Linq; +using System.Windows.Forms; +using DelftTools.Controls.Swf; +using NUnit.Framework; + +namespace DelftTools.Tests.Shell.Gui.Swf +{ + [TestFixture] + public class ControlExtensionsTest + { + private Form form; + private Control userControl; + + [Test] + public void GetAllControlsRecursiveReturnsCorrectList() + { + Assert.AreEqual(1, userControl.GetAllControlsRecursive().Count()); + Assert.AreEqual(1, form.GetAllControlsRecursive().Count()); + Assert.AreEqual(2, form.GetAllControlsRecursive().Count()); + Assert.AreEqual(1, form.GetAllControlsRecursive().Count()); + Assert.AreEqual(2, form.Controls.GetAllControlsRecursive().Count()); + } + + [Test] + public void GetFirstControlOfTypeReturnsControlAsExptected() + { + Assert.IsNotNull(form.GetFirstControlOfType()); + Assert.IsNull(form.GetFirstControlOfType()); + } + + #region Setup + + [TestFixtureSetUp] + public void FixtureSetup() {} + + [TestFixtureTearDown] + public void FixtureTearDown() {} + + [SetUp] + public void TestTearDown() + { + form = new Form(); + userControl = new UserControl(); + userControl.Controls.Add(new TextBox()); + form.Controls.Add(userControl); + } + + [TearDown] + public void TestSetup() + { + form.Dispose(); + } + + #endregion + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/Child.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/Child.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/Child.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using DelftTools.Utils.Aop; +using DelftTools.Utils.Collections.Generic; + +namespace DelftTools.Tests.TestObjects +{ + [Entity] + public class Child + { + public Child() + { + Children = new EventedList(); + } + + public string Name { get; set; } + + public IList Children { get; set; } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/ChildNodePresenter.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/ChildNodePresenter.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/ChildNodePresenter.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,27 @@ +using System; +using System.Collections; +using DelftTools.Controls; +using DelftTools.Controls.Swf.TreeViewControls; + +namespace DelftTools.Tests.TestObjects +{ + public class ChildNodePresenter : TreeViewNodePresenterBase + { + public event EventHandler AfterUpdate; + + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, Child nodeData) + { + node.Text = nodeData.Name; + + if (AfterUpdate != null) + { + AfterUpdate(this, null); + } + } + + public override IEnumerable GetChildNodeObjects(Child parentNodeData, ITreeNode node) + { + return parentNodeData.Children; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/MockTestNode.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/MockTestNode.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/MockTestNode.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,18 @@ +using DelftTools.Controls.Swf.TreeViewControls; + +namespace DelftTools.Tests.TestObjects +{ + public class MockTestNode : TreeNode + { + public MockTestNode(TreeView treeView, bool loaded) + : base(treeView) + { + isLoaded = loaded; + } + + public void SetLoaded(bool value) + { + isLoaded = value; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/Parent.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/Parent.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/Parent.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace DelftTools.Tests.TestObjects +{ + public class Parent + { + public readonly IList Children = new List(); + public string Name { get; set; } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/ParentNodePresenter.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/ParentNodePresenter.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/ParentNodePresenter.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,19 @@ +using System.Collections; +using DelftTools.Controls; +using DelftTools.Controls.Swf.TreeViewControls; + +namespace DelftTools.Tests.TestObjects +{ + public class ParentNodePresenter : TreeViewNodePresenterBase + { + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, Parent nodeData) + { + node.Text = nodeData.Name; + } + + public override IEnumerable GetChildNodeObjects(Parent parentNodeData, ITreeNode node) + { + return parentNodeData.Children; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/TestClasses.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/TestClasses.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/TestObjects/TestClasses.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,28 @@ +using DelftTools.Controls; +using DelftTools.Controls.Swf.TreeViewControls; + +namespace DelftTools.Tests.TestObjects +{ + public interface SomeInterface {} + + //for review: should we really split this class into 4 very small files? + //seems to me the relationships are less clear then but more consequent with the rest.. + public class BaseClass {} + + public class SubClass : BaseClass, SomeInterface {} + + public class SomeInterfaceNodePresenter : TreeViewNodePresenterBase + { + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, SomeInterface nodeData) {} + } + + public class SubClassNodePresenter : TreeViewNodePresenterBase + { + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, SubClass nodeData) {} + } + + public class BaseClassNodePresenter : TreeViewNodePresenterBase + { + public override void UpdateNode(ITreeNode parentNode, ITreeNode node, BaseClass nodeData) {} + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/TestUtils/WindowsFormsTestHelperTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/TestUtils/WindowsFormsTestHelperTest.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/TestUtils/WindowsFormsTestHelperTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,136 @@ +using System; +using System.Threading; +using System.Windows.Forms; +using DelftTools.TestUtils; +using NUnit.Framework; + +namespace DelftTools.Tests.TestUtils +{ + [TestFixture] + public class WindowsFormsTestHelperTest + { + [Test] + public void ShowActionIsRunForAFormUsingShow() + { + var form = new Form(); + int callCount = 0; + + WindowsFormsTestHelper.Show(form, delegate { callCount++; }); + + Assert.AreEqual(1, callCount); + + WindowsFormsTestHelper.CloseAll(); + } + + [Test] + public void ShowActionIsRunForUserControl() + { + var uc = new UserControl(); + int callCount = 0; + + WindowsFormsTestHelper.Show(uc, delegate { callCount++; }); + + Assert.AreEqual(1, callCount); + + WindowsFormsTestHelper.CloseAll(); + } + + [Test] + public void ShowActionIsRunForForm() + { + var form = new Form(); + int callCount = 0; + + WindowsFormsTestHelper.Show(form, delegate { callCount++; }); + + Assert.AreEqual(1, callCount); + + WindowsFormsTestHelper.CloseAll(); + } + + [Test] + public void ExceptionsInActionLogsStackTraceCorrectlyCorrectly() + { + try + { + WindowsFormsTestHelper.Show(new Label(), MethodWithException); + } + catch (Exception e) + { + Assert.AreEqual(typeof(InvalidOperationException), e.GetType()); + Assert.AreEqual("my message", e.Message); + Assert.IsTrue(e.StackTrace.Contains("MethodWithException")); + } + + WindowsFormsTestHelper.CloseAll(); + } + + [Test] + public void UnhandledThreadExceptionsInActionLogsStackTraceCorrectlyCorrectly() + { + var thread = new Thread(MethodWithExceptionInSeparateThread); + + try + { + WindowsFormsTestHelper.Show(new Label(), + delegate + { + thread.Start(); + thread.Join(); + }); + } + catch (Exception e) + { + Assert.AreEqual(typeof(GuiTestHelper.UnhandledException), e.GetType()); + Assert.IsTrue(e.Message.Contains("my message from thread")); + Assert.IsTrue(e.StackTrace.Contains("MethodWithExceptionInSeparateThread")); + } + + WindowsFormsTestHelper.CloseAll(); + } + + [Test] + public void CallActionOnShowModal() + { + var callCount = 0; + + WindowsFormsTestHelper.ShowModal(new Form(), delegate { callCount++; }); + + Assert.AreEqual(1, callCount); + } + + [Test] + public void ShownCalledOnShowModal() + { + var callCount = 0; + var form = new Form(); + + form.Shown += delegate { callCount++; }; + + WindowsFormsTestHelper.ShowModal(form); + + Assert.AreEqual(1, callCount); + } + + [Test] + [ExpectedException(typeof(GuiTestHelper.UnhandledException))] + public void ExceptionIsCatchedWhenFromShownEvent() + { + var form = new Form(); + + form.Shown += delegate { Assert.Fail(); }; + + WindowsFormsTestHelper.ShowModal(form); + } + + private void MethodWithException(Form obj) + { + throw new InvalidOperationException("my message"); + } + + private void MethodWithExceptionInSeparateThread() + { + throw new InvalidOperationException("my message from thread"); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/TimeDependentModelBaseStub.cs =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/TimeDependentModelBaseStub.cs (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/TimeDependentModelBaseStub.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,55 @@ +using System; +using System.ComponentModel; +using DelftTools.Shell.Core.Workflow; +using DelftTools.Shell.Core.Workflow.DataItems; +using log4net; + +namespace DelftTools.Tests.Core.Mocks +{ + // TODO: Remove this "stub" and use real stubs in the tests + public class TimeDependentModelBaseStub : TimeDependentModelBase + { + private static readonly ILog Log = LogManager.GetLogger(typeof(TimeDependentModelBaseStub)); + + public event EventHandler Executing; + + protected override void OnInitialize() + { + + } + + protected override bool OnExecute() + { + if (null != Executing) + { + Executing(this, null); + } + + return true; + } + + protected override void OnDataItemRemoved(IDataItem item) + { + + } + + protected override void OnDataItemAdded(IDataItem item) + { + + } + + protected override void OnInputPropertyChanged(object sender, PropertyChangedEventArgs e) + { + OnInputDataChangedCallCount++; + + Log.DebugFormat("InputPropertyChanged: {0}.{1}", sender, e.PropertyName); + + base.OnInputPropertyChanged(sender, e); + } + + /// + /// Used by test + /// + public int OnInputDataChangedCallCount { get; set; } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.DelftTools.Tests/packages.config =================================================================== diff -u --- Core/Common/test/Core.Common.DelftTools.Tests/packages.config (revision 0) +++ Core/Common/test/Core.Common.DelftTools.Tests/packages.config (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,4 @@ + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.IntegrationTests/App.config =================================================================== diff -u --- Core/Common/test/Core.Common.IntegrationTests/App.config (revision 0) +++ Core/Common/test/Core.Common.IntegrationTests/App.config (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,27 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.IntegrationTests/Core.Common.IntegrationTests.csproj =================================================================== diff -u --- Core/Common/test/Core.Common.IntegrationTests/Core.Common.IntegrationTests.csproj (revision 0) +++ Core/Common/test/Core.Common.IntegrationTests/Core.Common.IntegrationTests.csproj (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,205 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {A6A434E0-AE5A-4D5B-97D7-532B00FBDFE9} + Library + Properties + DeltaShell.IntegrationTests + DeltaShell.IntegrationTests + v4.0 + 512 + + + 3.5 + + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + True + + + true + bin\Debug\ + 4 + x86 + MinimumRecommendedRules.ruleset + TRACE;DEBUG; + + + bin\Release\ + 4 + x86 + MinimumRecommendedRules.ruleset + TRACE; + true + + + + False + ..\..\..\lib\log4net.dll + + + False + ..\..\..\lib\nunit.framework.dll + + + + + False + ..\..\..\lib\Rhino.Mocks.dll + + + ..\..\..\lib\SharpTestsEx.dll + + + + 3.5 + + + + + + + + + + + + + + + + {A3C9DF74-978A-44B1-B55D-A72AC4221E3A} + SharpMap.Api + + + {93E73FAB-FAE8-49C6-9ABB-27D24DF761F6} + DeltaShell.Plugins.CommonTools.Gui + + + {BEFDCC44-2638-4972-B353-42D14C7DA2C6} + DeltaShell.Plugins.CommonTools + + + {ED20DBA9-D577-423F-A68D-A0A8130FB10B} + DeltaShell.Plugins.ProjectExplorer + + + {0BC3751E-EC42-40A0-A7D3-B7C2AA66976E} + DeltaShell.Plugins.SharpMapGis.Gui + + + {696DAAEE-D1D8-42D0-86AC-471B970FB17E} + DeltaShell.Plugins.SharpMapGis + + + {016DBD27-99BF-489A-81B5-50D66964BB90} + Core.GIS.GeoApi.Extensions + + + {FFB69466-79DE-466A-ADA7-5C47C5C5CA3A} + Core.GIS.GeoApi + + + {5770DAA9-84E5-4770-AF43-F6B815894368} + Core.GIS.NetTopologySuite + + + {DD1CC1DB-4BF9-4C88-A100-733D84795F3A} + SharpMap.UI + + + {C83777FC-AABB-47D9-911F-D76255D4D541} + SharpMap + + + {3BBFD65B-B277-4E50-AE6D-BD24C3434609} + DeltaShell.Core + + + {4A7D6720-4AA1-4F0B-A796-A0436DB3D7D7} + Application.Ringtoets + + + {3DBD23CE-5C4A-4A49-B51C-B268CB2B510E} + Core.Common.Controls.Swf + + + {9A2D67E6-26AC-4D17-B11A-2B4372F2F572} + Core.Common.Controls + + + {82B61D20-FD4B-49BE-9252-5BF6E3EE4666} + Core.Common.BaseDelftTools + + + {30E4C2AE-719E-4D70-9FA9-668A9767FBFA} + Core.Common.Gui + + + {EFA25023-CF6A-4FF7-8C42-B24D7F9509E1} + Core.Common.TestUtils + + + {F49BD8B2-332A-4C91-A196-8CCE0A2C7D98} + Core.Common.Utils + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + lib\DeltaShell\DeltaShell.Plugins.Data.NHibernate + lib\Common\SharpMap.Extensions + lib\DeltaShell\DeltaShell.Plugins.NetCdf + lib\DeltaShell\DeltaShell.Plugins.Scripting + + + + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Core/DelftShellApplicationIntegrationTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Core/DelftShellApplicationIntegrationTest.cs (revision 0) +++ Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Core/DelftShellApplicationIntegrationTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,45 @@ +using System.Threading; +using System.Windows.Forms; +using DelftTools.Shell.Core.Workflow; +using DeltaShell.Core; +using NUnit.Framework; + +namespace DeltaShell.IntegrationTests.DeltaShell.DeltaShell.Core +{ + [TestFixture] + public class DeltaShellApplicationIntegrationTest + { + [Test] + public void RunManyActivitiesCheckForThreadingIssues() + { + var smallActivity = new SmallActivity(); + using (var app = new DeltaShellApplication + { + WaitMethod = Application.DoEvents + }) + { + for (int i = 0; i < 2000; i++) + { + app.RunActivity(smallActivity); + } + } + } + + private class SmallActivity : Activity + { + protected override void OnInitialize() {} + + protected override void OnExecute() + { + Thread.Sleep(2); + Status = ActivityStatus.Done; + } + + protected override void OnCancel() {} + + protected override void OnCleanUp() {} + + protected override void OnFinish() {} + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Gui/DeltaShellGuiIntegrationTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Gui/DeltaShellGuiIntegrationTest.cs (revision 0) +++ Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Gui/DeltaShellGuiIntegrationTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,383 @@ +using System; +using System.Diagnostics; +using System.Threading; +using System.Windows; +using DelftTools.Shell.Core; +using DelftTools.Shell.Core.Workflow; +using DelftTools.TestUtils; +using DelftTools.Utils.Collections; +using DeltaShell.Core; +using DeltaShell.Gui; +using DeltaShell.Plugins.CommonTools; +using DeltaShell.Plugins.CommonTools.Gui; +using DeltaShell.Plugins.ProjectExplorer; +using DeltaShell.Plugins.SharpMapGis; +using DeltaShell.Plugins.SharpMapGis.Gui; +using log4net; +using NUnit.Framework; +using Rhino.Mocks; +using SharpMap; +using SharpMap.Data.Providers; +using SharpMap.Layers; +using SharpTestsEx; +using Application = System.Windows.Forms.Application; +using Control = System.Windows.Controls.Control; + +namespace DeltaShell.IntegrationTests.DeltaShell.DeltaShell.Gui +{ + [TestFixture] + public class DeltaShellGuiIntegrationTest + { + private readonly MockRepository mocks = new MockRepository(); + private static readonly ILog log = LogManager.GetLogger(typeof(DeltaShellGuiIntegrationTest)); + + [SetUp] + public void SetUp() + { + LogHelper.ResetLogging(); + } + + [Test] + public void DeleteProjectDataDirectoryShouldNotThrowExceptionOnNewProjectAndShouldNotHang() + { + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + + app.Plugins.Add(new CommonToolsApplicationPlugin()); + app.Plugins.Add(new SharpMapGisApplicationPlugin()); + gui.Plugins.Add(new ProjectExplorerGuiPlugin()); + gui.Run(); + + gui.CommandHandler.TryCreateNewWTIProject(); + gui.CommandHandler.TryCreateNewWTIProject(); + } + } + + [Test] + [Ignore("potentially hangs")] + public void RunManyActivitiesCancelCheckForThreadingIssuesTools9791() + { + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + gui.Run(); + + Action onShown = delegate + { + var smallActivity = new TestActivity2(); + + for (int i = 0; i < 1000; i++) + { + app.RunActivityInBackground(smallActivity); + + // cancel + while (!app.IsActivityRunning()) + { + Thread.Sleep(1); + } + app.ActivityRunner.CancelAll(); + while (app.IsActivityRunning()) + { + Application.DoEvents(); + } + } + }; + WpfTestHelper.ShowModal((Control) gui.MainWindow, onShown); + } + } + + [Test] + public void ProgressDialogIsModal() + { + if (!Environment.UserInteractive) + { + return; //progress dialog stuff isn't processed on non-interactive environment (see DeltaShellGui::UpdateProgressDialog) + } + + if (GuiTestHelper.IsBuildServer) + { + return; // bleh (fails if users log in etc..) + } + + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + + app.Plugins.Add(new CommonToolsApplicationPlugin()); + app.Plugins.Add(new SharpMapGisApplicationPlugin()); + gui.Plugins.Add(new ProjectExplorerGuiPlugin()); + gui.Run(); + + var mainWindow = (Control) gui.MainWindow; + Action onShown = delegate + { + var testActivity = new TestActivity(); + gui.Application.ActivityRunner.Enqueue(testActivity); + try + { + while (!gui.Application.ActivityRunner.IsRunningActivity(testActivity)) + { + Thread.Sleep(0); + } + + Application.DoEvents(); + + Assert.IsFalse(mainWindow.IsEnabled); + } + finally + { + testActivity.Done = true; + } + + while (gui.Application.ActivityRunner.IsRunningActivity(testActivity)) + { + Thread.Sleep(0); + } + + Application.DoEvents(); + + Assert.IsTrue(mainWindow.IsEnabled); + }; + + WpfTestHelper.ShowModal(mainWindow, onShown); + } + } + + [Test] + public void ClosingEmptyProjectShouldNotGiveException() + { + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + app.Plugins.Add(new CommonToolsApplicationPlugin()); + app.Plugins.Add(new SharpMapGisApplicationPlugin()); + gui.Plugins.Add(new ProjectExplorerGuiPlugin()); + gui.Run(); + + gui.CommandHandler.TryCloseWTIProject(); //should not trigger exception + } + } + + [Test] + public void ErrorLogMessageShouldActivateMessageWindow() + { + using (var gui = new DeltaShellGui()) + { + gui.Application.Plugins.ForEach(p => p.Application = gui.Application); + gui.Run(); + + var activeViewChanged = false; + Action onShown = delegate + { + // nothing active initial + gui.ToolWindowViews.ActiveView = null; + + gui.ToolWindowViews.ActiveViewChanged += delegate + { + activeViewChanged = true; + if (gui.ToolWindowViews.ActiveView != null) + { + gui.ToolWindowViews.ActiveView.Should("error log message must trigger message window activation").Be.EqualTo(gui.MainWindow.MessageWindow); + } + }; + + var stopWatch = new Stopwatch(); + stopWatch.Start(); + + // trigger message window to appear + log.Error("Error to appear in message window"); + + while (!activeViewChanged) + { + if (stopWatch.ElapsedMilliseconds > 10000) //10 sec, prevent infinite loop + { + Assert.Fail("Should have happened by now.."); + break; + } + Application.DoEvents(); + } + }; + + WpfTestHelper.ShowModal((Window) gui.MainWindow, onShown); + } + } + + [Test] + public void StartGuiWithToolboxDoesNotCrash() + { + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + + app.Plugins.Add(new CommonToolsApplicationPlugin()); + app.Plugins.Add(new SharpMapGisApplicationPlugin()); + + gui.Run(); + } + } + + [Test] + public void StartWithCommonPluginsShouldBeFast() + { + TestHelper.AssertIsFasterThan(7500, StartWithCommonPlugins); + } + + [Test] + public void CreateNewProjectAfterStartWithCommonPluginsShouldBeFast() + { + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + + app.Plugins.Add(new SharpMapGisApplicationPlugin()); + app.Plugins.Add(new CommonToolsApplicationPlugin()); + gui.Plugins.Add(new SharpMapGisGuiPlugin()); + gui.Plugins.Add(new CommonToolsGuiPlugin()); + gui.Plugins.Add(new ProjectExplorerGuiPlugin()); + + gui.Run(); + + Action onShown = () => TestHelper.AssertIsFasterThan(300, gui.Application.CreateNewProject); + + WpfTestHelper.ShowModal((Control) gui.MainWindow, onShown); + } + } + + [Test] + public void ExitShouldBeFast() + { + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + + app.Plugins.Add(new CommonToolsApplicationPlugin()); + app.Plugins.Add(new SharpMapGisApplicationPlugin()); + gui.Plugins.Add(new ProjectExplorerGuiPlugin()); + + gui.Run(); + + app.UserSettings["autosaveWindowLayout"] = false; // skip damagin of window layout + + gui.MainWindow.Show(); + + for (int i = 0; i < 20; i++) + { + var map = new Map(); + app.Project.Items.Add(map); + gui.CommandHandler.OpenView(map); + } + app.SaveProjectAs(TestHelper.GetCurrentMethodName() + ".dsproj"); + + TestHelper.AssertIsFasterThan(200, gui.Exit); + } + } + + [Test] + public void GuiSelectionIsSetToProjectAfterStartWithProjectExplorer() + { + // initialize + using (var gui = new DeltaShellGui()) + { + gui.Plugins.Add(new ProjectExplorerGuiPlugin()); + gui.Run(); + + gui.Selection.Should().Be.EqualTo(gui.Application.Project); + } + } + + [Test] + public void FormActionIsRunForMainWindow() + { + //testing testhelper + visible changed event of mainwindow. + //could be tested separately but the combination is vital to many tests. That's why this test is here. + using (var gui = new DeltaShellGui()) + { + gui.Run(); + int callCount = 0; + WpfTestHelper.ShowModal((Control) gui.MainWindow, () => callCount++); + Assert.AreEqual(1, callCount); + } + } + + private class TestActivity2 : Activity + { + private bool shouldCancel; + + public override void Execute() + { + if (shouldCancel) + { + Status = ActivityStatus.Cancelled; + shouldCancel = false; + return; + } + + base.Execute(); + } + + public override void Cancel() + { + shouldCancel = true; + } + + protected override void OnInitialize() {} + + protected override void OnExecute() + { + Thread.Sleep(100); + } + + protected override void OnCancel() + { + throw new NotImplementedException(); + } + + protected override void OnCleanUp() + { + shouldCancel = false; + } + + protected override void OnFinish() {} + } + + private class TestActivity : Activity + { + public bool Done { get; set; } + + protected override void OnInitialize() + { + while (!Done) + { + Thread.Sleep(0); + } + + Status = ActivityStatus.Done; + } + + protected override void OnExecute() {} + + protected override void OnCancel() {} + + protected override void OnCleanUp() {} + + protected override void OnFinish() {} + } + + private static void StartWithCommonPlugins() + { + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + + app.Plugins.Add(new SharpMapGisApplicationPlugin()); + app.Plugins.Add(new CommonToolsApplicationPlugin()); + gui.Plugins.Add(new ProjectExplorerGuiPlugin()); + + gui.Run(); + + WpfTestHelper.ShowModal((Control) gui.MainWindow); + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Gui/GuiImportHandlerTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Gui/GuiImportHandlerTest.cs (revision 0) +++ Core/Common/test/Core.Common.IntegrationTests/DeltaShell/DeltaShell.Gui/GuiImportHandlerTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,320 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Windows.Forms; +using DelftTools.Controls.Swf; +using DelftTools.Shell.Core; +using DelftTools.Shell.Gui; +using DelftTools.TestUtils; +using DeltaShell.Core; +using DeltaShell.Gui; +using DeltaShell.Plugins.CommonTools; +using DeltaShell.Plugins.SharpMapGis; +using log4net.Core; +using NUnit.Framework; +using Rhino.Mocks; +using MessageBox = DelftTools.Controls.Swf.MessageBox; + +namespace DeltaShell.IntegrationTests.DeltaShell.DeltaShell.Gui +{ + [TestFixture] + public class GuiImportHandlerTest + { + private MockRepository mocks; + private IGui gui; + private IApplication realApp; + + private readonly ApplicationPlugin commonToolsPlugin = new CommonToolsApplicationPlugin(); + + [SetUp] + public void SetUp() + { + LogHelper.SetLoggingLevel(Level.Error); + + mocks = new MockRepository(); + + gui = mocks.Stub(); + + realApp = new DeltaShellApplication(); + realApp.Plugins.Add(commonToolsPlugin); + realApp.Plugins.Add(new SharpMapGisApplicationPlugin()); + realApp.Run(); + + gui.Application = realApp; + } + + [TearDown] + public void TearDown() + { + realApp.Dispose(); + } + + [Test] + public void NoImporterAvailableGivesMessageBox() //are we even interested in this? + { + var messageBox = mocks.StrictMock(); + MessageBox.CustomMessageBox = messageBox; + messageBox.Expect(mb => mb.Show(null, null, MessageBoxButtons.OK)).Return(DialogResult.OK).IgnoreArguments() + .Repeat.Once(); + messageBox.Replay(); + + var importHandler = new GuiImportHandler(gui); + + var item = importHandler.GetSupportedImporterForTargetType(typeof(Int64)); + + Assert.IsNull(item); + + messageBox.VerifyAllExpectations(); + } + + [Test] + public void FileFilteringWorks() + { + var application = mocks.Stub(); + var fileImporter = mocks.Stub(); + var targetItemImporter = mocks.Stub(); + var plugin = mocks.Stub(); + + application.Stub(a => a.Plugins).Return(new[] + { + plugin + }); + application.Stub(a => a.ProjectFilePath).Return(Directory.GetCurrentDirectory()).Repeat.Any(); + gui.Application = application; + + IEnumerable importers = new[] + { + targetItemImporter, + fileImporter + }; + + fileImporter.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(Int64) + }).Repeat.Any(); + fileImporter.Expect(fi => fi.FileFilter).Return("known|*.bla").Repeat.Any(); + fileImporter.Expect(fi => fi.Name).Return("1").Repeat.Any(); + fileImporter.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(true).Repeat.Any(); + + targetItemImporter.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(Int64) + }).Repeat.Any(); + targetItemImporter.Expect(fi => fi.FileFilter).Return("known|*.ext").Repeat.Any(); + targetItemImporter.Expect(fi => fi.Name).Return("2").Repeat.Any(); + targetItemImporter.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(true).Repeat.Any(); + + application.Expect(a => a.FileImporters).IgnoreArguments().Repeat.Any().Return(importers); + + mocks.ReplayAll(); + + var guiImportHandler = new GuiImportHandler(gui); + + var one = (long) 1.0; + var returnedImporter1 = guiImportHandler.GetSupportedImporterForTargetTypeAndSelectedFiles(one, new[] + { + "testfile.ext" + }); + + Assert.AreEqual(targetItemImporter, returnedImporter1); + + var two = (long) 2.0; + var returnedImporter2 = guiImportHandler.GetSupportedImporterForTargetTypeAndSelectedFiles(two, new[] + { + "testfile.unknown" + }); + + Assert.IsNull(returnedImporter2); + + mocks.VerifyAll(); + } + + [Test] + public void NonRootLevelImportersAreNotReturnedForNullType() + { + var application = mocks.Stub(); + var fileImporter = mocks.Stub(); + var targetItemImporter = mocks.Stub(); + var targetItemImporter2 = mocks.Stub(); + var plugin = mocks.Stub(); + + application.Stub(a => a.Plugins).Return(new[] + { + plugin + }); + application.Stub(a => a.ProjectFilePath).Return(Directory.GetCurrentDirectory()).Repeat.Any(); + gui.Application = application; + + IEnumerable importers = new[] + { + fileImporter, + targetItemImporter, + targetItemImporter2 + }; + + fileImporter.Expect(fi => fi.CanImportOnRootLevel).Return(false); + targetItemImporter.Expect(fi => fi.CanImportOnRootLevel).Return(false); + targetItemImporter2.Expect(fi => fi.CanImportOnRootLevel).Return(true); + + application.Expect(a => a.FileImporters).IgnoreArguments().Repeat.Any().Return(importers); + + mocks.ReplayAll(); + + var guiImportHandler = new GuiImportHandler(gui); + + var fileImporters = guiImportHandler.GetImporters(null); + + Assert.AreEqual(1, fileImporters.Count); + Assert.AreSame(targetItemImporter2, fileImporters.First()); + + mocks.VerifyAll(); + } + + [Test] + public void TargetItemFileImporterAreReturnedWhenMatch() + { + var application = mocks.Stub(); + var fileImporter = mocks.Stub(); + var targetItemImporter = mocks.Stub(); + var targetItemImporterWhereCanImportIsFalse = mocks.Stub(); + application.Stub(a => a.ProjectFilePath).Return(Directory.GetCurrentDirectory()).Repeat.Any(); + gui.Application = application; + + IEnumerable importers = new[] + { + fileImporter, + targetItemImporter, + targetItemImporterWhereCanImportIsFalse + }; + + fileImporter.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(Int64) + }); + fileImporter.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(true).Repeat.Any(); + + targetItemImporter.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(Int64) + }); + targetItemImporter.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(true).Repeat.Any(); + + targetItemImporterWhereCanImportIsFalse.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(Int64) + }); + targetItemImporterWhereCanImportIsFalse.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(false).Repeat.Any(); + + application.Expect(a => a.FileImporters).IgnoreArguments().Repeat.Any().Return(importers); + + mocks.ReplayAll(); + + var guiImportHandler = new GuiImportHandler(gui); + + var fileImporters = guiImportHandler.GetImporters((long) 1.0); + + Assert.AreEqual(2, fileImporters.Count); + + mocks.VerifyAll(); + } + + [Test] + public void TargetItemFileImporterCanMatchOnSubtype() + { + //test verifies that an importer for type A matches on type B if B implements A + + var application = mocks.Stub(); + var targetItemImporter = mocks.Stub(); + var plugin = mocks.Stub(); + + application.Stub(a => a.Plugins).Return(new[] + { + plugin + }); + application.Stub(a => a.ProjectFilePath).Return(Directory.GetCurrentDirectory()).Repeat.Any(); + + gui.Application = application; + + IEnumerable importers = new[] + { + targetItemImporter + }; + + targetItemImporter.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(IList) + }); + targetItemImporter.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(true).Repeat.Any(); + + application.Expect(a => a.FileImporters).IgnoreArguments().Repeat.Any().Return(importers); + + mocks.ReplayAll(); + + var guiImportHandler = new GuiImportHandler(gui); + + //get importers for subtype + var fileImporters = guiImportHandler.GetImporters(new List()); + + Assert.AreEqual(new[] + { + targetItemImporter + }, fileImporters); + + mocks.VerifyAll(); + } + + [Test] + public void AllPluginsAreSearchedForFileImportersAndOnlyMatchingImportersAreReturned() + { + var application = mocks.Stub(); + var fileImporter1 = mocks.Stub(); + var fileImporter2 = mocks.Stub(); + var fileImporter3 = mocks.Stub(); + var plugin1 = mocks.Stub(); + + application.Stub(a => a.Plugins).Return(new[] + { + plugin1 + }); + application.Stub(a => a.ProjectFilePath).Return(Directory.GetCurrentDirectory()).Repeat.Any(); + gui.Application = application; + + IEnumerable importers = new[] + { + fileImporter1, + fileImporter2, + fileImporter3 + }; + + fileImporter1.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(Int32) + }); + fileImporter2.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(Int64) + }); + fileImporter3.Expect(fi => fi.SupportedItemTypes).Return(new[] + { + typeof(Int16) + }); + + fileImporter1.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(true).Repeat.Any(); + fileImporter2.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(true).Repeat.Any(); + fileImporter3.Expect(fi => fi.CanImportOn(null)).IgnoreArguments().Return(true).Repeat.Any(); + + application.Expect(a => a.FileImporters).Repeat.Any().Return(importers).Repeat.Once(); + + mocks.ReplayAll(); + + var guiImportHandler = new GuiImportHandler(gui); + + var fileImporters = guiImportHandler.GetImporters((long) 1.0); + + Assert.AreEqual(1, fileImporters.Count); + + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.IntegrationTests/Properties/AssemblyInfo.cs =================================================================== diff -u --- Core/Common/test/Core.Common.IntegrationTests/Properties/AssemblyInfo.cs (revision 0) +++ Core/Common/test/Core.Common.IntegrationTests/Properties/AssemblyInfo.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,41 @@ +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +using System.Reflection; +using System.Runtime.InteropServices; +using NUnit.Framework; + +[assembly: AssemblyTitle("DeltaShell.IntegrationTests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Deltares")] +[assembly: AssemblyProduct("DeltaShell.IntegrationTests")] +[assembly: AssemblyCopyright("Copyright © Deltares 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("4a1c7014-8890-4030-a00e-24b8895caf67")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: RequiresSTA] \ No newline at end of file Index: Core/Common/test/Core.Common.IntegrationTests/packages.config =================================================================== diff -u --- Core/Common/test/Core.Common.IntegrationTests/packages.config (revision 0) +++ Core/Common/test/Core.Common.IntegrationTests/packages.config (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,4 @@ + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/App.config =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/App.config (revision 0) +++ Core/Common/test/Core.Common.Tests/App.config (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,36 @@ + + + +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Core.Common.Tests.csproj =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Core.Common.Tests.csproj (revision 0) +++ Core/Common/test/Core.Common.Tests/Core.Common.Tests.csproj (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,243 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {E0990383-FB2E-47D1-99CD-9B9FA2929E5B} + Library + Properties + DeltaShell.Tests + DeltaShell.Tests + OnOutputUpdated + + + 3.5 + + + v4.0 + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + true + bin\Debug\ + 4 + x86 + MinimumRecommendedRules.ruleset + TRACE;DEBUG + + + bin\Release\ + 4 + x86 + MinimumRecommendedRules.ruleset + TRACE + true + + + + False + ..\..\..\..\lib\log4net.dll + + + False + ..\..\..\..\lib\nunit.framework.dll + + + + + False + ..\..\..\..\lib\Rhino.Mocks.dll + + + ..\..\..\..\lib\SharpTestsEx.dll + + + + 3.5 + + + + + + + + ..\..\..\..\packages\AvalonDock.2.0.2000\lib\net40\Xceed.Wpf.AvalonDock.dll + + + + + + + + + + + + + + + + True + True + Resources.resx + + + UserControl + + + TestReusableView.cs + + + + UserControl + + + ToolWindowTestControl.cs + + + + + UserControl + + + TestView.cs + + + + True + True + TestSettings.settings + + + + + PreserveNewest + + + + SettingsSingleFileGenerator + TestSettings.Designer.cs + + + + + Designer + ToolWindowTestControl.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + TestView.cs + + + + + + + + + + + + + + + {3DBD23CE-5C4A-4A49-B51C-B268CB2B510E} + Core.Common.Controls.Swf + + + {9A2D67E6-26AC-4D17-B11A-2B4372F2F572} + Core.Common.Controls + + + {82B61D20-FD4B-49BE-9252-5BF6E3EE4666} + Core.Common.BaseDelftTools + + + {30E4C2AE-719E-4D70-9FA9-668A9767FBFA} + Core.Common.Gui + + + {BEFDCC44-2638-4972-B353-42D14C7DA2C6} + DeltaShell.Plugins.CommonTools + + + {EFA25023-CF6A-4FF7-8C42-B24D7F9509E1} + Core.Common.TestUtils + + + {F49BD8B2-332A-4C91-A196-8CCE0A2C7D98} + Core.Common.Utils + + + {3BBFD65B-B277-4E50-AE6D-BD24C3434609} + DeltaShell.Core + + + {4A7D6720-4AA1-4F0B-A796-A0436DB3D7D7} + Application.Ringtoets + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + + + + + + + lib\DeltaShell\DeltaShell.Plugins.Data.NHibernate + + + + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Core/AssemblyInfoTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Core/AssemblyInfoTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Core/AssemblyInfoTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,23 @@ +using DelftTools.Utils.Reflection; +using DeltaShell.Core; +using NUnit.Framework; + +namespace DeltaShell.Tests.Core +{ + [TestFixture] + public class AssemblyInfoTest + { + [Test] + public void CheckForValidAssembly() + { + AssemblyUtils.AssemblyInfo info = AssemblyUtils.GetAssemblyInfo((typeof(DeltaShellApplication)).Assembly); + + Assert.AreEqual("Delta Shell", info.Title); + Assert.IsNotNull(info.Version); + Assert.IsNotNull(info.Description); + Assert.AreEqual("Delta Shell", info.Product); + Assert.IsNotNull(info.Copyright); + Assert.AreEqual("Deltares", info.Company); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Core/DelftShellApplicationTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Core/DelftShellApplicationTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Core/DelftShellApplicationTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,113 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using DelftTools.Shell.Core; +using DeltaShell.Core; +using DeltaShell.Gui; +using NUnit.Framework; +using Rhino.Mocks; + +namespace DeltaShell.Tests.Core +{ + [TestFixture] + public class DeltaShellApplicationTest + { + [Test] + [ExpectedException(typeof(InvalidOperationException))] + public void ApplicationShouldRunBeforeProjectCanBeOpened() + { + using (var app = new DeltaShellApplication()) + { + app.OpenProject(null); + } + } + + [Test] + [ExpectedException(typeof(InvalidOperationException))] + public void ApplicationShouldRunBeforeProjectCanBeCreated() + { + using (var app = new DeltaShellApplication()) + { + app.OpenProject(null); + } + } + + [Test] + [ExpectedException(typeof(InvalidOperationException))] + public void ApplicationRunCanBeCalledOnlyOnce() + { + using (var app = new DeltaShellApplication()) + { + app.Run(); + app.Run(); + } + } + + [Test] + public void ActivatePlugins() + { + var mocks = new MockRepository(); + + var plugin = mocks.StrictMock(); + + Expect.Call(plugin.IsActive).Repeat.Any().Return(true); + Expect.Call(plugin.Application = null).IgnoreArguments(); + Expect.Call(plugin.Resources = null).IgnoreArguments(); + Expect.Call(plugin.Name).Return("mock plugin").Repeat.Any(); + Expect.Call(plugin.Deactivate); + Expect.Call(plugin.GetDataItemInfos()).Return(new List()).Repeat.Any(); + Expect.Call(plugin.GetFileImporters()).Return(new List()); + Expect.Call(plugin.GetFileExporters()).Return(new List()); + + plugin.Activate(); + LastCall.Repeat.Once(); + + mocks.ReplayAll(); + + using (var gui = new DeltaShellGui()) + { + var app = gui.Application; + gui.Application = app; + gui.Application.Plugins.Add(plugin); + gui.Run(); + + gui.Dispose(); + + mocks.VerifyAll(); + } + } + + [Test] + public void CurrentCultureIsChangedWhenTurkishOrAzeri() + { + Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); + using (var delftShellApplication = new DeltaShellApplication()) + { + delftShellApplication.Run(); + Assert.AreEqual("en-US", Thread.CurrentThread.CurrentCulture.ToString()); + } + + Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL"); + using (var delftShellApplication = new DeltaShellApplication()) + { + delftShellApplication.Run(); + Assert.AreEqual("nl-NL", Thread.CurrentThread.CurrentCulture.ToString()); + } + + Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR"); + using (var delftShellApplication = new DeltaShellApplication()) + { + delftShellApplication.Run(); + Assert.AreEqual("en-US", Thread.CurrentThread.CurrentCulture.ToString()); + } + + Thread.CurrentThread.CurrentCulture = new CultureInfo("az"); + using (var delftShellApplication = new DeltaShellApplication()) + { + delftShellApplication.Run(); + Assert.AreEqual("en-US", Thread.CurrentThread.CurrentCulture.ToString()); + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Core/DeltaShellApplicationSettingsTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Core/DeltaShellApplicationSettingsTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Core/DeltaShellApplicationSettingsTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,22 @@ +using DeltaShell.Core; +using DeltaShell.Tests.TestObjects; +using NUnit.Framework; + +namespace DeltaShell.Tests.Core +{ + [TestFixture] + public class DeltaShellApplicationSettingsTest + { + [Test] + public void PropertyChangedWorksForWrappedSettings() + { + var settings = new TestSettings(); + + var wrappedSettings = new DeltaShellApplicationSettings(settings); + int callCount = 0; + wrappedSettings.PropertyChanged += (s, e) => callCount++; + wrappedSettings["Name"] = "kees"; + Assert.AreEqual(1, callCount); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Core/Extensions/CompositeActivityExtensionsTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Core/Extensions/CompositeActivityExtensionsTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Core/Extensions/CompositeActivityExtensionsTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,51 @@ +using System.Linq; +using DelftTools.Shell.Core.Extensions; +using DelftTools.Shell.Core.Workflow; +using DelftTools.Utils.Collections.Generic; +using NUnit.Framework; +using Rhino.Mocks; + +namespace DeltaShell.Tests.Core.Extensions +{ + [TestFixture] + public class CompositeActivityExtensionsTest + { + [Test] + public void GetAllActivitiesRecursive() + { + var mocks = new MockRepository(); + var activity1 = mocks.Stub(); + var activity2 = mocks.Stub(); + var activity3 = mocks.Stub(); + var activity4 = mocks.Stub(); + var activity5 = mocks.Stub(); + var activity6 = mocks.Stub(); + + mocks.ReplayAll(); + + var compositeActivity = new ParallelActivity + { + Activities = new EventedList + { + new SequentialActivity + { + Activities = new EventedList + { + activity1, activity2 + } + }, + new SequentialActivity + { + Activities = new EventedList + { + activity3, activity4, activity5 + } + }, + activity6 + } + }; + + Assert.AreEqual(9, compositeActivity.GetAllActivitiesRecursive().Count()); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/DelftShellGuiTests.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/DelftShellGuiTests.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/DelftShellGuiTests.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,70 @@ +using DelftTools.Shell.Gui; +using DelftTools.TestUtils; +using DeltaShell.Gui; +using DeltaShell.Tests.TestObjects; +using log4net.Core; +using NUnit.Framework; +using SharpTestsEx; + +namespace DeltaShell.Tests.Gui +{ + [TestFixture] + public class DeltaShellGuiTests + { + private DeltaShellGui gui; + + [SetUp] + public void SetUp() + { + LogHelper.SetLoggingLevel(Level.Error); + gui = new DeltaShellGui(); + } + + [TearDown] + public void TearDown() + { + gui.Dispose(); + } + + [Test] + public void DisposingGuiDisposesApplication() + { + var testApplication = new TestApplication(); + gui.Application = testApplication; + + //action! + gui.Dispose(); + + //assert + Assert.AreEqual(1, testApplication.DisposeCallCount); + } + + [Test] + public void CheckViewPropertyEditorIsInitialized() + { + ViewPropertyEditor.Gui.Should().Not.Be.Null(); + } + + [Test] + public void FireEventAfterRun() + { + var callCount = 0; + gui.AfterRun += () => callCount++; + gui.Run(); + + callCount.Should("AfterRun event is fired after gui starts").Be.EqualTo(1); + } + + [TestFixtureSetUp] + public void TestFixtureSetUp() + { + LogHelper.ConfigureLogging(); + } + + [TestFixtureTearDown] + public void TestFixtureTearDown() + { + LogHelper.ResetLogging(); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.Designer.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.Designer.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.Designer.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,820 @@ +using DevComponents.DotNetBar; + +namespace DeltaShell.Tests.Gui +{ + partial class DotNetBarTestForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.buttonMenuHelp = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuHelpAbout = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuTools = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuToolsPlugins = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuToolsOptions = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuProject = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuProjectAddFolder = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuView = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuViewProjectExplorer = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuViewModelsAndTools = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuViewMessages = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuViewProperties = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuViewCloseAll = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuEdit = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuEditUndo = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuEditRedo = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuEditCut = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuEditCopy = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuEditPaste = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuEditDelete = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFile = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFileNewProject = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFileOpenProject = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFileSaveProject = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFileSaveProjectAs = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFileCloseProject = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFileRecentProjects = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFileRecentProjectEmpty = new DevComponents.DotNetBar.ButtonItem(); + this.buttonMenuFileExit = new DevComponents.DotNetBar.ButtonItem(); + this.bar1 = new DevComponents.DotNetBar.Bar(); + this.buttonItem1 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem2 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem3 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem4 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem5 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem6 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem7 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem8 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem9 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem10 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem11 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItemEditMenu = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem13 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem14 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem15 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem16 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem17 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem18 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem19 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem20 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem21 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem22 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem23 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem24 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem25 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem26 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem27 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem28 = new DevComponents.DotNetBar.ButtonItem(); + this.Tools = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem38 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem39 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem40 = new DevComponents.DotNetBar.ButtonItem(); + this.buttonItem41 = new DevComponents.DotNetBar.ButtonItem(); + this.panelDockContainer1 = new DevComponents.DotNetBar.PanelDockContainer(); + this.dockContainerItem1 = new DevComponents.DotNetBar.DockContainerItem(); + this.dockingManager = new DevComponents.DotNetBar.DotNetBarManager(this.components); + this.barBottomDockSite = new DevComponents.DotNetBar.DockSite(); + this.dockSiteCenter = new DevComponents.DotNetBar.DockSite(); + this.barCenter = new DevComponents.DotNetBar.Bar(); + this.barLeftDockSite = new DevComponents.DotNetBar.DockSite(); + this.barRightDockSite = new DevComponents.DotNetBar.DockSite(); + this.dockSite4 = new DevComponents.DotNetBar.DockSite(); + this.dockSite1 = new DevComponents.DotNetBar.DockSite(); + this.dockSite2 = new DevComponents.DotNetBar.DockSite(); + this.dockSite3 = new DevComponents.DotNetBar.DockSite(); + this.barTopDockSite = new DevComponents.DotNetBar.DockSite(); + ((System.ComponentModel.ISupportInitialize)(this.bar1)).BeginInit(); + this.dockSiteCenter.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.barCenter)).BeginInit(); + this.barCenter.SuspendLayout(); + this.dockSite3.SuspendLayout(); + this.SuspendLayout(); + // + // buttonMenuHelp + // + this.buttonMenuHelp.Name = "buttonMenuHelp"; + this.buttonMenuHelp.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonMenuHelpAbout}); + this.buttonMenuHelp.Text = "&Help"; + // + // buttonMenuHelpAbout + // + this.buttonMenuHelpAbout.Name = "buttonMenuHelpAbout"; + this.buttonMenuHelpAbout.Text = "&About"; + // + // buttonMenuTools + // + this.buttonMenuTools.Name = "buttonMenuTools"; + this.buttonMenuTools.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonMenuToolsPlugins, + this.buttonMenuToolsOptions}); + this.buttonMenuTools.Text = "&Tools"; + // + // buttonMenuToolsPlugins + // + this.buttonMenuToolsPlugins.Name = "buttonMenuToolsPlugins"; + this.buttonMenuToolsPlugins.Text = "Plug-In Manager..."; + // + // buttonMenuToolsOptions + // + this.buttonMenuToolsOptions.BeginGroup = true; + this.buttonMenuToolsOptions.Name = "buttonMenuToolsOptions"; + this.buttonMenuToolsOptions.Text = "Options..."; + // + // buttonMenuProject + // + this.buttonMenuProject.Name = "buttonMenuProject"; + this.buttonMenuProject.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonMenuProjectAddFolder}); + this.buttonMenuProject.Text = "&Project"; + // + // buttonMenuProjectAddFolder + // + this.buttonMenuProjectAddFolder.Name = "buttonMenuProjectAddFolder"; + this.buttonMenuProjectAddFolder.Text = "Add Folder"; + // + // buttonMenuView + // + this.buttonMenuView.Name = "buttonMenuView"; + this.buttonMenuView.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonMenuViewProjectExplorer, + this.buttonMenuViewModelsAndTools, + this.buttonMenuViewMessages, + this.buttonMenuViewProperties, + this.buttonMenuViewCloseAll}); + this.buttonMenuView.Text = "&View"; + // + // buttonMenuViewProjectExplorer + // + this.buttonMenuViewProjectExplorer.Name = "buttonMenuViewProjectExplorer"; + this.buttonMenuViewProjectExplorer.Text = "&Project Explorer"; + // + // buttonMenuViewModelsAndTools + // + this.buttonMenuViewModelsAndTools.Name = "buttonMenuViewModelsAndTools"; + this.buttonMenuViewModelsAndTools.Text = "M&odels and Tools"; + // + // buttonMenuViewMessages + // + this.buttonMenuViewMessages.BeginGroup = true; + this.buttonMenuViewMessages.Name = "buttonMenuViewMessages"; + this.buttonMenuViewMessages.Text = "&Messages"; + // + // buttonMenuViewProperties + // + this.buttonMenuViewProperties.Name = "buttonMenuViewProperties"; + this.buttonMenuViewProperties.Text = "Pr&operties"; + // + // buttonMenuViewCloseAll + // + this.buttonMenuViewCloseAll.BeginGroup = true; + this.buttonMenuViewCloseAll.Name = "buttonMenuViewCloseAll"; + this.buttonMenuViewCloseAll.Text = "&Close All Views"; + // + // buttonMenuEdit + // + this.buttonMenuEdit.Name = "buttonMenuEdit"; + this.buttonMenuEdit.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonMenuEditUndo, + this.buttonMenuEditRedo, + this.buttonMenuEditCut, + this.buttonMenuEditCopy, + this.buttonMenuEditPaste, + this.buttonMenuEditDelete}); + this.buttonMenuEdit.Text = "&Edit"; + // + // buttonMenuEditUndo + // + this.buttonMenuEditUndo.Name = "buttonMenuEditUndo"; + this.buttonMenuEditUndo.Text = "&Undo"; + // + // buttonMenuEditRedo + // + this.buttonMenuEditRedo.Name = "buttonMenuEditRedo"; + this.buttonMenuEditRedo.Text = "&Redo"; + // + // buttonMenuEditCut + // + this.buttonMenuEditCut.BeginGroup = true; + this.buttonMenuEditCut.Name = "buttonMenuEditCut"; + this.buttonMenuEditCut.Text = "Cu&t"; + // + // buttonMenuEditCopy + // + this.buttonMenuEditCopy.Name = "buttonMenuEditCopy"; + this.buttonMenuEditCopy.Text = "&Copy"; + // + // buttonMenuEditPaste + // + this.buttonMenuEditPaste.Name = "buttonMenuEditPaste"; + this.buttonMenuEditPaste.Text = "&Paste"; + // + // buttonMenuEditDelete + // + this.buttonMenuEditDelete.Name = "buttonMenuEditDelete"; + this.buttonMenuEditDelete.Text = "&Delete"; + // + // buttonMenuFile + // + this.buttonMenuFile.Name = "buttonMenuFile"; + this.buttonMenuFile.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonMenuFileNewProject, + this.buttonMenuFileOpenProject, + this.buttonMenuFileSaveProject, + this.buttonMenuFileSaveProjectAs, + this.buttonMenuFileCloseProject, + this.buttonMenuFileRecentProjects, + this.buttonMenuFileExit}); + this.buttonMenuFile.Text = "&File"; + // + // buttonMenuFileNewProject + // + this.buttonMenuFileNewProject.GlobalName = "fileNew"; + this.buttonMenuFileNewProject.Name = "buttonMenuFileNewProject"; + this.buttonMenuFileNewProject.Text = "&New Project"; + // + // buttonMenuFileOpenProject + // + this.buttonMenuFileOpenProject.BeginGroup = true; + this.buttonMenuFileOpenProject.GlobalName = "fileOpen"; + this.buttonMenuFileOpenProject.Name = "buttonMenuFileOpenProject"; + this.buttonMenuFileOpenProject.Text = "&Open Project..."; + // + // buttonMenuFileSaveProject + // + this.buttonMenuFileSaveProject.BeginGroup = true; + this.buttonMenuFileSaveProject.GlobalName = "fileSave"; + this.buttonMenuFileSaveProject.Name = "buttonMenuFileSaveProject"; + this.buttonMenuFileSaveProject.Text = "&Save Project"; + // + // buttonMenuFileSaveProjectAs + // + this.buttonMenuFileSaveProjectAs.Name = "buttonMenuFileSaveProjectAs"; + this.buttonMenuFileSaveProjectAs.Text = "Save Project As..."; + // + // buttonMenuFileCloseProject + // + this.buttonMenuFileCloseProject.BeginGroup = true; + this.buttonMenuFileCloseProject.Name = "buttonMenuFileCloseProject"; + this.buttonMenuFileCloseProject.Text = "&Close Project"; + // + // buttonMenuFileRecentProjects + // + this.buttonMenuFileRecentProjects.BeginGroup = true; + this.buttonMenuFileRecentProjects.Name = "buttonMenuFileRecentProjects"; + this.buttonMenuFileRecentProjects.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonMenuFileRecentProjectEmpty}); + this.buttonMenuFileRecentProjects.Text = "&Recent Projects"; + // + // buttonMenuFileRecentProjectEmpty + // + this.buttonMenuFileRecentProjectEmpty.Name = "buttonMenuFileRecentProjectEmpty"; + this.buttonMenuFileRecentProjectEmpty.Text = ""; + // + // buttonMenuFileExit + // + this.buttonMenuFileExit.BeginGroup = true; + this.buttonMenuFileExit.Name = "buttonMenuFileExit"; + this.buttonMenuFileExit.Text = "E&xit"; + // + // bar1 + // + this.bar1.AccessibleDescription = "DotNetBar Bar (bar1)"; + this.bar1.AccessibleName = "DotNetBar Bar"; + this.bar1.AccessibleRole = System.Windows.Forms.AccessibleRole.MenuBar; + this.bar1.Dock = System.Windows.Forms.DockStyle.Top; + this.bar1.DockSide = DevComponents.DotNetBar.eDockSide.Top; + this.bar1.Items.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonItem1, + this.buttonItemEditMenu, + this.buttonItem19, + this.buttonItem26, + this.Tools, + this.buttonItem40}); + this.bar1.Location = new System.Drawing.Point(0, 0); + this.bar1.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.bar1.MenuBar = true; + this.bar1.Name = "bar1"; + this.bar1.Size = new System.Drawing.Size(765, 27); + this.bar1.Stretch = true; + this.bar1.Style = DevComponents.DotNetBar.eDotNetBarStyle.Office2003; + this.bar1.TabIndex = 32; + this.bar1.TabStop = false; + this.bar1.Text = "&Help"; + // + // buttonItem1 + // + this.buttonItem1.Name = "buttonItem1"; + this.buttonItem1.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonItem2, + this.buttonItem3, + this.buttonItem4, + this.buttonItem5, + this.buttonItem6, + this.buttonItem7, + this.buttonItem8, + this.buttonItem9, + this.buttonItem11}); + this.buttonItem1.Text = "&File"; + // + // buttonItem2 + // + this.buttonItem2.GlobalName = "fileNew"; + this.buttonItem2.Name = "buttonItem2"; + this.buttonItem2.Text = "&New Project"; + // + // buttonItem3 + // + this.buttonItem3.Name = "buttonItem3"; + this.buttonItem3.Text = "New &Folder"; + // + // buttonItem4 + // + this.buttonItem4.Name = "buttonItem4"; + this.buttonItem4.Text = "New &Task"; + // + // buttonItem5 + // + this.buttonItem5.BeginGroup = true; + this.buttonItem5.GlobalName = "fileOpen"; + this.buttonItem5.Name = "buttonItem5"; + this.buttonItem5.Text = "&Open Project..."; + // + // buttonItem6 + // + this.buttonItem6.BeginGroup = true; + this.buttonItem6.GlobalName = "fileSave"; + this.buttonItem6.Name = "buttonItem6"; + this.buttonItem6.Text = "&Save Project"; + // + // buttonItem7 + // + this.buttonItem7.Name = "buttonItem7"; + this.buttonItem7.Text = "Save Project As..."; + // + // buttonItem8 + // + this.buttonItem8.BeginGroup = true; + this.buttonItem8.Name = "buttonItem8"; + this.buttonItem8.Text = "&Close Project"; + // + // buttonItem9 + // + this.buttonItem9.BeginGroup = true; + this.buttonItem9.Name = "buttonItem9"; + this.buttonItem9.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonItem10}); + this.buttonItem9.Text = "&Recent Projects"; + // + // buttonItem10 + // + this.buttonItem10.Name = "buttonItem10"; + this.buttonItem10.Text = ""; + // + // buttonItem11 + // + this.buttonItem11.BeginGroup = true; + this.buttonItem11.Name = "buttonItem11"; + this.buttonItem11.Text = "E&xit"; + // + // buttonItemEditMenu + // + this.buttonItemEditMenu.Name = "buttonItemEditMenu"; + this.buttonItemEditMenu.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonItem13, + this.buttonItem14, + this.buttonItem15, + this.buttonItem16, + this.buttonItem17, + this.buttonItem18}); + this.buttonItemEditMenu.Text = "&Edit"; + // + // buttonItem13 + // + this.buttonItem13.Name = "buttonItem13"; + this.buttonItem13.Text = "&Undo"; + // + // buttonItem14 + // + this.buttonItem14.Name = "buttonItem14"; + this.buttonItem14.Text = "&Redo"; + // + // buttonItem15 + // + this.buttonItem15.BeginGroup = true; + this.buttonItem15.Name = "buttonItem15"; + this.buttonItem15.Text = "Cu&t"; + // + // buttonItem16 + // + this.buttonItem16.Name = "buttonItem16"; + this.buttonItem16.Text = "&Copy"; + // + // buttonItem17 + // + this.buttonItem17.Name = "buttonItem17"; + this.buttonItem17.Text = "&Paste"; + // + // buttonItem18 + // + this.buttonItem18.Name = "buttonItem18"; + this.buttonItem18.Text = "&Delete"; + // + // buttonItem19 + // + this.buttonItem19.Name = "buttonItem19"; + this.buttonItem19.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonItem20, + this.buttonItem21, + this.buttonItem22, + this.buttonItem23, + this.buttonItem24, + this.buttonItem25}); + this.buttonItem19.Text = "&View"; + // + // buttonItem20 + // + this.buttonItem20.Name = "buttonItem20"; + this.buttonItem20.Text = "&Project Explorer"; + // + // buttonItem21 + // + this.buttonItem21.Name = "buttonItem21"; + this.buttonItem21.Text = "M&odels and Tools"; + // + // buttonItem22 + // + this.buttonItem22.ImageIndex = 1; + this.buttonItem22.Name = "buttonItem22"; + this.buttonItem22.Text = "Models"; + // + // buttonItem23 + // + this.buttonItem23.BeginGroup = true; + this.buttonItem23.Name = "buttonItem23"; + this.buttonItem23.Text = "&Messages"; + // + // buttonItem24 + // + this.buttonItem24.Name = "buttonItem24"; + this.buttonItem24.Text = "Pr&operties"; + // + // buttonItem25 + // + this.buttonItem25.BeginGroup = true; + this.buttonItem25.Name = "buttonItem25"; + this.buttonItem25.Text = "&Close All Views"; + // + // buttonItem26 + // + this.buttonItem26.Name = "buttonItem26"; + this.buttonItem26.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonItem27, + this.buttonItem28}); + this.buttonItem26.Text = "&Project"; + // + // buttonItem27 + // + this.buttonItem27.Name = "buttonItem27"; + this.buttonItem27.Text = "Add Folder"; + // + // buttonItem28 + // + this.buttonItem28.Name = "buttonItem28"; + this.buttonItem28.Text = "Add Task"; + // + // Tools + // + this.Tools.Name = "Tools"; + this.Tools.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonItem38, + this.buttonItem39}); + this.Tools.Text = "&Tools"; + // + // buttonItem38 + // + this.buttonItem38.Name = "buttonItem38"; + this.buttonItem38.Text = "Plug-In Manager..."; + // + // buttonItem39 + // + this.buttonItem39.BeginGroup = true; + this.buttonItem39.Name = "buttonItem39"; + this.buttonItem39.Text = "Options..."; + // + // buttonItem40 + // + this.buttonItem40.Name = "buttonItem40"; + this.buttonItem40.SubItems.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.buttonItem41}); + this.buttonItem40.Text = "&Help"; + // + // buttonItem41 + // + this.buttonItem41.Name = "buttonItem41"; + this.buttonItem41.Text = "&About"; + // + // panelDockContainer1 + // + this.panelDockContainer1.Location = new System.Drawing.Point(3, 28); + this.panelDockContainer1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.panelDockContainer1.Name = "panelDockContainer1"; + this.panelDockContainer1.Size = new System.Drawing.Size(478, 316); + this.panelDockContainer1.Style.Alignment = System.Drawing.StringAlignment.Center; + this.panelDockContainer1.Style.BackColor1.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.BarBackground; + this.panelDockContainer1.Style.BackColor2.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.BarBackground2; + this.panelDockContainer1.Style.BorderColor.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.BarDockedBorder; + this.panelDockContainer1.Style.ForeColor.ColorSchemePart = DevComponents.DotNetBar.eColorSchemePart.ItemText; + this.panelDockContainer1.Style.GradientAngle = 90; + this.panelDockContainer1.TabIndex = 0; + // + // dockContainerItem1 + // + this.dockContainerItem1.Control = this.panelDockContainer1; + this.dockContainerItem1.Name = "dockContainerItem1"; + this.dockContainerItem1.Text = "dockContainerItem1"; + // + // barManager + // + this.dockingManager.BottomDockSite = this.barBottomDockSite; + this.dockingManager.FillDockSite = this.dockSiteCenter; + this.dockingManager.LeftDockSite = this.barLeftDockSite; + this.dockingManager.ParentForm = this; + this.dockingManager.RightDockSite = this.barRightDockSite; + this.dockingManager.Style = DevComponents.DotNetBar.eDotNetBarStyle.Office2003; + this.dockingManager.ToolbarBottomDockSite = this.dockSite4; + this.dockingManager.ToolbarLeftDockSite = this.dockSite1; + this.dockingManager.ToolbarRightDockSite = this.dockSite2; + this.dockingManager.ToolbarTopDockSite = this.dockSite3; + this.dockingManager.TopDockSite = this.barTopDockSite; + // + // barBottomDockSite + // + this.barBottomDockSite.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.barBottomDockSite.Dock = System.Windows.Forms.DockStyle.Bottom; + this.barBottomDockSite.DocumentDockContainer = new DevComponents.DotNetBar.DocumentDockContainer(); + this.barBottomDockSite.Location = new System.Drawing.Point(0, 747); + this.barBottomDockSite.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.barBottomDockSite.Name = "barBottomDockSite"; + this.barBottomDockSite.Size = new System.Drawing.Size(765, 0); + this.barBottomDockSite.TabIndex = 3; + this.barBottomDockSite.TabStop = false; + // + // dockSiteCenter + // + this.dockSiteCenter.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.dockSiteCenter.Controls.Add(this.barCenter); + this.dockSiteCenter.Dock = System.Windows.Forms.DockStyle.Fill; + this.dockSiteCenter.DocumentDockContainer = new DevComponents.DotNetBar.DocumentDockContainer(); + this.dockSiteCenter.Location = new System.Drawing.Point(0, 28); + this.dockSiteCenter.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dockSiteCenter.Name = "dockSiteCenter"; + this.dockSiteCenter.Size = new System.Drawing.Size(765, 719); + this.dockSiteCenter.TabIndex = 36; + this.dockSiteCenter.TabStop = false; + // + // barCenter + // + this.barCenter.AccessibleDescription = "DotNetBar Bar (barCenter)"; + this.barCenter.AccessibleName = "DotNetBar Bar"; + this.barCenter.AccessibleRole = System.Windows.Forms.AccessibleRole.ToolBar; + this.barCenter.AlwaysDisplayDockTab = true; + this.barCenter.CanCustomize = false; + this.barCenter.CanDockBottom = false; + this.barCenter.CanDockDocument = true; + this.barCenter.CanDockLeft = false; + this.barCenter.CanDockRight = false; + this.barCenter.CanDockTop = false; + this.barCenter.CanHide = true; + this.barCenter.CanUndock = false; + this.barCenter.Controls.Add(this.panelDockContainer1); + this.barCenter.DockTabAlignment = DevComponents.DotNetBar.eTabStripAlignment.Top; + this.barCenter.Items.AddRange(new DevComponents.DotNetBar.BaseItem[] { + this.dockContainerItem1}); + this.barCenter.LayoutType = DevComponents.DotNetBar.eLayoutType.DockContainer; + this.barCenter.Location = new System.Drawing.Point(0, 0); + this.barCenter.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.barCenter.Name = "barCenter"; + this.barCenter.SelectedDockTab = 0; + this.barCenter.Size = new System.Drawing.Size(645, 427); + this.barCenter.Stretch = true; + this.barCenter.Style = DevComponents.DotNetBar.eDotNetBarStyle.Office2003; + this.barCenter.TabIndex = 0; + this.barCenter.TabNavigation = true; + this.barCenter.TabStop = false; + // + // barLeftDockSite + // + this.barLeftDockSite.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.barLeftDockSite.Dock = System.Windows.Forms.DockStyle.Left; + this.barLeftDockSite.DocumentDockContainer = new DevComponents.DotNetBar.DocumentDockContainer(); + this.barLeftDockSite.Location = new System.Drawing.Point(0, 28); + this.barLeftDockSite.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.barLeftDockSite.Name = "barLeftDockSite"; + this.barLeftDockSite.Size = new System.Drawing.Size(0, 719); + this.barLeftDockSite.TabIndex = 0; + this.barLeftDockSite.TabStop = false; + // + // barRightDockSite + // + this.barRightDockSite.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.barRightDockSite.Dock = System.Windows.Forms.DockStyle.Right; + this.barRightDockSite.DocumentDockContainer = new DevComponents.DotNetBar.DocumentDockContainer(); + this.barRightDockSite.Location = new System.Drawing.Point(765, 28); + this.barRightDockSite.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.barRightDockSite.Name = "barRightDockSite"; + this.barRightDockSite.Size = new System.Drawing.Size(0, 719); + this.barRightDockSite.TabIndex = 1; + this.barRightDockSite.TabStop = false; + // + // dockSite4 + // + this.dockSite4.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.dockSite4.Dock = System.Windows.Forms.DockStyle.Bottom; + this.dockSite4.Location = new System.Drawing.Point(0, 747); + this.dockSite4.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dockSite4.Name = "dockSite4"; + this.dockSite4.Size = new System.Drawing.Size(765, 0); + this.dockSite4.TabIndex = 7; + this.dockSite4.TabStop = false; + // + // dockSite1 + // + this.dockSite1.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.dockSite1.Dock = System.Windows.Forms.DockStyle.Left; + this.dockSite1.Location = new System.Drawing.Point(0, 28); + this.dockSite1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dockSite1.Name = "dockSite1"; + this.dockSite1.Size = new System.Drawing.Size(0, 719); + this.dockSite1.TabIndex = 4; + this.dockSite1.TabStop = false; + // + // dockSite2 + // + this.dockSite2.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.dockSite2.Dock = System.Windows.Forms.DockStyle.Right; + this.dockSite2.Location = new System.Drawing.Point(765, 28); + this.dockSite2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dockSite2.Name = "dockSite2"; + this.dockSite2.Size = new System.Drawing.Size(0, 719); + this.dockSite2.TabIndex = 5; + this.dockSite2.TabStop = false; + // + // dockSite3 + // + this.dockSite3.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.dockSite3.Controls.Add(this.bar1); + this.dockSite3.Dock = System.Windows.Forms.DockStyle.Top; + this.dockSite3.Location = new System.Drawing.Point(0, 0); + this.dockSite3.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.dockSite3.Name = "dockSite3"; + this.dockSite3.Size = new System.Drawing.Size(765, 28); + this.dockSite3.TabIndex = 6; + this.dockSite3.TabStop = false; + // + // barTopDockSite + // + this.barTopDockSite.AccessibleRole = System.Windows.Forms.AccessibleRole.Window; + this.barTopDockSite.Dock = System.Windows.Forms.DockStyle.Top; + this.barTopDockSite.DocumentDockContainer = new DevComponents.DotNetBar.DocumentDockContainer(); + this.barTopDockSite.Location = new System.Drawing.Point(0, 28); + this.barTopDockSite.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.barTopDockSite.Name = "barTopDockSite"; + this.barTopDockSite.Size = new System.Drawing.Size(765, 0); + this.barTopDockSite.TabIndex = 2; + this.barTopDockSite.TabStop = false; + // + // DotNetBarTestForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(765, 747); + this.Controls.Add(this.dockSiteCenter); + this.Controls.Add(this.barLeftDockSite); + this.Controls.Add(this.barRightDockSite); + this.Controls.Add(this.barTopDockSite); + this.Controls.Add(this.barBottomDockSite); + this.Controls.Add(this.dockSite1); + this.Controls.Add(this.dockSite2); + this.Controls.Add(this.dockSite3); + this.Controls.Add(this.dockSite4); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.Name = "DotNetBarTestForm"; + this.Text = "testForm"; + ((System.ComponentModel.ISupportInitialize)(this.bar1)).EndInit(); + this.dockSiteCenter.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.barCenter)).EndInit(); + this.barCenter.ResumeLayout(false); + this.dockSite3.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private DevComponents.DotNetBar.ButtonItem buttonMenuHelp; + private DevComponents.DotNetBar.ButtonItem buttonMenuHelpAbout; + private DevComponents.DotNetBar.ButtonItem buttonMenuTools; + private DevComponents.DotNetBar.ButtonItem buttonMenuToolsPlugins; + private DevComponents.DotNetBar.ButtonItem buttonMenuToolsOptions; + private DevComponents.DotNetBar.ButtonItem buttonMenuProject; + private DevComponents.DotNetBar.ButtonItem buttonMenuProjectAddFolder; + private DevComponents.DotNetBar.ButtonItem buttonMenuView; + private DevComponents.DotNetBar.ButtonItem buttonMenuViewProjectExplorer; + private DevComponents.DotNetBar.ButtonItem buttonMenuViewModelsAndTools; + private DevComponents.DotNetBar.ButtonItem buttonMenuViewMessages; + private DevComponents.DotNetBar.ButtonItem buttonMenuViewProperties; + private DevComponents.DotNetBar.ButtonItem buttonMenuViewCloseAll; + private DevComponents.DotNetBar.ButtonItem buttonMenuEdit; + private DevComponents.DotNetBar.ButtonItem buttonMenuEditUndo; + private DevComponents.DotNetBar.ButtonItem buttonMenuEditRedo; + private DevComponents.DotNetBar.ButtonItem buttonMenuEditCut; + private DevComponents.DotNetBar.ButtonItem buttonMenuEditCopy; + private DevComponents.DotNetBar.ButtonItem buttonMenuEditPaste; + private DevComponents.DotNetBar.ButtonItem buttonMenuEditDelete; + private DevComponents.DotNetBar.ButtonItem buttonMenuFile; + private DevComponents.DotNetBar.ButtonItem buttonMenuFileNewProject; + private DevComponents.DotNetBar.ButtonItem buttonMenuFileOpenProject; + private DevComponents.DotNetBar.ButtonItem buttonMenuFileSaveProject; + private DevComponents.DotNetBar.ButtonItem buttonMenuFileSaveProjectAs; + private DevComponents.DotNetBar.ButtonItem buttonMenuFileCloseProject; + private DevComponents.DotNetBar.ButtonItem buttonMenuFileRecentProjects; + private DevComponents.DotNetBar.ButtonItem buttonMenuFileRecentProjectEmpty; + private DevComponents.DotNetBar.ButtonItem buttonMenuFileExit; + private DevComponents.DotNetBar.Bar bar1; + private DevComponents.DotNetBar.Bar barCenter; + private DevComponents.DotNetBar.PanelDockContainer panelDockContainer1; + private DevComponents.DotNetBar.DockContainerItem dockContainerItem1; + public DevComponents.DotNetBar.DotNetBarManager dockingManager; + public DevComponents.DotNetBar.DockSite dockSiteCenter; + private DevComponents.DotNetBar.DockSite barLeftDockSite; + private DevComponents.DotNetBar.DockSite barRightDockSite; + private DevComponents.DotNetBar.DockSite barTopDockSite; + private DevComponents.DotNetBar.DockSite barBottomDockSite; + private DevComponents.DotNetBar.DockSite dockSite1; + private DevComponents.DotNetBar.DockSite dockSite2; + private DevComponents.DotNetBar.DockSite dockSite3; + private DevComponents.DotNetBar.DockSite dockSite4; + + private DevComponents.DotNetBar.ButtonItem buttonItem1; + private DevComponents.DotNetBar.ButtonItem buttonItem2; + private DevComponents.DotNetBar.ButtonItem buttonItem3; + private DevComponents.DotNetBar.ButtonItem buttonItem4; + private DevComponents.DotNetBar.ButtonItem buttonItem5; + private DevComponents.DotNetBar.ButtonItem buttonItem6; + private DevComponents.DotNetBar.ButtonItem buttonItem7; + private DevComponents.DotNetBar.ButtonItem buttonItem8; + private DevComponents.DotNetBar.ButtonItem buttonItem9; + private DevComponents.DotNetBar.ButtonItem buttonItem10; + private DevComponents.DotNetBar.ButtonItem buttonItem11; + private DevComponents.DotNetBar.ButtonItem buttonItemEditMenu; + private DevComponents.DotNetBar.ButtonItem buttonItem13; + private DevComponents.DotNetBar.ButtonItem buttonItem14; + private DevComponents.DotNetBar.ButtonItem buttonItem15; + private DevComponents.DotNetBar.ButtonItem buttonItem16; + private DevComponents.DotNetBar.ButtonItem buttonItem17; + private DevComponents.DotNetBar.ButtonItem buttonItem18; + private DevComponents.DotNetBar.ButtonItem buttonItem19; + private DevComponents.DotNetBar.ButtonItem buttonItem20; + private DevComponents.DotNetBar.ButtonItem buttonItem21; + private DevComponents.DotNetBar.ButtonItem buttonItem22; + private DevComponents.DotNetBar.ButtonItem buttonItem23; + private DevComponents.DotNetBar.ButtonItem buttonItem24; + private DevComponents.DotNetBar.ButtonItem buttonItem25; + private DevComponents.DotNetBar.ButtonItem buttonItem26; + private DevComponents.DotNetBar.ButtonItem buttonItem27; + private DevComponents.DotNetBar.ButtonItem buttonItem28; + private DevComponents.DotNetBar.ButtonItem buttonItem37; + private DevComponents.DotNetBar.ButtonItem buttonItem38; + private DevComponents.DotNetBar.ButtonItem buttonItem39; + private DevComponents.DotNetBar.ButtonItem buttonItem40; + private DevComponents.DotNetBar.ButtonItem buttonItem41; + private DevComponents.DotNetBar.ButtonItem Tools; + // Copied Controls from MainWindow in DeltaShell + + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using DelftTools.Controls; +using DelftTools.Shell.Core; +using DelftTools.Shell.Gui; +using DelftTools.Shell.Gui.Forms; +using DeltaShell.Gui.Forms; +using MenuItem=DeltaShell.Gui.Forms.MenuItem; +using ToolBar=DeltaShell.Gui.Forms.ToolBar; + +namespace DeltaShell.Tests.Gui +{ + public partial class DotNetBarTestForm : Form, IMainWindow + { + private ToolBarManager toolBarManager; + + public ToolBarManager ToolBarManager + { + get { return toolBarManager; } + set { toolBarManager = value; } + } + + public DotNetBarTestForm() + { + InitializeComponent(); + toolBarManager = new ToolBarManager(dockingManager); + } + public DevComponents.DotNetBar.Bar MainMenu + { + get + { + return bar1; + } + } + + #region IMainWindow Members + + public IMessageWindow MessageWindow + { + get { throw new NotImplementedException("The method or operation is not implemented."); } + } + + public IView WelcomePage + { + get { throw new NotImplementedException("The method or operation is not implemented."); } + } + + public string Title + { + get + { + throw new NotImplementedException("The method or operation is not implemented."); + } + set + { + throw new NotImplementedException("The method or operation is not implemented."); + } + } + + public IMenuItem CreateMenuItem() + { + return new MenuItem(toolBarManager); + } + + public IMenuItem CreateMenuComboItem() + { + return new MenuComboItem(toolBarManager); + } + + public IToolBar GetToolBar(string name) + { + return toolBarManager.GetToolBar(name); + } + + public IToolBar CreateToolBar() + { + return toolBarManager.CreateToolBar(); + } + + #endregion + + #region IMainWindow Members + + public IList Toolbars + { + get { return toolBarManager; } + } + + public string StatusBarMessage + { + get { return ""; } + set { } + } + + public void ValidateToolbars() + { + } + + public void ValidateMenuItems() + { + } + + public void ToggleFullScreen() + { + throw new NotImplementedException(); + } + + #endregion + + #region IMainWindow Members + + + public IToolBar ApplicationMenu + { + get + { + return new ToolBar(toolBarManager, bar1); + } + } + + IToolBar IMainWindow.MenuItems + { + get { throw new NotImplementedException("The method or operation is not implemented."); } + } + + #endregion + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.resx =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.resx (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/DotNetBarTestForm.resx (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/Forms/AvalonDockDockingManagerTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/Forms/AvalonDockDockingManagerTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/Forms/AvalonDockDockingManagerTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,83 @@ +using DelftTools.Shell.Gui; +using DelftTools.Utils.Reflection; +using DeltaShell.Gui.Forms.ViewManager; +using DeltaShell.Tests.TestObjects; +using NUnit.Framework; +using Rhino.Mocks; +using Xceed.Wpf.AvalonDock; +using Xceed.Wpf.AvalonDock.Layout; + +namespace DeltaShell.Tests.Gui.Forms +{ + [TestFixture] + public class AvalonDockDockingManagerTest + { + [Test] + public void ViewTextChangedResultsInTabNameChanged() + { + var mocks = new MockRepository(); + var dockManager = mocks.Stub(); + var view = new TestView(); + + var dock = new AvalonDockDockingManager(dockManager, new[] + { + ViewLocation.Document + }); + dock.Add(view, ViewLocation.Document); + + var layout = TypeUtils.CallPrivateMethod(dock, "GetLayoutContent", view); + + Assert.AreEqual("", layout.Title); + view.Text = "Test"; + + Assert.AreEqual("Test", layout.Title); + } + + [Test] + public void LockingAndUnlockingViewSetsLockIcon() + { + var mocks = new MockRepository(); + var dockManager = mocks.Stub(); + var view = new ReusableTestView(); + + var dock = new AvalonDockDockingManager(dockManager, new[] + { + ViewLocation.Document + }); + dock.Add(view, ViewLocation.Document); + + var layout = TypeUtils.CallPrivateMethod(dock, "GetLayoutContent", view); + + Assert.IsNull(layout.IconSource); //null because view doesn't have its own image + view.Locked = true; + Assert.IsNotNull(layout.IconSource); //(lock) image set + view.Locked = false; + Assert.IsNull(layout.IconSource); + } + + [Test] + public void SwitchingTabCausesOldTabsActiveControlToLoseFocusTools9109() + { + var view = new TestView(); + var view2 = new TestView(); + + // create an avalon dock/tab with two views + var dock = new AvalonDockDockingManager(new DockingManager(), new[] + { + ViewLocation.Document + }); + dock.Add(view, ViewLocation.Document); + dock.Add(view2, ViewLocation.Document); + dock.ActivateView(view); + + // set a textbox active + view.ActiveControl = view.Controls[0]; + + // switch to other tab + dock.ActivateView(view2); + + // assert the textbox is no longer active + Assert.IsNull(view.ActiveControl); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/Forms/ProgressBarDialogTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/Forms/ProgressBarDialogTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/Forms/ProgressBarDialogTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,35 @@ +using System.Threading; +using System.Windows.Forms; +using DelftTools.Controls.Swf; +using NUnit.Framework; + +namespace DeltaShell.Tests.Gui.Forms +{ + [TestFixture] + public class ProgressBarDialogTest + { + [Test] + public void EmptyTaskDoesNotHang() + { + ProgressBarDialog.PerformTask("Doing stuff", () => { }); + } + + [Test] + public void ShowProgress() + { + ProgressBarDialog.PerformTask("Doing stuff", () => Thread.Sleep(200)); + } + + [TestFixtureSetUp] + public void FixtureSetUp() + { + ModalHelper.MainWindow = new Form(); + } + + [TestFixtureTearDown] + public void FixtureTearDown() + { + ModalHelper.MainWindow = null; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/Forms/PropertyGridView/PropertyResolverTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/Forms/PropertyGridView/PropertyResolverTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/Forms/PropertyGridView/PropertyResolverTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,312 @@ +using System.Collections.Generic; +using DelftTools.Shell.Gui; +using DelftTools.Utils.PropertyBag.Dynamic; +using DeltaShell.Gui.Forms.PropertyGridView; +using NUnit.Framework; + +namespace DeltaShell.Tests.Gui.Forms.PropertyGridView +{ + [TestFixture] + public class PropertyResolverTest + { + # region GetObjectProperties tests + + [Test] + public void GetObjectProperties_WhenNoPropertyInfoIsFound_ReturnNull() + { + // Assert + Assert.IsNull(PropertyResolver.GetObjectProperties(new List(), 1.0)); + } + + [Test] + public void GetObjectProperties_WhenOnePropertyInfoIsFound_ReturnDynamicPropertyBagContainingOnlyThatPropertiesObject() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo>() + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new A()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(SimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + [Test] + public void GetObjectProperties_WhenOnePropertyInfoIsFoundButAdditionalChecksFail_ReturnNull() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo>() + { + AdditionalDataCheck = o => false + } + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new A()); + + // Assert + Assert.IsNull(objectProperties); + } + + [Test] + public void GetObjectProperties_WhenTwoPropertyInfoAreFoundOneWithAdditionalCheckOneWithBetterType_ReturnPropertiesObjectMatchingAdditionCheck() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo>() + { + AdditionalDataCheck = o => false + }, + new PropertyInfo>() + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new C()); + + // Assert + Assert.AreSame(typeof(SimpleProperties), + ((DynamicPropertyBag) objectProperties).GetContentType(), "we got A, expected C"); + } + + [Test] + public void GetObjectProperties_BasedOnDirectObjectTypeMatch_ReturnObjectPropertiesMatchingTypeD() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo>(), + new PropertyInfo>() + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new D()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(SimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + [Test] + public void GetObjectProperties_BasedOnDerivedObjectTypeMatch_ReturnObjectPropertiesForBaseClass() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo>(), + new PropertyInfo>() + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new D()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(SimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + [Test] + public void GetObjectProperties_BasedOnDerivedObjectTypeMatchAndAdditionalDataCheck_ReturnObjectPropertiesForBaseClassMatchingAdditionCheck() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo> + { + AdditionalDataCheck = o => true + }, + new PropertyInfo> + { + AdditionalDataCheck = o => true + } + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new D()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(SimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + [Test] + public void GetObjectProperties_BasedOnMatchingAdditionalDataCheck_ReturnMatchingWithAdditionalDataCheck() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo> + { + AdditionalDataCheck = o => true // Additional data check which will be matched + }, + new PropertyInfo>() + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new B()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(SimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + [Test] + public void GetObjectProperties_BasedOnMismatchingAdditionalDataCheck_ReturnFallBackPropertiesObject() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo> + { + AdditionalDataCheck = o => false // Additional data check which will not be matched + }, + new PropertyInfo>() + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new B()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(OtherSimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + [Test] + public void GetObjectProperties_BasedOnDerivedPropertyTypeMatch_ReturnDerivedObjectPropertiesClass() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo>(), + new PropertyInfo>() + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new B()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(DerivedSimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + [Test] + public void GetObjectProperties_BasedOnDerivedPropertyTypeMatchAndAdditionalDataCheck_ReturnDerivedObjectProperties() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo> + { + AdditionalDataCheck = o => true + }, + new PropertyInfo> + { + AdditionalDataCheck = o => true + } + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new B()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(DerivedSimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + [Test] + public void GetObjectProperties_WhenMultiplePropertyObjectsAreFound_ReturnNull() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo>(), + new PropertyInfo>() + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new B()); + + // Assert + Assert.IsNull(objectProperties); + } + + [Test] + public void GetObjectProperties_TakingAllPropertyInfoPropertiesIntoAccount_ReturnDerivedObjectPropertiesMatchingDataCheck() + { + // Setup + var propertyInfos = new List + { + new PropertyInfo> + { + AdditionalDataCheck = o => true + }, // D is not assignable from C: no candidate + new PropertyInfo> + { + AdditionalDataCheck = o => true + }, // A is less specific than C: candidate but not the most specific one + new PropertyInfo> + { + AdditionalDataCheck = o => false + }, // Additional data check is false: no candidate + new PropertyInfo> + { + AdditionalDataCheck = o => true + }, // SimpleProperties is less specific than DerivedSimpleProperties: candidate but not the most specific one + new PropertyInfo> + { + AdditionalDataCheck = o => true + } // Most specific! + }; + + // Call + var objectProperties = PropertyResolver.GetObjectProperties(propertyInfos, new C()); + + // Assert + Assert.IsTrue(objectProperties is DynamicPropertyBag); + Assert.AreSame(typeof(DerivedSimpleProperties), ((DynamicPropertyBag) objectProperties).GetContentType()); + } + + # endregion + + # region Nested types + + /* + * A + * ___^___ + * | | + * B C + * | + * D + * + * + * + * SimpleProperties OtherSimpleProperties + * ^ + * | + * DerivedSimpleProperties + * + */ + + private class A {} + + private class B : A {} + + private class C : A {} + + private class D : C {} + + private class SimpleProperties : ObjectProperties {} + + private class DerivedSimpleProperties : SimpleProperties {} + + private class OtherSimpleProperties : ObjectProperties {} + + # endregion + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/GuiExportHandlerTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/GuiExportHandlerTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/GuiExportHandlerTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using DelftTools.Shell.Core; +using DeltaShell.Gui; +using NUnit.Framework; +using Rhino.Mocks; +using SharpTestsEx; + +namespace DeltaShell.Tests.Gui +{ + [TestFixture] + public class GuiExportHandlerTest + { + [Test] + public void GetSupportedExporters() + { + var handler = new GuiExportHandler(FileExportersGetter, null); + + handler.GetSupportedExportersForItem("string item").Should().Not.Be.Empty(); + } + + [Test] + public void GetSupportedExportersChecksForCanExport() + { + var mocks = new MockRepository(); + var exporter = mocks.StrictMock(); + + exporter.Expect(e => e.SourceTypes()).Return(new[] + { + typeof(string) + }); + exporter.Expect(e => e.CanExportFor(null)).IgnoreArguments().Return(false); + + mocks.ReplayAll(); + + var handler = new GuiExportHandler(o => new[] + { + exporter + }, null); + handler.GetSupportedExportersForItem("string").Should().Be.Empty(); + + mocks.BackToRecordAll(); + + exporter.Expect(e => e.SourceTypes()).Return(new[] + { + typeof(string) + }); + exporter.Expect(e => e.CanExportFor(null)).IgnoreArguments().Return(true); + + mocks.ReplayAll(); + + handler.GetSupportedExportersForItem("string").Should().Not.Be.Empty(); + + mocks.VerifyAll(); + } + + private static IEnumerable FileExportersGetter(object item) + { + yield return new TestFileExporter(); + } + + public class TestFileExporter : IFileExporter + { + public string Name { get; private set; } + + public string Category { get; private set; } + + public string FileFilter { get; private set; } + + public Bitmap Icon { get; private set; } + + public bool Export(object item, string path) + { + return true; + } + + public IEnumerable SourceTypes() + { + yield return typeof(string); + } + + public bool CanExportFor(object item) + { + return true; + } + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/ImportActivityTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/ImportActivityTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/ImportActivityTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,59 @@ +using System.Linq; +using DelftTools.Shell.Core; +using DelftTools.Shell.Core.Workflow; +using DelftTools.Shell.Gui; +using NUnit.Framework; +using Rhino.Mocks; + +namespace DeltaShell.Tests.Gui +{ + [TestFixture] + public class ImportActivityTest + { + private readonly MockRepository mockRepository = new MockRepository(); + + [Test] + public void FileImportActivity() + { + // wrap importer by activity + var gui = mockRepository.Stub(); + var app = mockRepository.Stub(); + var project = new Project("test"); + gui.Application = app; + app.Expect(a => a.Project).Return(project).Repeat.Any(); + + var importer = mockRepository.Stub(); + var fileImportActivity = new FileImportActivity(importer) + { + Files = new[] + { + "test1", + "test2", + "test3" + } + }; + + Expect.Call(importer.ImportItem("test1")).Repeat.Once().Return(new object()); + Expect.Call(importer.ImportItem("test2")).Repeat.Once().Return(new object()); + Expect.Call(importer.ImportItem("test3")).Repeat.Once().Return(new object()); + mockRepository.ReplayAll(); + + // expect some reporting while processing each file + fileImportActivity.ImportedItemOwner = app.Project; + fileImportActivity.OnImportFinished += (sender, importedObject, theImporter) => + { + var projectToAddTo = sender.ImportedItemOwner as Project; + + if (projectToAddTo != null) + { + projectToAddTo.Items.Add(importedObject); + } + }; + fileImportActivity.Initialize(); + fileImportActivity.Initialize(); + fileImportActivity.Execute(); + + Assert.AreEqual(3, app.Project.Items.Count()); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/Log4netTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/Log4netTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/Log4netTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,46 @@ +// Log4net.cs created with MonoDevelop +// User: baart_f at 2:18 PM 8/8/2007 +// +// To change standard headers go to Edit->Preferences->Coding->Standard Headers +// + +using log4net; +using NUnit.Framework; + +namespace DeltaShell.Tests.Gui +{ + [TestFixture] + public class Log4net + { + [Test] + public void CreateLogger() + { + ILog log = LogManager.GetLogger("delftshell.tests.log4net"); + Assert.AreEqual(log.Logger.Name, "delftshell.tests.log4net"); + } + + [Test] + public void LoggingTypes() + { + ILog log = LogManager.GetLogger("delftshell.tests.log4net"); + log.Info("LoggingTypes"); + log.Debug("LoggingTypes"); + log.Warn("LoggingTypes"); + log.Error("LoggingTypes"); + log.Fatal("LoggingTypes"); + } + + [Test] + public void LoggingFormat() + { + ILog log = LogManager.GetLogger("delftshell.tests.log4net"); + //The following methods somehow dont work under mono..... + //TODO: find the cause of this + log.InfoFormat("LoggingTypes {0}", 1); + log.DebugFormat("LoggingTypes {0}", 1); + log.WarnFormat("LoggingTypes {0}", 1); + log.ErrorFormat("LoggingTypes {0}", 1); + log.FatalFormat("LoggingTypes {0}", 1); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/Resources/image1.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.Tests/Gui/Resources/image2.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.Tests/Gui/Resources/image3.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.Tests/Gui/Resources/image4.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.Tests/Gui/Resources/image5.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.Tests/Gui/Resources/image6.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.Tests/Gui/Resources/image7.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.Tests/Gui/Resources/image8.png =================================================================== diff -u Binary files differ Index: Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.Designer.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.Designer.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.Designer.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,56 @@ +namespace DeltaShell.Tests.Gui +{ + partial class ToolWindowTestControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.propertyGrid1 = new System.Windows.Forms.PropertyGrid(); + this.SuspendLayout(); + // + // propertyGrid1 + // + this.propertyGrid1.Dock = System.Windows.Forms.DockStyle.Fill; + this.propertyGrid1.Location = new System.Drawing.Point(0, 0); + this.propertyGrid1.Name = "propertyGrid1"; + this.propertyGrid1.Size = new System.Drawing.Size(150, 150); + this.propertyGrid1.TabIndex = 0; + // + // ToolWindowTestControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.propertyGrid1); + this.Name = "ToolWindowTestControl"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PropertyGrid propertyGrid1; + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,31 @@ +using System.Drawing; +using System.Windows.Forms; +using DelftTools.Controls; + +namespace DeltaShell.Tests.Gui +{ + public partial class ToolWindowTestControl : UserControl, IView + { + public ToolWindowTestControl() + { + Initialize(); + } + + private void Initialize() + { + InitializeComponent(); + propertyGrid1.SelectedObject = propertyGrid1; + } + + #region IView Members + + public object Data { get; set; } + + public Image Image { get; set; } + + public void EnsureVisible(object item) {} + public ViewInfo ViewInfo { get; set; } + + #endregion + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.resx =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.resx (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/ToolWindowTestControl.resx (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Gui/ViewListTest.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Gui/ViewListTest.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Gui/ViewListTest.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,311 @@ +using System.Collections.Generic; +using System.Linq; +using DelftTools.Controls; +using DelftTools.Controls.Swf; +using DelftTools.Shell.Gui; +using DelftTools.Utils; +using DelftTools.Utils.Collections; +using DeltaShell.Gui.Forms.ViewManager; +using DeltaShell.Tests.TestObjects; +using NUnit.Framework; +using SharpTestsEx; + +namespace DeltaShell.Tests.Gui +{ + [TestFixture] + public class ViewListTest + { + [Test] + public void CollectionChangedEvent() + { + var dockingManager = new TestDockingManager(); + + var toolWindowViewManager = new ViewList(dockingManager, ViewLocation.Left); + + var view = new ToolWindowTestControl + { + Text = "text" + }; + + var senders = new List(); + var actions = new List(); + var items = new List(); + var indexes = new List(); + toolWindowViewManager.CollectionChanged += (s, e) => + { + senders.Add(s); + actions.Add(e.Action); + items.Add(e.Item); + indexes.Add(e.Index); + }; + + toolWindowViewManager.Add(view); + toolWindowViewManager.Remove(view); + + // asserts + Assert.AreEqual(new[] + { + toolWindowViewManager, + toolWindowViewManager + }, senders); + Assert.AreEqual(new[] + { + NotifyCollectionChangeAction.Add, + NotifyCollectionChangeAction.Remove + }, actions); + Assert.AreEqual(new[] + { + view, + view + }, items); + Assert.AreEqual(new[] + { + 0, + 0 + }, indexes); + } + + [Test] + public void OpenViewForDataWithTwoViewsOneAdditionalViewShouldNotCausePrompt() + { + // for example if we have a central map view & a validation view for a model, the choice is simple! + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Left); + var viewResolver = new ViewResolver(viewList, new ViewInfo[] + { + new ViewInfo(), + new ViewInfo() + }); + + var testObject = new object(); + + viewResolver.OpenViewForData(testObject); + + var viewForTestObject = (TestView) viewList[0]; + Assert.IsInstanceOf(viewForTestObject); + Assert.AreEqual(testObject, viewForTestObject.Data); + } + + [Test] + public void OpenViewForDataWithViewTypeShouldUseNewViews() + { + // for example if we have a open functionview. Opening a view for another function should use the existing functionview + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Left); + var viewResolver = new ViewResolver(viewList, new ViewInfo[] + { + new ViewInfo() + }); + + var testObject = new object(); + + viewResolver.OpenViewForData(testObject); + + var viewForTestObject = (TestView) viewList[0]; + Assert.AreEqual(testObject, viewForTestObject.Data); + + var otherObject = new object(); + viewResolver.OpenViewForData(otherObject, typeof(TestView)); + + // no extra views. the first view now renders the other object + Assert.AreEqual(2, viewList.Count); + Assert.AreEqual(otherObject, viewList[1].Data); + } + + [Test] + public void OpeningAViewForAObjectShouldUseNewViewForLockedReusableView() + { + // for example if we have a open functionview. Opening a view for another function should use the existing functionview + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Left); + var viewResolver = new ViewResolver(viewList, new ViewInfo[] + { + new ViewInfo() + }); + + var testObject = new object(); + viewResolver.OpenViewForData(testObject); + + var viewForTestObject = (TestReusableView) viewList[0]; + Assert.AreEqual(testObject, viewForTestObject.Data); + + // lock the view so it can't be used for other data + viewForTestObject.Locked = true; + + var otherObject = new object(); + viewResolver.OpenViewForData(otherObject); + + // no extra views. the first view now renders the other object + Assert.AreEqual(2, viewList.Count); + Assert.AreEqual(otherObject, viewList[1].Data); + } + + [Test] + public void OpeningAViewForAObjectShouldUseNewViewForNonLockableView() + { + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Left); + var viewResolver = new ViewResolver(viewList, new ViewInfo[] + { + new ViewInfo() + }); + + var testObject = new object(); + viewResolver.OpenViewForData(testObject); + var viewForTestObject = viewList[0]; + Assert.AreEqual(testObject, viewForTestObject.Data); + + var otherObject = new object(); + viewResolver.OpenViewForData(otherObject); + + // extra views. the first view now renders the other object + Assert.AreEqual(2, viewList.Count); + + // no change in original view + Assert.AreEqual(testObject, viewForTestObject.Data); + } + + [Test] + public void OpeningAViewForAObjectShouldUsingExistingReusableView() + { + // for example if we have a open functionview. Opening a view for another function should use the existing functionview + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Left); + var viewResolver = new ViewResolver(viewList, new ViewInfo[] + { + new ViewInfo() + }); + + var testObject = new object(); + viewResolver.OpenViewForData(testObject); + var viewForTestObject = (TestReusableView) viewList[0]; + Assert.AreEqual(testObject, viewForTestObject.Data); + + var otherObject = new object(); + viewResolver.OpenViewForData(otherObject); + + // no extra views. the first view now renders the other object + Assert.AreEqual(1, viewList.Count); + Assert.AreEqual(otherObject, viewList[0].Data); + } + + [Test] + public void ReplacingAViewGivesAddAndRemoveEvents() + { + // get a view manager + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Left); + + // add a context aware view + var view = new TestView(); + + viewList.Add(view); + + // now replace the view with another one + var newView = new TestView(); + + var senders = new List(); + var actions = new List(); + var items = new List(); + + viewList.CollectionChanged += (s, e) => + { + senders.Add(s); + actions.Add(e.Action); + items.Add((IView) e.Item); + }; + + // action! replace a view + viewList[0] = newView; + + // assert the right collection changes occures ..for now it should be remove / add...no replace yet + Assert.AreEqual(new[] + { + viewList, + viewList + }, senders); + Assert.AreEqual(new[] + { + NotifyCollectionChangeAction.Remove, + NotifyCollectionChangeAction.Add + }, actions); + Assert.AreEqual(new[] + { + view, + newView + }, items); + } + + [Test] + public void OpeningViewForDataTwiceShouldOnlySetActiveView() + { + var url = new Url("Deltares", "www.deltares.nl"); + + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Document); + var viewResolver = new ViewResolver(viewList, new ViewInfo[] + { + new ViewInfo() + }); + + viewResolver.OpenViewForData(url); + + var activeView = viewList.ActiveView; + + viewList.ActiveView = null; + viewResolver.OpenViewForData(url); + + Assert.AreEqual(activeView, viewList.ActiveView); + } + + [Test] + public void GetViewsForDataWithCustomData() + { + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Left); + var viewResolver = new ViewResolver(viewList, new ViewInfo[] + { + new ViewInfo + { + GetViewData = o => o.RealData + } + }); + + var someDataObject = "some data object"; + var wrapper = new TestWrapper + { + RealData = someDataObject + }; + + var view = new TestView + { + Data = someDataObject + }; + + viewList.Add(view); + + var returnedViews = viewResolver.GetViewsForData(wrapper); // <-- must trigger IViewProvider.IsViewForData() + + returnedViews.Count.Should("number of compatible views").Be.EqualTo(1); + + returnedViews.First().Should("correct view is returned back").Be.EqualTo(view); + } + + [Test] + public void OpenViewForItemShouldNotReturnSubClassedViews() + { + var viewList = new ViewList(new TestDockingManager(), ViewLocation.Left); + var viewResolver = new ViewResolver(viewList, new ViewInfo[] + { + new ViewInfo + { + Description = "Object view" + }, + new ViewInfo + { + Description = "String view" + } // string inherits from object + }); + + var data = "string data"; + viewResolver.OpenViewForData(data); + + var view = viewList.ActiveView; + + Assert.AreEqual(data, view.Data); + Assert.AreEqual(typeof(ReusableTestView), view.GetType()); + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Properties/AssemblyInfo.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Properties/AssemblyInfo.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Properties/AssemblyInfo.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,40 @@ +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +using System.Reflection; +using System.Runtime.InteropServices; +using NUnit.Framework; + +[assembly: AssemblyTitle("DeltaShell.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Deltares")] +[assembly: AssemblyProduct("DeltaShell.Tests")] +[assembly: AssemblyCopyright("Copyright � Deltares 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("2d410d08-3a73-45cd-a541-14238fcade49")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: RequiresSTA] \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/Properties/Resources.Designer.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Properties/Resources.Designer.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/Properties/Resources.Designer.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,60 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DeltaShell.Tests.Properties { + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DeltaShell.Tests.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} Index: Core/Common/test/Core.Common.Tests/Properties/Resources.resx =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/Properties/Resources.resx (revision 0) +++ Core/Common/test/Core.Common.Tests/Properties/Resources.resx (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/TestObjects/TestApplication.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestApplication.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestApplication.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,159 @@ +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration; +using System.Resources; +using DelftTools.Shell.Core; +using DelftTools.Shell.Core.Workflow; + +namespace DeltaShell.Tests.TestObjects +{ + internal class TestApplication : IApplication + { + // Required by interface, but not used (yet) +#pragma warning disable 67 + public event Action ProjectOpening; + + public event Action ProjectOpened; + public event Action ProjectClosing; + public event Action ProjectSaving; + public event Action ProjectSaveFailed; + public event Action ProjectSaved; + + public event Action AfterRun; +#pragma warning restore 67 + + public int DisposeCallCount { get; private set; } + + public IList Plugins { get; set; } + + public Project Project { get; set; } + + public IActivityRunner ActivityRunner + { + get + { + return new ActivityRunner(); + } + } + + public NameValueCollection Settings { get; set; } + public ApplicationSettingsBase UserSettings { get; set; } + + public ResourceManager Resources { get; set; } + + public IEnumerable FileImporters + { + get + { + yield break; + } + } + + public IEnumerable FileExporters + { + get + { + yield break; + } + } + + public string ProjectDataDirectory + { + get + { + throw new NotImplementedException(); + } + } + + public string ProjectFilePath + { + get + { + throw new NotImplementedException(); + } + } + + public string PluginVersions { get; private set; } + + public ApplicationPlugin GetPluginForType(Type type) + { + throw new NotImplementedException(); + } + + public bool IsActivityRunning() + { + throw new NotImplementedException(); + } + + public string GetUserSettingsDirectoryPath() + { + throw new NotImplementedException(); + } + + public void Run() + { + throw new NotImplementedException(); + } + + public void Run(string projectPath) + { + throw new NotImplementedException(); + } + + public void Exit() + { + throw new NotImplementedException(); + } + + public void RunActivity(IActivity activity) + { + throw new NotImplementedException(); + } + + public void RunActivityInBackground(IActivity activity) + { + throw new NotImplementedException(); + } + + public bool IsActivityRunningOrWaiting(IActivity activity) + { + throw new NotImplementedException(); + } + + public void StopActivity(IActivity activity) + { + throw new NotImplementedException(); + } + + public void CreateNewProject() + { + Project = new Project(); + } + + public bool OpenProject(string path) + { + throw new NotImplementedException(); + } + + public void CloseProject() + { + Project = null; + } + + public void SaveProjectAs(string path) + { + throw new NotImplementedException(); + } + + public void SaveProject() + { + throw new NotImplementedException(); + } + + public void Dispose() + { + DisposeCallCount++; + } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/TestObjects/TestDockingManager.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestDockingManager.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestDockingManager.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using DelftTools.Controls; +using DelftTools.Shell.Gui; +using DeltaShell.Gui.Forms.ViewManager; + +namespace DeltaShell.Tests.TestObjects +{ + /// + /// Docking manager for test...does nothing + /// + public class TestDockingManager : IDockingManager + { +// Required by interface, but not used (yet) +#pragma warning disable 67 + public event EventHandler ViewBarClosing; + public event EventHandler ViewActivated; + + public event Action ViewSelectionMouseDown; +#pragma warning restore 67 + + public TestDockingManager() + { + Views = new List(); + } + + public IEnumerable Views { get; private set; } + + public void Add(IView view, ViewLocation location) {} + + public void Remove(IView view, bool removeTabFromDockingbar) {} + + public void SetToolTip(IView view, string tooltip) {} + + public void ActivateView(IView view) {} + + public void Dispose() {} + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/TestObjects/TestReusableView.Designer.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestReusableView.Designer.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestReusableView.Designer.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,37 @@ +namespace DeltaShell.Tests.TestObjects +{ + partial class TestReusableView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} Index: Core/Common/test/Core.Common.Tests/TestObjects/TestReusableView.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestReusableView.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestReusableView.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,41 @@ +using System; +using System.Drawing; +using System.Windows.Forms; +using DelftTools.Controls; + +namespace DeltaShell.Tests.TestObjects +{ + public partial class TestReusableView : UserControl, IReusableView + { + public event EventHandler LockedChanged; + + private bool locked; + + public TestReusableView() + { + InitializeComponent(); + } + + public object Data { get; set; } + public Image Image { get; set; } + public ViewInfo ViewInfo { get; set; } + + public bool Locked + { + get + { + return locked; + } + set + { + locked = value; + if (LockedChanged != null) + { + LockedChanged(this, new EventArgs()); + } + } + } + + public void EnsureVisible(object item) {} + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/TestObjects/TestSettings.Designer.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestSettings.Designer.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestSettings.Designer.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.225 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DeltaShell.Tests.TestObjects { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] + internal sealed partial class TestSettings : global::System.Configuration.ApplicationSettingsBase { + + private static TestSettings defaultInstance = ((TestSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new TestSettings()))); + + public static TestSettings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string Name { + get { + return ((string)(this["Name"])); + } + set { + this["Name"] = value; + } + } + } +} Index: Core/Common/test/Core.Common.Tests/TestObjects/TestSettings.settings =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestSettings.settings (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestSettings.settings (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/TestObjects/TestView.Designer.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestView.Designer.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestView.Designer.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,56 @@ +namespace DeltaShell.Tests.TestObjects +{ + partial class TestView + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(3, 3); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(74, 20); + this.textBox1.TabIndex = 0; + // + // TestView + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.textBox1); + this.Name = "TestView"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + } +} Index: Core/Common/test/Core.Common.Tests/TestObjects/TestView.cs =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestView.cs (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestView.cs (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,52 @@ +using System; +using System.Drawing; +using System.Windows.Forms; +using DelftTools.Controls; + +namespace DeltaShell.Tests.TestObjects +{ + public partial class TestView : UserControl, IView + { + public TestView() + { + InitializeComponent(); + } + + public object Data { get; set; } + public Image Image { get; set; } + public ViewInfo ViewInfo { get; set; } + public void EnsureVisible(object item) {} + } + + public class ReusableTestView : TestView, IReusableView + { + public event EventHandler LockedChanged; + private bool locked; + + public bool Locked + { + get + { + return locked; + } + set + { + if (!Equals(locked, value)) + { + locked = value; + if (LockedChanged != null) + { + LockedChanged(this, EventArgs.Empty); + } + } + } + } + } + + public class AdditionalView : TestView, IAdditionalView {} + + public class TestWrapper + { + public string RealData { get; set; } + } +} \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/TestObjects/TestView.resx =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/TestObjects/TestView.resx (revision 0) +++ Core/Common/test/Core.Common.Tests/TestObjects/TestView.resx (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file Index: Core/Common/test/Core.Common.Tests/packages.config =================================================================== diff -u --- Core/Common/test/Core.Common.Tests/packages.config (revision 0) +++ Core/Common/test/Core.Common.Tests/packages.config (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,4 @@ + + + + \ No newline at end of file Index: Core/Plugins/src/Core.Plugins.CommonTools.Gui/Core.Plugins.CommonTools.Gui.csproj =================================================================== diff -u -r6e613570fb69ad93ca5fe269e6f48c8f6ceb1bab -r1c526b820be6d88285ac58ff819944b208966f39 --- Core/Plugins/src/Core.Plugins.CommonTools.Gui/Core.Plugins.CommonTools.Gui.csproj (.../Core.Plugins.CommonTools.Gui.csproj) (revision 6e613570fb69ad93ca5fe269e6f48c8f6ceb1bab) +++ Core/Plugins/src/Core.Plugins.CommonTools.Gui/Core.Plugins.CommonTools.Gui.csproj (.../Core.Plugins.CommonTools.Gui.csproj) (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -70,7 +70,7 @@ - + Properties\GlobalAssembly.cs Index: Core/Plugins/src/Core.Plugins.CommonTools/Core.Plugins.CommonTools.csproj =================================================================== diff -u -r6e613570fb69ad93ca5fe269e6f48c8f6ceb1bab -r1c526b820be6d88285ac58ff819944b208966f39 --- Core/Plugins/src/Core.Plugins.CommonTools/Core.Plugins.CommonTools.csproj (.../Core.Plugins.CommonTools.csproj) (revision 6e613570fb69ad93ca5fe269e6f48c8f6ceb1bab) +++ Core/Plugins/src/Core.Plugins.CommonTools/Core.Plugins.CommonTools.csproj (.../Core.Plugins.CommonTools.csproj) (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -72,7 +72,7 @@ - + Properties\GlobalAssembly.cs Index: Core/Plugins/test/Core.Plugins.SharpMapGis.Tests/Core.Plugins.SharpMapGis.Tests.csproj =================================================================== diff -u -rd1733deec42c46288be19c3a649d495b4d80fb18 -r1c526b820be6d88285ac58ff819944b208966f39 --- Core/Plugins/test/Core.Plugins.SharpMapGis.Tests/Core.Plugins.SharpMapGis.Tests.csproj (.../Core.Plugins.SharpMapGis.Tests.csproj) (revision d1733deec42c46288be19c3a649d495b4d80fb18) +++ Core/Plugins/test/Core.Plugins.SharpMapGis.Tests/Core.Plugins.SharpMapGis.Tests.csproj (.../Core.Plugins.SharpMapGis.Tests.csproj) (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -186,6 +186,10 @@ {0A82E7D2-26F8-4A30-9787-7EEABCD7F470} Core.GIS.SharpMapTestUtils + + {EFA25023-CF6A-4FF7-8C42-B24D7F9509E1} + Core.Common.TestUtils + Index: DeltaShell.sln =================================================================== diff -u -rd1733deec42c46288be19c3a649d495b4d80fb18 -r1c526b820be6d88285ac58ff819944b208966f39 --- DeltaShell.sln (.../DeltaShell.sln) (revision d1733deec42c46288be19c3a649d495b4d80fb18) +++ DeltaShell.sln (.../DeltaShell.sln) (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -144,6 +144,8 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ringtoets.Piping.Service.Test", "Ringtoets\Piping\test\Ringtoets.Piping.Service.Test\Ringtoets.Piping.Service.Test.csproj", "{D783543B-46A1-4848-A812-AF5A5259ED7E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Common.Tests", "Core\Common\test\Core.Common.Tests\Core.Common.Tests.csproj", "{E0990383-FB2E-47D1-99CD-9B9FA2929E5B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution CreateInstaller|x86 = CreateInstaller|x86 @@ -439,6 +441,12 @@ {D783543B-46A1-4848-A812-AF5A5259ED7E}.Debug|x86.Build.0 = Debug|x86 {D783543B-46A1-4848-A812-AF5A5259ED7E}.Release|x86.ActiveCfg = Release|x86 {D783543B-46A1-4848-A812-AF5A5259ED7E}.Release|x86.Build.0 = Release|x86 + {E0990383-FB2E-47D1-99CD-9B9FA2929E5B}.CreateInstaller|x86.ActiveCfg = Release|x86 + {E0990383-FB2E-47D1-99CD-9B9FA2929E5B}.CreateInstaller|x86.Build.0 = Release|x86 + {E0990383-FB2E-47D1-99CD-9B9FA2929E5B}.Debug|x86.ActiveCfg = Debug|x86 + {E0990383-FB2E-47D1-99CD-9B9FA2929E5B}.Debug|x86.Build.0 = Debug|x86 + {E0990383-FB2E-47D1-99CD-9B9FA2929E5B}.Release|x86.ActiveCfg = Release|x86 + {E0990383-FB2E-47D1-99CD-9B9FA2929E5B}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -469,6 +477,7 @@ {3DBD23CE-5C4A-4A49-B51C-B268CB2B510E} = {8261CCE1-98D7-465B-BC94-4ED239DE7F2E} {7F937E31-02CA-41D9-B7D4-1079CF452C72} = {0D9858E1-CF2D-4DE5-AC0E-64401900D531} {D749EE4C-CE50-4C17-BF01-9A953028C126} = {0D9858E1-CF2D-4DE5-AC0E-64401900D531} + {E0990383-FB2E-47D1-99CD-9B9FA2929E5B} = {0D9858E1-CF2D-4DE5-AC0E-64401900D531} {FFB69466-79DE-466A-ADA7-5C47C5C5CA3A} = {C9F89C6E-CEA9-40CA-96A9-2A0368459B9F} {016DBD27-99BF-489A-81B5-50D66964BB90} = {C9F89C6E-CEA9-40CA-96A9-2A0368459B9F} {5770DAA9-84E5-4770-AF43-F6B815894368} = {C9F89C6E-CEA9-40CA-96A9-2A0368459B9F} Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj =================================================================== diff -u -rd1733deec42c46288be19c3a649d495b4d80fb18 -r1c526b820be6d88285ac58ff819944b208966f39 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj (.../Ringtoets.Piping.Forms.Test.csproj) (revision d1733deec42c46288be19c3a649d495b4d80fb18) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Ringtoets.Piping.Forms.Test.csproj (.../Ringtoets.Piping.Forms.Test.csproj) (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -101,10 +101,14 @@ {27E0A5C9-3ABF-426A-A3DA-7D0B83A218C8} Ringtoets.Piping.Calculation.TestUtil - + {e0990383-fb2e-47d1-99cd-9b9fa2929e5b} - DeltaShell.Tests + Core.Common.Tests + + {955E574D-67CE-4347-AA6B-7DF8A04ED754} + Core.Common.TestUtils + + \ No newline at end of file Index: lib/DeltaShell/Application.Ringtoets/license.lic =================================================================== diff -u --- lib/DeltaShell/Application.Ringtoets/license.lic (revision 0) +++ lib/DeltaShell/Application.Ringtoets/license.lic (revision 1c526b820be6d88285ac58ff819944b208966f39) @@ -0,0 +1,5 @@ +# DelftSoftware license verwijzingsfile. +SERVER JAGUAR 0030482a11da TCP:8500 +SERVER LUIPAARD 0002b39704b8 TCP:8500 +SERVER REEBOK 003048296d08 TCP:8500 +USE_SERVER \ No newline at end of file Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `lib/DeltaShell/DeltaShell.Gui/license.lic'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `src/documentation/UML/Plugins/Wti/Piping/PipingCalculation.cd'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `src/documentation/UML/Plugins/Wti/Piping/PipingDataModel.cd'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `src/documentation/UML/Properties/AssemblyInfo.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `src/documentation/UML/UML.csproj'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/App.config'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/CSV/CsvImportTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/ChartTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/QuarterViewDateTimeFormatProviderTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/Series/AreaChartSeriesTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/Series/BarSeriesTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/Series/LineChartSeriesTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/Series/PointChartSeriesTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/Series/PolygonChartSeriesTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/Series/TeeChartSeriesDecoratorTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Charting/YearViewDateTimeFormatProviderTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/CustomInputDialogTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/DataEditorGenerator/SelfCollapsingGroupboxTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/FileSystemTreeViewTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/FindAndReplaceControlTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/MessageBoxTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Table/TableViewCopyPasteTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Table/TableViewCsvImportWizardDialogTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Table/TableViewPasteControllerTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Table/TableViewTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Table/TestClasses/ClassWithEnum.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/Table/TestClasses/Person.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/TreeViewControls/TreeNodeGraphicExtensionsTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/TreeViewControls/TreeNodeTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewControllerTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewNodePresenterBaseTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/TreeViewControls/TreeViewTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/UndoRedoTestClasses/Child.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/UndoRedoTestClasses/Parent.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Controls/Swf/WindowsFormsHelperTests.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/DelftTools.Tests.csproj'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/ModelBaseStub.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/ModelBaseTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/ProjectStructureValidation.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Properties/AssemblyInfo.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Properties/Resources.Designer.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Properties/Resources.resx'. Fisheye: No comparison available. Pass `N' to diff? Index: test/Common/DelftTools.Tests/Resources/alarm-clock-blue.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/ApplicationPluginTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/DataItemInfoTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/Extensions/CompositeActivityExtensionsTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/ObservableListTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/ProjectTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/UrlTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/WorkFlow/ActivityRunnerTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/WorkFlow/ActivityTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/WorkFlow/AsyncActivityRunnerTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/WorkFlow/BackgroundWorkerTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/WorkFlow/CompositeActivityTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/WorkFlow/CrashingActivity.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Core/WorkFlow/FileImportActivityTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Gui/ExpandableArrayConverterTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Gui/MapLayerProviderHelperTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/Shell/Gui/Swf/ControlExtensionTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/TestObjects/Child.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/TestObjects/ChildNodePresenter.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/TestObjects/MockTestNode.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/TestObjects/Parent.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/TestObjects/ParentNodePresenter.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/TestObjects/TestClasses.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/TestUtils/WindowsFormsTestHelperTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/TimeDependentModelBaseStub.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/Common/DelftTools.Tests/packages.config'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.IntegrationTests/App.config'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.IntegrationTests/DeltaShell.IntegrationTests.csproj'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.IntegrationTests/DeltaShell/DeltaShell.Core/DelftShellApplicationIntegrationTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.IntegrationTests/DeltaShell/DeltaShell.Gui/DeltaShellGuiIntegrationTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.IntegrationTests/DeltaShell/DeltaShell.Gui/GuiImportHandlerTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.IntegrationTests/Properties/AssemblyInfo.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.IntegrationTests/packages.config'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/App.config'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Core/AssemblyInfoTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Core/DelftShellApplicationTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Core/DeltaShellApplicationSettingsTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Core/Extensions/CompositeActivityExtensionsTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/DeltaShell.Tests.csproj'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/DelftShellGuiTests.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/DotNetBarTestForm.Designer.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/DotNetBarTestForm.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/DotNetBarTestForm.resx'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/Forms/AvalonDockDockingManagerTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/Forms/ProgressBarDialogTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/Forms/PropertyGridView/PropertyResolverTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/GuiExportHandlerTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/ImportActivityTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/Log4netTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Index: test/DeltaShell/DeltaShell.Tests/Gui/Resources/image1.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Index: test/DeltaShell/DeltaShell.Tests/Gui/Resources/image2.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Index: test/DeltaShell/DeltaShell.Tests/Gui/Resources/image3.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Index: test/DeltaShell/DeltaShell.Tests/Gui/Resources/image4.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Index: test/DeltaShell/DeltaShell.Tests/Gui/Resources/image5.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Index: test/DeltaShell/DeltaShell.Tests/Gui/Resources/image6.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Index: test/DeltaShell/DeltaShell.Tests/Gui/Resources/image7.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Index: test/DeltaShell/DeltaShell.Tests/Gui/Resources/image8.png =================================================================== diff -u -r8f6ae890fed8e8eae3a32f9c0498a10f82e0ddf9 -r1c526b820be6d88285ac58ff819944b208966f39 Binary files differ Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/ToolWindowTestControl.Designer.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/ToolWindowTestControl.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/ToolWindowTestControl.resx'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Gui/ViewListTest.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Properties/AssemblyInfo.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Properties/Resources.Designer.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/Properties/Resources.resx'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestApplication.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestDockingManager.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestReusableView.Designer.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestReusableView.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestSettings.Designer.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestSettings.settings'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestView.Designer.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestView.cs'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/TestObjects/TestView.resx'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 1c526b820be6d88285ac58ff819944b208966f39 refers to a dead (removed) revision in file `test/DeltaShell/DeltaShell.Tests/packages.config'. Fisheye: No comparison available. Pass `N' to diff?