-
Notifications
You must be signed in to change notification settings - Fork 4.6k
/
MetadataViewGenerationTests.cs
131 lines (103 loc) · 4.23 KB
/
MetadataViewGenerationTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Composition.Hosting;
using System.Composition.UnitTests.Util;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
namespace System.Composition.Lightweight.UnitTests
{
public class MetadataViewGenerationTests
{
[Export, ExportMetadata("Name", "A")]
public class HasNameA { }
public class Named { public string Name { get; set; } }
[Fact]
public void AConcreteTypeWithWritablePropertiesIsAMetadataView()
{
var cc = new ContainerConfiguration()
.WithPart<HasNameA>()
.CreateContainer();
var hn = cc.GetExport<Lazy<HasNameA, Named>>();
Assert.Equal("A", hn.Metadata.Name);
}
[Export]
public class HasNoName { }
public class OptionallyNamed {[DefaultValue("B")] public string Name { get; set; } }
[Fact]
public void MetadataViewsCanCarryDefaultValues()
{
var cc = new ContainerConfiguration()
.WithPart<HasNoName>()
.CreateContainer();
var hn = cc.GetExport<Lazy<HasNoName, OptionallyNamed>>();
Assert.Equal("B", hn.Metadata.Name);
}
public class DictionaryName
{
public DictionaryName(IDictionary<string, object> metadata)
{
RetrievedName = (string)metadata["Name"];
}
public string RetrievedName { get; set; }
}
[Fact]
public void AConcreteTypeWithDictionaryConstructorIsAMetadataView()
{
var cc = new ContainerConfiguration()
.WithPart<HasNameA>()
.CreateContainer();
var hn = cc.GetExport<Lazy<HasNameA, DictionaryName>>();
Assert.Equal("A", hn.Metadata.RetrievedName);
}
public class InvalidConcreteView
{
public InvalidConcreteView(string unsupported) { }
}
[Fact]
public void AConcreteTypeWithUnsupportedConstructorsCannotBeUsedAsAMetadataView()
{
var cc = new ContainerConfiguration()
.WithPart<HasNameA>()
.CreateContainer();
var x = Assert.Throws<CompositionFailedException>(() => cc.GetExport<Lazy<HasNoName, InvalidConcreteView>>());
Assert.Equal("The type 'InvalidConcreteView' cannot be used as a metadata view. A metadata view must be a concrete class with a parameterless or dictionary constructor.", x.Message);
}
[Export, ExportMetadata("Name", "A")]
public class ExportsWithMetadata { }
public interface INamed { string Name { get; } }
[Export]
public class ImportsWithMetadataInterface
{
[Import]
public Lazy<ExportsWithMetadata, INamed> Imported { get; set; }
}
[Fact]
public void UnsupportedMetadataViewMessageIsInformative()
{
var cc = new ContainerConfiguration().WithParts(typeof(ImportsWithMetadataInterface), typeof(ExportsWithMetadata)).CreateContainer();
var x = Assert.Throws<CompositionFailedException>(() => cc.GetExport<ImportsWithMetadataInterface>());
Assert.Equal("The type 'INamed' cannot be used as a metadata view. A metadata view must be a concrete class with a parameterless or dictionary constructor.", x.Message);
}
public class ReadonlyNameOrderMetadata
{
public int Order { get; set; }
public string Name { get { return "Name"; } }
}
[Export, ExportMetadata("Order", 1)]
public class HasOrder { }
[Fact]
public void ReadOnlyPropertiesOnMetadataViewsAreIgnored()
{
var c = new ContainerConfiguration()
.WithPart<HasOrder>()
.CreateContainer();
var l = c.GetExport<Lazy<HasOrder, ReadonlyNameOrderMetadata>>();
Assert.Equal(1, l.Metadata.Order);
}
}
}