Skip to content

Commit 909f589

Browse files
committed
Add test String_Join_disallow_enumerable_of_string_parameter (npgsql#3105)
Verifies bc15b0e works as expected
1 parent bc15b0e commit 909f589

7 files changed

Lines changed: 78 additions & 24 deletions

File tree

test/EFCore.PG.FunctionalTests/Query/ArrayArrayQueryTest.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ public override async Task Array_column_Contains_value_converted_param(bool asyn
500500

501501
await AssertQuery(
502502
async,
503-
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArray.Contains(item)));
503+
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArrayOfEnum.Contains(item)));
504504

505505
AssertSql(
506506
"""
@@ -516,7 +516,7 @@ public override async Task Array_column_Contains_value_converted_constant(bool a
516516
{
517517
await AssertQuery(
518518
async,
519-
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArray.Contains(SomeEnum.Eight)));
519+
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArrayOfEnum.Contains(SomeEnum.Eight)));
520520

521521
AssertSql(
522522
"""
@@ -532,7 +532,7 @@ public override async Task Array_param_Contains_value_converted_array_column(boo
532532

533533
await AssertQuery(
534534
async,
535-
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArray.All(x => p.Contains(x))));
535+
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArrayOfEnum.All(x => p.Contains(x))));
536536

537537
AssertSql(
538538
"""
@@ -773,7 +773,7 @@ public override async Task Any_Contains_between_column_and_other_type(bool async
773773

774774
await AssertQuery(
775775
async,
776-
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArray.Any(i => list.Contains(i))));
776+
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArrayOfEnum.Any(i => list.Contains(i))));
777777

778778
AssertSql(
779779
"""
@@ -883,6 +883,18 @@ WHERE array_to_string(s."StringArray", ', ', '') = '3, 4'
883883
""");
884884
}
885885

886+
[ConditionalTheory]
887+
[MemberData(nameof(IsAsyncData))]
888+
public override async Task String_Join_disallow_non_array_type_mapped_parameter(bool async)
889+
{
890+
// This is not in ArrayQueryTest because string.Join uses another overload for string[] than for List<string> and thus
891+
// ArrayToListReplacingExpressionVisitor won't work.
892+
await AssertTranslationFailed(() => AssertQuery(
893+
async,
894+
ss => ss.Set<ArrayEntity>()
895+
.Where(e => string.Join(", ", e.ArrayOfStringConvertedToDelimitedString) == "3, 4")));
896+
}
897+
886898
#endregion Other translations
887899

888900
public class ArrayArrayQueryFixture : ArrayQueryFixture

test/EFCore.PG.FunctionalTests/Query/ArrayListQueryTest.cs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ public override async Task Array_column_Contains_value_converted_param(bool asyn
508508

509509
await AssertQuery(
510510
async,
511-
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedList.Contains(item)));
511+
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedListOfEnum.Contains(item)));
512512

513513
AssertSql(
514514
"""
@@ -524,7 +524,7 @@ public override async Task Array_column_Contains_value_converted_constant(bool a
524524
{
525525
await AssertQuery(
526526
async,
527-
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedList.Contains(SomeEnum.Eight)));
527+
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedListOfEnum.Contains(SomeEnum.Eight)));
528528

529529
AssertSql(
530530
"""
@@ -540,7 +540,7 @@ public override async Task Array_param_Contains_value_converted_array_column(boo
540540

541541
await AssertQuery(
542542
async,
543-
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArray.All(x => p.Contains(x))));
543+
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedArrayOfEnum.All(x => p.Contains(x))));
544544

545545
AssertSql(
546546
"""
@@ -791,7 +791,7 @@ public override async Task Any_Contains_between_column_and_other_type(bool async
791791

792792
await AssertQuery(
793793
async,
794-
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedList.Any(i => array.Contains(i))));
794+
ss => ss.Set<ArrayEntity>().Where(e => e.ValueConvertedListOfEnum.Any(i => array.Contains(i))));
795795

796796
AssertSql(
797797
"""
@@ -905,6 +905,18 @@ WHERE array_to_string(s."StringList", ', ', '') = '3, 4'
905905
""");
906906
}
907907

