diff --git a/src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs b/src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs
index 97bc88d0b6..a16f27a629 100644
--- a/src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs
+++ b/src/AddIns/BackendBindings/VBNetBinding/Test/CodeCompletionTests.cs
@@ -119,5 +119,21 @@ End Module";
TestCtrlSpace(text, true, list => Assert.IsFalse(list.Items.Any(i => i.Text == "InnerException")));
}
+
+ [Test]
+ public void TestLocalVariablesAvailableAtEndOfForLoop()
+ {
+ string text = @"Module Test
+ Public Sub f()
+ Dim cheeses = { ""cheddar"", ""brie"", ""edam"" }
+ For Each cheese As String In cheeses
+ Dim gouda = ""is tasty""
+ |
+ Next
+ End Sub
+End Module";
+
+ TestKeyPress(text, 'g', CodeCompletionKeyPressResult.CompletedIncludeKeyInCompletion, list => Assert.IsTrue(list.Items.Any(i => i.Text == "gouda")));
+ }
}
}
diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml
index 28d9173495..c88f6c4bdf 100644
--- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml
+++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml
@@ -84,7 +84,7 @@
Database:
+ ItemsSource="{Binding SelectedDatasource.Databases, ElementName=This}">
diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml.cs
index 334708f3c2..e214369b8e 100644
--- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml.cs
+++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.Core.UI/Windows/ConnectionWizardWindow.xaml.cs
@@ -92,6 +92,7 @@ namespace ICSharpCode.Data.Core.UI.Windows
set
{
_selectedDatabase = value;
+ btnAdd.IsEnabled = (_selectedDatabase != null);
OnPropertyChanged("SelectedDatabase");
}
}
@@ -212,11 +213,6 @@ namespace ICSharpCode.Data.Core.UI.Windows
}
}
- private void cboDatabases_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- btnAdd.IsEnabled = true;
- }
-
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
if (_addAction == null)
diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs
index b4a511815b..7068621414 100644
--- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs
+++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core.UI/DisplayBinding/EDMDesignerViewContent.cs
@@ -1,9 +1,8 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
-#region Usings
-
using System;
+using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
@@ -11,8 +10,11 @@ using System.Windows;
using System.Windows.Controls;
using System.Xml.Linq;
+using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Common;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.ChangeWatcher;
+using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL;
+using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL.Property;
using ICSharpCode.Data.EDMDesigner.Core.EDMObjects.Designer.CSDL.Type;
using ICSharpCode.Data.EDMDesigner.Core.IO;
using ICSharpCode.Data.EDMDesigner.Core.UI.UserControls;
@@ -22,29 +24,22 @@ using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Workbench;
-#endregion
-
namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
{
public class EDMDesignerViewContent : AbstractViewContent, IHasPropertyContainer, IToolsHost, IEDMDesignerChangeWatcherObserver
{
- #region Fields
-
- private ScrollViewer _scrollViewer = new ScrollViewer() { HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, VerticalScrollBarVisibility = ScrollBarVisibility.Auto };
+ private ScrollViewer _scrollViewer = new ScrollViewer() {
+ HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
+ VerticalScrollBarVisibility = ScrollBarVisibility.Auto
+ };
private DesignerCanvas _designerCanvas = null;
private PropertyContainer _propertyContainer = new PropertyContainer();
private EDMView _edmView = null;
private object _selection = null;
- #endregion
-
- #region Properties
-
- public object Selection
- {
+ public object Selection {
get { return _selection; }
- set
- {
+ set {
if (_selection == null)
_propertyContainer.Clear();
else
@@ -54,30 +49,22 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
}
}
- public Window Window
- {
+ public Window Window {
get { return Application.Current.MainWindow; }
}
- public EDMView EDMView
- {
+ public EDMView EDMView {
get { return _edmView; }
}
- public override object Control
- {
+ public override object Control {
get { return _scrollViewer; }
}
- public DesignerCanvas DesignerCanvas
- {
+ public DesignerCanvas DesignerCanvas {
get { return _designerCanvas; }
}
-
- #endregion
-
- #region Constructor
-
+
public EDMDesignerViewContent(OpenedFile primaryFile)
: base(primaryFile)
{
@@ -89,10 +76,6 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
EDMDesignerChangeWatcher.AddEDMDesignerViewContent(this);
}
- #endregion
-
- #region Methods
-
public override void Load(OpenedFile file, Stream stream)
{
Debug.Assert(file == this.PrimaryFile);
@@ -105,17 +88,13 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
_edmView = new EDMView(stream, readMoreAction);
// If EDMX is empty run EDM Wizard
- if (_edmView.EDM.IsEmpty)
- {
+ if (_edmView.EDM.IsEmpty) {
edmxElement = null;
string ns = String.Empty;
- if (ProjectService.CurrentProject == null)
- {
+ if (ProjectService.CurrentProject == null) {
ns = ICSharpCode.Core.MessageService.ShowInputBox("EDMDesigner","Enter NameSpace","DefaultNamespace");
- }
- else
- {
+ } else {
ns = ProjectService.CurrentProject.RootNamespace;
}
@@ -132,8 +111,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
XElement designerViewsElement = null;
- if (edmxElement == null || (designerViewsElement = EDMXIO.ReadSection(edmxElement, EDMXIO.EDMXSection.DesignerViews)) == null)
- {
+ if (edmxElement == null || (designerViewsElement = EDMXIO.ReadSection(edmxElement, EDMXIO.EDMXSection.DesignerViews)) == null) {
designerViewsElement = DesignerIO.GenerateNewDesignerViewsFromCSDLView(_edmView);
}
@@ -147,11 +125,15 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
_scrollViewer.Content = _designerCanvas;
// Register CSDL of EDMX in CSDL DatabaseTreeView
- CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Add(_edmView.CSDL);
+ CSDLViews.Add(_edmView.CSDL);
EDMDesignerChangeWatcher.Init = false;
}
+ ObservableCollection CSDLViews {
+ get { return CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews; }
+ }
+
public override void Save(OpenedFile file, Stream stream)
{
EDMXIO.WriteXDocument(_edmView).Save(stream);
@@ -159,7 +141,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
private EDMWizardWindow RunWizard(OpenedFile file, string projectStandardNamespace)
{
- EDMWizardWindow wizard = new EDMWizardWindow(file, projectStandardNamespace);
+ var wizard = new EDMWizardWindow(file, projectStandardNamespace);
wizard.Owner = Application.Current.MainWindow;
wizard.WindowStartupLocation = WindowStartupLocation.CenterOwner;
wizard.ShowDialog();
@@ -169,21 +151,20 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
public override void Dispose()
{
- if (CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Contains(_edmView.CSDL))
- CSDLDatabaseTreeViewAdditionalNode.Instance.CSDLViews.Remove(_edmView.CSDL);
+ if (_edmView != null) {
+ CSDLViews.Remove(_edmView.CSDL);
+ }
EDMDesignerChangeWatcher.RemoveEDMDesignerViewContent(this);
}
public void ShowMappingTab(IUIType uiType)
- { }
-
- #endregion
+ {
+ }
#region IHasPropertyContainer
- public PropertyContainer PropertyContainer
- {
+ public PropertyContainer PropertyContainer {
get { return _propertyContainer; }
}
@@ -191,8 +172,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
#region IToolsHost
- object IToolsHost.ToolsContent
- {
+ object IToolsHost.ToolsContent {
get { return null; }
}
@@ -202,18 +182,14 @@ namespace ICSharpCode.Data.EDMDesigner.Core.UI.DisplayBinding
public bool ObjectChanged(object changedObject)
{
- foreach (DesignerView designerView in _edmView.DesignerViews)
- {
- foreach (ITypeDesigner uiType in designerView)
- {
- if (uiType == changedObject || uiType.UIType.BusinessInstance == changedObject)
- {
+ foreach (DesignerView designerView in _edmView.DesignerViews) {
+ foreach (ITypeDesigner uiType in designerView) {
+ if (uiType == changedObject || uiType.UIType.BusinessInstance == changedObject) {
PrimaryFile.IsDirty = true;
return true;
}
}
}
-
return false;
}
diff --git a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/MSLIO.cs b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/MSLIO.cs
index eacb020c92..7704bb2d9d 100644
--- a/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/MSLIO.cs
+++ b/src/AddIns/DisplayBindings/Data/ICSharpCode.Data.EDMDesigner.Core/IO/MSLIO.cs
@@ -25,10 +25,6 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
{
public class MSLIO : IO
{
- #region Methods
-
- #region Read
-
public static XDocument GenerateTypeMapping(XDocument mslDocument)
{
XElement mappingElement = mslDocument.Element(XName.Get("Mapping", mslNamespace.NamespaceName));
@@ -41,8 +37,10 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
if (entityContainerMappingElement == null || entityContainerMappingElement.IsEmpty)
return null;
- foreach (XElement entitySetMapping in entityContainerMappingElement.Elements(mslNamespace + "EntitySetMapping"))
- {
+ foreach (XElement entitySetMapping in entityContainerMappingElement.Elements(mslNamespace + "EntitySetMapping")) {
+ if (entitySetMapping.HasEntityTypeMappingChildElement())
+ continue;
+
string name = entitySetMapping.Attribute("Name").Value;
string storeEntitySet = entitySetMapping.Attribute("StoreEntitySet").Value;
string typeName = entitySetMapping.Attribute("TypeName").Value;
@@ -61,7 +59,7 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
return mslDocument;
}
-
+
public static CSDLContainer IntegrateMSLInCSDLContainer(CSDLContainer csdlContainer, SSDLContainer ssdlContainer, XElement edmxRuntime)
{
XElement mappingsElement = edmxRuntime.Element(XName.Get("Mappings", edmxNamespace.NamespaceName));
@@ -263,10 +261,6 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
}
}
- #endregion
-
- #region Write
-
public static XElement Write(EDM edm)
{
CSDLContainer csdlContainer = edm.CSDLContainer;
@@ -533,10 +527,6 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
new XAttribute("ColumnName", result.Value));
}
}
-
- #endregion
-
- #endregion
}
#region Extension methods
@@ -560,6 +550,11 @@ namespace ICSharpCode.Data.EDMDesigner.Core.IO
return element;
}
+
+ public static bool HasEntityTypeMappingChildElement(this XElement entitySetMapping)
+ {
+ return entitySetMapping.Elements().Any(e => e.Name.LocalName == "EntityTypeMapping");
+ }
}
#endregion
diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs
index 88676aaa4b..ace1ad51eb 100644
--- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs
+++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs
@@ -37,6 +37,7 @@ namespace ICSharpCode.WpfDesign.Designer
return 0;
}
}
+ tmp = tmp.Parent;
}
return 0;
}
diff --git a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletion.cs b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletion.cs
index 63906827bb..4ac0f68b85 100644
--- a/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletion.cs
+++ b/src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlSchemaCompletion.cs
@@ -335,11 +335,25 @@ namespace ICSharpCode.XmlEditor
{
XmlSchemaComplexType complexType = element.SchemaType as XmlSchemaComplexType;
if (complexType == null) {
- complexType = FindNamedType(schema, element.SchemaTypeName);
+ if (element.SchemaTypeName.IsEmpty) {
+ return GetComplexTypeFromSubstitutionGroup(element);
+ }
+ return FindNamedType(schema, element.SchemaTypeName);
}
return complexType;
}
+ XmlSchemaComplexType GetComplexTypeFromSubstitutionGroup(XmlSchemaElement element)
+ {
+ if (!element.SubstitutionGroup.IsEmpty) {
+ XmlSchemaElement substitutedElement = FindElement(element.SubstitutionGroup);
+ if (substitutedElement != null) {
+ return GetElementAsComplexType(substitutedElement);
+ }
+ }
+ return null;
+ }
+
///
/// Handler for schema validation errors.
///
diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Resources/xslt.xsd b/src/AddIns/DisplayBindings/XmlEditor/Test/Resources/xslt.xsd
new file mode 100644
index 0000000000..2b71d914c5
--- /dev/null
+++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Resources/xslt.xsd
@@ -0,0 +1,1134 @@
+
+
+
+
+
+
+
+ This is a schema for XSLT 2.0 stylesheets.
+
+ It defines all the elements that appear in the XSLT namespace; it also
+ provides hooks that allow the inclusion of user-defined literal result elements,
+ extension instructions, and top-level data elements.
+
+ The schema is derived (with kind permission) from a schema for XSLT 1.0 stylesheets
+ produced by Asir S Vedamuthu of WebMethods Inc.
+
+ This schema is available for use under the conditions of the W3C Software License
+ published at http://www.w3.org/Consortium/Legal/copyright-software-19980720
+
+ The schema is organized as follows:
+
+ PART A: definitions of complex types and model groups used as the basis
+ for element definitions
+ PART B: definitions of individual XSLT elements
+ PART C: definitions for literal result elements
+ PART D: definitions of simple types used in attribute definitions
+
+ This schema does not attempt to define all the constraints that apply to a valid
+ XSLT 2.0 stylesheet module. It is the intention that all valid stylesheet modules
+ should conform to this schema; however, the schema is non-normative and in the event
+ of any conflict, the text of the Recommendation takes precedence.
+
+ This schema does not implement the special rules that apply when a stylesheet
+ has sections that use forwards-compatible-mode. In this mode, setting version="3.0"
+ allows elements from the XSLT namespace to be used that are not defined in XSLT 2.0.
+
+ Simplified stylesheets (those with a literal result element as the outermost element)
+ will validate against this schema only if validation starts in lax mode.
+
+ This version is dated 2007-03-16
+ Authors: Michael H Kay, Saxonica Limited
+ Jeni Tennison, Jeni Tennison Consulting Ltd.
+
+ 2007-03-15: added xsl:document element
+ revised xsl:sequence element
+ see http://www.w3.org/Bugs/Public/show_bug.cgi?id=4237
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PART A: definitions of complex types and model groups used as the basis
+ for element definitions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PART B: definitions of individual XSLT elements
+ Elements are listed in alphabetical order.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PART C: definition of literal result elements
+
+ There are three ways to define the literal result elements
+ permissible in a stylesheet.
+
+ (a) do nothing. This allows any element to be used as a literal
+ result element, provided it is not in the XSLT namespace
+
+ (b) declare all permitted literal result elements as members
+ of the xsl:literal-result-element substitution group
+
+ (c) redefine the model group xsl:result-elements to accommodate
+ all permitted literal result elements.
+
+ Literal result elements are allowed to take certain attributes
+ in the XSLT namespace. These are defined in the attribute group
+ literal-result-element-attributes, which can be included in the
+ definition of any literal result element.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PART D: definitions of simple types used in stylesheet attributes
+
+
+
+
+
+
+
+ This type is used for all attributes that allow an attribute value template.
+ The general rules for the syntax of attribute value templates, and the specific
+ rules for each such attribute, are described in the XSLT 2.0 Recommendation.
+
+
+
+
+
+
+
+
+ A string containing exactly one character.
+
+
+
+
+
+
+
+
+
+
+ An XPath 2.0 expression.
+
+
+
+
+
+
+
+
+
+
+ Describes how type annotations in source documents are handled.
+
+
+
+
+
+
+
+
+
+
+
+
+ The level attribute of xsl:number:
+ one of single, multiple, or any.
+
+
+
+
+
+
+
+
+
+
+
+
+ The mode attribute of xsl:apply-templates:
+ either a QName, or #current, or #default.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The mode attribute of xsl:template:
+ either a list, each member being either a QName or #default;
+ or the value #all
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A list of NameTests, as defined in the XPath 2.0 Recommendation.
+ Each NameTest is either a QName, or "*", or "prefix:*", or "*:localname"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The method attribute of xsl:output:
+ Either one of the recognized names "xml", "xhtml", "html", "text",
+ or a QName that must include a prefix.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A match pattern as defined in the XSLT 2.0 Recommendation.
+ The syntax for patterns is a restricted form of the syntax for
+ XPath 2.0 expressions.
+
+
+
+
+
+
+
+
+ Either a namespace prefix, or #default.
+ Used in the xsl:namespace-alias element.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A list of QNames.
+ Used in the [xsl:]use-attribute-sets attribute of various elements,
+ and in the cdata-section-elements attribute of xsl:output
+
+
+
+
+
+
+
+
+ A QName.
+ This schema does not use the built-in type xs:QName, but rather defines its own
+ QName type. Although xs:QName would define the correct validation on these attributes,
+ a schema processor would expand unprefixed QNames incorrectly when constructing the PSVI,
+ because (as defined in XML Schema errata) an unprefixed xs:QName is assumed to be in
+ the default namespace, which is not the correct assumption for XSLT.
+ The data type is defined as a restriction of the built-in type Name, restricted
+ so that it can only contain one colon which must not be the first or last character.
+
+
+
+
+
+
+
+
+
+
+ The description of a data type, conforming to the
+ SequenceType production defined in the XPath 2.0 Recommendation
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Describes different ways of type-annotating an element or attribute.
+
+
+
+
+
+
+
+
+
+
+
+ Describes different ways of type-annotating an element or attribute.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ One of the values "yes" or "no".
+
+
+
+
+
+
+
+
+
+
+
+ One of the values "yes" or "no" or "omit".
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/SubstitutionGroupTests.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/SubstitutionGroupTests.cs
new file mode 100644
index 0000000000..586ab3de4a
--- /dev/null
+++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/SubstitutionGroupTests.cs
@@ -0,0 +1,38 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using ICSharpCode.XmlEditor;
+using NUnit.Framework;
+
+namespace XmlEditor.Tests.Schema
+{
+ [TestFixture]
+ public class SubstitutionGroupTests : SchemaTestFixtureBase
+ {
+ string namespaceURI = "http://www.w3.org/1999/XSL/Transform";
+
+ protected override string GetSchema()
+ {
+ return
+ "\r\n" +
+ " \r\n" +
+ "";
+ }
+
+ [Test]
+ public void GetChildElementCompletion_ParentElementIsSubstitutionGroupButNoCorrespondingElementInSchema_NullReferenceExceptionIsNotThrown()
+ {
+ var path = new XmlElementPath();
+ path.AddElement(new QualifiedName("stylesheet", namespaceURI));
+
+ XmlCompletionItemCollection items = SchemaCompletion.GetChildElementCompletion(path);
+
+ Assert.AreEqual(0, items.Count);
+ }
+ }
+}
diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/XsltSchemaTests.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/XsltSchemaTests.cs
new file mode 100644
index 0000000000..7b47dda446
--- /dev/null
+++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Schema/XsltSchemaTests.cs
@@ -0,0 +1,48 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using ICSharpCode.XmlEditor;
+using NUnit.Framework;
+using XmlEditor.Tests.Utils;
+
+namespace XmlEditor.Tests.Schema
+{
+ [TestFixture]
+ public class XsltSchemaTests
+ {
+ string namespaceURI = "http://www.w3.org/1999/XSL/Transform";
+ XmlSchemaCompletion schemaCompletion;
+
+ [TestFixtureSetUp]
+ public void SetUp()
+ {
+ schemaCompletion = new XmlSchemaCompletion(ResourceManager.ReadXsltSchema());
+ }
+
+ [Test]
+ public void GetChildElementCompletion_StylesheetElement_SubstitutionGroupUsedForTemplateAndTemplateElementReturned()
+ {
+ var path = new XmlElementPath();
+ path.AddElement(new QualifiedName("stylesheet", namespaceURI));
+
+ XmlCompletionItemCollection completionItems = schemaCompletion.GetChildElementCompletion(path);
+ bool contains = completionItems.Contains("template");
+
+ Assert.IsTrue(contains);
+ }
+
+ [Test]
+ public void GetAttributeCompletion_TemplateElementIsChildOfStylesheetElement_SubstitutionGroupUsedForTemplateAndMatchAttributeReturned()
+ {
+ var path = new XmlElementPath();
+ path.AddElement(new QualifiedName("stylesheet", namespaceURI));
+ path.AddElement(new QualifiedName("template", namespaceURI));
+
+ XmlCompletionItemCollection completionItems = schemaCompletion.GetAttributeCompletion(path);
+ bool contains = completionItems.Contains("match");
+
+ Assert.IsTrue(contains);
+ }
+ }
+}
diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/ResourceManager.cs b/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/ResourceManager.cs
index 6df5d1d277..39bb1ef7ff 100644
--- a/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/ResourceManager.cs
+++ b/src/AddIns/DisplayBindings/XmlEditor/Test/Utils/ResourceManager.cs
@@ -35,6 +35,14 @@ namespace XmlEditor.Tests.Utils
return manager.ReadXml("XMLSchema.xsd");
}
+ ///
+ /// Reads the XSL Transforms schema.
+ ///
+ public static StreamReader ReadXsltSchema()
+ {
+ return manager.ReadXml("xslt.xsd");
+ }
+
///
/// Returns the xml read from the specified file which is embedded
/// in this assembly as a resource.
diff --git a/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj b/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj
index 111417191b..ad1a166920 100644
--- a/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj
+++ b/src/AddIns/DisplayBindings/XmlEditor/Test/XmlEditor.Tests.csproj
@@ -172,6 +172,8 @@
+
+
@@ -378,5 +380,8 @@
+
+
+
\ No newline at end of file
diff --git a/src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Console.Types.dll b/src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Console.Types.dll
index ce3a40d220..aa48faeffb 100644
Binary files a/src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Console.Types.dll and b/src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Console.Types.dll differ
diff --git a/src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Core.dll b/src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Core.dll
index 5d18cfd5b3..d3f6d3aaa2 100644
Binary files a/src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Core.dll and b/src/AddIns/Misc/PackageManagement/RequiredLibraries/NuGet.Core.dll differ
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/Dialogs/FormatStringConverte.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/Dialogs/FormatStringConverte.cs
index c89c34815b..3371fca99d 100644
--- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/Dialogs/FormatStringConverte.cs
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/Dialogs/FormatStringConverte.cs
@@ -38,10 +38,7 @@ namespace ICSharpCode.Reports.Addin.Dialogs
public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
-// return new StandardValuesCollection(
-// new string[] { "entry1", "entry2", "entry3" });
return new StandardValuesCollection(GlobalLists.Formats());
-
}
}
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj
index f48e252e50..9985834ef6 100644
--- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/ICSharpCode.Reports.Core.csproj
@@ -176,6 +176,7 @@
+
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/StandardFormatter.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/StandardFormatter.cs
index 98f9865cca..120e319376 100644
--- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/StandardFormatter.cs
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/Printing/StandardFormatter.cs
@@ -18,30 +18,27 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing
internal static class StandardFormatter
{
-
public static string FormatOutput(string valueToFormat,string format,
string dataType, string nullValue )
{
+ if (String.IsNullOrEmpty(format)) {
+ return valueToFormat;
+ }
+
+ if (String.IsNullOrEmpty(valueToFormat)) {
+ return nullValue;
+ }
+
TypeCode typeCode = TypeHelpers.TypeCodeFromString(dataType);
- return StandardFormatter.FormatItem(valueToFormat,format,
- typeCode,nullValue);
+ return FormatItem(valueToFormat,format,typeCode,nullValue);
}
- public static string FormatItem (string valueToFormat,string format,
+ private static string FormatItem (string valueToFormat,string format,
TypeCode typeCode,string nullValue)
{
string retValue = String.Empty;
- if (String.IsNullOrEmpty(format)) {
- retValue = valueToFormat;
- return retValue;
- }
-
- if (String.IsNullOrEmpty(valueToFormat)) {
- return nullValue;
- }
-
switch (typeCode) {
case TypeCode.Int16:
case TypeCode.Int32:
@@ -124,24 +121,30 @@ namespace ICSharpCode.Reports.Core.BaseClasses.Printing
return str;
}
+// http://stackoverflow.com/questions/4710455/i-need-code-to-validate-any-time-in-c-sharp-in-hhmmss-format
private static string FormatDate(string toFormat, string format)
{
- try {
- DateTime date = DateTime.Parse (toFormat.Trim(),
- CultureInfo.CurrentCulture.DateTimeFormat);
+ DateTime date;
+ if (DateTime.TryParse(toFormat, out date))
+ {
string str = date.ToString(format,
DateTimeFormatInfo.CurrentInfo);
-
return str.Trim();
- } catch (System.FormatException ) {
-// string s = String.Format("< {0} > {1}",toFormat,e.Message);
-// System.Console.WriteLine("\t\tDateValue {0}",s);
}
-
- return toFormat.Trim();
+
+ TimeSpan time;
+ bool valid = TimeSpan.TryParseExact(toFormat,
+ "g",
+ CultureInfo.CurrentCulture,
+ out time);
+ if (valid) {
+ return time.ToString("g");
+ }
+ return toFormat;
}
+
private static bool CheckValue (string toFormat)
{
if (String.IsNullOrEmpty(toFormat)) {
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/TypeHelpers.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/TypeHelpers.cs
index a1c67a2cc9..4327a5cd43 100644
--- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/TypeHelpers.cs
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/TypeHelpers.cs
@@ -67,6 +67,9 @@ namespace ICSharpCode.Reports.Core.Project.BaseClasses
if (String.IsNullOrEmpty(type)) {
throw new ArgumentNullException("type");
}
+// var x = Type.GetType(type,false,true);
+// var s = Type.GetTypeCode( Type.GetType(type));
+// Console.WriteLine ("typeCode for {0} - {1}",type,s);
return Type.GetTypeCode( Type.GetType(type));
}
}
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/DateAdd.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/DateAdd.cs
index 1273c3a8e9..4e8e72ca3a 100644
--- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/DateAdd.cs
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/DateAdd.cs
@@ -31,7 +31,6 @@ $Log: /CoreServices/Hsi/ExpressionEvaluator/Parser/Functions/ToString.cs $
using System;
using System.Text.RegularExpressions;
-using SimpleExpressionEvaluator.Compilation.Functions;
using SimpleExpressionEvaluator.Utilities;
namespace SimpleExpressionEvaluator.Compilation.Functions
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/DateSubtract.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/DateSubtract.cs
new file mode 100644
index 0000000000..8c4520a729
--- /dev/null
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/DateSubtract.cs
@@ -0,0 +1,45 @@
+/*
+ * Created by SharpDevelop.
+ * User: Peter Forstmeier
+ * Date: 06.02.2013
+ * Time: 20:18
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using SimpleExpressionEvaluator.Utilities;
+
+namespace SimpleExpressionEvaluator.Compilation.Functions
+{
+ ///
+ /// DateSubtract (endDate,startDate)
+ ///
+ public class DateSubtract: Function
+ {
+
+ protected override int ExpectedArgumentCount
+ {
+ get{return 2;}
+ }
+
+
+ protected override TimeSpan EvaluateFunction(object[] args)
+ {
+
+ args[0] = args[0] == null ? DateTime.Today : TypeNormalizer.EnsureType(args[0], typeof (DateTime));
+
+ args[1] = args[1] == null ? DateTime.Today : TypeNormalizer.EnsureType(args[1], typeof (DateTime));
+
+ var endDate = (DateTime) args[0];
+ if (endDate == DateTime.MinValue) {
+ endDate = DateTime.Today;
+ }
+ var startDate = (DateTime) args[1];
+ if (startDate == DateTime.MinValue)
+ startDate = DateTime.Today;
+
+ return endDate.Subtract(startDate);
+ }
+ }
+}
+
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Utilities/TypeNormalizer.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Utilities/TypeNormalizer.cs
index 22495cdfae..fb36bcace9 100644
--- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Utilities/TypeNormalizer.cs
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Utilities/TypeNormalizer.cs
@@ -107,29 +107,23 @@ namespace SimpleExpressionEvaluator.Utilities
public static object EnsureType(object value,Type targetType,object nullValue)
{
- if (value == null)
- return nullValue;
-
- if (targetType == typeof(object))
- return value;
+ if (value == null)
+ return nullValue;
+
+ if (targetType == typeof(object))
+ return value;
- if (value.GetType() == targetType)
- return value;
+ if (value.GetType() == targetType)
+ return value;
- /*
- TypeConverter converter = TypeDescriptor.GetConverter(targetType);
- if (converter != null && converter.CanConvertFrom(value.GetType()))
- {
- return converter.ConvertFrom(value);
- }
- */
- try
- {
- return Convert.ChangeType(value, targetType);
- }
- catch
- { }
- return nullValue;
+ try {
+ return Convert.ChangeType(value, targetType);
+ } catch (Exception e) {
+
+ Console.WriteLine("TypeNormalizer {0} - {1}",value.ToString(),e.Message);
+ return value.ToString();
+ //throw new Exception()String.Format("TypeNormalizer for <{0}> - {1}",value.ToString(),e.Message));
+ }
}
}
}
\ No newline at end of file
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Globals/GlobalLists.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Globals/GlobalLists.cs
index c4f164beaf..19d09bd4e2 100644
--- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Globals/GlobalLists.cs
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Globals/GlobalLists.cs
@@ -64,6 +64,7 @@ namespace ICSharpCode.Reports.Core.Globals
private static readonly string[] MyDataTypeList = new string[] {
"System.String",
"System.DateTime",
+ "System.TimeSpan",
"System.Decimal",
"System.Int"};
#endregion
@@ -155,7 +156,9 @@ namespace ICSharpCode.Reports.Core.Globals
"Ddd, dd MMM yyyy HH\':\'mm\'\"ss \'GMT\'",
"yyyy-MM-dd HH:mm:ss",
"yyyy-MM-dd HH:mm:ss GMT",
- "HH:mm", "HH:mm:ss",
+ "HH:mm",
+ "HH:mm:ss",
+ "hh:mm:ss",
"yyyy-MM-dd HH:mm:ss", "html"};
#endregion
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ICSharpCode.Reports.Core.Test.csproj b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ICSharpCode.Reports.Core.Test.csproj
index ce12c82bdd..ea0b847503 100644
--- a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ICSharpCode.Reports.Core.Test.csproj
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ICSharpCode.Reports.Core.Test.csproj
@@ -81,6 +81,7 @@
+
@@ -89,7 +90,7 @@
-
+
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/Printing/FormattingFixture.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/Printing/FormattingFixture.cs
new file mode 100644
index 0000000000..22b9a681ba
--- /dev/null
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/Printing/FormattingFixture.cs
@@ -0,0 +1,138 @@
+/*
+ * Created by SharpDevelop.
+ * User: Peter Forstmeier
+ * Date: 13.02.2013
+ * Time: 19:48
+ *
+ * To change this template use Tools | Options | Coding | Edit Standard Headers.
+ */
+using System;
+using System.Globalization;
+using ICSharpCode.Reports.Core.BaseClasses.Printing;
+using NUnit.Framework;
+
+namespace ICSharpCode.Reports.Core.Test.Printing
+{
+ [TestFixture]
+ public class FormattingFixture
+ {
+ private const string stringType = "System.String";
+ private const string dateTimetype = "System.DateTime";
+ private const string nullValue ="NullValue";
+ [Test]
+ public void String_Is_Not_Formatted()
+ {
+ string toFormat = "Hello World";
+ string format = "dd/MM/yy";
+ var result = StandardFormatter.FormatOutput(toFormat,format,stringType,nullValue);
+ Assert.That(result,Is.EqualTo(toFormat));
+ }
+
+ [Test]
+ public void Empty_Input_Returns_NullValue()
+ {
+ string toFormat = string.Empty;;
+ string format = "dd/MM/yy";
+ var result = StandardFormatter.FormatOutput(toFormat,format,stringType,nullValue);
+ Assert.That(result,Is.EqualTo(nullValue));
+ }
+
+ #region DateTime
+
+ [Test]
+ public void DateTime_dd_MM_YY ()
+ {
+ string toFormat = "2012/02/12";
+ string format = "dd.MM.yy";
+ var result = StandardFormatter.FormatOutput(toFormat,format,dateTimetype,nullValue);
+ Assert.That(result,Is.EqualTo("12.02.12"));
+ }
+
+
+ [Test]
+ public void TypeDateTimeOfResultIsString()
+ {
+ string toFormat = "2012/02/12";
+ string format = "dd.MM.yy";
+ var result = StandardFormatter.FormatOutput(toFormat,format,dateTimetype,nullValue);
+ Assert.That(result,Is.TypeOf(typeof(string)));
+ }
+
+
+ [Test]
+ public void ConvertResultToDateTime()
+ {
+ DateTime date;
+ string toFormat = "2012/02/12";
+ string format = "dd.MM.yy";
+ var result = StandardFormatter.FormatOutput(toFormat,format,dateTimetype,nullValue);
+
+
+ bool valid = DateTime.TryParse(toFormat, out date);
+
+ Assert.That(valid,Is.True);
+ Assert.That(date,Is.EqualTo(new DateTime(2012,02,12)));
+ }
+
+ #endregion
+
+ #region TimeSpan
+
+ [Test]
+ public void TimeSpan_HH_mm_ss ()
+ {
+ string toFormat = "5:50:10";
+ string format = "HH:mm:ss";
+ var result = StandardFormatter.FormatOutput(toFormat,format,dateTimetype,nullValue);
+ Assert.That(result,Is.EqualTo("05:50:10"));
+ }
+
+ [Test]
+ public void TimeSpan_H_mm_ss ()
+ {
+ string toFormat = "5:50:10";
+ string format = "H:mm:ss";
+ var result = StandardFormatter.FormatOutput(toFormat,format,dateTimetype,nullValue);
+ Assert.That(result,Is.EqualTo("5:50:10"));
+ }
+
+
+ [Test]
+ public void TimeSpan_D_H_mm_ss ()
+ {
+ string toFormat = "1,5:50:10";
+ string format = "H:mm:ss";
+ var result = StandardFormatter.FormatOutput(toFormat,format,dateTimetype,nullValue);
+ Assert.That(result,Is.EqualTo("1,5:50:10"));
+ }
+
+
+ [Test]
+ public void TypeOfTimeSpanResultIsString()
+ {
+ string toFormat = "5,50,10";
+ string format = "H:mm:ss";
+ var result = StandardFormatter.FormatOutput(toFormat,format,dateTimetype,nullValue);
+ Assert.That(result,Is.TypeOf(typeof(string)));
+ }
+
+
+ [Test]
+ public void ConvertResultToTimeSpan()
+ {
+ TimeSpan time;
+ string toFormat = "5:50:10";
+ string format = "H:mm:ss";
+ var result = StandardFormatter.FormatOutput(toFormat,format,dateTimetype,nullValue);
+
+ bool valid = TimeSpan.TryParseExact(result,
+ "c",
+ CultureInfo.CurrentCulture,
+ out time);
+ Assert.That(valid,Is.True);
+ Assert.That(time,Is.EqualTo(new TimeSpan(5,50,10)));
+ }
+
+ #endregion
+ }
+}
diff --git a/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/DateTimeFunctionsFixture.cs b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/DateTimeFunctionsFixture.cs
new file mode 100644
index 0000000000..171ecf1abe
--- /dev/null
+++ b/src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/ReportingLanguage/DateTimeFunctionsFixture.cs
@@ -0,0 +1,82 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+
+using System;
+using ICSharpCode.Reports.Expressions.ReportingLanguage;
+using NUnit.Framework;
+using SimpleExpressionEvaluator;
+
+namespace ICSharpCode.Reports.Core.Test.ReportingLanguage.LanguageTests
+{
+ [TestFixture]
+ public class DateTimeFunctionsFixture
+ {
+
+ [Test]
+ public void Can_Compile_Function()
+ {
+ const string expression = "today()";
+ IExpression expr = CreateExpression(expression);
+ Assert.That(expr.Evaluate(null), Is.EqualTo(DateTime.Today));
+ }
+
+
+ [Test]
+ public void Can_Compile_Expr_With_Generic_Return()
+ {
+ const string expression = "Today()";
+ IExpression expr = CreateExpression(expression);
+ Assert.That(expr.Evaluate(null), Is.EqualTo(DateTime.Today));
+ }
+
+ [Test]
+ public void Can_Compile_DateAdd()
+ {
+ const string expression = "dateAdd(today(),d,1)";
+ IExpression expr = CreateExpression(expression);
+ Assert.That(expr.Evaluate(null), Is.EqualTo(DateTime.Today.AddDays(1)));
+ }
+
+ [Test]
+ public void Can_Compile_DateDiff ()
+ {
+ const string expression = "dateSubtract('10.02.2013','09.02.2013')";
+ IExpression expr = CreateExpression(expression);
+ Assert.That(expr.Evaluate(null), Is.EqualTo(new TimeSpan(1,0,0,0).Duration()));
+ }
+
+
+ [Test]
+ public void Can_Compile_DateDiff_Start_Greater_End ()
+ {
+ const string expression = "dateSubtract('09.02.2013','10.02.2013')";
+ IExpression expr = CreateExpression(expression);
+ Assert.That(expr.Evaluate(null), Is.EqualTo(new TimeSpan(1,0,0,0)));
+ }
+
+ [Test]
+ public void Can_Compile_DateDiff_Include_Hours_Minutes()
+ {
+
+ // Example found at:
+ // http://msdn.microsoft.com/en-us/library/ae6246z1.aspx
+
+ System.DateTime date1 = new System.DateTime(1996, 6, 3, 22, 15, 0);
+ System.DateTime date2 = new System.DateTime(1996, 12, 6, 13, 2, 0);
+ // diff1 gets 185 days, 14 hours, and 47 minutes.
+ System.TimeSpan diff1 = date2.Subtract(date1);
+
+ const string expression = "dateSubtract('1996.12.6 13:2:0','1996.6.3 22:15:0')";
+
+ IExpression expr = CreateExpression(expression);
+ Assert.That(expr.Evaluate(null), Is.EqualTo(diff1));
+ }
+
+
+ private static IExpression CreateExpression (string expression)
+ {
+ var compiler = new ReportingLanguageCompiler();
+ return compiler.CompileExpression
-
-