0
|
1 using System;
|
|
2 using System.Data;
|
|
3
|
|
4 using NUnit.Framework;
|
|
5
|
|
6 using BLToolkit.Reflection;
|
|
7 using BLToolkit.Data;
|
|
8 using BLToolkit.Mapping;
|
|
9
|
|
10 #pragma warning disable 0252
|
|
11
|
|
12 namespace Data
|
|
13 {
|
|
14 [TestFixture]
|
|
15 public class InnerTypesTest
|
|
16 {
|
|
17 public class TypeMapper: MemberMapper
|
|
18 {
|
|
19 public override object GetValue(object o)
|
|
20 {
|
|
21 var value = (Type)MemberAccessor.GetValue(o);
|
|
22 return (null != value && MapMemberInfo.NullValue != value)? value.FullName: null;
|
|
23 }
|
|
24
|
|
25 public override void SetValue(object o, object value)
|
|
26 {
|
|
27 MemberAccessor.SetValue(o, (null != value)?
|
|
28 Type.GetType((string)value, true, true): MapMemberInfo.NullValue);
|
|
29 }
|
|
30 }
|
|
31
|
|
32 public class First
|
|
33 {
|
|
34 public string Name;
|
|
35 }
|
|
36
|
|
37 public abstract class Last
|
|
38 {
|
|
39 public string Name;
|
|
40 public abstract string Suffix { get; set; }
|
|
41
|
|
42 // Inner type of the inner type
|
|
43 //
|
|
44 [MapField("FirstName", "Name")]
|
|
45 public abstract First First { get; set; }
|
|
46
|
|
47 // This reference type field will be ignored
|
|
48 //
|
|
49 public Type Type;
|
|
50 }
|
|
51
|
|
52 [MapField("FirstName", "First.Name")]
|
|
53 [MapField("LastName", "Last.Name")]
|
|
54 [MapField("LastSuffix", "Last.Suffix")]
|
|
55 [MapField("LastFirstName", "Last.First.Name")]
|
|
56 public abstract class Person
|
|
57 {
|
|
58 [MapField("PersonID")]
|
|
59 public int ID;
|
|
60 public First First = new First();
|
|
61 public abstract Last Last { get; set; }
|
|
62 public string Name;
|
|
63 [MemberMapper(typeof(TypeMapper))]
|
|
64 public Type Type;
|
|
65 }
|
|
66
|
|
67 public abstract class Person2
|
|
68 {
|
|
69 [MapField("PersonID")]
|
|
70 public int ID;
|
|
71
|
|
72 [MapField("FirstName", "Name")]
|
|
73 public First First = new First();
|
|
74
|
|
75 [MapField(Format="Last{0}")]
|
|
76 public abstract Last Last { get; set; }
|
|
77
|
|
78 public string Name;
|
|
79 public string Type;
|
|
80 }
|
|
81
|
|
82 [Test]
|
|
83 public void MapFieldTest()
|
|
84 {
|
|
85 var p = (Person)TypeAccessor.CreateInstance(typeof(Person));
|
|
86
|
|
87 p.ID = 12345;
|
|
88 p.First.Name = "Crazy";
|
|
89 p.Last.Name = "Frog";
|
|
90 p.Last.Suffix = "Jr";
|
|
91 p.Last.Type = typeof(DbManager);
|
|
92 p.Last.First.Name = "Crazy Frog";
|
|
93 p.Name = "Froggy";
|
|
94 p.Type = typeof(DbManager);
|
|
95
|
|
96 var p2 = (Person2)Map.ObjectToObject(p, typeof(Person2));
|
|
97
|
|
98 Assert.AreEqual(p.ID, p2.ID);
|
|
99 Assert.AreEqual(p.First.Name, p2.First.Name);
|
|
100 Assert.AreEqual(p.Last.Name, p2.Last.Name);
|
|
101 Assert.AreEqual(p.Last.Suffix, p2.Last.Suffix);
|
|
102 Assert.AreEqual(p.Last.First.Name, p2.Last.First.Name);
|
|
103 Assert.AreEqual(p.Name, p2.Name);
|
|
104 Assert.AreEqual(p.Type.FullName, p2.Type);
|
|
105
|
|
106 // The 'Last.Type' field should be ignored by mapping process.
|
|
107 //
|
|
108 Assert.IsNull(p2.Last.Type);
|
|
109 }
|
|
110
|
|
111 [Test]
|
|
112 public void CreateParametersTest()
|
|
113 {
|
|
114 IDbDataParameter[] parameters;
|
|
115 var p = (Person)TypeAccessor.CreateInstance(typeof(Person));
|
|
116 p.ID = 12345;
|
|
117 p.First.Name = "Crazy";
|
|
118 p.Last.Name = "Frog";
|
|
119 p.Name = "Froggy";
|
|
120 p.Type = typeof(DbManager);
|
|
121
|
|
122 using (var db = new DbManager())
|
|
123 {
|
|
124 parameters = db.CreateParameters(p);
|
|
125 }
|
|
126
|
|
127 Assert.IsNotNull(parameters);
|
|
128 Assert.AreEqual(7, parameters.Length);
|
|
129
|
|
130 foreach (var parameter in parameters)
|
|
131 Console.WriteLine("{0}: {1}", parameter.ParameterName, parameter.Value);
|
|
132 }
|
|
133
|
|
134 public abstract class Template2
|
|
135 {
|
|
136 public abstract int ID { get; set; }
|
|
137 public abstract string DisplayName { get; set; }
|
|
138 }
|
|
139
|
|
140 [MapField("TPL_ID", "tpl.ID")]
|
|
141 [MapField("TPL_DisplayName", "tpl.DisplayName")]
|
|
142 public abstract class Template1
|
|
143 {
|
|
144 public abstract int ID { get; set; }
|
|
145 public abstract string DisplayName { get; set; }
|
|
146
|
|
147 public abstract Template2 tpl { get; set; }
|
|
148 }
|
|
149
|
|
150 [Test]
|
|
151 public void TemplateTest()
|
|
152 {
|
|
153 using (var db = new DbManager())
|
|
154 {
|
|
155 var cmd = @"
|
|
156 SELECT
|
|
157 1 as ID,
|
|
158 '2' as DisplayName,
|
|
159 3 as TPL_ID,
|
|
160 '4' as TPL_DisplayName";
|
|
161 #if ORACLE || FIREBIRD
|
|
162 cmd += " FROM dual";
|
|
163 #endif
|
|
164 var list = db
|
|
165 .SetCommand(cmd)
|
|
166 .ExecuteList(typeof(Template1));
|
|
167
|
|
168 Assert.IsNotNull(list);
|
|
169 }
|
|
170 }
|
|
171 }
|
|
172 }
|