Skip to content

Commit 0958792

Browse files
authored
Merge pull request #152 from neomasterhub/151-as-lower-in-as-upper-in-operator-tests
151 as lower in as upper in operator tests
2 parents 3c0fa47 + 1a5c95f commit 0958792

2 files changed

Lines changed: 143 additions & 1 deletion

File tree

Neomaster.JsonToLinq.UnitTests/ExpressionTools/ExpressionOperatorsUnitTests.cs

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Globalization;
12
using System.Linq.Expressions;
23
using Xunit.Abstractions;
34

@@ -52,6 +53,131 @@ public void Contains_DateTime()
5253
actual.ForEach(u => output.WriteLine(u.LastVisitAt?.Year.ToString() ?? "null"));
5354
}
5455

56+
[Fact]
57+
public void ContainsString_AsIs()
58+
{
59+
var collection = new string[] { "x", "Aa" };
60+
var users = new User[]
61+
{
62+
new() { FirstName = "aa" },
63+
new() { FirstName = "AA" },
64+
new() { FirstName = "Aa" },
65+
};
66+
var expected = users.Where(u => collection.Contains(u.FirstName));
67+
var func = CreateContainsStringFunc<User, string>(
68+
nameof(User.FirstName),
69+
collection,
70+
StringTransform.None);
71+
72+
var actual = users.Where(func).ToList();
73+
74+
Assert.Equal(expected, actual);
75+
76+
actual.ForEach(u => output.WriteLine(u.FirstName));
77+
}
78+
79+
[Fact]
80+
public void ContainsString_AsLower()
81+
{
82+
var collection = new string[] { "x", "aa" };
83+
var users = new User[]
84+
{
85+
new() { FirstName = "aa" },
86+
new() { FirstName = "AA" },
87+
new() { FirstName = "Aa" },
88+
new() { FirstName = "aA" },
89+
new() { FirstName = "xx" },
90+
new() { FirstName = "XX" },
91+
new() { FirstName = "Xx" },
92+
new() { FirstName = "xX" },
93+
};
94+
var expected = users.Where(u => collection.Contains(u.FirstName.ToLower()));
95+
var func = CreateContainsStringFunc<User, string>(
96+
nameof(User.FirstName),
97+
collection,
98+
StringTransform.Lower);
99+
100+
var actual = users.Where(func).ToList();
101+
102+
Assert.Equal(expected, actual);
103+
104+
actual.ForEach(u => output.WriteLine(u.FirstName));
105+
}
106+
107+
[Fact]
108+
public void ContainsString_AsUpper()
109+
{
110+
var collection = new string[] { "x", "AA" };
111+
var users = new User[]
112+
{
113+
new() { FirstName = "aa" },
114+
new() { FirstName = "AA" },
115+
new() { FirstName = "Aa" },
116+
new() { FirstName = "aA" },
117+
new() { FirstName = "xx" },
118+
new() { FirstName = "XX" },
119+
new() { FirstName = "Xx" },
120+
new() { FirstName = "xX" },
121+
};
122+
var expected = users.Where(u => collection.Contains(u.FirstName.ToUpper()));
123+
var func = CreateContainsStringFunc<User, string>(
124+
nameof(User.FirstName),
125+
collection,
126+
StringTransform.Upper);
127+
128+
var actual = users.Where(func).ToList();
129+
130+
Assert.Equal(expected, actual);
131+
132+
actual.ForEach(u => output.WriteLine(u.FirstName));
133+
}
134+
135+
[Theory]
136+
[InlineData("i", false, 1)]
137+
[InlineData("i", true, 0)]
138+
[InlineData("ı", false, 0)]
139+
[InlineData("ı", true, 1)]
140+
public void ContainsString_AsLower_Culture(
141+
string collectionItem,
142+
bool withCi,
143+
int found)
144+
{
145+
var collection = new string[] { collectionItem };
146+
var users = new User[] { new() { FirstName = "I" } };
147+
var func = CreateContainsStringFunc<User, string>(
148+
nameof(User.FirstName),
149+
collection,
150+
StringTransform.Lower,
151+
withCi ? new CultureInfo("tr-TR") : null);
152+
153+
var actual = users.Count(func);
154+
155+
Assert.Equal(found, actual);
156+
}
157+
158+
[Theory]
159+
[InlineData("I", false, 1)]
160+
[InlineData("I", true, 0)]
161+
[InlineData("İ", false, 0)]
162+
[InlineData("İ", true, 1)]
163+
public void ContainsString_AsUpper_Culture(
164+
string collectionItem,
165+
bool withCi,
166+
int found)
167+
{
168+
var collection = new string[] { collectionItem };
169+
var users = new User[] { new() { FirstName = "i" } };
170+
var func = CreateContainsStringFunc<User, string>(
171+
nameof(User.FirstName),
172+
collection,
173+
StringTransform.Upper,
174+
withCi ? new CultureInfo("tr-TR") : null);
175+
176+
var actual = users.Count(func);
177+
178+
Assert.Equal(found, actual);
179+
}
180+
55181
private static Func<TEntity, bool> CreateContainsFunc<TEntity, TProp>(
56182
string propName,
57183
IEnumerable<TProp> collection)
@@ -65,4 +191,20 @@ private static Func<TEntity, bool> CreateContainsFunc<TEntity, TProp>(
65191

66192
return func;
67193
}
194+
195+
private static Func<TEntity, bool> CreateContainsStringFunc<TEntity, TProp>(
196+
string propName,
197+
IEnumerable<TProp> collection,
198+
StringTransform stringTransform,
199+
CultureInfo cultureInfo = null)
200+
{
201+
var par = Expression.Parameter(typeof(TEntity));
202+
var col = Expression.Constant(collection);
203+
var element = Expression.Property(par, propName);
204+
var body = ExpressionOperators.ContainsString(col, element, stringTransform, cultureInfo);
205+
var lambda = Expression.Lambda<Func<TEntity, bool>>(body, par);
206+
var func = lambda.Compile();
207+
208+
return func;
209+
}
68210
}

Neomaster.JsonToLinq/Neomaster.JsonToLinq.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<NoWarn>$(NoWarn);IDE0079</NoWarn>
1010
<PackageId>JsonToLinq</PackageId>
1111
<PackageIcon>logo.png</PackageIcon>
12-
<Version>1.0.0-rc912</Version>
12+
<Version>1.0.0-rc913</Version>
1313
<Authors>Neomaster</Authors>
1414
<Company>Neomaster</Company>
1515
<Copyright>Copyright © 2025 Neomaster</Copyright>

0 commit comments

Comments
 (0)