Skip to content

Commit 9fdb392

Browse files
committed
Improved SelectDtoTest
- Enum constants better testing - checking results of queries - refactoring
1 parent fa15423 commit 9fdb392

1 file changed

Lines changed: 104 additions & 45 deletions

File tree

Orm/Xtensive.Orm.Tests/Linq/SelectDtoTest.cs

Lines changed: 104 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ public enum BudgetType
2525
}
2626

2727
[HierarchyRoot]
28-
public class Manager
29-
: Entity
28+
public class Manager : Entity
3029
{
3130
[Field, Key]
3231
public int Id { get; private set; }
@@ -36,11 +35,15 @@ public class Manager
3635

3736
[Field,Association(PairTo = "Manager")]
3837
public EntitySet<Person> Persons { get; private set; }
38+
39+
public Manager(Session session)
40+
: base(session)
41+
{
42+
}
3943
}
4044

4145
[HierarchyRoot]
42-
public class Person
43-
: Entity
46+
public class Person : Entity
4447
{
4548
[Field, Key]
4649
public int Id { get; private set; }
@@ -56,6 +59,11 @@ public class Person
5659

5760
[Field]
5861
public BudgetType? BudgetType { get; set; }
62+
63+
public Person(Session session)
64+
: base(session)
65+
{
66+
}
5967
}
6068

