aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRob Mensching <rob@firegiant.com>2017-12-06 11:21:42 -0800
committerRob Mensching <rob@firegiant.com>2017-12-06 11:21:42 -0800
commitca376995792d2e2a1a7f39760989496702a8f603 (patch)
treed9d2f35647d8fe77a91a63740d0ad267c32547b2 /src
parent53e877183abe0dbbb623c39380101bc369e9f265 (diff)
downloadwix-ca376995792d2e2a1a7f39760989496702a8f603.tar.gz
wix-ca376995792d2e2a1a7f39760989496702a8f603.tar.bz2
wix-ca376995792d2e2a1a7f39760989496702a8f603.zip
Fix handling of long values and baseUri in path fields
Diffstat (limited to 'src')
-rw-r--r--src/WixToolset.Data/Intermediate.cs49
-rw-r--r--src/WixToolset.Data/IntermediateField.cs5
-rw-r--r--src/WixToolset.Data/IntermediateFieldDefinition.cs1
-rw-r--r--src/WixToolset.Data/IntermediateFieldExtensions.cs53
-rw-r--r--src/WixToolset.Data/IntermediateFieldValue.cs27
-rw-r--r--src/WixToolset.Data/IntermediateSection.cs4
-rw-r--r--src/WixToolset.Data/IntermediateTuple.cs5
-rw-r--r--src/WixToolset.Data/SourceLineNumber.cs2
-rw-r--r--src/test/WixToolsetTest.Data/SerializeFixture.cs43
9 files changed, 132 insertions, 57 deletions
diff --git a/src/WixToolset.Data/Intermediate.cs b/src/WixToolset.Data/Intermediate.cs
index 4d4e17cc..81a97151 100644
--- a/src/WixToolset.Data/Intermediate.cs
+++ b/src/WixToolset.Data/Intermediate.cs
@@ -4,8 +4,9 @@ namespace WixToolset.Data
4{ 4{
5 using System; 5 using System;
6 using System.Collections.Generic; 6 using System.Collections.Generic;
7 using System.Linq;
8 using System.IO; 7 using System.IO;
8 using System.Linq;
9 using System.Reflection;
9 using SimpleJson; 10 using SimpleJson;
10 11
11 /// <summary> 12 /// <summary>
@@ -99,48 +100,60 @@ namespace WixToolset.Data
99 { 100 {
100 using (var stream = File.OpenRead(path)) 101 using (var stream = File.OpenRead(path))
101 { 102 {
103 var uri = new Uri(Path.GetFullPath(path));
102 var creator = new SimpleTupleDefinitionCreator(); 104 var creator = new SimpleTupleDefinitionCreator();
103 return Intermediate.Load(stream, path, creator, suppressVersionCheck); 105 return Intermediate.Load(stream, uri, creator, suppressVersionCheck);
104 } 106 }
105 } 107 }
106 108
107 /// <summary> 109 /// <summary>
108 /// Loads an intermediate from a stream. 110 /// Loads an intermediate from a stream.
109 /// </summary> 111 /// </summary>
110 /// <param name="stream">Stream to intermediate file.</param> 112 /// <param name="assembly">Assembly with intermediate embedded in resource stream.</param>
113 /// <param name="resourceName">Name of resource stream.</param>
111 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param> 114 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param>
112 /// <returns>Returns the loaded intermediate.</returns> 115 /// <returns>Returns the loaded intermediate.</returns>
113 public static Intermediate Load(Stream stream, bool suppressVersionCheck = false) 116 public static Intermediate Load(Assembly assembly, string resourceName, bool suppressVersionCheck = false)
114 { 117 {
115 var creator = new SimpleTupleDefinitionCreator(); 118 var creator = new SimpleTupleDefinitionCreator();
116 return Intermediate.Load(stream, creator, suppressVersionCheck); 119 return Intermediate.Load(assembly, resourceName, creator, suppressVersionCheck);
117 } 120 }
118 121
119 /// <summary> 122 /// <summary>
120 /// Loads an intermediate from a path on disk. 123 /// Loads an intermediate from a stream.
121 /// </summary> 124 /// </summary>
122 /// <param name="path">Path to intermediate file saved on disk.</param> 125 /// <param name="assembly">Assembly with intermediate embedded in resource stream.</param>
126 /// <param name="resourceName">Name of resource stream.</param>
123 /// <param name="creator">ITupleDefinitionCreator to use when reconstituting the intermediate.</param> 127 /// <param name="creator">ITupleDefinitionCreator to use when reconstituting the intermediate.</param>
124 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param> 128 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param>
125 /// <returns>Returns the loaded intermediate.</returns> 129 /// <returns>Returns the loaded intermediate.</returns>
126 public static Intermediate Load(string path, ITupleDefinitionCreator creator, bool suppressVersionCheck = false) 130 public static Intermediate Load(Assembly assembly, string resourceName, ITupleDefinitionCreator creator, bool suppressVersionCheck = false)
127 { 131 {
128 using (var stream = File.OpenRead(path)) 132 using (Stream resourceStream = assembly.GetManifestResourceStream(resourceName))
129 { 133 {
130 return Intermediate.Load(stream, path, creator, suppressVersionCheck); 134 var uriBuilder = new UriBuilder(assembly.CodeBase);
135 uriBuilder.Scheme = "embeddedresource";
136 uriBuilder.Fragment = resourceName;
137
138 return Intermediate.Load(resourceStream, uriBuilder.Uri, creator, suppressVersionCheck);
131 } 139 }
132 } 140 }
133 141
134 /// <summary> 142 /// <summary>
135 /// Loads an intermediate from a path on disk. 143 /// Loads an intermediate from a path on disk.
136 /// </summary> 144 /// </summary>
137 /// <param name="stream">Stream to intermediate file.</param> 145 /// <param name="path">Path to intermediate file saved on disk.</param>
138 /// <param name="creator">ITupleDefinitionCreator to use when reconstituting the intermediate.</param> 146 /// <param name="creator">ITupleDefinitionCreator to use when reconstituting the intermediate.</param>
139 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param> 147 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param>
140 /// <returns>Returns the loaded intermediate.</returns> 148 /// <returns>Returns the loaded intermediate.</returns>
141 public static Intermediate Load(Stream stream, ITupleDefinitionCreator creator, bool suppressVersionCheck = false) 149 public static Intermediate Load(string path, ITupleDefinitionCreator creator, bool suppressVersionCheck = false)
142 { 150 {
143 return Load(stream, "<unknown>", creator, suppressVersionCheck); 151 using (var stream = File.OpenRead(path))
152 {
153 var uri = new Uri(Path.GetFullPath(path));
154
155 return Intermediate.Load(stream, uri, creator, suppressVersionCheck);
156 }
144 } 157 }
145 158
146 /// <summary> 159 /// <summary>
@@ -206,11 +219,11 @@ namespace WixToolset.Data
206 /// Loads an intermediate from a path on disk. 219 /// Loads an intermediate from a path on disk.
207 /// </summary> 220 /// </summary>
208 /// <param name="stream">Stream to intermediate file.</param> 221 /// <param name="stream">Stream to intermediate file.</param>
209 /// <param name="path">Path name of intermediate file.</param> 222 /// <param name="baseUri">Path name of intermediate file.</param>
210 /// <param name="creator">ITupleDefinitionCreator to use when reconstituting the intermediate.</param> 223 /// <param name="creator">ITupleDefinitionCreator to use when reconstituting the intermediate.</param>
211 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param> 224 /// <param name="suppressVersionCheck">Suppress checking for wix.dll version mismatches.</param>
212 /// <returns>Returns the loaded intermediate.</returns> 225 /// <returns>Returns the loaded intermediate.</returns>
213 internal static Intermediate Load(Stream stream, string path, ITupleDefinitionCreator creator, bool suppressVersionCheck = false) 226 internal static Intermediate Load(Stream stream, Uri baseUri, ITupleDefinitionCreator creator, bool suppressVersionCheck = false)
214 { 227 {
215 JsonObject jsonObject; 228 JsonObject jsonObject;
216 229
@@ -218,7 +231,7 @@ namespace WixToolset.Data
218 { 231 {
219 if (FileFormat.WixIR != fs.FileFormat) 232 if (FileFormat.WixIR != fs.FileFormat)
220 { 233 {
221 throw new WixUnexpectedFileFormatException(path, FileFormat.WixIR, fs.FileFormat); 234 throw new WixUnexpectedFileFormatException(baseUri.LocalPath, FileFormat.WixIR, fs.FileFormat);
222 } 235 }
223 236
224 var json = fs.GetData(); 237 var json = fs.GetData();
@@ -231,7 +244,7 @@ namespace WixToolset.Data
231 244
232 if (!Version.TryParse(versionJson, out var version) || !Intermediate.CurrentVersion.Equals(version)) 245 if (!Version.TryParse(versionJson, out var version) || !Intermediate.CurrentVersion.Equals(version))
233 { 246 {
234 throw new WixException(WixDataErrors.VersionMismatch(SourceLineNumber.CreateFromUri(path), "intermediate", versionJson, Intermediate.CurrentVersion.ToString())); 247 throw new WixException(WixDataErrors.VersionMismatch(SourceLineNumber.CreateFromUri(baseUri.AbsoluteUri), "intermediate", versionJson, Intermediate.CurrentVersion.ToString()));
235 } 248 }
236 } 249 }
237 250
@@ -253,7 +266,7 @@ namespace WixToolset.Data
253 var sectionsJson = jsonObject.GetValueOrDefault<JsonArray>("sections"); 266 var sectionsJson = jsonObject.GetValueOrDefault<JsonArray>("sections");
254 foreach (JsonObject sectionJson in sectionsJson) 267 foreach (JsonObject sectionJson in sectionsJson)
255 { 268 {
256 var section = IntermediateSection.Deserialize(creator, sectionJson); 269 var section = IntermediateSection.Deserialize(creator, baseUri, sectionJson);
257 sections.Add(section); 270 sections.Add(section);
258 } 271 }
259 272
diff --git a/src/WixToolset.Data/IntermediateField.cs b/src/WixToolset.Data/IntermediateField.cs
index eba0e1ab..48cdceea 100644
--- a/src/WixToolset.Data/IntermediateField.cs
+++ b/src/WixToolset.Data/IntermediateField.cs
@@ -2,6 +2,7 @@
2 2
3namespace WixToolset.Data 3namespace WixToolset.Data
4{ 4{
5 using System;
5 using System.Diagnostics; 6 using System.Diagnostics;
6 using SimpleJson; 7 using SimpleJson;
7 8
@@ -50,13 +51,13 @@ namespace WixToolset.Data
50 return field.AsString(); 51 return field.AsString();
51 } 52 }
52 53
53 internal static IntermediateField Deserialize(IntermediateFieldDefinition definition, JsonObject jsonObject) 54 internal static IntermediateField Deserialize(IntermediateFieldDefinition definition, Uri baseUri, JsonObject jsonObject)
54 { 55 {
55 var field = new IntermediateField(definition); 56 var field = new IntermediateField(definition);
56 57
57 if (jsonObject != null) 58 if (jsonObject != null)
58 { 59 {
59 field.Value = IntermediateFieldValue.Deserialize(jsonObject); 60 field.Value = IntermediateFieldValue.Deserialize(jsonObject, baseUri, definition.Type);
60 } 61 }
61 62
62 return field; 63 return field;
diff --git a/src/WixToolset.Data/IntermediateFieldDefinition.cs b/src/WixToolset.Data/IntermediateFieldDefinition.cs
index c77a2ae8..5e1d8f29 100644
--- a/src/WixToolset.Data/IntermediateFieldDefinition.cs
+++ b/src/WixToolset.Data/IntermediateFieldDefinition.cs
@@ -7,6 +7,7 @@ namespace WixToolset.Data
7 String, 7 String,
8 Bool, 8 Bool,
9 Number, 9 Number,
10 LargeNumber,
10 Path, 11 Path,
11 } 12 }
12 13
diff --git a/src/WixToolset.Data/IntermediateFieldExtensions.cs b/src/WixToolset.Data/IntermediateFieldExtensions.cs
index be225452..89a6b903 100644
--- a/src/WixToolset.Data/IntermediateFieldExtensions.cs
+++ b/src/WixToolset.Data/IntermediateFieldExtensions.cs
@@ -21,26 +21,15 @@ namespace WixToolset.Data
21 { 21 {
22 // Null is always allowed. 22 // Null is always allowed.
23 } 23 }
24 else if (field.Type == IntermediateFieldType.Bool && !(value is bool)) 24 else if (field.Type == IntermediateFieldType.String && !(value is string))
25 { 25 {
26 if (value is int) 26 if (value is int)
27 { 27 {
28 data = ((int)value) != 0; 28 data = value.ToString();
29 } 29 }
30 else if (value is string str) 30 else if (value is bool b)
31 { 31 {
32 if (str.Equals("yes", StringComparison.OrdinalIgnoreCase) || str.Equals("true", StringComparison.OrdinalIgnoreCase)) 32 data = b ? "true" : "false";
33 {
34 data = true;
35 }
36 else if (str.Equals("no", StringComparison.OrdinalIgnoreCase) || str.Equals("false", StringComparison.OrdinalIgnoreCase))
37 {
38 data = false;
39 }
40 else
41 {
42 throw new ArgumentException(nameof(value));
43 }
44 } 33 }
45 else 34 else
46 { 35 {
@@ -58,15 +47,26 @@ namespace WixToolset.Data
58 throw new ArgumentException(nameof(value)); 47 throw new ArgumentException(nameof(value));
59 } 48 }
60 } 49 }
61 else if (field.Type == IntermediateFieldType.String && !(value is string)) 50 else if (field.Type == IntermediateFieldType.Bool && !(value is bool))
62 { 51 {
63 if (value is int) 52 if (value is int)
64 { 53 {
65 data = value.ToString(); 54 data = ((int)value) != 0;
66 } 55 }
67 else if (value is bool b) 56 else if (value is string str)
68 { 57 {
69 data = b ? "true" : "false"; 58 if (str.Equals("yes", StringComparison.OrdinalIgnoreCase) || str.Equals("true", StringComparison.OrdinalIgnoreCase))
59 {
60 data = true;
61 }
62 else if (str.Equals("no", StringComparison.OrdinalIgnoreCase) || str.Equals("false", StringComparison.OrdinalIgnoreCase))
63 {
64 data = false;
65 }
66 else
67 {
68 throw new ArgumentException(nameof(value));
69 }
70 } 70 }
71 else 71 else
72 { 72 {
@@ -84,6 +84,21 @@ namespace WixToolset.Data
84 throw new ArgumentException(nameof(value)); 84 throw new ArgumentException(nameof(value));
85 } 85 }
86 } 86 }
87 else if (field.Type == IntermediateFieldType.LargeNumber && !(value is long))
88 {
89 if (value is string str && Int64.TryParse(str, out var number))
90 {
91 data = number;
92 }
93 else if (value is int i)
94 {
95 data = (long)i;
96 }
97 else
98 {
99 throw new ArgumentException(nameof(value));
100 }
101 }
87 102
88 field.Value = new IntermediateFieldValue 103 field.Value = new IntermediateFieldValue
89 { 104 {
diff --git a/src/WixToolset.Data/IntermediateFieldValue.cs b/src/WixToolset.Data/IntermediateFieldValue.cs
index 2064afec..88bfb910 100644
--- a/src/WixToolset.Data/IntermediateFieldValue.cs
+++ b/src/WixToolset.Data/IntermediateFieldValue.cs
@@ -45,7 +45,7 @@ namespace WixToolset.Data
45 return value.AsString(); 45 return value.AsString();
46 } 46 }
47 47
48 internal static IntermediateFieldValue Deserialize(JsonObject jsonObject) 48 internal static IntermediateFieldValue Deserialize(JsonObject jsonObject, Uri baseUri, IntermediateFieldType type)
49 { 49 {
50 var context = jsonObject.GetValueOrDefault<string>("context"); 50 var context = jsonObject.GetValueOrDefault<string>("context");
51 if (!jsonObject.TryGetValue("data", out var data)) 51 if (!jsonObject.TryGetValue("data", out var data))
@@ -55,26 +55,30 @@ namespace WixToolset.Data
55 55
56 var value = data; 56 var value = data;
57 57
58 if (data is JsonObject jsonData) 58 if (data is string)
59 { 59 {
60 Uri baseUri = null; 60 }
61 61 else if (data is long)
62 if (jsonData.TryGetValue("baseUri", out var baseUriValue) && baseUriValue is string) 62 {
63 if (type == IntermediateFieldType.Number)
63 { 64 {
64 baseUri = new Uri((string)baseUriValue); 65 value = Convert.ToInt32(data);
65 } 66 }
67 }
68 else if (data is JsonObject jsonData)
69 {
66 jsonData.TryGetValue("embeddedIndex", out var embeddedIndex); 70 jsonData.TryGetValue("embeddedIndex", out var embeddedIndex);
67 71
68 value = new IntermediateFieldPathValue 72 value = new IntermediateFieldPathValue
69 { 73 {
70 BaseUri = baseUri, 74 BaseUri = (embeddedIndex == null) ? null : baseUri,
71 EmbeddedFileIndex = (int?)embeddedIndex, 75 EmbeddedFileIndex = (embeddedIndex == null) ? null : (int?)Convert.ToInt32(embeddedIndex),
72 Path = jsonData.GetValueOrDefault<string>("path"), 76 Path = jsonData.GetValueOrDefault<string>("path"),
73 }; 77 };
74 } 78 }
75 79
76 var previousValueJson = jsonObject.GetValueOrDefault<JsonObject>("prev"); 80 var previousValueJson = jsonObject.GetValueOrDefault<JsonObject>("prev");
77 var previousValue = (previousValueJson == null) ? null : IntermediateFieldValue.Deserialize(previousValueJson); 81 var previousValue = (previousValueJson == null) ? null : IntermediateFieldValue.Deserialize(previousValueJson, baseUri, type);
78 82
79 return new IntermediateFieldValue 83 return new IntermediateFieldValue
80 { 84 {
@@ -97,10 +101,7 @@ namespace WixToolset.Data
97 { 101 {
98 var jsonData = new JsonObject(); 102 var jsonData = new JsonObject();
99 103
100 if (pathField.BaseUri != null) 104 // pathField.BaseUri is set during load, not saved.
101 {
102 jsonData.Add("baseUri", pathField.BaseUri.AbsoluteUri);
103 }
104 105
105 if (pathField.EmbeddedFileIndex.HasValue) 106 if (pathField.EmbeddedFileIndex.HasValue)
106 { 107 {
diff --git a/src/WixToolset.Data/IntermediateSection.cs b/src/WixToolset.Data/IntermediateSection.cs
index 5d17eb31..54758136 100644
--- a/src/WixToolset.Data/IntermediateSection.cs
+++ b/src/WixToolset.Data/IntermediateSection.cs
@@ -61,7 +61,7 @@ namespace WixToolset.Data
61 /// <summary> 61 /// <summary>
62 /// Parse a section from the JSON data. 62 /// Parse a section from the JSON data.
63 /// </summary> 63 /// </summary>
64 internal static IntermediateSection Deserialize(ITupleDefinitionCreator creator, JsonObject jsonObject) 64 internal static IntermediateSection Deserialize(ITupleDefinitionCreator creator, Uri baseUri, JsonObject jsonObject)
65 { 65 {
66 var codepage = jsonObject.GetValueOrDefault("codepage", 0); 66 var codepage = jsonObject.GetValueOrDefault("codepage", 0);
67 var id = jsonObject.GetValueOrDefault<string>("id"); 67 var id = jsonObject.GetValueOrDefault<string>("id");
@@ -83,7 +83,7 @@ namespace WixToolset.Data
83 83
84 foreach (JsonObject tupleJson in tuplesJson) 84 foreach (JsonObject tupleJson in tuplesJson)
85 { 85 {
86 var tuple = IntermediateTuple.Deserialize(creator, tupleJson); 86 var tuple = IntermediateTuple.Deserialize(creator, baseUri, tupleJson);
87 section.Tuples.Add(tuple); 87 section.Tuples.Add(tuple);
88 } 88 }
89 89
diff --git a/src/WixToolset.Data/IntermediateTuple.cs b/src/WixToolset.Data/IntermediateTuple.cs
index cda133b5..e5df9ecb 100644
--- a/src/WixToolset.Data/IntermediateTuple.cs
+++ b/src/WixToolset.Data/IntermediateTuple.cs
@@ -2,6 +2,7 @@
2 2
3namespace WixToolset.Data 3namespace WixToolset.Data
4{ 4{
5 using System;
5 using SimpleJson; 6 using SimpleJson;
6 7
7 public class IntermediateTuple 8 public class IntermediateTuple
@@ -28,7 +29,7 @@ namespace WixToolset.Data
28 29
29 public IntermediateField this[int index] => this.Fields[index]; 30 public IntermediateField this[int index] => this.Fields[index];
30 31
31 internal static IntermediateTuple Deserialize(ITupleDefinitionCreator creator, JsonObject jsonObject) 32 internal static IntermediateTuple Deserialize(ITupleDefinitionCreator creator, Uri baseUri, JsonObject jsonObject)
32 { 33 {
33 var definitionName = jsonObject.GetValueOrDefault<string>("type"); 34 var definitionName = jsonObject.GetValueOrDefault<string>("type");
34 var idJson = jsonObject.GetValueOrDefault<JsonObject>("id"); 35 var idJson = jsonObject.GetValueOrDefault<JsonObject>("id");
@@ -45,7 +46,7 @@ namespace WixToolset.Data
45 { 46 {
46 if (tuple.Fields.Length > i && fieldsJson[i] is JsonObject fieldJson) 47 if (tuple.Fields.Length > i && fieldsJson[i] is JsonObject fieldJson)
47 { 48 {
48 tuple.Fields[i] = IntermediateField.Deserialize(tuple.Definition.FieldDefinitions[i], fieldJson); 49 tuple.Fields[i] = IntermediateField.Deserialize(tuple.Definition.FieldDefinitions[i], baseUri, fieldJson);
49 } 50 }
50 } 51 }
51 52
diff --git a/src/WixToolset.Data/SourceLineNumber.cs b/src/WixToolset.Data/SourceLineNumber.cs
index 742f6e9d..8ec65201 100644
--- a/src/WixToolset.Data/SourceLineNumber.cs
+++ b/src/WixToolset.Data/SourceLineNumber.cs
@@ -146,7 +146,7 @@ namespace WixToolset.Data
146 } 146 }
147 147
148 // make the local path look like a normal local path 148 // make the local path look like a normal local path
149 string localPath = new Uri(uri).LocalPath; 149 var localPath = new Uri(uri).LocalPath;
150 localPath = localPath.TrimStart(Path.AltDirectorySeparatorChar).Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); 150 localPath = localPath.TrimStart(Path.AltDirectorySeparatorChar).Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
151 151
152 return new SourceLineNumber(localPath); 152 return new SourceLineNumber(localPath);
diff --git a/src/test/WixToolsetTest.Data/SerializeFixture.cs b/src/test/WixToolsetTest.Data/SerializeFixture.cs
new file mode 100644
index 00000000..9883053f
--- /dev/null
+++ b/src/test/WixToolsetTest.Data/SerializeFixture.cs
@@ -0,0 +1,43 @@
1// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
2
3namespace WixToolsetTest.Data
4{
5 using System;
6 using System.IO;
7 using System.Linq;
8 using WixToolset.Data;
9 using WixToolset.Data.Tuples;
10 using Xunit;
11
12 public class SerializeFixture
13 {
14 [Fact]
15 public void CanSaveAndLoadIntermediate()
16 {
17 var sln = new SourceLineNumber("test.wxs", 1);
18
19 var section = new IntermediateSection("test", SectionType.Product, 65001);
20
21 section.Tuples.Add(new ComponentTuple(sln, new Identifier("TestComponent", AccessModifier.Public))
22 {
23 ComponentId = new Guid(1, 0, 0, new byte[8]).ToString("B"),
24 Directory_ = "TestFolder",
25 Attributes = 2,
26 });
27
28 var intermediate = new Intermediate("TestIntermediate", new[] { section }, null, null);
29
30 var path = Path.GetTempFileName();
31 intermediate.Save(path);
32
33 var loaded = Intermediate.Load(path);
34
35 var tuple = (ComponentTuple)loaded.Sections.Single().Tuples.Single();
36
37 Assert.Equal("TestComponent", tuple.Id.Id);
38 Assert.Equal(AccessModifier.Public, tuple.Id.Access);
39 Assert.Equal("TestFolder", tuple.Directory_);
40 Assert.Equal(2, tuple.Attributes);
41 }
42 }
43}