7a2d73ebc7a553852ad26f7746eb055f3ef11511
[mono.git] / mcs / tools / compiler-tester / xmldocdiff.cs
1 #if !NET_2_1\r
2 \r
3 using System;\r
4 using System.Collections;\r
5 using System.Xml;\r
6 \r
7 public class XmlComparer\r
8 {\r
9         public class ComparisonException : Exception\r
10         {\r
11                 public ComparisonException (string message)\r
12                         : base (message)\r
13                 {\r
14                 }\r
15         }\r
16 \r
17         static bool debug = false;\r
18 /*\r
19 \r
20         public static void Main (string [] args)\r
21         {\r
22                 if (args.Length < 2) {\r
23                         Console.Error.WriteLine ("Usage: xmldocdiff [reference_output.xml] [actual_output.xml]");\r
24                         return;\r
25                 }\r
26                 if (args.Length > 2 && args [2].EndsWith ("-debug"))\r
27                         debug = true;\r
28 \r
29                 try {\r
30                         Run (args[0], args[1]);\r
31                 } catch (Exception ex) {\r
32                         Console.WriteLine ("FAIL: " + args [1]);\r
33                         throw ex;\r
34                 }\r
35                 Console.WriteLine ("PASS: " + args [1]);\r
36         }\r
37 */\r
38         public static void Compare (string reference, string output)\r
39         {\r
40                 XmlDocument doc1 = new XmlDocument ();\r
41                 doc1.Load (reference);\r
42                 XmlDocument doc2 = new XmlDocument ();\r
43                 doc2.Load (output);\r
44 \r
45                 XmlNodeList memberList1 = doc1.SelectNodes ("/doc/members/member");\r
46                 XmlNodeList memberList2 = doc2.SelectNodes ("/doc/members/member");\r
47 \r
48                 Hashtable namedItems = new Hashtable ();\r
49 \r
50                 foreach (XmlElement el in memberList1)\r
51                         namedItems.Add (el.GetAttribute ("name"), el);\r
52                 foreach (XmlElement el2 in memberList2) {\r
53                         string name = el2.GetAttribute ("name");\r
54                         XmlElement el1 = namedItems [name] as XmlElement;\r
55                         if (el1 == null) {\r
56                                 Report ("Extraneous element found. Name is '{0}'", name);\r
57                                 continue;\r
58                         }\r
59                         namedItems.Remove (name);\r
60 \r
61                         CompareNodes (el1, el2);\r
62 \r
63                 }\r
64                 foreach (string name in namedItems.Keys)\r
65                         Report ("Expected comment was not found. Name is {0}, XML is {1}", name, ((XmlElement) namedItems [name]).OuterXml);\r
66 \r
67                 // finally, check other nodes than members\r
68                 doc1.SelectSingleNode ("/doc/members").RemoveAll ();\r
69                 doc2.SelectSingleNode ("/doc/members").RemoveAll ();\r
70                 string xml1 = doc1.OuterXml.Replace ("\r", "").Trim ();\r
71                 string xml2 = doc2.OuterXml.Replace ("\r", "").Trim ();\r
72                 if (xml1 != xml2)\r
73                         Report (@"Either of doc, assembly, name, members elements  are different.\r
74 doc1: {0}\r
75 doc2: {1}", xml1, xml2);\r
76         }\r
77 \r
78         private static void CompareNodes (XmlNode n1, XmlNode n2)\r
79         {\r
80                 if (n2 == null) {\r
81                         Report (@"Nodes does not exist:\r
82 Node1: {0}", n1.OuterXml);\r
83                         return;\r
84                 }\r
85                 if (n1.NodeType != n2.NodeType) {\r
86                         Report (@"Nodes differ:\r
87 Node1: {0}\r
88 Node2: {1}", n1.OuterXml, n2.OuterXml);\r
89                         return;\r
90                 }\r
91                 if (n1.Name != n2.Name) {\r
92                         Report (@"Node names differ:\r
93 Node1: {0}\r
94 Node2: {1}", n1.OuterXml, n2.OuterXml);\r
95                         return;\r
96                 }\r
97                 if (n1 is XmlElement) {\r
98                         for (int i = 0; i < n1.Attributes.Count; i++)\r
99                                 CompareNodes (n1.Attributes [i],\r
100                                         n2.Attributes [i]);\r
101                         for (int i = 0; i < n1.ChildNodes.Count; i++)\r
102                                 CompareNodes (n1.ChildNodes [i],\r
103                                         n2.ChildNodes [i]);\r
104                 }\r
105                 if (n1.NodeType != XmlNodeType.Comment && n1.Value != null) {\r
106                         string v1 = n1.Value.Trim ().Replace ("\r", "");\r
107                         string v2 = n2.Value.Trim ().Replace ("\r", "");\r
108                         if (v1 != v2)\r
109                                 Report (@"Node values differ:\r
110 Node1: {0}\r
111 Node2: {1}", v1, v2);\r
112                 }\r
113         }\r
114 \r
115         static void Report (string format, params object [] args)\r
116         {\r
117                 if (debug)\r
118                         Console.WriteLine (format, args);\r
119                 else\r
120                         throw new ComparisonException (String.Format (format, args));\r
121         }\r
122 }\r
123 \r
124 #endif\r