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