2010-04-15 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Thu, 15 Apr 2010 08:04:54 +0000 (08:04 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Thu, 15 Apr 2010 08:04:54 +0000 (08:04 -0000)
* XData.cs : actual implementation.

* XDataTest.cs : new test.

svn path=/trunk/mcs/; revision=155476

mcs/class/System.Xaml/System.Windows.Markup/ChangeLog
mcs/class/System.Xaml/System.Windows.Markup/XData.cs
mcs/class/System.Xaml/Test/System.Windows.Markup/ChangeLog
mcs/class/System.Xaml/Test/System.Windows.Markup/XDataTest.cs [new file with mode: 0644]

index 726dec5a36ece920cbd91a482d591718c4e713a8..0969e71b0ac7e677031547713120159d3549fc3f 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XData.cs : actual implementation.
+
 2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
 
        * ArrayExtension.cs
index 3e0f1638395050c81a573bd43369c98d72c30480..0352f39c593189089dc7ac42ed7ab83b0ee45275 100755 (executable)
@@ -24,16 +24,43 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.IO;
 using System.Reflection;
 using System.Windows.Markup;
 using System.Xaml.Schema;
+using System.Xml;
 
 namespace System.Windows.Markup
 {
        [ContentProperty ("Text")]
        public sealed class XData
        {
-               public string Text { get; set; }
-               public object XmlReader { get; set; }
+               string text;
+               XmlReader reader;
+
+               public string Text {
+                       get { return text; }
+                       set {
+                               if (value == null) {
+                                       text = null;
+                                       reader = null;
+                               }
+                               else
+                                       text = value;
+                       }
+               }
+
+               public object XmlReader {
+                       get {
+                               if (reader == null)
+                                       reader = System.Xml.XmlReader.Create (new StringReader (text));
+                               return reader;
+                       }
+                       set {
+                               // silly? yes, it's also a hack in .NET - who cares?
+                               reader = value as XmlReader;
+                               text = null;
+                       }
+               }
        }
 }
index cdf88e87928f944734f4ae7558944e9bcc5d2a3a..932743f5132b41a6531546e73a742bfc01bb232a 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-15  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XDataTest.cs : new test.
+
 2010-04-14  Atsushi Enomoto  <atsushi@ximian.com>
 
        * ValueSerializerTest.cs : new test.
diff --git a/mcs/class/System.Xaml/Test/System.Windows.Markup/XDataTest.cs b/mcs/class/System.Xaml/Test/System.Windows.Markup/XDataTest.cs
new file mode 100644 (file)
index 0000000..dfe9175
--- /dev/null
@@ -0,0 +1,96 @@
+//
+// Copyright (C) 2010 Novell Inc. http://novell.com
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Reflection;
+using System.Text;
+using System.Windows.Markup;
+using System.Xaml;
+using System.Xaml.Schema;
+using System.Xml;
+using NUnit.Framework;
+
+using Category = NUnit.Framework.CategoryAttribute;
+
+namespace MonoTests.System.Windows.Markup
+{
+       [TestFixture]
+       public class XDataTest
+       {
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void GetXmlReaderWithNullText ()
+               {
+                       var x = new XData ();
+                       Assert.IsNull (x.Text, "#1");
+                       Assert.IsNull (x.XmlReader, "#2");
+               }
+
+               [Test]
+               public void TextSetsXmlReader ()
+               {
+                       var x = new XData ();
+                       x.Text = "foobar";
+                       Assert.IsNotNull (x.Text, "#3");
+                       var r = x.XmlReader as XmlReader;
+                       Assert.IsNotNull (r, "#4");
+                       Assert.AreEqual (XmlNodeType.None, r.NodeType, "#5");
+                       try {
+                               r.Read (); // invalid xml
+                               Assert.Fail ("#6");
+                       } catch (XmlException) {
+                       }
+               }
+
+               [Test]
+               public void SetTextNull ()
+               {
+                       var x = new XData ();
+                       // allowed.
+                       x.Text = null;
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void SetNonXmlReader ()
+               {
+                       var x = new XData ();
+                       XmlReader r;
+                       x.XmlReader = "<foo/>"; // not allowed. It does *not* raise an error, but the value becomes null.
+                       r = x.XmlReader as XmlReader; // and thus it causes ANE.
+               }
+
+               [Test]
+               public void SetXmlReader ()
+               {
+                       var x = new XData ();
+                       x.XmlReader = XmlReader.Create (new StringReader ("<root/>"));
+                       Assert.IsNull (x.Text, "#1");
+                       Assert.IsNotNull (x.XmlReader, "#2");
+                       x.XmlReader = null;
+               }
+       }
+}