908+
[ConditionalTheory]
909+
[MemberData(nameof(IsAsyncData))]
910+
public override async Task String_Join_disallow_non_array_type_mapped_parameter(bool async)
911+
{
912+
// This is not in ArrayQueryTest because string.Join uses another overload for string[] than for List<string> and thus
913+
// ArrayToListReplacingExpressionVisitor won't work.
914+
await AssertTranslationFailed(() => AssertQuery(
915+
async,
916+
ss => ss.Set<ArrayEntity>()
917+
.Where(e => string.Join(", ", e.ListOfStringConvertedToDelimitedString) == "3, 4")));
918+
}
919+
908920
#endregion Other translations
909921

910922
public class ArrayListQueryFixture : ArrayQueryFixture
@@ -942,11 +954,11 @@ private static readonly PropertyInfo StringList
942954
private static readonly PropertyInfo NullableStringList
943955
= typeof(ArrayEntity).GetProperty(nameof(ArrayEntity.NullableStringList));
944956

945-
private static readonly PropertyInfo ValueConvertedArray
946-
= typeof(ArrayEntity).GetProperty(nameof(ArrayEntity.ValueConvertedArray));
957+
private static readonly PropertyInfo ValueConvertedArrayOfEnum
958+
= typeof(ArrayEntity).GetProperty(nameof(ArrayEntity.ValueConvertedArrayOfEnum));
947959

948-
private static readonly PropertyInfo ValueConvertedList
949-
= typeof(ArrayEntity).GetProperty(nameof(ArrayEntity.ValueConvertedList));
960+
private static readonly PropertyInfo ValueConvertedListOfEnum
961+
= typeof(ArrayEntity).GetProperty(nameof(ArrayEntity.ValueConvertedListOfEnum));
950962

951963
protected override Expression VisitMember(MemberExpression node)
952964
{
@@ -970,9 +982,9 @@ protected override Expression VisitMember(MemberExpression node)
970982
return Expression.MakeMemberAccess(node.Expression, NullableStringList);
971983
}
972984

973-
if (node.Member == ValueConvertedArray)
985+
if (node.Member == ValueConvertedArrayOfEnum)
974986
{
975-
return Expression.MakeMemberAccess(node.Expression, ValueConvertedList);
987+
return Expression.MakeMemberAccess(node.Expression, ValueConvertedListOfEnum);
976988
}
977989

978990
return node;

test/EFCore.PG.FunctionalTests/Query/ArrayQueryFixture.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@ public IReadOnlyDictionary<Type, object> EntityAsserters
5656
Assert.Equal(ee.NullableText, ee.NullableText);
5757
Assert.Equal(ee.NonNullableText, ee.NonNullableText);
5858
Assert.Equal(ee.EnumConvertedToInt, ee.EnumConvertedToInt);
59-
Assert.Equal(ee.ValueConvertedArray, ee.ValueConvertedArray);
60-
Assert.Equal(ee.ValueConvertedList, ee.ValueConvertedList);
59+
Assert.Equal(ee.ArrayOfStringConvertedToDelimitedString, ee.ArrayOfStringConvertedToDelimitedString);
60+
Assert.Equal(ee.ListOfStringConvertedToDelimitedString, ee.ListOfStringConvertedToDelimitedString);
61+
Assert.Equal(ee.ValueConvertedArrayOfEnum, ee.ValueConvertedArrayOfEnum);
62+
Assert.Equal(ee.ValueConvertedListOfEnum, ee.ValueConvertedListOfEnum);
6163
Assert.Equal(ee.IList, ee.IList);
6264
Assert.Equal(ee.Byte, ee.Byte);
6365
}

test/EFCore.PG.FunctionalTests/Query/ArrayQueryTest.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,10 @@ public virtual Task String_Join_with_array_of_int_column(bool async)
513513
[MemberData(nameof(IsAsyncData))]
514514
public abstract Task String_Join_with_array_of_string_column(bool async);
515515

516+
[ConditionalTheory]
517+
[MemberData(nameof(IsAsyncData))]
518+
public abstract Task String_Join_disallow_non_array_type_mapped_parameter(bool async);
519+
516520
#endregion Other translations
517521

518522
#region Support

