Merge branch 'patch-1' of https://github.com/ReubenBond/mono into ReubenBond-patch-1
[mono.git] / mcs / class / System.XML / Test / System.Xml.Xsl / standalone_tests / XmlCompare.cs
1 using System;\r
2 using System.Xml;\r
3 \r
4 namespace XmlCompare\r
5 {\r
6         /// <summary>\r
7         /// Summary description for XmlCompare.\r
8         /// </summary>\r
9         public class XmlCompare\r
10         {\r
11                 [Flags]\r
12                 public enum Flags {\r
13                         IgnoreNone=0,\r
14                         IgnoreAttribOrder=1,\r
15                 }\r
16                 Flags flags;\r
17                 public XmlCompare (Flags flags)\r
18                 {\r
19                         this.flags = flags;\r
20                 }\r
21 \r
22                 public XmlCompare ()\r
23                         :this (Flags.IgnoreNone)\r
24                 {\r
25                 }\r
26 \r
27                 public bool AreEqualAttribs (XmlAttributeCollection attrs1, XmlAttributeCollection attrs2)\r
28                 {\r
29                         if (attrs1.Count != attrs2.Count)\r
30                                 return false;\r
31                         for (int i=0; i<attrs1.Count; i++) {\r
32                                 if ((flags & Flags.IgnoreAttribOrder) != 0) {\r
33                                         string ln = attrs1[i].LocalName;\r
34                                         string ns = attrs1[i].NamespaceURI;\r
35                                         string val = attrs1[i].Value;\r
36                                         XmlAttribute atr2 = attrs2[ln, ns];\r
37                                         if (atr2 == null || atr2.Value != val)\r
38                                                 return false;\r
39                                 } else {\r
40                                         if (attrs1 [i].LocalName != attrs2 [i].LocalName)\r
41                                                 return false;\r
42                                         if (attrs1 [i].NamespaceURI != attrs2 [i].NamespaceURI)\r
43                                                 return false;\r
44                                         if (attrs1 [i].Value != attrs2 [i].Value)\r
45                                                 return false;\r
46                                 }\r
47                         }\r
48                         return true;\r
49                 }\r
50 \r
51                 public bool AreEqualNodeList (XmlNodeList lst1, XmlNodeList lst2)\r
52                 {\r
53                         if (lst1.Count != lst2.Count)\r
54                                 return false;\r
55                         for (int i=0; i<lst1.Count; i++) {\r
56                                 if (!AreEqual (lst1[i], lst2[i]))\r
57                                         return false;\r
58                         }\r
59                         return true;\r
60                 }\r
61 \r
62                 public bool AreEqual (XmlNode node1, XmlNode node2)\r
63                 {\r
64                         if (node1.NodeType != node2.NodeType)\r
65                                 return false;\r
66                         if (node1.LocalName != node2.LocalName)\r
67                                 return false;\r
68                         if (node1.NamespaceURI != node2.NamespaceURI)\r
69                                 return false;\r
70                         if (node1.Attributes != null && node2.Attributes != null) {\r
71                                 if (!AreEqualAttribs (node1.Attributes, node2.Attributes))\r
72                                         return false;\r
73                         }\r
74                         else //one of nodes has no attrs\r
75                                 if (node1.Attributes != null || node2.Attributes != null)\r
76                                         return false;//and another has some\r
77                         if (!node1.HasChildNodes && !node2.HasChildNodes)\r
78                                 return node1.Value == node2.Value;\r
79                         else {//one of nodes has some children\r
80                                 if (!node1.HasChildNodes || !node2.HasChildNodes)\r
81                                         return false;//and another has none\r
82                                 return AreEqualNodeList (node1.ChildNodes, node2.ChildNodes);\r
83                         }\r
84                 }\r
85 \r
86                 static void Main ()\r
87                 {\r
88                         XmlDocument doc1 = new XmlDocument ();\r
89                         XmlDocument doc2 = new XmlDocument ();\r
90                         XmlDocument doc3 = new XmlDocument ();\r
91                         XmlDocument doc4 = new XmlDocument ();\r
92                         \r
93                         doc1.LoadXml (@"<?xml version=""1.0""?>\r
94 <doc>\r
95         <element attr1=""1"" attr2=""2"" />\r
96 </doc>");\r
97                         doc2.LoadXml (@"<?xml version=""1.0""?><doc><element attr1=""1"" attr2=""2""/></doc>");\r
98                         doc3.LoadXml (@"<?xml version=""1.0""?><doc><element attr2=""2"" attr1=""1""/></doc>");\r
99                         doc4.LoadXml (@"<?xml version=""1.0""?><doc><element attr3=""3"" attr2=""2""/></doc>");\r
100 \r
101                         XmlCompare cmp1 = new XmlCompare();\r
102                         XmlCompare cmp2 = new XmlCompare(Flags.IgnoreAttribOrder);\r
103 \r
104                         Console.Out.WriteLine (cmp1.AreEqual (doc1, doc2).ToString ());\r
105                         Console.Out.WriteLine (cmp1.AreEqual (doc1, doc3).ToString ());\r
106                         Console.Out.WriteLine (cmp2.AreEqual (doc1, doc3).ToString ());\r
107                         Console.Out.WriteLine (cmp2.AreEqual (doc1, doc4).ToString ());\r
108                 }\r
109         }\r
110 }\r