1 // Permission is hereby granted, free of charge, to any person obtaining
\r
2 // a copy of this software and associated documentation files (the
\r
3 // "Software"), to deal in the Software without restriction, including
\r
4 // without limitation the rights to use, copy, modify, merge, publish,
\r
5 // distribute, sublicense, and/or sell copies of the Software, and to
\r
6 // permit persons to whom the Software is furnished to do so, subject to
\r
7 // the following conditions:
\r
9 // The above copyright notice and this permission notice shall be
\r
10 // included in all copies or substantial portions of the Software.
\r
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
20 // Copyright (c) 2008 Novell, Inc. (http://www.novell.com)
\r
21 // Copyright (c) 2011 Xamarin Inc. (http://www.xamarin.com)
\r
24 // Alan McGovern (amcgovern@novell.com)
\r
25 // Rolf Bjarne Kvinge (rolf@xamarin.com)
\r
30 using System.Collections.Generic;
\r
32 using System.IO.Packaging;
\r
36 using NUnit.Framework;
\r
38 namespace MonoTests.System.IO.Packaging {
\r
41 public class PackageRelationshipTests : TestBase {
\r
43 public void AddInvalidRelationshipTwice ()
\r
46 package.CreateRelationship (new Uri ("", UriKind.Relative), TargetMode.Internal, "bmp");
\r
47 } catch (ArgumentException) {
\r
49 package.CreateRelationship (new Uri ("", UriKind.Relative), TargetMode.Internal, "bmp");
\r
50 } catch (ArgumentException) {
\r
51 Assert.AreEqual (0, package.GetRelationships ().Count (), "Need to be buggy and return null");
\r
56 Assert.Fail ("Should have thrown an ArgumentException then InvalidOperationException");
\r
60 public void AddThreeRelationShips ()
\r
62 PackageRelationship r1 = package.CreateRelationship (uris [0], TargetMode.Internal, "a");
\r
63 PackageRelationship r2 = package.CreateRelationship (uris [1], TargetMode.Internal, "b");
\r
64 PackageRelationship r3 = package.CreateRelationship (uris [2], TargetMode.Internal, "a");
\r
66 Assert.AreEqual (3, package.GetRelationships ().Count (), "#1");
\r
67 Assert.AreEqual (2, package.GetRelationshipsByType ("a").Count (), "#2");
\r
68 Assert.AreEqual (0, package.GetRelationshipsByType ("A").Count (), "#3");
\r
72 public void CheckProperties ()
\r
74 AddThreeRelationShips ();
\r
75 PackageRelationship r = package.GetRelationshipsByType ("b").ToArray () [0];
\r
76 Assert.AreEqual (uris [1], r.TargetUri, "#1");
\r
77 Assert.AreEqual (TargetMode.Internal, r.TargetMode, "#2");
\r
78 Assert.AreEqual (new Uri ("/", UriKind.Relative), r.SourceUri, "#3");
\r
79 Assert.AreEqual ("b", r.RelationshipType, "#4");
\r
80 Assert.AreEqual (package, r.Package, "#5");
\r
81 Assert.IsTrue (package == r.Package, "#6");
\r
82 Assert.IsTrue (!string.IsNullOrEmpty (r.Id), "#7");
\r
83 Assert.IsTrue (char.IsLetter (r.Id [0]), "#8");
\r
87 public void CreatePackageTest ()
\r
89 package.CreateRelationship (uris[0], TargetMode.Internal, "a");
\r
90 package.CreateRelationship (uris[1], TargetMode.External, "a");
\r
91 package.CreateRelationship (new Uri ("http://www.example.com", UriKind.Absolute), TargetMode.External, "ex");
\r
94 package = Package.Open (new MemoryStream (stream.ToArray ()));
\r
95 PackageRelationship[] rels = package.GetRelationships ().ToArray ();
\r
96 Assert.AreEqual (3, rels.Length, "#1");
\r
98 Assert.AreEqual (uris[0], rels[0].TargetUri, "#2");
\r
99 Assert.AreEqual (TargetMode.Internal, rels[0].TargetMode, "#3");
\r
101 Assert.AreEqual (uris[1], rels[1].TargetUri, "#4");
\r
102 Assert.AreEqual (TargetMode.External, rels[1].TargetMode, "#5");
\r
104 Assert.AreEqual ("http://www.example.com/", rels[2].TargetUri.ToString (), "#6");
\r
105 Assert.AreEqual (TargetMode.External, rels[1].TargetMode, "#7");
\r
109 public void ExternalRelationshipTest ()
\r
111 package.CreateRelationship (new Uri ("/file2", UriKind.Relative), TargetMode.External, "RelType");
\r
112 package.CreateRelationship (new Uri ("http://www.example.com", UriKind.Absolute), TargetMode.External, "RelType");
\r
116 public void InternalRelationshipTest ()
\r
118 package.CreateRelationship (new Uri ("/file2", UriKind.Relative), TargetMode.Internal, "RelType");
\r
120 package.CreateRelationship (new Uri ("http://www.example.com", UriKind.Absolute), TargetMode.Internal, "RelType");
\r
121 Assert.Fail ("Internal relationships must be relative");
\r
122 } catch (ArgumentException) {
\r
127 public void RemoveById ()
\r
129 AddThreeRelationShips ();
\r
130 PackageRelationship r = package.GetRelationshipsByType ("a").ToArray () [0];
\r
131 package.DeleteRelationship (r.Id);
\r
132 Assert.AreEqual (2, package.GetRelationships ().Count (), "#1");
\r
133 Assert.AreEqual (1, package.GetRelationshipsByType ("a").Count (), "#2");
\r
137 public void RemoveThreeRelationships ()
\r
139 AddThreeRelationShips ();
\r
140 foreach (PackageRelationship p in new List<PackageRelationship> (package.GetRelationships ()))
\r
141 package.DeleteRelationship (p.Id);
\r
142 Assert.AreEqual (0, package.GetRelationships ().Count (), "Should contain no relationships");
\r
146 [ExpectedException (typeof (InvalidOperationException))]
\r
147 public void RemoveThreeRelationshipsBreak ()
\r
149 AddThreeRelationShips ();
\r
150 foreach (PackageRelationship p in package.GetRelationships ())
\r
151 package.DeleteRelationship (p.Id);
\r
155 public void CheckRelationshipData ()
\r
157 AddThreeRelationShips ();
\r
158 PackagePart part = package.GetPart (new Uri ("/_rels/.rels", UriKind.Relative));
\r
159 Assert.IsNotNull (package.GetPart (new Uri ("/_RELS/.RELS", UriKind.Relative)), "#0");
\r
161 Assert.IsNotNull (part, "#1");
\r
163 Stream stream = part.GetStream ();
\r
164 Assert.IsTrue (stream.Length > 0, "#2a");
\r
166 XmlDocument doc = new XmlDocument ();
\r
167 XmlNamespaceManager manager = new XmlNamespaceManager (doc.NameTable);
\r
168 manager.AddNamespace("rel", "http://schemas.openxmlformats.org/package/2006/relationships");
\r
169 doc.Load (new StreamReader (stream));
\r
171 Assert.IsNotNull (doc.SelectSingleNode ("/rel:Relationships", manager), "#2b");
\r
173 XmlNodeList list = doc.SelectNodes ("/rel:Relationships/*", manager);
\r
174 Assert.AreEqual (3, list.Count);
\r
176 List<PackageRelationship> relationships = new List<PackageRelationship>(package.GetRelationships ());
\r
177 foreach (XmlNode node in list) {
\r
178 Assert.AreEqual (3, node.Attributes.Count, "#3");
\r
179 Assert.IsNotNull (node.Attributes ["Id"], "#4");
\r
180 Assert.IsNotNull (node.Attributes ["Target"], "#5");
\r
181 Assert.IsNotNull (node.Attributes ["Type"], "#6");
\r
182 Assert.IsTrue(relationships.Exists(d => d.Id == node.Attributes["Id"].InnerText &&
\r
183 d.TargetUri == new Uri (node.Attributes["Target"].InnerText, UriKind.Relative) &&
\r
184 d.RelationshipType == node.Attributes["Type"].InnerText));
\r