aa333328d962b5cf0d7640c6500f03d266c21e83
[mono.git] / mcs / class / System.XML / Test / System.Xml.Xsl / XslCompiledTransformTests.cs
1 using NUnit.Framework;
2 using System.IO;
3 using System.Xml;
4 using System.Xml.XPath;
5 using System.Xml.Xsl;
6
7 namespace MonoTests.System.Xml.Xsl
8 {
9         [TestFixture]
10         public class XslCompiledTransformTests
11         {
12                 [Test]
13                 public void GlobalVariableReferencesAnotherGlobalVariable ()
14                 {
15                         string xsl = @"<xsl:stylesheet version='1.0'
16 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
17 <xsl:variable name='global2'><xsl:value-of select='root/@attr' /></xsl:variable>
18 <xsl:variable name='global1'>
19         <xsl:for-each select='//foo'>
20                 <xsl:if test='@attr = $global2'>
21                         <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
22                 </xsl:if>
23         </xsl:for-each>
24 </xsl:variable>
25 <xsl:template match='/'>
26         <root>
27                 <xsl:value-of select='$global1' />
28         </root>
29 </xsl:template>
30 </xsl:stylesheet>";
31                         StringWriter sw = new StringWriter ();
32                         XslCompiledTransform t = new XslCompiledTransform ();
33                         t.Load (new XPathDocument (new StringReader (xsl)));
34                         t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root attr='B'><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
35                         Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><root>foo: B</root>", sw.ToString ());
36                 }
37
38                 [Test]
39                 [Category ("MobileNotWorking")]
40                 public void MSXslNodeSetAcceptsNodeSet ()
41                 {
42                         string xsl = @"<xsl:stylesheet version='1.0'
43 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
44 <xsl:template match='/'>
45         <root>
46                 <!-- msxsl:node-set() accepts a node set -->
47                 <xsl:for-each select='msxsl:node-set(root/foo)'>
48                         <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
49                 </xsl:for-each>
50         </root>
51 </xsl:template>
52 </xsl:stylesheet>";
53                         StringWriter sw = new StringWriter ();
54                         XslCompiledTransform t = new XslCompiledTransform ();
55                         t.Load (new XPathDocument (new StringReader (xsl)));
56                         // should transform without an exception
57                         t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
58                 }
59
60                 [Test]
61                 [Category ("MobileNotWorking")]
62                 public void MSXslNodeSetAcceptsEmptyString ()
63                 {
64                         string xsl = @"<xsl:stylesheet version='1.0'
65 xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt'>
66 <xsl:template match='/'>
67         <root>
68                 <!-- msxsl:node-set() accepts an empty string -->
69                 <xsl:variable name='empty'></xsl:variable>
70                 <xsl:for-each select='msxsl:node-set($empty)'>
71                         <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
72                 </xsl:for-each>
73         </root>
74 </xsl:template>
75 </xsl:stylesheet>";
76                         StringWriter sw = new StringWriter ();
77                         XslCompiledTransform t = new XslCompiledTransform ();
78                         t.Load (new XPathDocument (new StringReader (xsl)));
79                         // should transform without an exception
80                         t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
81                 }
82
83                 [Test]
84                 public void ValueOfElementWithInsignificantWhitespace ()
85                 {
86                         string xsl = @"<?xml version='1.0' encoding='utf-8'?>
87 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
88 <xsl:template match='/'>
89         <root>
90                 <bar>
91                         <xsl:if test='root/@attr'>
92                                 <xsl:value-of select='root/@attr'>
93                                 </xsl:value-of>
94                         </xsl:if>
95                 </bar>
96                 <baz>
97                         <xsl:for-each select='root/foo'>
98                                 <xsl:if test='position() != 1'>
99                                         <xsl:text>,</xsl:text>
100                                 </xsl:if>
101                                 <xsl:value-of select='name(.)' />: <xsl:value-of select='@attr' />
102                         </xsl:for-each>
103                 </baz>
104         </root>
105 </xsl:template>
106 </xsl:stylesheet>";
107                         StringWriter sw = new StringWriter ();
108                         XslCompiledTransform t = new XslCompiledTransform ();
109                         t.Load (new XmlTextReader(new StringReader(xsl)));
110                         t.Transform (new XPathDocument (new XmlTextReader (new StringReader ("<root attr='D'><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), null, sw);
111                         Assert.AreEqual ("<?xml version=\"1.0\" encoding=\"utf-16\"?><root><bar>D</bar><baz>foo: A,foo: B,foo: C</baz></root>", sw.ToString ());
112                 }
113
114                 [Test]
115                 public void ElementToAttribute ()
116                 {
117                         var xsl = @"<?xml version='1.0' encoding='utf-8'?>
118 <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
119   <xsl:output method='xml'/>
120   <xsl:template match='/'>
121         <Node>
122           <xsl:attribute name='name'>
123                 <xsl:call-template name='makeName'>
124                   <xsl:with-param name='Name' select='Node/Name' />
125                 </xsl:call-template>
126           </xsl:attribute>
127         </Node>
128   </xsl:template>
129
130   <xsl:template name='makeName'>
131         <xsl:param name='Name' />
132         <xsl:value-of select='$Name' />
133   </xsl:template>
134 </xsl:stylesheet>";
135
136                         var t = new XslCompiledTransform ();
137                         t.Load (new XmlTextReader (new StringReader (xsl)));
138
139                         var source = "<?xml version='1.0' encoding='utf-8' ?><Node><Name>123</Name></Node>";
140 #if MOBILE
141                         var expected = "<?xml version=\"1.0\" encoding=\"utf-16\"?><Node name=\"123\"></Node>";
142 #else
143                         var expected = "<?xml version=\"1.0\" encoding=\"utf-16\"?><Node name=\"123\" />";
144 #endif
145                         StringWriter sw = new StringWriter ();
146                         var xp = new XPathDocument (new XmlTextReader (new StringReader (source)));
147                         t.Transform (xp, null, sw);
148                         Assert.AreEqual (expected, sw.ToString ());
149                 }
150                 
151                 [Test] // bug 2917
152                 [Category ("MobileNotWorking")]
153                 public void XslOutputSettings ()
154                 {
155                         XslCompiledTransform xslCompiledTransform = new XslCompiledTransform();
156
157                         string xsl =
158                                 @"<?xml version=""1.0"" encoding=""UTF-8"" ?>
159                                 <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" xmlns:extensions=""urn:extensions"" exclude-result-prefixes=""extensions"">
160                                         <xsl:output method=""xml"" indent=""yes""/>
161                                         <xsl:template match="" / ""></xsl:template>
162                                 </xsl:stylesheet>";
163                         
164
165                         var xmlReader = XmlReader.Create(new StringReader(xsl));
166                         xslCompiledTransform.Load(xmlReader);
167
168                         // Returns true on .NET and False on mono 2.10.2
169                         Assert.IsTrue (xslCompiledTransform.OutputSettings.Indent, "#1");
170                 }
171         }
172 }