Skip to content

Commit 8f777a6

Browse files
NetanelPersikNetanelPersikGoogleBlaiseD
authored
feat(primitive-collections): including literal types for non-navigation/simple members. (#52)
* feat(primitive-collections): including literal types for non-navigation/simple members. AutoMapper/AutoMapper.Extensions.OData#196 * Minor: separation of concerns. --------- Co-authored-by: netanelpersik <netanelpersik@google.com> Co-authored-by: Blaise Taylor <btaylor@bPolicySolutions.com>
1 parent c23c79c commit 8f777a6

File tree

2 files changed

+58
-9
lines changed

2 files changed

+58
-9
lines changed

LogicBuilder.Expressions.Utils.Tests/TypeExtensionsTests.cs

+54-8
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Reflection;
5-
using System.Text;
6-
using System.Threading.Tasks;
75
using Xunit;
86

97
namespace LogicBuilder.Expressions.Utils.Tests
@@ -27,29 +25,77 @@ public void MemberInfoReflectedTypeMustMatchTheDeclaringType(string propertyName
2725
[InlineData(nameof(DerivedThing.Id), typeof(DerivedThing))]
2826
[InlineData(nameof(DerivedThing.Name), typeof(BaseThing))]
2927
[InlineData(nameof(DerivedThing.Description), typeof(DerivedThing))]
30-
public void MemberInfoReflectedTypeMustMatchTheDeclaringTypeForGetSelectedMembers(string propertyName, Type reflectedType)
28+
public void MemberInfoReflectedTypeMustMatchTheDeclaringTypeForGetSelectedMembers(string propertyName,
29+
Type reflectedType)
3130
{
3231
//act
33-
MemberInfo memberInfo = typeof(DerivedThing).GetSelectedMembers(new List<string>()).FirstOrDefault(m => m.Name == propertyName);
32+
MemberInfo memberInfo = typeof(DerivedThing).GetSelectedMembers(new List<string>())
33+
.FirstOrDefault(m => m.Name == propertyName);
3434

3535
//assert
3636
Assert.Equal(reflectedType.FullName, memberInfo.ReflectedType.FullName);
3737
}
3838

39-
public abstract class BaseThing
39+
[Fact]
40+
public void GetSelectedMembers_WhenSelectIsEmpty_MustReturnAllLiteralAndLiteralListMembers()
41+
{
42+
// Act
43+
var memberInfos = typeof(Thing).GetSelectedMembers(Enumerable.Empty<string>().ToList());
44+
45+
// Assert
46+
Assert.Multiple(() =>
47+
{
48+
var names = memberInfos.Select(mi => mi.Name).ToList();
49+
50+
Assert.DoesNotContain(memberInfos, name => name.Name == nameof(Thing.Objects));
51+
52+
Assert.Contains(names, name => name == nameof(Thing.ParametersArray));
53+
Assert.Contains(names, name => name == nameof(Thing.ParametersList));
54+
Assert.Contains(names, name => name == nameof(Thing.Ints));
55+
Assert.Contains(names, name => name == nameof(Thing.Strings));
56+
Assert.Contains(names, name => name == nameof(Thing.Booleans));
57+
Assert.Contains(names, name => name == nameof(Thing.DateTimes));
58+
Assert.Contains(names, name => name == nameof(Thing.Dates));
59+
Assert.Contains(names, name => name == nameof(Thing.Guides));
60+
Assert.Contains(names, name => name == nameof(Thing.UnsignedInts));
61+
Assert.Contains(names, name => name == nameof(Thing.Name));
62+
Assert.Contains(names, name => name == nameof(Thing.Id));
63+
Assert.Contains(names, name => name == nameof(Thing.Description));
64+
});
65+
}
66+
67+
private abstract class BaseThing
4068
{
4169
public string Name { get; set; }
4270
}
4371

44-
public class DerivedThing : BaseThing, IDerivedThing
72+
private class DerivedThing : BaseThing, IDerivedThing
4573
{
4674
public Guid Id { get; set; }
4775
public string Description { get; set; }
4876
}
4977

50-
public interface IDerivedThing
78+
private interface IDerivedThing
79+
{
80+
public string Description { get; set; }
81+
}
82+
83+
private class Thing
5184
{
85+
public string Name { get; set; }
86+
public Guid Id { get; set; }
5287
public string Description { get; set; }
88+
public byte[] DataInBytes { get; set; }
89+
public string[] ParametersArray { get; set; }
90+
public ICollection<string> Strings { get; set; }
91+
public List<string> ParametersList { get; set; }
92+
public List<bool> Booleans { get; set; }
93+
public ISet<DateTime> DateTimes { get; set; }
94+
public ISet<DateOnly> Dates { get; set; }
95+
public HashSet<Guid> Guides { get; set; }
96+
public uint[] UnsignedInts { get; set; }
97+
public IEnumerable<int> Ints { get; set; }
98+
public List<object> Objects { get; set; }
5399
}
54100
}
55-
}
101+
}

LogicBuilder.Expressions.Utils/TypeExtensions.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,13 @@ private static MemberInfo[] GetValueTypeMembers(this Type parentType)
204204
return parentType.GetMemberInfos().Where
205205
(
206206
info => (info.MemberType == MemberTypes.Field || info.MemberType == MemberTypes.Property)
207-
&& (info.GetMemberType().IsLiteralType() || info.GetMemberType() == typeof(byte[]))//Need typeof(byte[]) for SQL Server timestamp column
207+
&& (info.GetMemberType().IsLiteralType() || info.GetMemberType().IsLiteralList())
208208
).ToArray();
209209
}
210210

211+
private static bool IsLiteralList(this Type type)
212+
=> type.IsList() && type.GetUnderlyingElementType().IsLiteralType();
213+
211214
private static MemberInfo[] GetMemberInfos(this Type parentType)
212215
=> parentType.GetMembers(instanceBindingFlags).Select
213216
(

0 commit comments

Comments
 (0)