Merge pull request #495 from nicolas-raoul/fix-for-issue2907-with-no-formatting-changes
[mono.git] / mcs / class / System.ServiceModel / Test / MetadataTests / TestContext.cs
1 //
2 // ITestContext.cs
3 //
4 // Author:
5 //       Martin Baulig <martin.baulig@xamarin.com>
6 //
7 // Copyright (c) 2012 Xamarin Inc. (http://www.xamarin.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining a copy
10 // of this software and associated documentation files (the "Software"), to deal
11 // in the Software without restriction, including without limitation the rights
12 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 // copies of the Software, and to permit persons to whom the Software is
14 // furnished to do so, subject to the following conditions:
15 //
16 // The above copyright notice and this permission notice shall be included in
17 // all copies or substantial portions of the Software.
18 //
19 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 // THE SOFTWARE.
26
27 using System;
28 using System.IO;
29 using System.Xml;
30 using System.Text;
31 using System.Reflection;
32 using System.ServiceModel.Description;
33
34 namespace MonoTests.System.ServiceModel.MetadataTests {
35
36         public abstract class TestContext {
37
38                 #region Abstract API
39
40                 public abstract MetadataSet GetMetadata (string name);
41
42                 #endregion
43
44                 #region Default Context
45
46                 public static TestContext LoadMetadataContext = new _LoadMetadataContext ();
47
48                 public static TestContext CreateMetadataContext = new _CreateMetadataContext ();
49
50                 public static TestContext RoundTripContext = new _RoundTripContext ();
51
52                 #endregion
53
54                 #region Implementations
55
56                 class _LoadMetadataContext : TestContext {
57                         public override MetadataSet GetMetadata (string name)
58                         {
59                                 return LoadMetadata (name);
60                         }
61                 }
62
63                 class _CreateMetadataContext : TestContext {
64                         public override MetadataSet GetMetadata (string name)
65                         {
66                                 return MetadataSamples.GetMetadataByName (name);
67                         }
68                 }
69
70                 class _RoundTripContext : TestContext {
71                         public override MetadataSet GetMetadata (string name)
72                         {
73                                 return RoundTrip (name);
74                         }
75                 }
76
77                 #endregion
78
79                 #region Public Static API
80
81                 public static MetadataSet LoadMetadata (string name)
82                 {
83 #if USE_EMBEDDED_METADATA
84                         return LoadMetadataFromResource (name);
85 #else
86                         return LoadMetadataFromFile (name);
87 #endif
88                 }
89
90                 public static void SaveMetadata (string name, MetadataSet metadata)
91                 {
92                         SaveMetadataToFile (name, metadata);
93                 }
94
95                 public static MetadataSet LoadMetadataFromFile (string name)
96                 {
97                         var asm = Assembly.GetExecutingAssembly ();
98                         if (!name.EndsWith (".xml"))
99                                 name = name + ".xml";
100                         var uri = new Uri (asm.CodeBase);
101                         var path = Path.GetDirectoryName (uri.AbsolutePath);
102                         path = Path.Combine (path, "Test");
103                         path = Path.Combine (path, "MetadataTests");
104                         path = Path.Combine (path, "Resources");
105                         var filename = Path.Combine (path, name);
106                         using (var stream = new StreamReader (filename)) {
107                                 var reader = new XmlTextReader (stream);
108                                 return MetadataSet.ReadFrom (reader);
109                         }
110                 }
111
112                 public static MetadataSet LoadMetadataFromResource (string name)
113                 {
114                         var asm = Assembly.GetExecutingAssembly ();
115                         if (!name.EndsWith (".xml"))
116                                 name = name + ".xml";
117                         
118                         var resname = "MetadataTests.Resources." + name;
119                         using (var stream = asm.GetManifestResourceStream (resname)) {
120                                 if (stream == null)
121                                         throw new InvalidOperationException (
122                                                 "No such resource: " + name);
123                                 var reader = new XmlTextReader (stream);
124                                 return MetadataSet.ReadFrom (reader);
125                         }
126                 }
127                 
128                 public static void SaveMetadataToFile (string name, MetadataSet metadata)
129                 {
130                         var filename = name + ".xml";
131                         if (File.Exists (filename))
132                                 return;
133
134                         using (var file = new StreamWriter (filename, false)) {
135                                 var writer = new XmlTextWriter (file);
136                                 writer.Formatting = Formatting.Indented;
137                                 metadata.WriteTo (writer);
138                         }
139
140                         Console.WriteLine ("Exported {0}.", filename);
141                 }
142
143                 internal static string SaveMetadataToString (MetadataSet metadata)
144                 {
145                         using (var ms = new MemoryStream ()) {
146                                 var writer = new XmlTextWriter (new StreamWriter (ms));
147                                 writer.Formatting = Formatting.Indented;
148                                 metadata.WriteTo (writer);
149                                 writer.Flush ();
150
151                                 return Encoding.UTF8.GetString (ms.GetBuffer (), 0, (int)ms.Position);
152                         }
153                 }
154
155                 internal static MetadataSet LoadMetadataFromString (string doc)
156                 {
157                         var buffer = Encoding.UTF8.GetBytes (doc);
158                         using (var ms = new MemoryStream (buffer)) {
159                                 var reader = new XmlTextReader (ms);
160                                 return MetadataSet.ReadFrom (reader);
161                         }
162                 }
163
164                 public static MetadataSet RoundTrip (string name)
165                 {
166                         var metadata = MetadataSamples.GetMetadataByName (name);
167
168                         var doc = SaveMetadataToString (metadata);
169                         return LoadMetadataFromString (doc);
170                 }
171
172                 #endregion
173         }
174 }
175