diff --git a/src/libraries/Microsoft.PowerFx.Core/Texl/Remove.cs b/src/libraries/Microsoft.PowerFx.Core/Texl/Remove.cs index 99164a6d2f..13fec1473f 100644 --- a/src/libraries/Microsoft.PowerFx.Core/Texl/Remove.cs +++ b/src/libraries/Microsoft.PowerFx.Core/Texl/Remove.cs @@ -43,6 +43,7 @@ internal class RemoveFunction : BuiltinFunction, ISuggestionAwareFunction public override bool MutatesArg(int argIndex, TexlNode arg) => argIndex == 0; + // !!!TODO this might be a problem. public override bool RequireAllParamColumns => true; public override bool ArgMatchesDatasourceType(int argNum) diff --git a/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove.txt index d2adc38985..ecb4352eb1 100644 --- a/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove.txt +++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove.txt @@ -2,5 +2,43 @@ // Check MutationFunctionsTestSetup handler (PowerFxEvaluationTests.cs) for documentation. ->> Collect(t1, r2);Remove(t1, r1);t1 -Table({Field1:2,Field2:"moon",Field3:DateTime(2022,2,1,0,0,0,0),Field4:false}) \ No newline at end of file +// Wrong arguments +>> Remove(t1, r1,"Al"); +Errors: Error 14-18: If provided, last argument must be 'RemoveFlags.All'. Is there a typo?|Error 0-6: The function 'Remove' has some invalid arguments. + +>> Remove(t1, r1,""); +Errors: Error 14-16: If provided, last argument must be 'RemoveFlags.All'. Is there a typo?|Error 0-6: The function 'Remove' has some invalid arguments. + +>> Remove(t1, r1, r1, r1, r1, r1, r1, "Al"); +Errors: Error 0-6: The function 'Remove' has some invalid arguments.|Error 35-39: If provided, last argument must be 'RemoveFlags.All'. Is there a typo? + +>> Remove(t1, "All"); +Errors: Error 0-6: The function 'Remove' has some invalid arguments.|Error 11-16: Cannot use a non-record value in this context: '"All"'. + +>> Collect(t1, r2); + Collect(t1, {Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true}); + Collect(t1, {Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false}); + Remove(t1,LookUp(t1,DisplayNameField2="earth")); + t1 +Table({Field1:2,Field2:"moon",Field3:DateTime(2022,2,1,0,0,0,0),Field4:false},{Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true},{Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false}) + +>> Collect(t1, r2); + Collect(t1, {Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true}); + Collect(t1, {Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false}); + Remove(t1,Last(Filter(t1, DisplayNameField2 = "earth"))); + t1 +Table({Field1:1,Field2:"earth",Field3:DateTime(2022,1,1,0,0,0,0),Field4:true},{Field1:2,Field2:"moon",Field3:DateTime(2022,2,1,0,0,0,0),Field4:false},{Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true}) + +>> Collect(t1, r2); + Collect(t1, {Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true}); + Collect(t1, {Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false}); + Remove(t1,First(Filter(t1, DisplayNameField2 = "earth"))); + t1 +Table({Field1:2,Field2:"moon",Field3:DateTime(2022,2,1,0,0,0,0),Field4:false},{Field1:3,Field2:"earth",Field3:DateTime(2030,2,1,0,0,0,0),Field4:true},{Field1:4,Field2:"earth",Field3:DateTime(2040,2,1,0,0,0,0),Field4:false}) + +>> Remove(Foo, {Field1:5}, RemoveFlags.All) +Errors: Error 7-10: Name isn't valid. 'Foo' isn't recognized. + +>> Remove(Foo, Bar) +Errors: Error 7-10: Name isn't valid. 'Foo' isn't recognized.|Error 12-15: Name isn't valid. 'Bar' isn't recognized.|Error 0-6: The function 'Remove' has some invalid arguments. + diff --git a/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationScripts/Remove.txt b/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationScripts/Remove.txt index a81bcfeed9..ead47ca656 100644 --- a/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationScripts/Remove.txt +++ b/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/MutationScripts/Remove.txt @@ -42,6 +42,16 @@ Error(Table({Kind:ErrorKind.NotFound},{Kind:ErrorKind.NotFound})) >> 3;t1 Table({a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hi",c:DateTime(2024,1,1,0,0,0,0)},{a:false,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:false,b:"hi",c:DateTime(2024,1,1,0,0,0,0)}) +>> Remove(t1, If(1/0<2, {a:true,b:"hello"})) +Errors: Errors: Error 0-6: The function 'Remove' has some invalid arguments.|Error 11-40: Missing column. Your formula is missing a column 'c' with a type of 'DateTime'. + +>> 4;t1 +Table({a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:true,b:"hi",c:DateTime(2024,1,1,0,0,0,0)},{a:false,b:"hello",c:DateTime(2024,1,1,0,0,0,0)},{a:false,b:"hi",c:DateTime(2024,1,1,0,0,0,0)}) + +// Remove propagates error. +>> Remove(t1, If(1/0<2, {a:true,b:"hello",c:DateTime(2024,1,1,0,0,0,0)})) +Error({Kind:ErrorKind.Div0}) + >> Set(t3, Table({a:{aa:{aaa:true,bbb:true}}})) Table({a:{aa:{aaa:true,bbb:true}}}) @@ -51,9 +61,11 @@ Errors: Error 0-6: The function 'Remove' has some invalid arguments.|Error 11-30 >> Remove(t3, {a:{aa:{aaa:true,bbb:false}}}) Error({Kind:ErrorKind.NotFound}) +>> Remove(t3, {a:{aa:{aaa:true,bbb:false}}}, RemoveFlags.All) +Error({Kind:ErrorKind.NotFound}) + >> Remove(t3, {a:{aa:{aaa:true,bbb:true}}}) If(true, {test:1}, "Void value (result of the expression can't be used).") >> t3 -Table() - +Table() \ No newline at end of file diff --git a/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/PADIntegrationTests.cs b/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/PADIntegrationTests.cs index fd37de852e..af0f8cef78 100644 --- a/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/PADIntegrationTests.cs +++ b/src/tests/Microsoft.PowerFx.Interpreter.Tests.Shared/PADIntegrationTests.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Data; +using System.Linq; using Microsoft.PowerFx.Interpreter.Tests; using Microsoft.PowerFx.Types; using Xunit; @@ -164,8 +165,9 @@ public void DataTableEvalTest2() var result7 = engine.Eval("Patch(robintable, First(robintable),{Names:\"new-name\"});robintable", options: opt); Assert.Equal("Table({Names:\"new-name\",Scores:10},{Names:\"name3\",Scores:30},{Names:\"name100\",Scores:10})", ((DataTableValue)result7).Dump()); - var result8 = engine.Eval("Remove(robintable, {Scores:10}, RemoveFlags.All);robintable", options: opt); - Assert.IsType(result8); + var check = engine.Check("Remove(robintable, {Scores:10}, RemoveFlags.All)", options: opt); + Assert.False(check.IsSuccess); + Assert.Contains("ErrColumnMissing_ColName_ExpectedType", check.Errors.Select(err => err.MessageKey)); Assert.Equal(3, table.Rows.Count); }