6169
public class ManagerDto
@@ -90,7 +98,7 @@ public void MainTest()
9098
{
9199
using (var session = Domain.OpenSession())
92100
using (var t = session.OpenTransaction()) {
93-
var alex = new Person() { Name = "Alex" };
101+
var alex = new Person(session) { Name = "Alex" };
94102
var query = session.Query.All<Person>()
95103
.Select(p => new PersonDto {Name = p.Name})
96104
.Where(personDto => personDto.Name == "Alex");
@@ -105,8 +113,8 @@ public void WhereTest()
105113
{
106114
using (var session = Domain.OpenSession())
107115
using (var t = session.OpenTransaction()) {
108-
var person5 = new Person() {Name = "John", Tag = 5, BudgetType = BudgetType.Regional};
109-
var personEmpty = new Person() {Name = "John"};
116+
var person5 = new Person(session) {Name = "John", Tag = 5, BudgetType = BudgetType.Regional};
117+
var personEmpty = new Person(session) {Name = "John"};
110118

111119
var count = session.Query.All<Person>()
112120
.Select(p => new PersonDto() { Id = p.Id, Name = p.Name, Tag = p.Tag, BudgetType = p.BudgetType})
@@ -118,24 +126,58 @@ public void WhereTest()
118126
[Test]
119127
public void EnumTest()
120128
{
129+
BudgetType budgetType = BudgetType.Regional;
130+
BudgetType budgetTypeNotNullable = BudgetType.State;
131+
BudgetType? budgetTypeNullable = BudgetType.Default;
132+
BudgetType? nullBudgetType = null;
133+
121134
using (var session = Domain.OpenSession())
122135
using (var t = session.OpenTransaction()) {
123-
BudgetType budgetType = BudgetType.Regional;
124-
BudgetType budgetTypeNotNullable = BudgetType.Regional;
125-
BudgetType? budgetTypeNullable = BudgetType.Regional;
136+
_ = new Person(session) { Name = "A", BudgetType = BudgetType.Default };
137+
_ = new Person(session) { Name = "B", BudgetType = BudgetType.Default };
138+
_ = new Person(session) { Name = "C", BudgetType = BudgetType.Regional };
139+
_ = new Person(session) { Name = "D", BudgetType = BudgetType.State };
140+
_ = new Person(session) { Name = "E" };
141+
_ = new Person(session) { Name = "F" };
142+
_ = new Person(session) { Name = null };
143+
_ = new Person(session) { Name = null };
144+
145+
session.SaveChanges();
146+
126147
Expression<Func<Person, bool>> filterExpression = p => p.BudgetType == budgetType;
148+
var regionalBudgetPeople = session.Query.All<Person>().Where(filterExpression).ToList();
149+
Assert.That(regionalBudgetPeople.Count, Is.EqualTo(1));
150+
Assert.That(regionalBudgetPeople[0].Name, Is.EqualTo("C"));
151+
152+
Expression<Func<Person, bool>> filterNotNullableExpression = p => p.BudgetType == budgetTypeNotNullable;
153+
var stateBudgetPeople = session.Query.All<Person>().Where(filterNotNullableExpression).ToList();
154+
Assert.That(stateBudgetPeople.Count, Is.EqualTo(1));
155+
Assert.That(stateBudgetPeople[0].Name, Is.EqualTo("D"));
156+
127157
Expression<Func<Person, bool>> filterNullableExpression = p => p.BudgetType == budgetTypeNullable;
128-
Expression<Func<Person, bool>> filterNotNullableExpression = p => budgetTypeNotNullable == budgetType;
158+
var defaultBudgetPeople = session.Query.All<Person>().Where(filterNullableExpression).ToList();
159+
Assert.That(defaultBudgetPeople.Count, Is.EqualTo(2));
160+
Assert.That(defaultBudgetPeople[0].Name, Is.EqualTo("A").Or.EqualTo("B"));
161+
Assert.That(defaultBudgetPeople[1].Name, Is.EqualTo("A").Or.EqualTo("B"));
162+
163+
Expression<Func<Person, bool>> filterNullExpression = p => p.BudgetType == nullBudgetType;
164+
var undefinedBudgetPeople = session.Query.All<Person>().Where(filterNullExpression).ToList();
165+
Assert.That(undefinedBudgetPeople.Count, Is.EqualTo(4));
166+
foreach (var person in undefinedBudgetPeople) {
167+
Assert.That(undefinedBudgetPeople[0].Name, Is.EqualTo("E").Or.EqualTo("F").Or.EqualTo(null));
168+
}
169+
129170
Expression<Func<Person, BudgetType?>> propertyExpression = p => p.BudgetType;
130171
var valueExpression = Expression.Convert(Expression.Constant(budgetType), typeof(BudgetType?));
131172
var body = Expression.Convert(propertyExpression.Body, typeof(BudgetType?));
132-
Expression<Func<Person, bool>> customFilterExpression = Expression.Lambda<Func<Person, bool>>(
173+
var customFilterExpression = Expression.Lambda<Func<Person, bool>>(
133174
Expression.Equal(body, valueExpression),
134175
propertyExpression.Parameters);
135-
var persons = session.Query.All<Person>().Where(filterExpression).ToList();
136-
var customPersons = session.Query.All<Person>().Where(customFilterExpression).ToList();
176+
var customFilterExpressionResults = session.Query.All<Person>().Where(customFilterExpression).ToList();
177+
Assert.That(customFilterExpressionResults.OrderBy(p => p.Id).SequenceEqual(regionalBudgetPeople.OrderBy(p => p.Id)), Is.True);
178+
137179
var func = customFilterExpression.Compile();
138-
func(new Person() {BudgetType = BudgetType.Regional});
180+
Assert.That(func(new Person(session) {BudgetType = BudgetType.Regional}),Is.True);
139181
}
140182
}
141183

@@ -144,14 +186,14 @@ public void SelectNullableTest()
144186
{
145187
using (var session = Domain.OpenSession())
146188
using (var t = session.OpenTransaction()) {
147-
var manager1 = new Manager() {Name = "M0"};
148-
var manager2 = new Manager() {Name = "M0"};
149-
new Person() { Name = "A", Manager = manager1};
150-
new Person() { Name = "B", Manager = manager1};
151-
new Person() { Name = "C", Manager = manager2};
152-
new Person() { Name = "D", Manager = manager2};
153-
new Person() { Name = "E" };
154-
new Person() { Name = "F" };
189+
var manager1 = new Manager(session) {Name = "M0"};
190+
var manager2 = new Manager(session) {Name = "M0"};
191+
_ = new Person(session) { Name = "A", Manager = manager1};
192+
_ = new Person(session) { Name = "B", Manager = manager1};
193+
_ = new Person(session) { Name = "C", Manager = manager2};
194+
_ = new Person(session) { Name = "D", Manager = manager2};
195+
_ = new Person(session) { Name = "E" };
196+
_ = new Person(session) { Name = "F" };
155197

156198
var query = session.Query.All<Person>()
157199
.Select(p => new PersonDto {
@@ -169,12 +211,12 @@ public void GroupByTest()
169211
Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries);
170212
using (var session = Domain.OpenSession())
171213
using (var t = session.OpenTransaction()) {
172-
new Person() {Name = "A", BudgetType = BudgetType.Default};
173-
new Person() {Name = "B", BudgetType = BudgetType.Default};
174-
new Person() {Name = "C", BudgetType = BudgetType.Regional};
175-
new Person() {Name = "D", BudgetType = BudgetType.State};
176-
new Person() {Name = "E"};
177-
new Person() {Name = "F"};
214+
_ = new Person(session) {Name = "A", BudgetType = BudgetType.Default};
215+
_ = new Person(session) {Name = "B", BudgetType = BudgetType.Default};
216+
_ = new Person(session) {Name = "C", BudgetType = BudgetType.Regional};
217+
_ = new Person(session) {Name = "D", BudgetType = BudgetType.State};
218+
_ = new Person(session) {Name = "E"};
219+
_ = new Person(session) {Name = "F"};
178220

179221
var types = session.Query.All<Person>()
180222
.Select(p => p.BudgetType)
@@ -203,24 +245,33 @@ public void MethodProjectionTest()
203245
{
204246
using (var session = Domain.OpenSession())
205247
using (var t = session.OpenTransaction()) {
206-
new Person() { Name = "A", BudgetType = BudgetType.Default };
207-
new Person() { Name = "B", BudgetType = BudgetType.Default };
208-
new Person() { Name = "C", BudgetType = BudgetType.Regional };
209-
new Person() { Name = "D", BudgetType = BudgetType.State };
210-
new Person() { Name = "E" };
211-
new Person() { Name = "F" };
212-
new Person() { Name = null };
213-
new Person() { Name = null };
248+
_ = new Person(session) { Name = "A", BudgetType = BudgetType.Default };
249+
_ = new Person(session) { Name = "B", BudgetType = BudgetType.Default };
250+
_ = new Person(session) { Name = "C", BudgetType = BudgetType.Regional };
251+
_ = new Person(session) { Name = "D", BudgetType = BudgetType.State };
252+
_ = new Person(session) { Name = "E" };
253+
_ = new Person(session) { Name = "F" };
254+
_ = new Person(session) { Name = null };
255+
_ = new Person(session) { Name = null };
214256

215257
var selectedMethod = session.Query.All<Person>()
216258
.Select(p => new PersonDto() {Id = p.Id, Name = p.Name, Description = GetDescription(p)})
217259
.OrderBy(x => x.Name)
218260
.ToList();
219261

262+
Assert.That(selectedMethod.Count, Is.EqualTo(8));
263+
Assert.That(selectedMethod[0].Name, Is.Null);
264+
Assert.That(selectedMethod[1].Name, Is.Null);
265+
Assert.That(selectedMethod.Skip(2).Select(dto => dto.Name).SequenceEqual(new[] { "A", "B", "C", "D", "E", "F" }), Is.True);
266+
220267
var selectedMethod2 = session.Query.All<Person>()
221268
.Select(p => new PersonDto() { Id = p.Id, Name = p.Name, Description = p.Name ?? GetDescription(p) })
222269
.Where(x => x.Name == null)
223270
.ToList();
271+
272+
Assert.That(selectedMethod2.Count, Is.EqualTo(2));
273+
Assert.That(selectedMethod2[0].Name, Is.Null);
274+
Assert.That(selectedMethod2[1].Name, Is.Null);
224275
}
225276
}
226277

@@ -230,18 +281,18 @@ public void FirstOrDefaultTest()
230281
Require.AllFeaturesSupported(ProviderFeatures.ScalarSubqueries);
231282
using (var session = Domain.OpenSession())
232283
using (var t = session.OpenTransaction()) {
233-
var manager = new Manager() {
284+
var manager = new Manager(session) {
234285
Name = "Manager"
235286
};
236-
var looser = new Manager() {
287+
var looser = new Manager(session) {
237288
Name = "Looser"
238289
};
239-
new Person() { Name = "A", BudgetType = BudgetType.Default, Manager = manager};
240-
new Person() { Name = "B", BudgetType = BudgetType.Default, Manager = manager};
241-
new Person() { Name = "C", BudgetType = BudgetType.Regional, Manager = manager };
242-
new Person() { Name = "D", BudgetType = BudgetType.State, Manager = manager };
243-
new Person() { Name = "E" };
244-
new Person() { Name = "F" };
290+
_ = new Person(session) { Name = "A", BudgetType = BudgetType.Default, Manager = manager};
291+
_ = new Person(session) { Name = "B", BudgetType = BudgetType.Default, Manager = manager};
292+
_ = new Person(session) { Name = "C", BudgetType = BudgetType.Regional, Manager = manager };
293+
_ = new Person(session) { Name = "D", BudgetType = BudgetType.State, Manager = manager };
294+
_ = new Person(session) { Name = "E" };
295+
_ = new Person(session) { Name = "F" };
245296

246297
var list = session.Query.All<Manager>()
247298
.Select(m => new { Entity = m, FirstPerson = m.Persons.FirstOrDefault() })
@@ -250,6 +301,14 @@ public void FirstOrDefaultTest()
250301
FirstPersonId = g.FirstPerson != null ? (int?)g.FirstPerson.Id : null,
251302
})
252303
.ToList();
304+
305+
Assert.That(list.Count, Is.EqualTo(2));
306+
foreach(var dto in list) {
307+
var constraint = (dto.Id == looser.Id)
308+
? Is.Null
309+
: Is.Not.Null;
310+
Assert.That(dto.FirstPersonId, constraint);
311+
}
253312
}
254313
}
255314

0 commit comments

Comments
 (0)