test/EFCore.PG.FunctionalTests/TestModels/Array/ArrayEntity.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ public class ArrayEntity
2323
public SomeEnum EnumConvertedToString { get; set; }
2424
public SomeEnum? NullableEnumConvertedToString { get; set; }
2525
public SomeEnum? NullableEnumConvertedToStringWithNonNullableLambda { get; set; }
26-
public SomeEnum[] ValueConvertedArray { get; set; } = null!;
27-
public List<SomeEnum> ValueConvertedList { get; set; } = null!;
26+
public SomeEnum[] ValueConvertedArrayOfEnum { get; set; } = null!;
27+
public List<SomeEnum> ValueConvertedListOfEnum { get; set; } = null!;
28+
public string[] ArrayOfStringConvertedToDelimitedString { get; set; } = null!;
29+
public List<string> ListOfStringConvertedToDelimitedString { get; set; } = null!;
2830
public IList<int> IList { get; set; } = null!;
2931
public byte Byte { get; set; }
3032
}

test/EFCore.PG.FunctionalTests/TestModels/Array/ArrayQueryContext.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,28 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
2727
e.Property(ae => ae.NullableEnumConvertedToStringWithNonNullableLambda)
2828
.HasConversion(new ValueConverter<SomeEnum, string>(w => w.ToString(), v => Enum.Parse<SomeEnum>(v)));
2929

30-
e.PrimitiveCollection(ae => ae.ValueConvertedArray)
30+
e.Property(ae => ae.ListOfStringConvertedToDelimitedString)
31+
.HasConversion(
32+
v => string.Join(",", v),
33+
v => v.Split(',', StringSplitOptions.None).ToList(),
34+
new ValueComparer<List<string>>(
35+
(c1, c2) => c1.SequenceEqual(c2),
36+
c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
37+
c => c.ToList()));
38+
39+
e.Property(ae => ae.ArrayOfStringConvertedToDelimitedString)
40+
.HasConversion(
41+
v => string.Join(",", v),
42+
v => v.Split(',', StringSplitOptions.None).ToArray(),
43+
new ValueComparer<string[]>(
44+
(c1, c2) => c1.SequenceEqual(c2),
45+
c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
46+
c => c.ToArray()));
47+
48+
e.PrimitiveCollection(ae => ae.ValueConvertedArrayOfEnum)
3149
.ElementType(eb => eb.HasConversion(typeof(EnumToStringConverter<SomeEnum>)));
3250

33-
e.PrimitiveCollection(ae => ae.ValueConvertedList)
51+
e.PrimitiveCollection(ae => ae.ValueConvertedListOfEnum)
3452
.ElementType(eb => eb.HasConversion(typeof(EnumToStringConverter<SomeEnum>)));
3553

3654
e.HasIndex(ae => ae.NonNullableText);

test/EFCore.PG.FunctionalTests/TestModels/Array/ArrayQueryData.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ public static IReadOnlyList<ArrayEntity> CreateArrayEntities()
4545
EnumConvertedToString = SomeEnum.One,
4646
NullableEnumConvertedToString = SomeEnum.One,
4747
NullableEnumConvertedToStringWithNonNullableLambda = SomeEnum.One,
48-
ValueConvertedArray = [SomeEnum.Eight, SomeEnum.Nine],
49-
ValueConvertedList = [SomeEnum.Eight, SomeEnum.Nine],
48+
ValueConvertedArrayOfEnum = [SomeEnum.Eight, SomeEnum.Nine],
49+
ValueConvertedListOfEnum = [SomeEnum.Eight, SomeEnum.Nine],
50+
ArrayOfStringConvertedToDelimitedString = ["3", "4"],
51+
ListOfStringConvertedToDelimitedString = ["3", "4"],
5052
IList = new[] { 8, 9 },
5153
Byte = 10
5254
},
@@ -71,8 +73,10 @@ public static IReadOnlyList<ArrayEntity> CreateArrayEntities()
7173
EnumConvertedToString = SomeEnum.Two,
7274
NullableEnumConvertedToString = SomeEnum.Two,
7375
NullableEnumConvertedToStringWithNonNullableLambda = SomeEnum.Two,
74-
ValueConvertedArray = [SomeEnum.Nine, SomeEnum.Ten],
75-
ValueConvertedList = [SomeEnum.Nine, SomeEnum.Ten],
76+
ValueConvertedArrayOfEnum = [SomeEnum.Nine, SomeEnum.Ten],
77+
ValueConvertedListOfEnum = [SomeEnum.Nine, SomeEnum.Ten],
78+
ArrayOfStringConvertedToDelimitedString = ["5", "6", "7", "8"],
79+
ListOfStringConvertedToDelimitedString = ["5", "6", "7", "8"],
7680
IList = new[] { 9, 10 },
7781
Byte = 20
7882
}

0 commit comments

Comments
 (0)