diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index b82b02162..37ff7c4a1 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -75,6 +75,7 @@
..\..\..\src\build\35MSSharedLib1024.snk
+ ..\..\..\..\src\build\35MSSharedLib1024.snk
true
true
diff --git a/src/Microsoft.PowerFx.sln b/src/Microsoft.PowerFx.sln
index 1a5641d3f..6f400eeb7 100644
--- a/src/Microsoft.PowerFx.sln
+++ b/src/Microsoft.PowerFx.sln
@@ -19,10 +19,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Interpret
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.LanguageServerProtocol", "libraries\Microsoft.PowerFx.LanguageServerProtocol\Microsoft.PowerFx.LanguageServerProtocol.csproj", "{AC286BA6-D439-4EDA-A468-2B18DB53E163}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Core.Tests", "tests\Microsoft.PowerFx.Core.Tests\Microsoft.PowerFx.Core.Tests.csproj", "{085B4B1A-1F94-4A9C-AEBF-47E0E0B0A983}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Interpreter.Tests", "tests\Microsoft.PowerFx.Interpreter.Tests\Microsoft.PowerFx.Interpreter.Tests.csproj", "{70C7007C-3288-48F1-A1F0-02F5CC837D4E}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{1BF2F760-4DBD-450B-ADED-81548000432D}"
ProjectSection(SolutionItems) = preProject
..\.editorconfig = ..\.editorconfig
@@ -38,10 +34,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Transport
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Connectors", "libraries\Microsoft.PowerFx.Connectors\Microsoft.PowerFx.Connectors.csproj", "{CEE27893-EE7D-4832-858F-70AF6BA325E3}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Connectors.Tests", "tests\Microsoft.PowerFx.Connectors.Tests\Microsoft.PowerFx.Connectors.Tests.csproj", "{81586372-FE63-4F6D-923D-B47E94487676}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Performance.Tests", "tests\Microsoft.PowerFx.Performance.Tests\Microsoft.PowerFx.Performance.Tests.csproj", "{5A2EEF08-7A8A-43E6-B498-EFB32B98CC5A}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{5EEC2873-35B5-4364-A2A0-97AAD7BF960D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Repl", "tools\Repl\Repl.csproj", "{142854D7-409C-4C87-A5B8-39B51477F5B2}"
@@ -55,8 +47,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmark", "Benchmark", "{
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Json", "libraries\Microsoft.PowerFx.Json\Microsoft.PowerFx.Json.csproj", "{D4CC6660-8C30-41E5-A28A-C018DDDF8D96}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Json.Tests", "tests\Microsoft.PowerFx.Json.Tests\Microsoft.PowerFx.Json.Tests.csproj", "{8986E836-2F55-4D71-B23E-50F4A8427A5B}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmark", "Benchmark", "{89514D49-4D5D-4423-A6EC-F0FF1D23EF43}"
ProjectSection(SolutionItems) = preProject
ReadBenchmarkData.ps1 = ReadBenchmarkData.ps1
@@ -65,9 +55,35 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmark", "Benchmark", "{
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Repl", "libraries\Microsoft.PowerFx.Repl\Microsoft.PowerFx.Repl.csproj", "{889A85AD-6450-4F5E-A404-01CC296C90D9}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Repl.Tests", "tests\Microsoft.PowerFx.Repl.Tests\Microsoft.PowerFx.Repl.Tests.csproj", "{8A54017E-52C3-45BB-9E87-3F0876688D53}"
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.PowerFx.Connectors.Tests.Shared", "tests\Microsoft.PowerFx.Connectors.Tests.Shared\Microsoft.PowerFx.Connectors.Tests.Shared.shproj", "{B91CCC91-2A8D-4411-9A50-709A11B61ADC}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.PowerFx.TexlFunctionExporter", "tests\Microsoft.PowerFx.TexlFunctionExporter\Microsoft.PowerFx.TexlFunctionExporter.csproj", "{06373068-0BDC-4BF8-9DAA-7B248C2B577E}"
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.PowerFx.Core.Tests.Shared", "tests\Microsoft.PowerFx.Core.Tests.Shared\Microsoft.PowerFx.Core.Tests.Shared.shproj", "{D274E7B2-0FED-4F9E-B39A-9FA4A8ACCF39}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.PowerFx.Interpreter.Tests.Shared", "tests\Microsoft.PowerFx.Interpreter.Tests.Shared\Microsoft.PowerFx.Interpreter.Tests.Shared.shproj", "{0DAA552E-5906-42C3-846F-2646EE2C33D3}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.PowerFx.Json.Tests.Shared", "tests\Microsoft.PowerFx.Json.Tests.Shared\Microsoft.PowerFx.Json.Tests.Shared.shproj", "{B23198D8-6652-4CE5-AEE3-8646202E6BBD}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.PowerFx.Performance.Tests.Shared", "tests\Microsoft.PowerFx.Performance.Tests.Shared\Microsoft.PowerFx.Performance.Tests.Shared.shproj", "{21E2744A-4C69-4862-894A-6922C2B8E2F8}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.PowerFx.Repl.Tests.Shared", "tests\Microsoft.PowerFx.Repl.Tests.Shared\Microsoft.PowerFx.Repl.Tests.Shared.shproj", "{F065BA6A-DB76-409B-9516-1F027753C2F4}"
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "Microsoft.PowerFx.TexlFunctionExporter.Shared", "tests\Microsoft.PowerFx.TexlFunctionExporter.Shared\Microsoft.PowerFx.TexlFunctionExporter.Shared.shproj", "{6BB3FA08-791F-4418-AD1C-FAB5EE67D88C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".Net 3.1", ".Net 3.1", "{6DEBA875-6D2F-4F19-8B7B-A2E385CB2182}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Connectors.Tests", "tests\.Net 3.1\Microsoft.PowerFx.Connectors.Tests\Microsoft.PowerFx.Connectors.Tests.csproj", "{0C397C3A-2331-4DCA-A5AF-8838308466E1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Core.Tests", "tests\.Net 3.1\Microsoft.PowerFx.Core.Tests\Microsoft.PowerFx.Core.Tests.csproj", "{99BF2BF9-3A27-412A-A489-C31C7C9E236B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Interpreter.Tests", "tests\.Net 3.1\Microsoft.PowerFx.Interpreter.Tests\Microsoft.PowerFx.Interpreter.Tests.csproj", "{7CE0C1C3-E6B7-4AF0-B6A3-FF4D0002829F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Json.Tests", "tests\.Net 3.1\Microsoft.PowerFx.Json.Tests\Microsoft.PowerFx.Json.Tests.csproj", "{68392322-F03E-4A71-8AA2-E4462031A491}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Performance.Tests", "tests\.Net 3.1\Microsoft.PowerFx.Performance.Tests\Microsoft.PowerFx.Performance.Tests.csproj", "{0D2926E8-1577-4FDC-8591-5EB9B8420480}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.Repl.Tests", "tests\.Net 3.1\Microsoft.PowerFx.Repl.Tests\Microsoft.PowerFx.Repl.Tests.csproj", "{33F53D1E-90E7-45E7-9A54-A140E4AF26AE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerFx.TexlFunctionExporter", "tests\.Net 3.1\Microsoft.PowerFx.TexlFunctionExporter\Microsoft.PowerFx.TexlFunctionExporter.csproj", "{ACE89DC7-06E7-4919-B1DB-53E9B39E94F7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -87,14 +103,6 @@ Global
{AC286BA6-D439-4EDA-A468-2B18DB53E163}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AC286BA6-D439-4EDA-A468-2B18DB53E163}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC286BA6-D439-4EDA-A468-2B18DB53E163}.Release|Any CPU.Build.0 = Release|Any CPU
- {085B4B1A-1F94-4A9C-AEBF-47E0E0B0A983}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {085B4B1A-1F94-4A9C-AEBF-47E0E0B0A983}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {085B4B1A-1F94-4A9C-AEBF-47E0E0B0A983}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {085B4B1A-1F94-4A9C-AEBF-47E0E0B0A983}.Release|Any CPU.Build.0 = Release|Any CPU
- {70C7007C-3288-48F1-A1F0-02F5CC837D4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {70C7007C-3288-48F1-A1F0-02F5CC837D4E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {70C7007C-3288-48F1-A1F0-02F5CC837D4E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {70C7007C-3288-48F1-A1F0-02F5CC837D4E}.Release|Any CPU.Build.0 = Release|Any CPU
{ED98A690-863A-443C-9DBB-8F0F5BCACE2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ED98A690-863A-443C-9DBB-8F0F5BCACE2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ED98A690-863A-443C-9DBB-8F0F5BCACE2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -103,14 +111,6 @@ Global
{CEE27893-EE7D-4832-858F-70AF6BA325E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CEE27893-EE7D-4832-858F-70AF6BA325E3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CEE27893-EE7D-4832-858F-70AF6BA325E3}.Release|Any CPU.Build.0 = Release|Any CPU
- {81586372-FE63-4F6D-923D-B47E94487676}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {81586372-FE63-4F6D-923D-B47E94487676}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {81586372-FE63-4F6D-923D-B47E94487676}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {81586372-FE63-4F6D-923D-B47E94487676}.Release|Any CPU.Build.0 = Release|Any CPU
- {5A2EEF08-7A8A-43E6-B498-EFB32B98CC5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5A2EEF08-7A8A-43E6-B498-EFB32B98CC5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5A2EEF08-7A8A-43E6-B498-EFB32B98CC5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5A2EEF08-7A8A-43E6-B498-EFB32B98CC5A}.Release|Any CPU.Build.0 = Release|Any CPU
{142854D7-409C-4C87-A5B8-39B51477F5B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{142854D7-409C-4C87-A5B8-39B51477F5B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{142854D7-409C-4C87-A5B8-39B51477F5B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -119,22 +119,38 @@ Global
{D4CC6660-8C30-41E5-A28A-C018DDDF8D96}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D4CC6660-8C30-41E5-A28A-C018DDDF8D96}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D4CC6660-8C30-41E5-A28A-C018DDDF8D96}.Release|Any CPU.Build.0 = Release|Any CPU
- {8986E836-2F55-4D71-B23E-50F4A8427A5B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8986E836-2F55-4D71-B23E-50F4A8427A5B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8986E836-2F55-4D71-B23E-50F4A8427A5B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8986E836-2F55-4D71-B23E-50F4A8427A5B}.Release|Any CPU.Build.0 = Release|Any CPU
{889A85AD-6450-4F5E-A404-01CC296C90D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{889A85AD-6450-4F5E-A404-01CC296C90D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{889A85AD-6450-4F5E-A404-01CC296C90D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{889A85AD-6450-4F5E-A404-01CC296C90D9}.Release|Any CPU.Build.0 = Release|Any CPU
- {8A54017E-52C3-45BB-9E87-3F0876688D53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8A54017E-52C3-45BB-9E87-3F0876688D53}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8A54017E-52C3-45BB-9E87-3F0876688D53}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8A54017E-52C3-45BB-9E87-3F0876688D53}.Release|Any CPU.Build.0 = Release|Any CPU
- {06373068-0BDC-4BF8-9DAA-7B248C2B577E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {06373068-0BDC-4BF8-9DAA-7B248C2B577E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {06373068-0BDC-4BF8-9DAA-7B248C2B577E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {06373068-0BDC-4BF8-9DAA-7B248C2B577E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0C397C3A-2331-4DCA-A5AF-8838308466E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0C397C3A-2331-4DCA-A5AF-8838308466E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0C397C3A-2331-4DCA-A5AF-8838308466E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0C397C3A-2331-4DCA-A5AF-8838308466E1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {99BF2BF9-3A27-412A-A489-C31C7C9E236B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {99BF2BF9-3A27-412A-A489-C31C7C9E236B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {99BF2BF9-3A27-412A-A489-C31C7C9E236B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {99BF2BF9-3A27-412A-A489-C31C7C9E236B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7CE0C1C3-E6B7-4AF0-B6A3-FF4D0002829F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7CE0C1C3-E6B7-4AF0-B6A3-FF4D0002829F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7CE0C1C3-E6B7-4AF0-B6A3-FF4D0002829F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7CE0C1C3-E6B7-4AF0-B6A3-FF4D0002829F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {68392322-F03E-4A71-8AA2-E4462031A491}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {68392322-F03E-4A71-8AA2-E4462031A491}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {68392322-F03E-4A71-8AA2-E4462031A491}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {68392322-F03E-4A71-8AA2-E4462031A491}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0D2926E8-1577-4FDC-8591-5EB9B8420480}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0D2926E8-1577-4FDC-8591-5EB9B8420480}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0D2926E8-1577-4FDC-8591-5EB9B8420480}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0D2926E8-1577-4FDC-8591-5EB9B8420480}.Release|Any CPU.Build.0 = Release|Any CPU
+ {33F53D1E-90E7-45E7-9A54-A140E4AF26AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {33F53D1E-90E7-45E7-9A54-A140E4AF26AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {33F53D1E-90E7-45E7-9A54-A140E4AF26AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {33F53D1E-90E7-45E7-9A54-A140E4AF26AE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {ACE89DC7-06E7-4919-B1DB-53E9B39E94F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {ACE89DC7-06E7-4919-B1DB-53E9B39E94F7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {ACE89DC7-06E7-4919-B1DB-53E9B39E94F7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {ACE89DC7-06E7-4919-B1DB-53E9B39E94F7}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -143,21 +159,45 @@ Global
{C4AE1B00-36BB-4D5F-8CC9-E51979BE2830} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
{E59979B0-F267-46DC-B628-941D31C3CB7C} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
{AC286BA6-D439-4EDA-A468-2B18DB53E163} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
- {085B4B1A-1F94-4A9C-AEBF-47E0E0B0A983} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
- {70C7007C-3288-48F1-A1F0-02F5CC837D4E} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
{ED98A690-863A-443C-9DBB-8F0F5BCACE2B} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
{CEE27893-EE7D-4832-858F-70AF6BA325E3} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
- {81586372-FE63-4F6D-923D-B47E94487676} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
- {5A2EEF08-7A8A-43E6-B498-EFB32B98CC5A} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
{142854D7-409C-4C87-A5B8-39B51477F5B2} = {5EEC2873-35B5-4364-A2A0-97AAD7BF960D}
{D4CC6660-8C30-41E5-A28A-C018DDDF8D96} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
- {8986E836-2F55-4D71-B23E-50F4A8427A5B} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
{89514D49-4D5D-4423-A6EC-F0FF1D23EF43} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
{889A85AD-6450-4F5E-A404-01CC296C90D9} = {4269F3C3-6B42-419B-B64A-3E6DC0F1574A}
- {8A54017E-52C3-45BB-9E87-3F0876688D53} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
- {06373068-0BDC-4BF8-9DAA-7B248C2B577E} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {B91CCC91-2A8D-4411-9A50-709A11B61ADC} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {D274E7B2-0FED-4F9E-B39A-9FA4A8ACCF39} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {0DAA552E-5906-42C3-846F-2646EE2C33D3} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {B23198D8-6652-4CE5-AEE3-8646202E6BBD} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {21E2744A-4C69-4862-894A-6922C2B8E2F8} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {F065BA6A-DB76-409B-9516-1F027753C2F4} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {6BB3FA08-791F-4418-AD1C-FAB5EE67D88C} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {6DEBA875-6D2F-4F19-8B7B-A2E385CB2182} = {AD743B78-D61F-4FBF-B620-FA83CE599A50}
+ {0C397C3A-2331-4DCA-A5AF-8838308466E1} = {6DEBA875-6D2F-4F19-8B7B-A2E385CB2182}
+ {99BF2BF9-3A27-412A-A489-C31C7C9E236B} = {6DEBA875-6D2F-4F19-8B7B-A2E385CB2182}
+ {7CE0C1C3-E6B7-4AF0-B6A3-FF4D0002829F} = {6DEBA875-6D2F-4F19-8B7B-A2E385CB2182}
+ {68392322-F03E-4A71-8AA2-E4462031A491} = {6DEBA875-6D2F-4F19-8B7B-A2E385CB2182}
+ {0D2926E8-1577-4FDC-8591-5EB9B8420480} = {6DEBA875-6D2F-4F19-8B7B-A2E385CB2182}
+ {33F53D1E-90E7-45E7-9A54-A140E4AF26AE} = {6DEBA875-6D2F-4F19-8B7B-A2E385CB2182}
+ {ACE89DC7-06E7-4919-B1DB-53E9B39E94F7} = {6DEBA875-6D2F-4F19-8B7B-A2E385CB2182}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {30372F91-B206-4351-A621-F0E2773C337B}
EndGlobalSection
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ tests\Microsoft.PowerFx.Connectors.Tests.Shared\Microsoft.PowerFx.Connectors.Tests.Shared.projitems*{0c397c3a-2331-4dca-a5af-8838308466e1}*SharedItemsImports = 5
+ tests\Microsoft.PowerFx.Performance.Tests.Shared\Microsoft.PowerFx.Performance.Tests.Shared.projitems*{0d2926e8-1577-4fdc-8591-5eb9b8420480}*SharedItemsImports = 5
+ tests\Microsoft.PowerFx.Interpreter.Tests.Shared\Microsoft.PowerFx.Interpreter.Tests.Shared.projitems*{0daa552e-5906-42c3-846f-2646ee2c33d3}*SharedItemsImports = 13
+ tests\Microsoft.PowerFx.Performance.Tests.Shared\Microsoft.PowerFx.Performance.Tests.Shared.projitems*{21e2744a-4c69-4862-894a-6922c2b8e2f8}*SharedItemsImports = 13
+ tests\Microsoft.PowerFx.Repl.Tests.Shared\Microsoft.PowerFx.Repl.Tests.Shared.projitems*{33f53d1e-90e7-45e7-9a54-a140e4af26ae}*SharedItemsImports = 5
+ tests\Microsoft.PowerFx.Json.Tests.Shared\Microsoft.PowerFx.Json.Tests.Shared.projitems*{68392322-f03e-4a71-8aa2-e4462031a491}*SharedItemsImports = 5
+ tests\Microsoft.PowerFx.TexlFunctionExporter.Shared\Microsoft.PowerFx.TexlFunctionExporter.Shared.projitems*{6bb3fa08-791f-4418-ad1c-fab5ee67d88c}*SharedItemsImports = 13
+ tests\Microsoft.PowerFx.Interpreter.Tests.Shared\Microsoft.PowerFx.Interpreter.Tests.Shared.projitems*{7ce0c1c3-e6b7-4af0-b6a3-ff4d0002829f}*SharedItemsImports = 5
+ tests\Microsoft.PowerFx.Core.Tests.Shared\Microsoft.PowerFx.Core.Tests.Shared.projitems*{99bf2bf9-3a27-412a-a489-c31c7c9e236b}*SharedItemsImports = 5
+ tests\Microsoft.PowerFx.TexlFunctionExporter.Shared\Microsoft.PowerFx.TexlFunctionExporter.Shared.projitems*{ace89dc7-06e7-4919-b1db-53e9b39e94f7}*SharedItemsImports = 5
+ tests\Microsoft.PowerFx.Json.Tests.Shared\Microsoft.PowerFx.Json.Tests.Shared.projitems*{b23198d8-6652-4ce5-aee3-8646202e6bbd}*SharedItemsImports = 13
+ tests\Microsoft.PowerFx.Connectors.Tests.Shared\Microsoft.PowerFx.Connectors.Tests.Shared.projitems*{b91ccc91-2a8d-4411-9a50-709a11b61adc}*SharedItemsImports = 13
+ tests\Microsoft.PowerFx.Core.Tests.Shared\Microsoft.PowerFx.Core.Tests.Shared.projitems*{d274e7b2-0fed-4f9e-b39a-9fa4a8accf39}*SharedItemsImports = 13
+ tests\Microsoft.PowerFx.Repl.Tests.Shared\Microsoft.PowerFx.Repl.Tests.Shared.projitems*{f065ba6a-db76-409b-9516-1f027753c2f4}*SharedItemsImports = 13
+ EndGlobalSection
EndGlobal
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Microsoft.PowerFx.Connectors.Tests.csproj b/src/tests/.Net 3.1/Microsoft.PowerFx.Connectors.Tests/Microsoft.PowerFx.Connectors.Tests.csproj
similarity index 69%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Microsoft.PowerFx.Connectors.Tests.csproj
rename to src/tests/.Net 3.1/Microsoft.PowerFx.Connectors.Tests/Microsoft.PowerFx.Connectors.Tests.csproj
index b87b53c80..ed8d5f325 100644
--- a/src/tests/Microsoft.PowerFx.Connectors.Tests/Microsoft.PowerFx.Connectors.Tests.csproj
+++ b/src/tests/.Net 3.1/Microsoft.PowerFx.Connectors.Tests/Microsoft.PowerFx.Connectors.Tests.csproj
@@ -26,26 +26,19 @@
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/Microsoft.PowerFx.Core.Tests.csproj b/src/tests/.Net 3.1/Microsoft.PowerFx.Core.Tests/Microsoft.PowerFx.Core.Tests.csproj
similarity index 61%
rename from src/tests/Microsoft.PowerFx.Core.Tests/Microsoft.PowerFx.Core.Tests.csproj
rename to src/tests/.Net 3.1/Microsoft.PowerFx.Core.Tests/Microsoft.PowerFx.Core.Tests.csproj
index 52ab2e815..e195e1151 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/Microsoft.PowerFx.Core.Tests.csproj
+++ b/src/tests/.Net 3.1/Microsoft.PowerFx.Core.Tests/Microsoft.PowerFx.Core.Tests.csproj
@@ -1,79 +1,46 @@
-
-
-
- true
- false
- $(GeneratePackages)
- netcoreapp3.1
- netcoreapp3.1
- $(LocalPackageVersion)
- $(ReleasePackageVersion)
- $(LocalPackageVersion)
- $(ReleasePackageVersion)
- Debug;Release
- false
-
-
-
-
- Microsoft.PowerFx.Core.Tests
- Microsoft Power Fx Compiler Tests Core
- The core test suite for all Microsoft Power Fx Compiler targets
- The core test suite for all Microsoft Power Fx Compiler targets
-
-
-
-
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
-
-
-
-
-
-
-
- PreserveNewest
-
-
- IntellisenseTests\TestSignatures\%(FileName)%(Extension)
- PreserveNewest
-
-
-
-
-
-
-
-
-
-
-
-
- Always
-
-
-
-
-
-
-
- True
- True
- Resources.resx
-
-
-
-
- ResXFileCodeGenerator
- Resources.Designer.cs
-
-
-
+
+
+
+ true
+ false
+ $(GeneratePackages)
+ netcoreapp3.1
+ netcoreapp3.1
+ $(LocalPackageVersion)
+ $(ReleasePackageVersion)
+ $(LocalPackageVersion)
+ $(ReleasePackageVersion)
+ Debug;Release
+ false
+
+
+
+
+ Microsoft.PowerFx.Core.Tests
+ Microsoft Power Fx Compiler Tests Core
+ The core test suite for all Microsoft Power Fx Compiler targets
+ The core test suite for all Microsoft Power Fx Compiler targets
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/tests/Microsoft.PowerFx.Interpreter.Tests/Microsoft.PowerFx.Interpreter.Tests.csproj b/src/tests/.Net 3.1/Microsoft.PowerFx.Interpreter.Tests/Microsoft.PowerFx.Interpreter.Tests.csproj
similarity index 50%
rename from src/tests/Microsoft.PowerFx.Interpreter.Tests/Microsoft.PowerFx.Interpreter.Tests.csproj
rename to src/tests/.Net 3.1/Microsoft.PowerFx.Interpreter.Tests/Microsoft.PowerFx.Interpreter.Tests.csproj
index 6c54ea706..fa591959f 100644
--- a/src/tests/Microsoft.PowerFx.Interpreter.Tests/Microsoft.PowerFx.Interpreter.Tests.csproj
+++ b/src/tests/.Net 3.1/Microsoft.PowerFx.Interpreter.Tests/Microsoft.PowerFx.Interpreter.Tests.csproj
@@ -21,33 +21,17 @@
-
+
-
-
+
+
+
+
+
-
-
-
-
- PreserveNewest
-
-
- IntellisenseTests\TestSignatures\%(FileName)%(Extension)
- PreserveNewest
-
-
- Always
-
-
-
-
-
- Always
-
-
+
\ No newline at end of file
diff --git a/src/tests/Microsoft.PowerFx.Repl.Tests/Microsoft.PowerFx.Repl.Tests.csproj b/src/tests/.Net 3.1/Microsoft.PowerFx.Json.Tests/Microsoft.PowerFx.Json.Tests.csproj
similarity index 68%
rename from src/tests/Microsoft.PowerFx.Repl.Tests/Microsoft.PowerFx.Repl.Tests.csproj
rename to src/tests/.Net 3.1/Microsoft.PowerFx.Json.Tests/Microsoft.PowerFx.Json.Tests.csproj
index 0d13fa2fd..cd5742a26 100644
--- a/src/tests/Microsoft.PowerFx.Repl.Tests/Microsoft.PowerFx.Repl.Tests.csproj
+++ b/src/tests/.Net 3.1/Microsoft.PowerFx.Json.Tests/Microsoft.PowerFx.Json.Tests.csproj
@@ -10,7 +10,6 @@
-
@@ -21,14 +20,15 @@
-
+
-
-
+
+
+
+
-
-
+
\ No newline at end of file
diff --git a/src/tests/Microsoft.PowerFx.Performance.Tests/Microsoft.PowerFx.Performance.Tests.csproj b/src/tests/.Net 3.1/Microsoft.PowerFx.Performance.Tests/Microsoft.PowerFx.Performance.Tests.csproj
similarity index 78%
rename from src/tests/Microsoft.PowerFx.Performance.Tests/Microsoft.PowerFx.Performance.Tests.csproj
rename to src/tests/.Net 3.1/Microsoft.PowerFx.Performance.Tests/Microsoft.PowerFx.Performance.Tests.csproj
index 6aa848bf4..711be875f 100644
--- a/src/tests/Microsoft.PowerFx.Performance.Tests/Microsoft.PowerFx.Performance.Tests.csproj
+++ b/src/tests/.Net 3.1/Microsoft.PowerFx.Performance.Tests/Microsoft.PowerFx.Performance.Tests.csproj
@@ -29,12 +29,13 @@
-
+
-
-
+
+
+
diff --git a/src/tests/Microsoft.PowerFx.Json.Tests/Microsoft.PowerFx.Json.Tests.csproj b/src/tests/.Net 3.1/Microsoft.PowerFx.Repl.Tests/Microsoft.PowerFx.Repl.Tests.csproj
similarity index 63%
rename from src/tests/Microsoft.PowerFx.Json.Tests/Microsoft.PowerFx.Json.Tests.csproj
rename to src/tests/.Net 3.1/Microsoft.PowerFx.Repl.Tests/Microsoft.PowerFx.Repl.Tests.csproj
index 3b7e9035c..deeba7b15 100644
--- a/src/tests/Microsoft.PowerFx.Json.Tests/Microsoft.PowerFx.Json.Tests.csproj
+++ b/src/tests/.Net 3.1/Microsoft.PowerFx.Repl.Tests/Microsoft.PowerFx.Repl.Tests.csproj
@@ -10,6 +10,7 @@
+
@@ -20,20 +21,16 @@
-
+
+
+
+
+
-
-
-
-
- TypeSystemTests\JsonTypeSnapshots\%(FileName)%(Extension)
- PreserveNewest
-
-
-
+
\ No newline at end of file
diff --git a/src/tests/Microsoft.PowerFx.TexlFunctionExporter/Microsoft.PowerFx.TexlFunctionExporter.csproj b/src/tests/.Net 3.1/Microsoft.PowerFx.TexlFunctionExporter/Microsoft.PowerFx.TexlFunctionExporter.csproj
similarity index 80%
rename from src/tests/Microsoft.PowerFx.TexlFunctionExporter/Microsoft.PowerFx.TexlFunctionExporter.csproj
rename to src/tests/.Net 3.1/Microsoft.PowerFx.TexlFunctionExporter/Microsoft.PowerFx.TexlFunctionExporter.csproj
index 4a4c30211..a2c49ee6c 100644
--- a/src/tests/Microsoft.PowerFx.TexlFunctionExporter/Microsoft.PowerFx.TexlFunctionExporter.csproj
+++ b/src/tests/.Net 3.1/Microsoft.PowerFx.TexlFunctionExporter/Microsoft.PowerFx.TexlFunctionExporter.csproj
@@ -22,11 +22,12 @@
-
+
-
+
+
\ No newline at end of file
diff --git a/src/tests/Directory.Build.props b/src/tests/Directory.Build.props
index 529741838..dec06e445 100644
--- a/src/tests/Directory.Build.props
+++ b/src/tests/Directory.Build.props
@@ -10,7 +10,7 @@
-
+
PreserveNewest
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/BaseConnectorTest.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/BaseConnectorTest.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/BaseConnectorTest.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/BaseConnectorTest.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/BasicRestTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/BasicRestTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/BasicRestTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/BasicRestTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/ConnectorWizardTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/ConnectorWizardTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/ConnectorWizardTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/ConnectorWizardTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/DynamicTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/DynamicTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/DynamicTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/DynamicTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/FileTabularConnector.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/FileTabularConnector.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/FileTabularConnector.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/FileTabularConnector.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Helpers/Helpers.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Helpers/Helpers.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Helpers/Helpers.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Helpers/Helpers.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Helpers/LoggingTestServer.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Helpers/LoggingTestServer.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Helpers/LoggingTestServer.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Helpers/LoggingTestServer.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/IntellisenseTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/IntellisenseTests.cs
similarity index 99%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/IntellisenseTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/IntellisenseTests.cs
index cea93ba02..32d52f1cd 100644
--- a/src/tests/Microsoft.PowerFx.Connectors.Tests/IntellisenseTests.cs
+++ b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/IntellisenseTests.cs
@@ -2,119 +2,119 @@
// Licensed under the MIT license.
using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Microsoft.OpenApi.Models;
using Microsoft.PowerFx.Intellisense;
using Microsoft.PowerFx.Interpreter.Tests;
using Microsoft.PowerFx.Tests;
using Xunit;
-using Xunit.Abstractions;
-
+using Xunit.Abstractions;
+
#pragma warning disable SA1515 // Single-line comment should be preceded by blank line
#pragma warning disable SA1025 // Code should not contain multiple whitespace in a row
-
+
namespace Microsoft.PowerFx.Connectors.Tests
{
public class IntellisenseTests
- {
- private readonly ITestOutputHelper _output;
-
- public IntellisenseTests(ITestOutputHelper output)
- {
- _output = output;
- }
+ {
+ private readonly ITestOutputHelper _output;
- [Theory]
- // Get list of servers
- [InlineData(1, 1, @"SQL.ExecuteProcedureV2(", @"""default""")]
- [InlineData(1, 1, @"SQL.ExecuteProcedureV2(""", @"""default""")] // inside the string, no character
- [InlineData(1, 1, @"SQL.ExecuteProcedureV2(""de", @"""default""")] // inside the string, some characters (matching)
- [InlineData(1, 1, @"SQL.ExecuteProcedureV2(""dz", "")] // inside the string, not matching characters
- // Get list of databases
- [InlineData(2, 2, @"SQL.ExecuteProcedureV2(""pfxdev-sql.database.windows.net"",", @"""default""")]
- [InlineData(2, 3, @"SQL.ExecuteProcedureV2(""default"",", @"""default""")] // testing with "default" server
- [InlineData(0, 0, @"SQL.ExecuteProcedureV2(""pfxdev-sql.database.windows.net""", "")] // no comma, still on 1st param
- [InlineData(0, 0, @"SQL.ExecuteProcedureV2(""pfxdev-sql"" + "".database.windows.net"",", "")] // concatenation of strings
- // Get list of stored procedures
- [InlineData(3, 4, @"SQL.ExecuteProcedureV2(""pfxdev-sql.database.windows.net"", ""connectortest"",", @"""[dbo].[sp_1]""|""[dbo].[sp_2]""")]
- [InlineData(3, 5, @"SQL.ExecuteProcedureV2(""default"", ""connectortest"",", @"""[dbo].[sp_1]""|""[dbo].[sp_2]""")] // testing with "default" server
- [InlineData(3, 6, @"SQL.ExecuteProcedureV2(""default"", ""default"",", @"""[dbo].[sp_1]""|""[dbo].[sp_2]""")] // testing with "default" server & database
- // Using fake function
- [InlineData(3, 4, @"SQL.ExecuteProcedureV2z(true, ""connectortest"",", @"""[dbo].[sp_1]""|""[dbo].[sp_2]""")]
- public void ConnectorIntellisenseTest(int responseIndex, int queryIndex, string expression, string expectedSuggestions)
- {
- // These tests are exercising 'x-ms-dynamic-values' extension property
- using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
- OpenApiDocument apiDoc = testConnector._apiDocument;
- PowerFxConfig config = new PowerFxConfig(Features.PowerFxV1);
-
- using HttpClient httpClient = new HttpClient(testConnector);
- using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient(
+ public IntellisenseTests(ITestOutputHelper output)
+ {
+ _output = output;
+ }
+
+ [Theory]
+ // Get list of servers
+ [InlineData(1, 1, @"SQL.ExecuteProcedureV2(", @"""default""")]
+ [InlineData(1, 1, @"SQL.ExecuteProcedureV2(""", @"""default""")] // inside the string, no character
+ [InlineData(1, 1, @"SQL.ExecuteProcedureV2(""de", @"""default""")] // inside the string, some characters (matching)
+ [InlineData(1, 1, @"SQL.ExecuteProcedureV2(""dz", "")] // inside the string, not matching characters
+ // Get list of databases
+ [InlineData(2, 2, @"SQL.ExecuteProcedureV2(""pfxdev-sql.database.windows.net"",", @"""default""")]
+ [InlineData(2, 3, @"SQL.ExecuteProcedureV2(""default"",", @"""default""")] // testing with "default" server
+ [InlineData(0, 0, @"SQL.ExecuteProcedureV2(""pfxdev-sql.database.windows.net""", "")] // no comma, still on 1st param
+ [InlineData(0, 0, @"SQL.ExecuteProcedureV2(""pfxdev-sql"" + "".database.windows.net"",", "")] // concatenation of strings
+ // Get list of stored procedures
+ [InlineData(3, 4, @"SQL.ExecuteProcedureV2(""pfxdev-sql.database.windows.net"", ""connectortest"",", @"""[dbo].[sp_1]""|""[dbo].[sp_2]""")]
+ [InlineData(3, 5, @"SQL.ExecuteProcedureV2(""default"", ""connectortest"",", @"""[dbo].[sp_1]""|""[dbo].[sp_2]""")] // testing with "default" server
+ [InlineData(3, 6, @"SQL.ExecuteProcedureV2(""default"", ""default"",", @"""[dbo].[sp_1]""|""[dbo].[sp_2]""")] // testing with "default" server & database
+ // Using fake function
+ [InlineData(3, 4, @"SQL.ExecuteProcedureV2z(true, ""connectortest"",", @"""[dbo].[sp_1]""|""[dbo].[sp_2]""")]
+ public void ConnectorIntellisenseTest(int responseIndex, int queryIndex, string expression, string expectedSuggestions)
+ {
+ // These tests are exercising 'x-ms-dynamic-values' extension property
+ using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
+ OpenApiDocument apiDoc = testConnector._apiDocument;
+ PowerFxConfig config = new PowerFxConfig(Features.PowerFxV1);
+
+ using HttpClient httpClient = new HttpClient(testConnector);
+ using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient(
"tip1-shared-002.azure-apim.net", // endpoint
"a2df3fb8-e4a4-e5e6-905c-e3dff9f93b46", // environment
"5f57ec83acef477b8ccc769e52fa22cc", // connectionId
() => "eyJ0eXA...",
- httpClient)
- {
- SessionId = "8e67ebdc-d402-455a-b33a-304820832383"
- };
-
- config.AddActionConnector("SQL", apiDoc, new ConsoleLogger(_output));
- testConnector.SetResponseFromFile(responseIndex switch
- {
- 0 => null,
- 1 => @"Responses\SQL Server Intellisense Response 1.json",
- 2 => @"Responses\SQL Server Intellisense Response 2.json",
- 3 => @"Responses\SQL Server Intellisense Response 3.json",
- _ => null
- });
- RecalcEngine engine = new RecalcEngine(config);
- BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
-
- CheckResult checkResult = engine.Check(expression, symbolTable: null);
- IIntellisenseResult suggestions = engine.Suggest(checkResult, expression.Length, serviceProvider);
-
- string list = string.Join("|", suggestions.Suggestions.Select(s => s.DisplayText.Text).OrderBy(x => x));
- Assert.Equal(expectedSuggestions, list);
- Assert.True((responseIndex == 0) ^ testConnector.SendAsyncCalled);
-
- string networkTrace = testConnector._log.ToString();
- string queryPart = queryIndex switch
- {
- 0 => null,
- 1 => "servers",
- 2 => "databases?server=pfxdev-sql.database.windows.net",
- 3 => "databases?server=default",
- 4 => "v2/datasets/pfxdev-sql.database.windows.net,connectortest/procedures",
- 5 => "v2/datasets/default,connectortest/procedures",
- 6 => "v2/datasets/default,default/procedures",
- _ => throw new NotImplementedException("Unknown index")
- };
-
- string expectedNetwork = queryIndex switch
- {
- 0 => string.Empty,
- _ =>
-$@"POST https://tip1-shared-002.azure-apim.net/invoke
- authority: tip1-shared-002.azure-apim.net
- Authorization: Bearer eyJ0eXA...
- path: /invoke
- scheme: https
- x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/a2df3fb8-e4a4-e5e6-905c-e3dff9f93b46
- x-ms-client-session-id: 8e67ebdc-d402-455a-b33a-304820832383
- x-ms-request-method: GET
- x-ms-request-url: /apim/sql/5f57ec83acef477b8ccc769e52fa22cc/{queryPart}
- x-ms-user-agent: PowerFx/{PowerPlatformConnectorClient.Version}
-"
- };
-
- Assert.Equal(expectedNetwork.Replace("\r\n", "\n").Replace("\r", "\n"), networkTrace.Replace("\r\n", "\n").Replace("\r", "\n"));
+ httpClient)
+ {
+ SessionId = "8e67ebdc-d402-455a-b33a-304820832383"
+ };
+
+ config.AddActionConnector("SQL", apiDoc, new ConsoleLogger(_output));
+ testConnector.SetResponseFromFile(responseIndex switch
+ {
+ 0 => null,
+ 1 => @"Responses\SQL Server Intellisense Response 1.json",
+ 2 => @"Responses\SQL Server Intellisense Response 2.json",
+ 3 => @"Responses\SQL Server Intellisense Response 3.json",
+ _ => null
+ });
+ RecalcEngine engine = new RecalcEngine(config);
+ BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
+
+ CheckResult checkResult = engine.Check(expression, symbolTable: null);
+ IIntellisenseResult suggestions = engine.Suggest(checkResult, expression.Length, serviceProvider);
+
+ string list = string.Join("|", suggestions.Suggestions.Select(s => s.DisplayText.Text).OrderBy(x => x));
+ Assert.Equal(expectedSuggestions, list);
+ Assert.True((responseIndex == 0) ^ testConnector.SendAsyncCalled);
+
+ string networkTrace = testConnector._log.ToString();
+ string queryPart = queryIndex switch
+ {
+ 0 => null,
+ 1 => "servers",
+ 2 => "databases?server=pfxdev-sql.database.windows.net",
+ 3 => "databases?server=default",
+ 4 => "v2/datasets/pfxdev-sql.database.windows.net,connectortest/procedures",
+ 5 => "v2/datasets/default,connectortest/procedures",
+ 6 => "v2/datasets/default,default/procedures",
+ _ => throw new NotImplementedException("Unknown index")
+ };
+
+ string expectedNetwork = queryIndex switch
+ {
+ 0 => string.Empty,
+ _ =>
+$@"POST https://tip1-shared-002.azure-apim.net/invoke
+ authority: tip1-shared-002.azure-apim.net
+ Authorization: Bearer eyJ0eXA...
+ path: /invoke
+ scheme: https
+ x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/a2df3fb8-e4a4-e5e6-905c-e3dff9f93b46
+ x-ms-client-session-id: 8e67ebdc-d402-455a-b33a-304820832383
+ x-ms-request-method: GET
+ x-ms-request-url: /apim/sql/5f57ec83acef477b8ccc769e52fa22cc/{queryPart}
+ x-ms-user-agent: PowerFx/{PowerPlatformConnectorClient.Version}
+"
+ };
+
+ Assert.Equal(expectedNetwork.Replace("\r\n", "\n").Replace("\r", "\n"), networkTrace.Replace("\r\n", "\n").Replace("\r", "\n"));
}
- [Theory]
+ [Theory]
[InlineData(1, 1, @"SQL.ExecuteProcedureV2(""default"", ""default"", ""sp_1"", ", @"p1|User")] // stored proc with 1 param, out of record
[InlineData(2, 1, @"SQL.ExecuteProcedureV2(""default"", ""default"", ""sp_2"", ", @"p1|p2|User")] // stored proc with 2 params, out of record
[InlineData(1, 1, @"SQL.ExecuteProcedureV2(""default"", ""default"", ""sp_1"", { ", "p1")] // in record, only suggest param names
@@ -129,7 +129,7 @@ $@"POST https://tip1-shared-002.azure-apim.net/invoke
{
// These tests are exercising 'x-ms-dynamic-schema' extension property
using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
- OpenApiDocument apiDoc = testConnector._apiDocument;
+ OpenApiDocument apiDoc = testConnector._apiDocument;
PowerFxConfig config = new PowerFxConfig(Features.PowerFxV1) { SymbolTable = UserInfoTestSetup.GetUserInfoSymbolTable() };
using HttpClient httpClient = new HttpClient(testConnector);
@@ -154,17 +154,17 @@ $@"POST https://tip1-shared-002.azure-apim.net/invoke
});
}
- RecalcEngine engine = new RecalcEngine(config);
- BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
-
+ RecalcEngine engine = new RecalcEngine(config);
+ BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
+
CheckResult checkResult = engine.Check(expression, symbolTable: null);
IIntellisenseResult suggestions = engine.Suggest(checkResult, expression.Length, serviceProvider);
string list = string.Join("|", suggestions.Suggestions.Select(s => s.DisplayText.Text).OrderBy(x => x));
- Assert.Equal(expectedSuggestions, list);
-
+ Assert.Equal(expectedSuggestions, list);
+
string networkTrace = testConnector._log.ToString();
- string expectedNetwork = networkCall == 0 ? string.Empty :
+ string expectedNetwork = networkCall == 0 ? string.Empty :
$@"POST https://tip1-shared-002.azure-apim.net/invoke
authority: tip1-shared-002.azure-apim.net
Authorization: Bearer eyJ0eXA...
@@ -175,15 +175,15 @@ $@"POST https://tip1-shared-002.azure-apim.net/invoke
x-ms-request-method: GET
x-ms-request-url: /apim/sql/5f57ec83acef477b8ccc769e52fa22cc/v2/$metadata.json/datasets/default,default/procedures/sp_{responseIndex}
x-ms-user-agent: PowerFx/{PowerPlatformConnectorClient.Version}
-";
-
+";
+
Assert.Equal(expectedNetwork.Replace("\r\n", "\n").Replace("\r", "\n"), networkTrace.Replace("\r\n", "\n").Replace("\r", "\n"));
- }
-
- [Fact]
+ }
+
+ [Fact]
public void ConnectorIntellisenseTest_ServerError()
- {
- string expression = @"SQL.ExecuteProcedureV2(""default"", ""default"", ""sp_2"", { ";
+ {
+ string expression = @"SQL.ExecuteProcedureV2(""default"", ""default"", ""sp_2"", { ";
using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
OpenApiDocument apiDoc = testConnector._apiDocument;
@@ -195,28 +195,28 @@ $@"POST https://tip1-shared-002.azure-apim.net/invoke
SessionId = "8e67ebdc-d402-455a-b33a-304820832383"
};
- config.AddActionConnector("SQL", apiDoc, new ConsoleLogger(_output));
-
- // The response is invalid (malformed Json), this is to ensure we manage properly the exception coming from ExtractFromJson
- testConnector.SetResponseFromFile(@"Responses\SQL Server Intellisense Response Error.json");
-
- RecalcEngine engine = new RecalcEngine(config);
- BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
-
- CheckResult checkResult = engine.Check(expression, symbolTable: null);
-
+ config.AddActionConnector("SQL", apiDoc, new ConsoleLogger(_output));
+
+ // The response is invalid (malformed Json), this is to ensure we manage properly the exception coming from ExtractFromJson
+ testConnector.SetResponseFromFile(@"Responses\SQL Server Intellisense Response Error.json");
+
+ RecalcEngine engine = new RecalcEngine(config);
+ BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
+
+ CheckResult checkResult = engine.Check(expression, symbolTable: null);
+
// This call should not throw an exception
IIntellisenseResult suggestions = engine.Suggest(checkResult, expression.Length, serviceProvider);
-
+
// We don't get any result as the response is invalid
string list = string.Join("|", suggestions.Suggestions.Select(s => s.DisplayText.Text).OrderBy(x => x));
Assert.Equal(string.Empty, list);
- }
-
- [Fact]
+ }
+
+ [Fact]
public void ConnectorIntellisenseTest_EmptyResponse()
- {
- string expression = @"SQL.ExecuteProcedureV2(""default"", ""default"", ""sp_2"", { ";
+ {
+ string expression = @"SQL.ExecuteProcedureV2(""default"", ""default"", ""sp_2"", { ";
using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
OpenApiDocument apiDoc = testConnector._apiDocument;
@@ -228,25 +228,25 @@ $@"POST https://tip1-shared-002.azure-apim.net/invoke
SessionId = "8e67ebdc-d402-455a-b33a-304820832383"
};
- config.AddActionConnector("SQL", apiDoc, new ConsoleLogger(_output));
-
- // The response is empty, this is to ensure we manage properly the exception coming from ExtractFromJson
- testConnector.SetResponseFromFile(@"Responses\EmptyResponse.json");
-
- RecalcEngine engine = new RecalcEngine(config);
- BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
-
- CheckResult checkResult = engine.Check(expression, symbolTable: null);
-
+ config.AddActionConnector("SQL", apiDoc, new ConsoleLogger(_output));
+
+ // The response is empty, this is to ensure we manage properly the exception coming from ExtractFromJson
+ testConnector.SetResponseFromFile(@"Responses\EmptyResponse.json");
+
+ RecalcEngine engine = new RecalcEngine(config);
+ BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
+
+ CheckResult checkResult = engine.Check(expression, symbolTable: null);
+
// This call should not throw an exception
IIntellisenseResult suggestions = engine.Suggest(checkResult, expression.Length, serviceProvider);
-
+
// We don't get any result as the response is invalid
string list = string.Join("|", suggestions.Suggestions.Select(s => s.DisplayText.Text).OrderBy(x => x));
Assert.Equal(string.Empty, list);
- }
-
- [Theory]
+ }
+
+ [Theory]
[InlineData(1, 1, @"SQL.ExecuteProcedureV2(""default"", ""default"", ""sp_1"", ", @"p1")] // stored proc with 1 param, out of record
public void ConnectorIntellisenseTestLSP(int responseIndex, int networkCall, string expression, string expectedSuggestions)
{
@@ -265,14 +265,14 @@ $@"POST https://tip1-shared-002.azure-apim.net/invoke
{
SessionId = "8e67ebdc-d402-455a-b33a-304820832383"
};
-
- // Real client comes at per-intellisense time.
- // - Must still pass in some non-null client to initialize the invoker
- // - client must have same base address as what we pass in at intellisense.
- using var ignoreHttpClient = new HttpClient
- {
- BaseAddress = client.BaseAddress
- };
+
+ // Real client comes at per-intellisense time.
+ // - Must still pass in some non-null client to initialize the invoker
+ // - client must have same base address as what we pass in at intellisense.
+ using var ignoreHttpClient = new HttpClient
+ {
+ BaseAddress = client.BaseAddress
+ };
const string cxNamespace = "SQL";
config.AddActionConnector(new ConnectorSettings(cxNamespace), apiDoc, new ConsoleLogger(_output));
if (networkCall > 0)
@@ -285,17 +285,17 @@ $@"POST https://tip1-shared-002.azure-apim.net/invoke
});
}
- RecalcEngine engine = new RecalcEngine(config);
- BasicServiceProvider services = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext(cxNamespace, client, console: _output));
-
- IPowerFxScope scope = new EditorContextScope((expr) => engine.Check(expression, symbolTable: null)) { Services = services };
- IIntellisenseResult suggestions = scope.Suggest(expression, expression.Length);
-
+ RecalcEngine engine = new RecalcEngine(config);
+ BasicServiceProvider services = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext(cxNamespace, client, console: _output));
+
+ IPowerFxScope scope = new EditorContextScope((expr) => engine.Check(expression, symbolTable: null)) { Services = services };
+ IIntellisenseResult suggestions = scope.Suggest(expression, expression.Length);
+
string list = string.Join("|", suggestions.Suggestions.Select(s => s.DisplayText.Text).OrderBy(x => x));
- Assert.Equal(expectedSuggestions, list);
-
+ Assert.Equal(expectedSuggestions, list);
+
string networkTrace = testConnector._log.ToString();
- string expectedNetwork = networkCall == 0 ? string.Empty :
+ string expectedNetwork = networkCall == 0 ? string.Empty :
$@"POST https://tip1-shared-002.azure-apim.net/invoke
authority: tip1-shared-002.azure-apim.net
Authorization: Bearer eyJ0eXA...
@@ -306,74 +306,74 @@ $@"POST https://tip1-shared-002.azure-apim.net/invoke
x-ms-request-method: GET
x-ms-request-url: /apim/sql/5f57ec83acef477b8ccc769e52fa22cc/v2/$metadata.json/datasets/default,default/procedures/sp_{responseIndex}
x-ms-user-agent: PowerFx/{PowerPlatformConnectorClient.Version}
-";
-
+";
+
Assert.Equal(expectedNetwork.Replace("\r\n", "\n").Replace("\r", "\n"), networkTrace.Replace("\r\n", "\n").Replace("\r", "\n"));
- }
-
- [Fact]
- public async Task ConnectorIntellisenseTest3()
- {
- using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SharePoint.json", _output);
- OpenApiDocument apiDoc = testConnector._apiDocument;
- PowerFxConfig config = new PowerFxConfig();
- string token = @"eyJ0eXA...";
-
- using HttpClient httpClient = new HttpClient(testConnector);
- using PowerPlatformConnectorClient ppClient = new PowerPlatformConnectorClient("https://tip1-shared-002.azure-apim.net", "2f0cc19d-893e-e765-b15d-2906e3231c09" /* env */, "6fb0a1a8e2f5487eafbe306821d8377e" /* connId */, () => $"{token}", httpClient) { SessionId = "547d471f-c04c-4c4a-b3af-337ab0637a0d" };
-
- List functions = OpenApiParser.GetFunctions("SP", apiDoc, new ConsoleLogger(_output)).OrderBy(f => f.Name).ToList();
-
- // Total 101 functions, including 50 internal, 1 deprecated & 50 internal functions (and no deprecated+internal functions)
- Assert.Equal(51, functions.Count);
- Assert.Single(functions.Where(f => f.IsDeprecated));
-
- // This is expected as internal functions (which are marked as internal) are not included
- Assert.Empty(functions.Where(f => f.IsInternal));
- Assert.Empty(functions.Where(f => f.IsDeprecated && f.IsInternal));
-
- IEnumerable funcInfos = config.AddActionConnector("SP", apiDoc, new ConsoleLogger(_output));
- RecalcEngine engine = new RecalcEngine(config);
-
- CheckResult checkResult = engine.Check("SP.", symbolTable: null);
- IIntellisenseResult suggestions = engine.Suggest(checkResult, 3);
-
- // We only suggest 50 functions as we don't include deprecated & internal functions
- Assert.Equal(50, suggestions.Suggestions.Count());
- }
-
- [Theory]
- [InlineData(@"SQL.")]
- [InlineData(@"SQ")]
- public async Task ConnectorDoNotSuggestDeprecatedEndpoints(string expression)
- {
- // This Path can be found in the Swagger file SQL Server.json
- var deprecatedFunctionExample = "SQL.ExecutePassThroughNativeQuery";
- using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
- OpenApiDocument apiDoc = testConnector._apiDocument;
- PowerFxConfig config = new PowerFxConfig(Features.PowerFxV1);
-
- using HttpClient httpClient = new HttpClient(testConnector);
- using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient(
+ }
+
+ [Fact]
+ public async Task ConnectorIntellisenseTest3()
+ {
+ using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SharePoint.json", _output);
+ OpenApiDocument apiDoc = testConnector._apiDocument;
+ PowerFxConfig config = new PowerFxConfig();
+ string token = @"eyJ0eXA...";
+
+ using HttpClient httpClient = new HttpClient(testConnector);
+ using PowerPlatformConnectorClient ppClient = new PowerPlatformConnectorClient("https://tip1-shared-002.azure-apim.net", "2f0cc19d-893e-e765-b15d-2906e3231c09" /* env */, "6fb0a1a8e2f5487eafbe306821d8377e" /* connId */, () => $"{token}", httpClient) { SessionId = "547d471f-c04c-4c4a-b3af-337ab0637a0d" };
+
+ List functions = OpenApiParser.GetFunctions("SP", apiDoc, new ConsoleLogger(_output)).OrderBy(f => f.Name).ToList();
+
+ // Total 101 functions, including 50 internal, 1 deprecated & 50 internal functions (and no deprecated+internal functions)
+ Assert.Equal(51, functions.Count);
+ Assert.Single(functions.Where(f => f.IsDeprecated));
+
+ // This is expected as internal functions (which are marked as internal) are not included
+ Assert.Empty(functions.Where(f => f.IsInternal));
+ Assert.Empty(functions.Where(f => f.IsDeprecated && f.IsInternal));
+
+ IEnumerable funcInfos = config.AddActionConnector("SP", apiDoc, new ConsoleLogger(_output));
+ RecalcEngine engine = new RecalcEngine(config);
+
+ CheckResult checkResult = engine.Check("SP.", symbolTable: null);
+ IIntellisenseResult suggestions = engine.Suggest(checkResult, 3);
+
+ // We only suggest 50 functions as we don't include deprecated & internal functions
+ Assert.Equal(50, suggestions.Suggestions.Count());
+ }
+
+ [Theory]
+ [InlineData(@"SQL.")]
+ [InlineData(@"SQ")]
+ public async Task ConnectorDoNotSuggestDeprecatedEndpoints(string expression)
+ {
+ // This Path can be found in the Swagger file SQL Server.json
+ var deprecatedFunctionExample = "SQL.ExecutePassThroughNativeQuery";
+ using LoggingTestServer testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
+ OpenApiDocument apiDoc = testConnector._apiDocument;
+ PowerFxConfig config = new PowerFxConfig(Features.PowerFxV1);
+
+ using HttpClient httpClient = new HttpClient(testConnector);
+ using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient(
"tip1-shared-002.azure-apim.net", // endpoint
"a2df3fb8-e4a4-e5e6-905c-e3dff9f93b46", // environment
"5f57ec83acef477b8ccc769e52fa22cc", // connectionId
() => "eyJ0eXA...",
- httpClient)
- {
- SessionId = "8e67ebdc-d402-455a-b33a-304820832383"
- };
-
- config.AddActionConnector("SQL", apiDoc, new ConsoleLogger(_output));
- RecalcEngine engine = new RecalcEngine(config);
- BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
-
- CheckResult checkResult = engine.Check(expression, symbolTable: null);
- IIntellisenseResult suggestions = engine.Suggest(checkResult, expression.Length, serviceProvider);
-
- Assert.DoesNotContain(suggestions.Suggestions, suggestion => suggestion.DisplayText.Text.Equals(deprecatedFunctionExample));
- }
- }
+ httpClient)
+ {
+ SessionId = "8e67ebdc-d402-455a-b33a-304820832383"
+ };
+
+ config.AddActionConnector("SQL", apiDoc, new ConsoleLogger(_output));
+ RecalcEngine engine = new RecalcEngine(config);
+ BasicServiceProvider serviceProvider = new BasicServiceProvider().AddRuntimeContext(new TestConnectorRuntimeContext("SQL", client, console: _output));
+
+ CheckResult checkResult = engine.Check(expression, symbolTable: null);
+ IIntellisenseResult suggestions = engine.Suggest(checkResult, expression.Length, serviceProvider);
+
+ Assert.DoesNotContain(suggestions.Suggestions, suggestion => suggestion.DisplayText.Text.Equals(deprecatedFunctionExample));
+ }
+ }
}
#pragma warning restore SA1515 // Single-line comment should be preceded by blank line
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/InternalTesting.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/InternalTesting.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/InternalTesting.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/InternalTesting.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/LivePublicSwaggerTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/LivePublicSwaggerTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/LivePublicSwaggerTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/LivePublicSwaggerTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/LoggerTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/LoggerTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/LoggerTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/LoggerTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/MergeRecordTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/MergeRecordTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/MergeRecordTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/MergeRecordTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Microsoft.PowerFx.Connectors.Tests.Shared.projitems b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Microsoft.PowerFx.Connectors.Tests.Shared.projitems
new file mode 100644
index 000000000..441524806
--- /dev/null
+++ b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Microsoft.PowerFx.Connectors.Tests.Shared.projitems
@@ -0,0 +1,24 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ b91ccc91-2a8d-4411-9a50-709a11b61adc
+
+
+ Microsoft.PowerFx.Connectors.Tests.Shared
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Microsoft.PowerFx.Connectors.Tests.Shared.shproj b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Microsoft.PowerFx.Connectors.Tests.Shared.shproj
new file mode 100644
index 000000000..3a37e5bd8
--- /dev/null
+++ b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Microsoft.PowerFx.Connectors.Tests.Shared.shproj
@@ -0,0 +1,13 @@
+
+
+
+ b91ccc91-2a8d-4411-9a50-709a11b61adc
+ 14.0
+
+
+
+
+
+
+
+
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/O365GroupTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/O365GroupTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/O365GroupTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/O365GroupTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/O365OutlookTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/O365OutlookTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/O365OutlookTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/O365OutlookTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/O365UserTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/O365UserTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/O365UserTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/O365UserTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/ODataParametersTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/ODataParametersTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/ODataParametersTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/ODataParametersTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiExtensionTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiExtensionTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiExtensionTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiExtensionTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiFormUrlEncoderTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiFormUrlEncoderTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiFormUrlEncoderTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiFormUrlEncoderTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiHelperFunctions.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiHelperFunctions.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiHelperFunctions.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiHelperFunctions.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiJsonSerializerTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiJsonSerializerTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiJsonSerializerTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiJsonSerializerTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiParserTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiParserTests.cs
similarity index 99%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiParserTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiParserTests.cs
index 18db58a2b..283aef067 100644
--- a/src/tests/Microsoft.PowerFx.Connectors.Tests/OpenApiParserTests.cs
+++ b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/OpenApiParserTests.cs
@@ -1,6 +1,6 @@
-// Copyright (c) Microsoft Corporation.
-// Licensed under the MIT license.
-
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT license.
+
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
@@ -13,18 +13,18 @@ using Microsoft.PowerFx.Tests;
using Microsoft.PowerFx.Types;
using Newtonsoft.Json;
using Xunit;
-using Xunit.Abstractions;
-
+using Xunit.Abstractions;
+
namespace Microsoft.PowerFx.Connectors.Tests
{
public class OpenApiParserTests
{
- private readonly ITestOutputHelper _output;
-
- public OpenApiParserTests(ITestOutputHelper output)
- {
- _output = output;
- }
+ private readonly ITestOutputHelper _output;
+
+ public OpenApiParserTests(ITestOutputHelper output)
+ {
+ _output = output;
+ }
[Fact]
public void ACSL_GetFunctionNames()
@@ -45,57 +45,57 @@ namespace Microsoft.PowerFx.Connectors.Tests
Assert.Equal("Analyzes the input conversation utterance.", conversationAnalysisAnalyzeConversationConversation.Description);
Assert.Equal("Conversations (CLU) (2022-05-01)", conversationAnalysisAnalyzeConversationConversation.Summary);
Assert.Equal("/apim/cognitiveservicestextanalytics/{connectionId}/language/:analyze-conversations", conversationAnalysisAnalyzeConversationConversation.OperationPath);
- Assert.Equal(HttpMethod.Post, conversationAnalysisAnalyzeConversationConversation.HttpMethod);
- }
-
- [Fact]
- public void ACSL_GetFunctionNames22()
- {
- OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\Azure Cognitive Service for Language v2.2.json", _output);
- List functions = OpenApiParser.GetFunctions("ACSL", doc, new ConsoleLogger(_output)).OrderBy(cf => cf.Name).ToList();
- ConnectorFunction detectSentimentV3 = functions.First(cf => cf.Name == "DetectSentimentV3");
-
- Assert.Equal("Documents", detectSentimentV3.OptionalParameters[0].Summary);
- Assert.Equal("The documents to analyze.", detectSentimentV3.OptionalParameters[0].Description);
- }
-
+ Assert.Equal(HttpMethod.Post, conversationAnalysisAnalyzeConversationConversation.HttpMethod);
+ }
+
+ [Fact]
+ public void ACSL_GetFunctionNames22()
+ {
+ OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\Azure Cognitive Service for Language v2.2.json", _output);
+ List functions = OpenApiParser.GetFunctions("ACSL", doc, new ConsoleLogger(_output)).OrderBy(cf => cf.Name).ToList();
+ ConnectorFunction detectSentimentV3 = functions.First(cf => cf.Name == "DetectSentimentV3");
+
+ Assert.Equal("Documents", detectSentimentV3.OptionalParameters[0].Summary);
+ Assert.Equal("The documents to analyze.", detectSentimentV3.OptionalParameters[0].Description);
+ }
+
[Fact]
public void ACSL_Load()
{
OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\Azure Cognitive Service for Language.json", _output);
- (List connectorFunctions, List texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("ACSL"), doc, new ConsoleLogger(_output));
- Assert.Contains(connectorFunctions, func => func.Namespace == "ACSL" && func.Name == "ConversationAnalysisAnalyzeConversationConversation");
- Assert.Contains(texlFunctions, func => func.Namespace.Name.Value == "ACSL" && func.Name == "ConversationAnalysisAnalyzeConversationConversation");
-
- ConnectorFunction func1 = connectorFunctions.First(f => f.Name == "AnalyzeTextSubmitJobCustomEntityRecognition");
- Assert.Equal("analysisInput:![documents:*[id:s, language:s, text:s]]|task:![parameters:![deploymentName:s, projectName:s, stringIndexType:s]]", string.Join("|", func1.RequiredParameters.Select(rp => $"{rp.Name}:{rp.FormulaType._type}")));
- Assert.Equal("displayName:s", string.Join("|", func1.OptionalParameters.Select(rp => $"{rp.Name}:{rp.FormulaType._type}")));
-
- (connectorFunctions, texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("ACSL") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, doc, new ConsoleLogger(_output));
- Assert.Contains(connectorFunctions, func => func.Namespace == "ACSL" && func.Name == "ConversationAnalysisAnalyzeConversationConversation");
- Assert.Contains(texlFunctions, func => func.Namespace.Name.Value == "ACSL" && func.Name == "ConversationAnalysisAnalyzeConversationConversation");
-
- func1 = connectorFunctions.First(f => f.Name == "AnalyzeTextSubmitJobCustomEntityRecognition");
- Assert.Equal("analysisInput:![documents:*[id:s, language:s, text:s]]|task:![parameters:![deploymentName:s, projectName:s]]", string.Join("|", func1.RequiredParameters.Select(rp => $"{rp.Name}:{rp.FormulaType._type}")));
- Assert.Empty(func1.OptionalParameters);
- }
-
+ (List connectorFunctions, List texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("ACSL"), doc, new ConsoleLogger(_output));
+ Assert.Contains(connectorFunctions, func => func.Namespace == "ACSL" && func.Name == "ConversationAnalysisAnalyzeConversationConversation");
+ Assert.Contains(texlFunctions, func => func.Namespace.Name.Value == "ACSL" && func.Name == "ConversationAnalysisAnalyzeConversationConversation");
+
+ ConnectorFunction func1 = connectorFunctions.First(f => f.Name == "AnalyzeTextSubmitJobCustomEntityRecognition");
+ Assert.Equal("analysisInput:![documents:*[id:s, language:s, text:s]]|task:![parameters:![deploymentName:s, projectName:s, stringIndexType:s]]", string.Join("|", func1.RequiredParameters.Select(rp => $"{rp.Name}:{rp.FormulaType._type}")));
+ Assert.Equal("displayName:s", string.Join("|", func1.OptionalParameters.Select(rp => $"{rp.Name}:{rp.FormulaType._type}")));
+
+ (connectorFunctions, texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("ACSL") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, doc, new ConsoleLogger(_output));
+ Assert.Contains(connectorFunctions, func => func.Namespace == "ACSL" && func.Name == "ConversationAnalysisAnalyzeConversationConversation");
+ Assert.Contains(texlFunctions, func => func.Namespace.Name.Value == "ACSL" && func.Name == "ConversationAnalysisAnalyzeConversationConversation");
+
+ func1 = connectorFunctions.First(f => f.Name == "AnalyzeTextSubmitJobCustomEntityRecognition");
+ Assert.Equal("analysisInput:![documents:*[id:s, language:s, text:s]]|task:![parameters:![deploymentName:s, projectName:s]]", string.Join("|", func1.RequiredParameters.Select(rp => $"{rp.Name}:{rp.FormulaType._type}")));
+ Assert.Empty(func1.OptionalParameters);
+ }
+
[Fact]
public void SF_TextCsv()
- {
+ {
OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\SalesForce.json", _output);
- (List connectorFunctions, List texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("SF") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, doc, new ConsoleLogger(_output));
-
- // function returns text/csv
- ConnectorFunction func1 = connectorFunctions.First(f => f.Name == "GetJobRecordResults");
- ConnectorType returnType = func1.ReturnParameterType;
-
- // returns a string
- Assert.Equal("s", returnType.FormulaType._type.ToString());
- }
-
+ (List connectorFunctions, List texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("SF") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, doc, new ConsoleLogger(_output));
+
+ // function returns text/csv
+ ConnectorFunction func1 = connectorFunctions.First(f => f.Name == "GetJobRecordResults");
+ ConnectorType returnType = func1.ReturnParameterType;
+
+ // returns a string
+ Assert.Equal("s", returnType.FormulaType._type.ToString());
+ }
+
#pragma warning disable SA1118, SA1117, SA1119, SA1137
-
+
[Fact]
public void ACSL_GetFunctionParameters_PowerAppsCompatibility()
{
@@ -112,18 +112,18 @@ namespace Microsoft.PowerFx.Connectors.Tests
RecordType analysisInputRecordType = Extensions.MakeRecordType(
("conversationItem", Extensions.MakeRecordType(
- ("language", FormulaType.String),
+ ("language", FormulaType.String),
("modality", FormulaType.String),
("text", FormulaType.String))));
RecordType parametersRecordType = Extensions.MakeRecordType(
- ("deploymentName", FormulaType.String),
- ("directTarget", FormulaType.String),
+ ("deploymentName", FormulaType.String),
+ ("directTarget", FormulaType.String),
("isLoggingEnabled", FormulaType.Boolean),
- ("projectName", FormulaType.String),
- ("stringIndexType", FormulaType.String),
+ ("projectName", FormulaType.String),
+ ("stringIndexType", FormulaType.String),
("targetProjectParameters", FormulaType.UntypedObject),
("verbose", FormulaType.Boolean));
-
+
// -- Parameter 1 --
Assert.Equal("kind", function.RequiredParameters[0].Name);
Assert.Equal(FormulaType.String, function.RequiredParameters[0].FormulaType);
@@ -134,20 +134,20 @@ namespace Microsoft.PowerFx.Connectors.Tests
Assert.Equal("analysisInput", function.RequiredParameters[1].Name);
Assert.Equal(analysisInputRecordType, function.RequiredParameters[1].FormulaType);
Assert.Equal("A single conversational task to execute.", function.RequiredParameters[1].Description);
- Assert.Null(function.RequiredParameters[1].DefaultValue);
- Assert.NotNull(function.RequiredParameters[1].ConnectorType);
- Assert.Equal("analysisInput", function.RequiredParameters[1].ConnectorType.Name);
- Assert.Null(function.RequiredParameters[1].ConnectorType.DisplayName);
- Assert.Equal("The input ConversationItem and its optional parameters", function.RequiredParameters[1].ConnectorType.Description);
- Assert.Equal(analysisInputRecordType, function.RequiredParameters[1].ConnectorType.FormulaType);
- Assert.True(function.RequiredParameters[1].ConnectorType.IsRequired);
- Assert.Single(function.RequiredParameters[1].ConnectorType.Fields);
- Assert.Equal("conversationItem", function.RequiredParameters[1].ConnectorType.Fields[0].Name);
- Assert.Null(function.RequiredParameters[1].ConnectorType.Fields[0].DisplayName);
- Assert.Equal("The abstract base for a user input formatted conversation (e.g., Text, Transcript).", function.RequiredParameters[1].ConnectorType.Fields[0].Description);
- Assert.True(function.RequiredParameters[1].ConnectorType.Fields[0].IsRequired);
-
- // -- Parameter 3 --
+ Assert.Null(function.RequiredParameters[1].DefaultValue);
+ Assert.NotNull(function.RequiredParameters[1].ConnectorType);
+ Assert.Equal("analysisInput", function.RequiredParameters[1].ConnectorType.Name);
+ Assert.Null(function.RequiredParameters[1].ConnectorType.DisplayName);
+ Assert.Equal("The input ConversationItem and its optional parameters", function.RequiredParameters[1].ConnectorType.Description);
+ Assert.Equal(analysisInputRecordType, function.RequiredParameters[1].ConnectorType.FormulaType);
+ Assert.True(function.RequiredParameters[1].ConnectorType.IsRequired);
+ Assert.Single(function.RequiredParameters[1].ConnectorType.Fields);
+ Assert.Equal("conversationItem", function.RequiredParameters[1].ConnectorType.Fields[0].Name);
+ Assert.Null(function.RequiredParameters[1].ConnectorType.Fields[0].DisplayName);
+ Assert.Equal("The abstract base for a user input formatted conversation (e.g., Text, Transcript).", function.RequiredParameters[1].ConnectorType.Fields[0].Description);
+ Assert.True(function.RequiredParameters[1].ConnectorType.Fields[0].IsRequired);
+
+ // -- Parameter 3 --
Assert.Equal("parameters", function.RequiredParameters[2].Name);
Assert.Equal(parametersRecordType, function.RequiredParameters[2].FormulaType);
Assert.Equal("A single conversational task to execute.", function.RequiredParameters[2].Description);
@@ -163,7 +163,7 @@ namespace Microsoft.PowerFx.Connectors.Tests
Assert.Equal(FormulaType.String, function.HiddenRequiredParameters[0].FormulaType);
Assert.Equal("Client API version.", function.HiddenRequiredParameters[0].Description);
Assert.Equal("2022-05-01", function.HiddenRequiredParameters[0].DefaultValue.ToObject());
-
+
// -- Hidden Required Parameter 2 --
Assert.Equal("analysisInput", function.HiddenRequiredParameters[1].Name);
Assert.Equal(analysisInputRecordTypeH, function.HiddenRequiredParameters[1].FormulaType);
@@ -200,15 +200,15 @@ namespace Microsoft.PowerFx.Connectors.Tests
string returnTypeName = expectedReturnType.ToStringWithDisplayNames();
Assert.Equal(rt3Name, returnTypeName);
- Assert.True((FormulaType)expectedReturnType == returnType);
-
- ConnectorType connectorReturnType = function.ReturnParameterType;
- Assert.NotNull(connectorReturnType);
- Assert.Equal((FormulaType)expectedReturnType, connectorReturnType.FormulaType);
- Assert.Equal(2, connectorReturnType.Fields.Length);
- Assert.Equal("The results of a Conversation task.", connectorReturnType.Description);
+ Assert.True((FormulaType)expectedReturnType == returnType);
+
+ ConnectorType connectorReturnType = function.ReturnParameterType;
+ Assert.NotNull(connectorReturnType);
+ Assert.Equal((FormulaType)expectedReturnType, connectorReturnType.FormulaType);
+ Assert.Equal(2, connectorReturnType.Fields.Length);
+ Assert.Equal("The results of a Conversation task.", connectorReturnType.Description);
}
-
+
[Fact]
public void ACSL_GetFunctionParameters_SwaggerCompatibility()
{
@@ -217,17 +217,17 @@ namespace Microsoft.PowerFx.Connectors.Tests
Assert.Equal("ConversationAnalysisAnalyzeConversationConversation", function.Name);
Assert.Equal("ConversationAnalysis_AnalyzeConversation_Conversation", function.OriginalName);
- Assert.Equal("/apim/cognitiveservicestextanalytics/{connectionId}/language/:analyze-conversations", function.OperationPath);
-
- RecordType analysisInputRecordType = Extensions.MakeRecordType(
- ("conversationItem", Extensions.MakeRecordType(
- ("language", FormulaType.String),
+ Assert.Equal("/apim/cognitiveservicestextanalytics/{connectionId}/language/:analyze-conversations", function.OperationPath);
+
+ RecordType analysisInputRecordType = Extensions.MakeRecordType(
+ ("conversationItem", Extensions.MakeRecordType(
+ ("language", FormulaType.String),
("text", FormulaType.String))));
RecordType parametersRecordType = Extensions.MakeRecordType(
- ("deploymentName", FormulaType.String),
- ("projectName", FormulaType.String),
+ ("deploymentName", FormulaType.String),
+ ("projectName", FormulaType.String),
("verbose", FormulaType.Boolean));
-
+
Assert.Equal(2, function.RequiredParameters.Length);
Assert.Equal(3, function.HiddenRequiredParameters.Length);
Assert.Empty(function.OptionalParameters);
@@ -236,20 +236,20 @@ namespace Microsoft.PowerFx.Connectors.Tests
Assert.Equal("analysisInput", function.RequiredParameters[0].Name);
Assert.Equal(analysisInputRecordType, function.RequiredParameters[0].FormulaType);
Assert.Equal("A single conversational task to execute.", function.RequiredParameters[0].Description);
- Assert.Null(function.RequiredParameters[0].DefaultValue);
- Assert.NotNull(function.RequiredParameters[0].ConnectorType);
- Assert.Equal("analysisInput", function.RequiredParameters[0].ConnectorType.Name);
- Assert.Null(function.RequiredParameters[0].ConnectorType.DisplayName);
- Assert.Equal("The input ConversationItem and its optional parameters", function.RequiredParameters[0].ConnectorType.Description);
- Assert.Equal(analysisInputRecordType, function.RequiredParameters[0].ConnectorType.FormulaType);
- Assert.True(function.RequiredParameters[0].ConnectorType.IsRequired);
- Assert.Single(function.RequiredParameters[0].ConnectorType.Fields);
- Assert.Equal("conversationItem", function.RequiredParameters[0].ConnectorType.Fields[0].Name);
- Assert.Null(function.RequiredParameters[0].ConnectorType.Fields[0].DisplayName);
- Assert.Equal("The abstract base for a user input formatted conversation (e.g., Text, Transcript).", function.RequiredParameters[0].ConnectorType.Fields[0].Description);
- Assert.True(function.RequiredParameters[0].ConnectorType.Fields[0].IsRequired);
-
- // -- Parameter 2 --
+ Assert.Null(function.RequiredParameters[0].DefaultValue);
+ Assert.NotNull(function.RequiredParameters[0].ConnectorType);
+ Assert.Equal("analysisInput", function.RequiredParameters[0].ConnectorType.Name);
+ Assert.Null(function.RequiredParameters[0].ConnectorType.DisplayName);
+ Assert.Equal("The input ConversationItem and its optional parameters", function.RequiredParameters[0].ConnectorType.Description);
+ Assert.Equal(analysisInputRecordType, function.RequiredParameters[0].ConnectorType.FormulaType);
+ Assert.True(function.RequiredParameters[0].ConnectorType.IsRequired);
+ Assert.Single(function.RequiredParameters[0].ConnectorType.Fields);
+ Assert.Equal("conversationItem", function.RequiredParameters[0].ConnectorType.Fields[0].Name);
+ Assert.Null(function.RequiredParameters[0].ConnectorType.Fields[0].DisplayName);
+ Assert.Equal("The abstract base for a user input formatted conversation (e.g., Text, Transcript).", function.RequiredParameters[0].ConnectorType.Fields[0].Description);
+ Assert.True(function.RequiredParameters[0].ConnectorType.Fields[0].IsRequired);
+
+ // -- Parameter 2 --
Assert.Equal("parameters", function.RequiredParameters[1].Name);
Assert.Equal(parametersRecordType, function.RequiredParameters[1].FormulaType);
Assert.Equal("A single conversational task to execute.", function.RequiredParameters[1].Description);
@@ -308,23 +308,23 @@ namespace Microsoft.PowerFx.Connectors.Tests
string returnTypeName = expectedReturnType.ToStringWithDisplayNames();
Assert.Equal(rt3Name, returnTypeName);
- Assert.True((FormulaType)expectedReturnType == returnType);
-
- ConnectorType connectorReturnType = function.ReturnParameterType;
- Assert.NotNull(connectorReturnType);
- Assert.Equal((FormulaType)expectedReturnType, connectorReturnType.FormulaType);
- Assert.Equal(2, connectorReturnType.Fields.Length);
- Assert.Equal("The results of a Conversation task.", connectorReturnType.Description);
+ Assert.True((FormulaType)expectedReturnType == returnType);
+
+ ConnectorType connectorReturnType = function.ReturnParameterType;
+ Assert.NotNull(connectorReturnType);
+ Assert.Equal((FormulaType)expectedReturnType, connectorReturnType.FormulaType);
+ Assert.Equal(2, connectorReturnType.Fields.Length);
+ Assert.Equal("The results of a Conversation task.", connectorReturnType.Description);
}
-
+
[Fact]
public async Task ACSL_InvokeFunction()
{
using var testConnector = new LoggingTestServer(@"Swagger\Azure Cognitive Service for Language.json", _output);
OpenApiDocument apiDoc = testConnector._apiDocument;
- ConsoleLogger logger = new ConsoleLogger(_output);
+ ConsoleLogger logger = new ConsoleLogger(_output);
- PowerFxConfig pfxConfig = new PowerFxConfig(Features.PowerFxV1);
+ PowerFxConfig pfxConfig = new PowerFxConfig(Features.PowerFxV1);
ConnectorFunction function = OpenApiParser.GetFunctions(new ConnectorSettings("ACSL") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, apiDoc).OrderBy(cf => cf.Name).ToList()[14];
Assert.Equal("ConversationAnalysisAnalyzeConversationConversation", function.Name);
Assert.Equal("![kind:s, result:![detectedLanguage:s, prediction:![entities:*[category:s, confidenceScore:w, extraInformation:O, length:w, offset:w, resolutions:O, text:s], intents:*[category:s, confidenceScore:w], projectKind:s, topIntent:s], query:s]]", function.ReturnType.ToStringWithDisplayNames());
@@ -334,32 +334,32 @@ namespace Microsoft.PowerFx.Connectors.Tests
string analysisInput = @"{ conversationItem: { modality: ""text"", language: ""en-us"", text: ""Book me a flight for Munich"" } }";
string parameters = @"{ deploymentName: ""deploy1"", projectName: ""project1"", verbose: true, stringIndexType: ""TextElement_V8"" }";
FormulaValue analysisInputParam = engine.Eval(analysisInput);
- FormulaValue parametersParam = engine.Eval(parameters);
+ FormulaValue parametersParam = engine.Eval(parameters);
FormulaValue kind = FormulaValue.New("Conversation");
-
+
using var httpClient = new HttpClient(testConnector);
testConnector.SetResponseFromFile(@"Responses\Azure Cognitive Service for Language_Response.json");
using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://lucgen-apim.azure-api.net", "aaa373836ffd4915bf6eefd63d164adc" /* environment Id */, "16e7c181-2f8d-4cae-b1f0-179c5c4e4d8b" /* connectionId */, () => "No Auth", httpClient)
{
SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878",
- };
-
- BaseRuntimeConnectorContext context = new TestConnectorRuntimeContext("ACSL", client, console: _output);
-
- FormulaValue httpResult = await function.InvokeAsync(new FormulaValue[] { analysisInputParam, parametersParam }, context, CancellationToken.None).ConfigureAwait(false);
- httpClient.Dispose();
- client.Dispose();
- testConnector.Dispose();
-
- using var testConnector2 = new LoggingTestServer(@"Swagger\Azure Cognitive Service for Language.json", _output);
+ };
+
+ BaseRuntimeConnectorContext context = new TestConnectorRuntimeContext("ACSL", client, console: _output);
+
+ FormulaValue httpResult = await function.InvokeAsync(new FormulaValue[] { analysisInputParam, parametersParam }, context, CancellationToken.None).ConfigureAwait(false);
+ httpClient.Dispose();
+ client.Dispose();
+ testConnector.Dispose();
+
+ using var testConnector2 = new LoggingTestServer(@"Swagger\Azure Cognitive Service for Language.json", _output);
using var httpClient2 = new HttpClient(testConnector2);
testConnector2.SetResponseFromFile(@"Responses\Azure Cognitive Service for Language_Response.json");
using PowerPlatformConnectorClient client2 = new PowerPlatformConnectorClient("https://lucgen-apim.azure-api.net", "aaa373836ffd4915bf6eefd63d164adc" /* environment Id */, "16e7c181-2f8d-4cae-b1f0-179c5c4e4d8b" /* connectionId */, () => "No Auth", httpClient2)
{
SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878",
};
-
- BaseRuntimeConnectorContext context2 = new TestConnectorRuntimeContext("ACSL", client2, console: _output);
+
+ BaseRuntimeConnectorContext context2 = new TestConnectorRuntimeContext("ACSL", client2, console: _output);
FormulaValue httpResult2 = await function.InvokeAsync(new FormulaValue[] { analysisInputParam, parametersParam }, context2, CancellationToken.None).ConfigureAwait(false);
@@ -402,54 +402,54 @@ namespace Microsoft.PowerFx.Connectors.Tests
";
Assert.Equal(expectedInput.Replace("\r\n", "\n").Replace("\r", "\n"), input.Replace("\r\n", "\n").Replace("\r", "\n"));
- }
-
+ }
+
[Fact]
public async Task AzureOpenAiGetFunctions()
{
using var testConnector = new LoggingTestServer(@"Swagger\Azure Open AI.json", _output);
OpenApiDocument apiDoc = testConnector._apiDocument;
- PowerFxConfig pfxConfig = new PowerFxConfig(Features.PowerFxV1);
- ConnectorFunction[] functions = OpenApiParser.GetFunctions("OpenAI", apiDoc, new ConsoleLogger(_output)).OrderBy(cf => cf.Name).ToArray();
-
- Assert.Equal("ChatCompletionsCreate", functions[0].Name);
- Assert.Equal("![choices:*[finish_reason:s, index:w, message:![content:s, role:s]], created:w, id:s, model:s, object:s, usage:![completion_tokens:w, prompt_tokens:w, total_tokens:w]]", functions[0].ReturnType.ToStringWithDisplayNames());
-
- Assert.Equal("CompletionsCreate", functions[1].Name);
- Assert.Equal("![choices:*[finish_reason:s, index:w, logprobs:![text_offset:*[Value:w], token_logprobs:*[Value:w], tokens:*[Value:s], top_logprobs:*[]], text:s], created:w, id:s, model:s, object:s, usage:![completion_tokens:w, prompt_tokens:w, total_tokens:w]]", functions[1].ReturnType.ToStringWithDisplayNames());
-
- Assert.Equal("ExtensionsChatCompletionsCreate", functions[2].Name);
- Assert.Equal("![choices:*[content_filter_results:![error:![code:s, message:s], hate:![filtered:b, severity:s], self_harm:![filtered:b, severity:s], sexual:![filtered:b, severity:s], violence:![filtered:b, severity:s]], finish_reason:s, index:w, messages:*[content:s, end_turn:b, index:w, recipient:s, role:s]], created:w, id:s, model:s, object:s, prompt_filter_results:*[content_filter_results:![error:![code:s, message:s], hate:![filtered:b, severity:s], self_harm:![filtered:b, severity:s], sexual:![filtered:b, severity:s], violence:![filtered:b, severity:s]], prompt_index:w], usage:![completion_tokens:w, prompt_tokens:w, total_tokens:w]]", functions[2].ReturnType.ToStringWithDisplayNames());
- }
-
+ PowerFxConfig pfxConfig = new PowerFxConfig(Features.PowerFxV1);
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions("OpenAI", apiDoc, new ConsoleLogger(_output)).OrderBy(cf => cf.Name).ToArray();
+
+ Assert.Equal("ChatCompletionsCreate", functions[0].Name);
+ Assert.Equal("![choices:*[finish_reason:s, index:w, message:![content:s, role:s]], created:w, id:s, model:s, object:s, usage:![completion_tokens:w, prompt_tokens:w, total_tokens:w]]", functions[0].ReturnType.ToStringWithDisplayNames());
+
+ Assert.Equal("CompletionsCreate", functions[1].Name);
+ Assert.Equal("![choices:*[finish_reason:s, index:w, logprobs:![text_offset:*[Value:w], token_logprobs:*[Value:w], tokens:*[Value:s], top_logprobs:*[]], text:s], created:w, id:s, model:s, object:s, usage:![completion_tokens:w, prompt_tokens:w, total_tokens:w]]", functions[1].ReturnType.ToStringWithDisplayNames());
+
+ Assert.Equal("ExtensionsChatCompletionsCreate", functions[2].Name);
+ Assert.Equal("![choices:*[content_filter_results:![error:![code:s, message:s], hate:![filtered:b, severity:s], self_harm:![filtered:b, severity:s], sexual:![filtered:b, severity:s], violence:![filtered:b, severity:s]], finish_reason:s, index:w, messages:*[content:s, end_turn:b, index:w, recipient:s, role:s]], created:w, id:s, model:s, object:s, prompt_filter_results:*[content_filter_results:![error:![code:s, message:s], hate:![filtered:b, severity:s], self_harm:![filtered:b, severity:s], sexual:![filtered:b, severity:s], violence:![filtered:b, severity:s]], prompt_index:w], usage:![completion_tokens:w, prompt_tokens:w, total_tokens:w]]", functions[2].ReturnType.ToStringWithDisplayNames());
+ }
+
[Fact]
public async Task ACSL_InvokeFunction_v21()
{
using var testConnector = new LoggingTestServer(@"Swagger\Azure Cognitive Service for Language v2.1.json", _output);
OpenApiDocument apiDoc = testConnector._apiDocument;
- ConsoleLogger logger = new ConsoleLogger(_output);
+ ConsoleLogger logger = new ConsoleLogger(_output);
PowerFxConfig pfxConfig = new PowerFxConfig(Features.PowerFxV1);
using var httpClient = new HttpClient(testConnector);
testConnector.SetResponseFromFile(@"Responses\Azure Cognitive Service for Language v2.1_Response.json");
-
+
var xx = OpenApiParser.GetFunctions("ACSL", apiDoc, logger).OrderBy(cf => cf.Name).ToList();
ConnectorFunction function = OpenApiParser.GetFunctions("ACSL", apiDoc, logger).OrderBy(cf => cf.Name).ToList()[11];
Assert.Equal("ConversationAnalysisAnalyzeConversationConversation", function.Name);
Assert.Equal("![kind:s, result:![detectedLanguage:s, prediction:![entities:*[category:s, confidenceScore:w, extraInformation:O, length:w, multipleResolutions:b, offset:w, resolutions:O, text:s, topResolution:O], intents:*[category:s, confidenceScore:w], projectKind:s, topIntent:s], query:s]]", function.ReturnType.ToStringWithDisplayNames());
- RecalcEngine engine = new RecalcEngine(pfxConfig);
+ RecalcEngine engine = new RecalcEngine(pfxConfig);
string analysisInput = @"{ conversationItem: { modality: ""text"", language: ""en-us"", text: ""Book me a flight for Munich"" } }";
string parameters = @"{ deploymentName: ""deploy1"", projectName: ""project1"", verbose: true, stringIndexType: ""TextElement_V8"" }";
FormulaValue analysisInputParam = engine.Eval(analysisInput);
- FormulaValue parametersParam = engine.Eval(parameters);
+ FormulaValue parametersParam = engine.Eval(parameters);
FormulaValue kind = FormulaValue.New("Conversation");
- using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://lucgen-apim.azure-api.net", "aaa373836ffd4915bf6eefd63d164adc" /* environment Id */, "16e7c181-2f8d-4cae-b1f0-179c5c4e4d8b" /* connectionId */, () => "No Auth", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878", };
- BaseRuntimeConnectorContext context = new TestConnectorRuntimeContext("ACSL", client, console: _output);
-
+ using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://lucgen-apim.azure-api.net", "aaa373836ffd4915bf6eefd63d164adc" /* environment Id */, "16e7c181-2f8d-4cae-b1f0-179c5c4e4d8b" /* connectionId */, () => "No Auth", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878", };
+ BaseRuntimeConnectorContext context = new TestConnectorRuntimeContext("ACSL", client, console: _output);
+
FormulaValue httpResult = await function.InvokeAsync(new FormulaValue[] { kind, analysisInputParam, parametersParam }, context, CancellationToken.None).ConfigureAwait(false);
Assert.NotNull(httpResult);
@@ -465,7 +465,7 @@ namespace Microsoft.PowerFx.Connectors.Tests
RecordValue entityValue2 = rows.Skip(1).First().Value;
FormulaValue resolutionsValue = entityValue2.GetField("resolutions");
- Assert.True(resolutionsValue is UntypedObjectValue);
+ Assert.True(resolutionsValue is UntypedObjectValue);
UOValueVisitor visitor1 = new UOValueVisitor();
resolutionsValue.Visit(visitor1);
@@ -478,10 +478,10 @@ namespace Microsoft.PowerFx.Connectors.Tests
topResolutionValue1.Visit(visitor2);
Assert.Equal("{\"resolutionKind\":\"DateTimeResolution\",\"value\":\"2023-02-25\"}", visitor2.Result);
- }
-
+ }
+
internal class UOValueVisitor : IValueVisitor
- {
+ {
public string Result { get; private set; }
public void Visit(BlankValue value)
@@ -575,11 +575,11 @@ namespace Microsoft.PowerFx.Connectors.Tests
Result = value.Value.ToString();
}
- public void Visit(BlobValue value)
- {
- Result = value.Content.GetAsBase64Async(CancellationToken.None).Result;
- }
-
+ public void Visit(BlobValue value)
+ {
+ Result = value.Content.GetAsBase64Async(CancellationToken.None).Result;
+ }
+
private void Visit(IUntypedObject untypedObject)
{
var type = untypedObject.Type;
@@ -600,8 +600,8 @@ namespace Microsoft.PowerFx.Connectors.Tests
{
if (externalType.Kind == ExternalTypeKind.Array)
{
- var rows = new List();
-
+ var rows = new List();
+
for (var i = 0; i < untypedObject.GetArrayLength(); i++)
{
var row = untypedObject[i];
@@ -642,8 +642,8 @@ namespace Microsoft.PowerFx.Connectors.Tests
public void LQA_Load()
{
OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\Language - Question Answering.json", _output);
- (List connectorFunctions, List texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("LQA"), doc, new ConsoleLogger(_output));
- Assert.Contains(texlFunctions, func => func.Namespace.Name.Value == "LQA" && func.Name == "GetAnswersFromText");
+ (List connectorFunctions, List texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("LQA"), doc, new ConsoleLogger(_output));
+ Assert.Contains(texlFunctions, func => func.Namespace.Name.Value == "LQA" && func.Name == "GetAnswersFromText");
}
[Fact]
@@ -651,508 +651,508 @@ namespace Microsoft.PowerFx.Connectors.Tests
{
OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\SQL Server.json", _output);
(List connectorFunctions, List texlFunctions) = OpenApiParser.ParseInternal(new ConnectorSettings("SQL") { IncludeInternalFunctions = true }, doc, new ConsoleLogger(_output));
- Assert.Contains(texlFunctions, func => func.Namespace.Name.Value == "SQL" && func.Name == "GetProcedureV2");
- }
-
- [Fact]
- public void Dataverse_Sample()
- {
- OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\DataverseSample.json", _output);
- ConnectorFunction[] functions = OpenApiParser.GetFunctions("DV", doc, new ConsoleLogger(_output)).ToArray();
-
- Assert.NotNull(functions);
- Assert.Equal(3, functions.Count());
-
- Assert.Equal(new List() { "GetLead", "PostLead", "QualifyLead" }, functions.Select(f => f.Name).ToList());
- Assert.Equal(new List() { "GetLead", "PostLead", "QualifyLead" }, functions.Select(f => f.OriginalName).ToList());
-
- // "x-ms-require-user-confirmation"
- Assert.Equal(new List() { false, true, true }, functions.Select(f => f.RequiresUserConfirmation).ToList());
-
- // "x-ms-explicit-input" in "QualifyLead" function parameters
- Assert.Equal(4, functions[2].RequiredParameters.Length);
- Assert.False(functions[2].RequiredParameters[0].ConnectorType.ExplicitInput); // "leadId"
- Assert.True(functions[2].RequiredParameters[1].ConnectorType.ExplicitInput); // "CreateAccount"
- Assert.True(functions[2].RequiredParameters[2].ConnectorType.ExplicitInput); // "CreateContact"
- Assert.True(functions[2].RequiredParameters[3].ConnectorType.ExplicitInput); // "CreateOpportunity"
- Assert.Single(functions[2].HiddenRequiredParameters);
- Assert.False(functions[2].HiddenRequiredParameters[0].ConnectorType.ExplicitInput); // "Status"
- Assert.Empty(functions[2].OptionalParameters);
-
- // "x-ms-visibility"
- (0..3).ForAll(i => Assert.Equal(Visibility.None, functions[2].RequiredParameters[i].ConnectorType.Visibility));
- Assert.Equal(Visibility.Internal, functions[2].HiddenRequiredParameters[0].ConnectorType.Visibility); // "Status"
-
- // "enum"
- Assert.Equal(FormulaType.Decimal, functions[1].OptionalParameters[2].ConnectorType.FormulaType); // "leadsourcecode"
- Assert.True(functions[1].OptionalParameters[2].ConnectorType.IsEnum);
- Assert.Equal(Enumerable.Range(1, 10).Select(i => (decimal)i).ToArray(), functions[1].OptionalParameters[2].ConnectorType.EnumValues.Select(fv => (decimal)fv.ToObject()));
- Assert.Equal("Advertisement, Employee Referral, External Referral, Partner, Public Relations, Seminar, Trade Show, Web, Word of Mouth, Other", string.Join(", ", functions[1].OptionalParameters[2].ConnectorType.EnumDisplayNames));
- Assert.Equal(4m, functions[1].OptionalParameters[2].ConnectorType.Enum["Partner"].ToObject());
-
- // "x-ms-enum-display-name"
- Assert.NotNull(functions[1].OptionalParameters[2].ConnectorType.EnumDisplayNames);
- Assert.Equal("Advertisement", functions[1].OptionalParameters[2].ConnectorType.EnumDisplayNames[0]);
- Assert.Equal("Employee Referral", functions[1].OptionalParameters[2].ConnectorType.EnumDisplayNames[1]);
-
- Assert.True(functions[1].RequiredParameters[2].ConnectorType.IsEnum); // "msdyn_company@odata.bind"
- Assert.Equal("2b629105-4a26-4607-97a5-0715059e0a55", functions[1].RequiredParameters[2].ConnectorType.EnumValues[0].ToObject());
- Assert.Equal("5cacddd3-d47f-4023-a68e-0ce3e0d401fb", functions[1].RequiredParameters[2].ConnectorType.EnumValues[1].ToObject());
- Assert.Equal("INMF", functions[1].RequiredParameters[2].ConnectorType.EnumDisplayNames[0]);
- Assert.Equal("MYMF", functions[1].RequiredParameters[2].ConnectorType.EnumDisplayNames[1]);
- }
-
- [Fact]
- public void VisibilityTest()
- {
- OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\AzureBlobStorage.json", _output);
- ConnectorFunction[] functions = OpenApiParser.GetFunctions("AzBlob", doc, new ConsoleLogger(_output)).ToArray();
-
- ConnectorFunction createFileV2 = functions.First(f => f.Name == "CreateFileV2");
-
- Assert.Equal(4, createFileV2.RequiredParameters.Length);
- Assert.Equal(3, createFileV2.OptionalParameters.Length);
- Assert.Empty(createFileV2.HiddenRequiredParameters);
-
- Assert.Equal("important", createFileV2.Visibility);
-
- Assert.Equal("dataset", createFileV2.RequiredParameters[0].Name);
- Assert.Equal("folderPath", createFileV2.RequiredParameters[1].Name);
- Assert.Equal("name", createFileV2.RequiredParameters[2].Name);
- Assert.Equal("file", createFileV2.RequiredParameters[3].Name);
- Assert.Equal(FormulaType.Blob, createFileV2.RequiredParameters[3].FormulaType);
- (0..3).ForAll(i => Assert.Equal(Visibility.None, createFileV2.RequiredParameters[i].ConnectorType.Visibility));
-
- Assert.Equal("queryParametersSingleEncoded", createFileV2.OptionalParameters[0].Name);
- Assert.Equal("Content-Type", createFileV2.OptionalParameters[1].Name);
- Assert.Equal("ReadFileMetadataFromServer", createFileV2.OptionalParameters[2].Name);
- Assert.Equal(Visibility.Internal, createFileV2.OptionalParameters[0].ConnectorType.Visibility);
- Assert.Equal(Visibility.Advanced, createFileV2.OptionalParameters[1].ConnectorType.Visibility);
- Assert.Equal(Visibility.Internal, createFileV2.OptionalParameters[2].ConnectorType.Visibility);
-
- Assert.Equal(Visibility.None, createFileV2.ReturnParameterType.Visibility);
-
- ConnectorFunction listFolderV4 = functions.First(f => f.Name == "ListFolderV4");
-
- Assert.Equal(Visibility.None, listFolderV4.ReturnParameterType.Visibility);
- Assert.Equal(Visibility.None, listFolderV4.ReturnParameterType.Fields[0].Visibility);
- Assert.Equal(Visibility.Advanced, listFolderV4.ReturnParameterType.Fields[1].Visibility);
- Assert.Equal(Visibility.Advanced, listFolderV4.ReturnParameterType.Fields[2].Visibility);
- }
-
- [Fact]
- public void DynamicReturnValueTest()
- {
- using HttpClient httpClient = new ();
- OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\SQL Server.json", _output);
- ConnectorFunction[] functions = OpenApiParser.GetFunctions("SQL", doc, new ConsoleLogger(_output)).ToArray();
-
- ConnectorFunction createFileV2 = functions.First(f => f.Name == "ExecuteProcedureV2");
-
- Assert.Equal(4, createFileV2.RequiredParameters.Length);
- Assert.Empty(createFileV2.OptionalParameters);
- Assert.Empty(createFileV2.HiddenRequiredParameters);
-
- Assert.NotNull(createFileV2.DynamicReturnSchema);
- Assert.Null(createFileV2.DynamicReturnProperty);
-
- Assert.Equal("GetProcedureV2", createFileV2.DynamicReturnSchema.OperationId);
- Assert.NotNull(createFileV2.DynamicReturnSchema.ConnectorFunction);
- Assert.Equal("GetProcedureV2", createFileV2.DynamicReturnSchema.ConnectorFunction.Name);
- Assert.Equal("schema/procedureresultschema", createFileV2.DynamicReturnSchema.ValuePath);
- Assert.Equal(3, createFileV2.DynamicReturnSchema.ParameterMap.Count);
-
- Assert.True(createFileV2.DynamicReturnSchema.ParameterMap["server"] is DynamicConnectorExtensionValue dv1 && dv1.Reference == "server");
- Assert.True(createFileV2.DynamicReturnSchema.ParameterMap["database"] is DynamicConnectorExtensionValue dv2 && dv2.Reference == "database");
- Assert.True(createFileV2.DynamicReturnSchema.ParameterMap["procedure"] is DynamicConnectorExtensionValue dv3 && dv3.Reference == "procedure");
-
- ConnectorFunction executePassThroughNativeQueryV2 = functions.First(f => f.Name == "ExecutePassThroughNativeQueryV2");
-
- Assert.Equal(2, executePassThroughNativeQueryV2.RequiredParameters.Length);
- Assert.Equal(3, executePassThroughNativeQueryV2.OptionalParameters.Length);
- Assert.Empty(executePassThroughNativeQueryV2.HiddenRequiredParameters);
-
- Assert.NotNull(executePassThroughNativeQueryV2.DynamicReturnSchema);
- Assert.NotNull(executePassThroughNativeQueryV2.DynamicReturnProperty);
-
- Assert.Equal("GetPassThroughNativeQueryMetadataV2", executePassThroughNativeQueryV2.DynamicReturnSchema.OperationId);
- Assert.NotNull(executePassThroughNativeQueryV2.DynamicReturnSchema.ConnectorFunction);
- Assert.Equal("GetPassThroughNativeQueryMetadataV2", executePassThroughNativeQueryV2.DynamicReturnSchema.ConnectorFunction.Name);
- Assert.Equal("schema/queryresults", executePassThroughNativeQueryV2.DynamicReturnSchema.ValuePath);
- Assert.Equal(4, executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap.Count);
- Assert.True(executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap["server"] is DynamicConnectorExtensionValue dv4 && dv4.Reference == "server");
- Assert.True(executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap["database"] is DynamicConnectorExtensionValue dv5 && dv5.Reference == "database");
- Assert.True(executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap["query"] is DynamicConnectorExtensionValue dv6 && dv6.Reference == "query");
- Assert.True(executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap["formalParameters"] is DynamicConnectorExtensionValue dv7 && dv7.Reference == "formalParameters");
-
- Assert.Equal("GetPassThroughNativeQueryMetadataV2", executePassThroughNativeQueryV2.DynamicReturnProperty.OperationId);
- Assert.NotNull(executePassThroughNativeQueryV2.DynamicReturnProperty.ConnectorFunction);
- Assert.Equal("GetPassThroughNativeQueryMetadataV2", executePassThroughNativeQueryV2.DynamicReturnProperty.ConnectorFunction.Name);
- Assert.Equal("schema/queryresults", executePassThroughNativeQueryV2.DynamicReturnProperty.ItemValuePath);
- Assert.Equal(4, executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap.Count);
- Assert.True(executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap["server"] is DynamicConnectorExtensionValue dv8 && dv8.Reference == "server");
- Assert.True(executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap["database"] is DynamicConnectorExtensionValue dv9 && dv9.Reference == "database");
- Assert.True(executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap["query/query"] is DynamicConnectorExtensionValue dv10 && dv10.Reference == "query/query");
- Assert.True(executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap["query/formalParameters"] is DynamicConnectorExtensionValue dv11 && dv11.Reference == "query/formalParameters");
- }
-
- [Fact]
- public async Task DirectIntellisenseTest()
- {
- using var testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
- using var httpClient = new HttpClient(testConnector);
- using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1002-002.azure-apihub.net", "ddadf2c7-ebdd-ec01-a5d1-502dc07f04b4" /* environment Id */, "4bf9a87fc9054b6db3a4d07a1c1f5a5b" /* connectionId */, () => "eyJ0eXAi...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
-
- BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("SQL", client, console: _output);
-
- ConnectorFunction[] functions = OpenApiParser.GetFunctions("SQL", testConnector._apiDocument, new ConsoleLogger(_output)).ToArray();
- ConnectorFunction executeProcedureV2 = functions.First(f => f.Name == "ExecuteProcedureV2");
-
- Assert.True(executeProcedureV2.RequiredParameters[0].SupportsDynamicIntellisense);
- Assert.True(executeProcedureV2.RequiredParameters[1].SupportsDynamicIntellisense);
- Assert.True(executeProcedureV2.RequiredParameters[2].SupportsDynamicIntellisense);
- Assert.True(executeProcedureV2.RequiredParameters[3].SupportsDynamicIntellisense);
-
- // Keeping only for debugging
- //FormulaValue result = await executeProcedureV2.InvokeAync(client, new FormulaValue[]
- //{
- // FormulaValue.New("pfxdev-sql.database.windows.net"),
- // FormulaValue.New("connectortest"),
- // FormulaValue.New("sp_1"),
- // FormulaValue.NewRecordFromFields(new NamedValue[] { new NamedValue("p1", FormulaValue.New(38)) })
- //}, CancellationToken.None).ConfigureAwait(false);
-
- testConnector.SetResponseFromFile(@"Responses\SQL Server Intellisense Response 3.json");
- ConnectorParameters parameters1 = await executeProcedureV2.GetParameterSuggestionsAsync(
- new NamedValue[]
- {
- new NamedValue("server", FormulaValue.New("pfxdev-sql.database.windows.net")),
- new NamedValue("database", FormulaValue.New("connectortest"))
- },
- executeProcedureV2.RequiredParameters[2], // procedure
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- ConnectorParameterWithSuggestions suggestions1 = parameters1.ParametersWithSuggestions[2];
- Assert.NotNull(suggestions1);
- Assert.NotNull(suggestions1.Suggestions);
- Assert.Equal(2, suggestions1.Suggestions.Count());
-
- testConnector.SetResponseFromFile(@"Responses\SQL Server Intellisense Response2 1.json");
- ConnectorParameters parameters2 = await executeProcedureV2.GetParameterSuggestionsAsync(
- new NamedValue[]
- {
- new NamedValue("server", FormulaValue.New("pfxdev-sql.database.windows.net")),
- new NamedValue("database", FormulaValue.New("connectortest")),
- new NamedValue("procedure", FormulaValue.New("sp_1"))
- },
- executeProcedureV2.RequiredParameters[3], // parameters
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- ConnectorParameterWithSuggestions suggestions2 = parameters2.ParametersWithSuggestions[3];
- Assert.NotNull(suggestions2);
- Assert.NotNull(suggestions2.Suggestions);
- Assert.Single(suggestions2.Suggestions);
-
- Assert.True(executeProcedureV2.ReturnParameterType.SupportsDynamicIntellisense);
-
- testConnector.SetResponseFromFile(@"Responses\SQL Server Intellisense Response2 1.json");
- ConnectorType returnType = await executeProcedureV2.GetConnectorReturnTypeAsync(
- new NamedValue[]
- {
- new NamedValue("server", FormulaValue.New("pfxdev-sql.database.windows.net")),
- new NamedValue("database", FormulaValue.New("connectortest")),
- new NamedValue("procedure", FormulaValue.New("sp_1"))
- },
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- Assert.NotNull(returnType);
- Assert.True(returnType.FormulaType is RecordType);
-
- string input = testConnector._log.ToString();
- var version = PowerPlatformConnectorClient.Version;
- string expected = $@"POST https://tip1002-002.azure-apihub.net/invoke
- authority: tip1002-002.azure-apihub.net
- Authorization: Bearer eyJ0eXAi...
- path: /invoke
- scheme: https
- x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/ddadf2c7-ebdd-ec01-a5d1-502dc07f04b4
- x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
- x-ms-request-method: GET
- x-ms-request-url: /apim/sql/4bf9a87fc9054b6db3a4d07a1c1f5a5b/v2/datasets/pfxdev-sql.database.windows.net,connectortest/procedures
- x-ms-user-agent: PowerFx/{version}
-POST https://tip1002-002.azure-apihub.net/invoke
- authority: tip1002-002.azure-apihub.net
- Authorization: Bearer eyJ0eXAi...
- path: /invoke
- scheme: https
- x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/ddadf2c7-ebdd-ec01-a5d1-502dc07f04b4
- x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
- x-ms-request-method: GET
- x-ms-request-url: /apim/sql/4bf9a87fc9054b6db3a4d07a1c1f5a5b/v2/$metadata.json/datasets/pfxdev-sql.database.windows.net,connectortest/procedures/sp_1
- x-ms-user-agent: PowerFx/{version}
-POST https://tip1002-002.azure-apihub.net/invoke
- authority: tip1002-002.azure-apihub.net
- Authorization: Bearer eyJ0eXAi...
- path: /invoke
- scheme: https
- x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/ddadf2c7-ebdd-ec01-a5d1-502dc07f04b4
- x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
- x-ms-request-method: GET
- x-ms-request-url: /apim/sql/4bf9a87fc9054b6db3a4d07a1c1f5a5b/v2/$metadata.json/datasets/pfxdev-sql.database.windows.net,connectortest/procedures/sp_1
- x-ms-user-agent: PowerFx/{version}
-";
-
- Assert.Equal(expected, input);
- }
-
- [Fact]
- public async Task DataverseTest()
- {
- using var testConnector = new LoggingTestServer(@"Swagger\Dataverse.json", _output);
- using var httpClient = new HttpClient(testConnector);
- using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1-shared.azure-apim.net", "Default-9f6be790-4a16-4dd6-9850-44a0d2649aef" /* environment Id */, "461a30624723445c9ba87313d8bbefa3" /* connectionId */, () => "eyJ0eXAiO...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
-
- BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("DV", client, console: _output);
-
- ConnectorFunction[] functions = OpenApiParser.GetFunctions(new ConnectorSettings("DV") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, testConnector._apiDocument).ToArray();
- ConnectorFunction createRecord = functions.First(f => f.Name == "CreateRecordWithOrganization");
-
- testConnector.SetResponseFromFile(@"Responses\Dataverse_Response_1.json");
- ConnectorParameters parameters1 = await createRecord.GetParameterSuggestionsAsync(
- new NamedValue[]
- {
- new NamedValue("organization", FormulaValue.New("https://org283e9949.crm10.dynamics.com"))
- },
- createRecord.RequiredParameters[1], // entityName
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- ConnectorParameterWithSuggestions suggestions1 = parameters1.ParametersWithSuggestions[1];
- Assert.Equal(651, suggestions1.Suggestions.Count);
- Assert.Equal("AAD Users", suggestions1.Suggestions[0].DisplayName);
- Assert.Equal("aadusers", ((StringValue)suggestions1.Suggestions[0].Suggestion).Value);
-
- testConnector.SetResponseFromFile(@"Responses\Dataverse_Response_2.json");
- ConnectorParameters parameters2 = await createRecord.GetParameterSuggestionsAsync(
- new NamedValue[]
- {
- new NamedValue("organization", FormulaValue.New("https://org283e9949.crm10.dynamics.com")),
- new NamedValue("entityName", FormulaValue.New("accounts"))
- },
- createRecord.RequiredParameters[2], // item
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- ConnectorParameterWithSuggestions suggestions2 = parameters2.ParametersWithSuggestions[2];
- Assert.Equal(119, suggestions2.Suggestions.Count);
- Assert.Equal("accountcategorycode", suggestions2.Suggestions[0].DisplayName);
- Assert.Equal("Decimal", suggestions2.Suggestions[0].Suggestion.Type.ToString());
-
- string input = testConnector._log.ToString();
- var version = PowerPlatformConnectorClient.Version;
- string expected = @$"POST https://tip1-shared.azure-apim.net/invoke
- authority: tip1-shared.azure-apim.net
- Authorization: Bearer eyJ0eXAiO...
- organization: https://org283e9949.crm10.dynamics.com
- path: /invoke
- scheme: https
- x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/Default-9f6be790-4a16-4dd6-9850-44a0d2649aef
- x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
- x-ms-request-method: POST
- x-ms-request-url: /apim/commondataserviceforapps/461a30624723445c9ba87313d8bbefa3/v1.0/$metadata.json/GetEntityListEnum/GetEntitiesWithOrganization
- x-ms-user-agent: PowerFx/{version}
-POST https://tip1-shared.azure-apim.net/invoke
- authority: tip1-shared.azure-apim.net
- Authorization: Bearer eyJ0eXAiO...
- organization: https://org283e9949.crm10.dynamics.com
- path: /invoke
- scheme: https
- x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/Default-9f6be790-4a16-4dd6-9850-44a0d2649aef
- x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
- x-ms-request-method: GET
- x-ms-request-url: /apim/commondataserviceforapps/461a30624723445c9ba87313d8bbefa3/v1.0/$metadata.json/entities/accounts/postitem
- x-ms-user-agent: PowerFx/{version}
-";
-
- Assert.Equal(expected, input);
- }
-
- [Theory]
-
- // Very slow -- [InlineData(@"Swagger\Dataverse 2.json")]
- // Very slow -- [InlineData(@"Swagger\Dataverse 3.json")]
- [InlineData(@"Swagger\PowerPlatformForAdmins.json")]
- public async Task DataverseTest2(string swaggerFile)
- {
- PowerFxConfig powerFxConfig = new PowerFxConfig();
- OpenApiDocument doc = Helpers.ReadSwagger(swaggerFile, _output);
-
- OpenApiParser.GetFunctions("namespace", doc); // missing logger
- powerFxConfig.AddActionConnector("namespace", doc);
- }
-
- [Fact]
- public async Task CardsForPowerApps_Invoke()
- {
- using var testConnector = new LoggingTestServer(@"Swagger\CardsForPowerApps.json", _output);
- using var httpClient = new HttpClient(testConnector);
- using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1002-002.azure-apihub.net", "7592282b-e371-e3f6-8e04-e8f23e64227c" /* environment Id */, "shared-cardsforpower-eafc4fa0-c560-4eba-a5b2-3e1ebc63193a" /* connectionId */, () => "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dC...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
-
- BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("DV", client, console: _output);
-
- ConnectorFunction[] functions = OpenApiParser.GetFunctions(
- new ConnectorSettings("DV")
- {
- Compatibility = ConnectorCompatibility.SwaggerCompatibility,
- ReturnUnknownRecordFieldsAsUntypedObjects = true
- },
- testConnector._apiDocument).ToArray();
- ConnectorFunction createCardInstance = functions.First(f => f.Name == "CreateCardInstance");
-
- testConnector.SetResponseFromFile(@"Responses\CardsForPowerApps_CreateCardInstance.json");
- var result = await createCardInstance.InvokeAsync(
- new FormulaValue[]
- {
- FormulaValue.New("card"),
- FormulaValue.NewRecordFromFields(
- new NamedValue("inputs", FormulaValue.NewRecordFromFields(
- new NamedValue("property1", FormulaValue.New("test1")),
- new NamedValue("property2", FormulaValue.New("test2"))))),
- },
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- string input = testConnector._log.ToString();
- Assert.Equal("AdaptiveCard", (((RecordValue)result).GetField("type") as UntypedObjectValue).Impl.GetString());
- Assert.Equal(
- $@"POST https://tip1002-002.azure-apihub.net/invoke
- authority: tip1002-002.azure-apihub.net
- Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dC...
- path: /invoke
- scheme: https
- x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/7592282b-e371-e3f6-8e04-e8f23e64227c
- x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
- x-ms-request-method: POST
- x-ms-request-url: /apim/cardsforpowerapps/shared-cardsforpower-eafc4fa0-c560-4eba-a5b2-3e1ebc63193a/cards/cards/card/instances
- x-ms-user-agent: PowerFx/{PowerPlatformConnectorClient.Version}
- [content-header] Content-Type: application/json; charset=utf-8
- [body] {{""inputs"":{{""property1"":""test1"",""property2"":""test2""}}}}
-", input);
- }
-
- [Fact]
- public async Task CardsForPowerApps_Suggestion()
- {
- using var testConnector = new LoggingTestServer(@"Swagger\CardsForPowerApps.json", _output);
- using var httpClient = new HttpClient(testConnector);
- using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1002-002.azure-apihub.net", "7592282b-e371-e3f6-8e04-e8f23e64227c" /* environment Id */, "shared-cardsforpower-eafc4fa0-c560-4eba-a5b2-3e1ebc63193a" /* connectionId */, () => "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dC...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
-
- BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("DV", client, console: _output);
-
- ConnectorFunction[] functions = OpenApiParser.GetFunctions(new ConnectorSettings("DV") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, testConnector._apiDocument).ToArray();
- ConnectorFunction createCardInstance = functions.First(f => f.Name == "CreateCardInstance");
-
- testConnector.SetResponseFromFile(@"Responses\CardsForPowerApps_Suggestions.json");
- ConnectorParameters parameters = await createCardInstance.GetParameterSuggestionsAsync(
- new NamedValue[]
- {
- },
- createCardInstance.RequiredParameters[0], // cardid
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- ConnectorParameterWithSuggestions suggestions = parameters.ParametersWithSuggestions[0];
- Assert.Equal(2, suggestions.Suggestions.Count);
- Assert.Equal("test", suggestions.Suggestions[0].DisplayName);
- Assert.Equal("testWithInputs", suggestions.Suggestions[1].DisplayName);
- }
-
- [Fact]
- public async Task Teams_GetMessageDetails_WithComplexParameterReference()
- {
- using var testConnector = new LoggingTestServer(@"Swagger\Teams.json", _output);
- using var httpClient = new HttpClient(testConnector);
- using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1002-002.azure-apihub.net", "7592282b-e371-e3f6-8e04-e8f23e64227c" /* environment Id */, "shared-cardsforpower-eafc4fa0-c560-4eba-a5b2-3e1ebc63193a" /* connectionId */, () => "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dC...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
-
- BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("DV", client, console: _output);
-
- ConnectorFunction[] functions = OpenApiParser.GetFunctions(new ConnectorSettings("DV") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, testConnector._apiDocument).ToArray();
- ConnectorFunction getMessageDetails = functions.First(f => f.Name == "GetMessageDetails");
-
- testConnector.SetResponseFromFile(@"Responses\Teams_GetMessageDetails_InputType.json");
- ConnectorParameters parameters = await getMessageDetails.GetParameterSuggestionsAsync(
- new NamedValue[]
- {
- new NamedValue("messageId", FormulaValue.New("messageId")),
- new NamedValue("threadType", FormulaValue.New("channel")),
- },
- getMessageDetails.RequiredParameters[2], // body
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- var bodyConnectorType = parameters.ParametersWithSuggestions[2].ConnectorType;
-
- ConnectorParameterWithSuggestions suggestions = parameters.ParametersWithSuggestions[2];
- testConnector.SetResponseFromFile(@"Responses\Teams_GetMessageDetails_GetSuggestionsForChannel.json");
-
- var connectorTypeWithSuggestions = await getMessageDetails.GetConnectorSuggestionsAsync(
- new NamedValue[]
- {
- new NamedValue("messageId", FormulaValue.New("messageId")),
- new NamedValue("threadType", FormulaValue.New("channel")),
- new NamedValue("body", FormulaValue.NewRecordFromFields(
- new NamedValue("recipient", FormulaValue.NewRecordFromFields(
- new NamedValue("groupId", FormulaValue.New("groupIdValue")))))),
- },
- bodyConnectorType.Fields[0].Fields[1], // channelId
- runtimeContext,
- CancellationToken.None).ConfigureAwait(false);
-
- Assert.Equal(2, connectorTypeWithSuggestions.ConnectorSuggestions.Suggestions.Count);
- Assert.Equal("channelName", connectorTypeWithSuggestions.ConnectorSuggestions.Suggestions[0].DisplayName);
- Assert.Equal("channelName2", connectorTypeWithSuggestions.ConnectorSuggestions.Suggestions[1].DisplayName);
- }
- }
-
- public static class Extensions
- {
- public static RecordType MakeRecordType(params (string, FormulaType)[] columns)
- {
- RecordType rt = RecordType.Empty();
-
- foreach ((string name, FormulaType type) in columns)
- {
- rt = rt.Add(name, type);
- }
-
- return rt;
- }
-
- public static TableType MakeTableType(params (string, FormulaType)[] columns)
- {
- TableType tt = TableType.Empty();
-
- foreach ((string name, FormulaType type) in columns)
- {
- tt = tt.Add(name, type);
- }
-
- return tt;
- }
-
- public static OptionSetValueType MakeOptionSetType(string name, params string[] names)
- {
- return MakeOptionSet(name, names).FormulaType;
- }
-
- public static OptionSet MakeOptionSet(string name, params string[] names)
- {
- return new OptionSet(name, DisplayNameUtility.MakeUnique(names.ToDictionary(n => n, n => n)));
- }
- }
-
+ Assert.Contains(texlFunctions, func => func.Namespace.Name.Value == "SQL" && func.Name == "GetProcedureV2");
+ }
+
+ [Fact]
+ public void Dataverse_Sample()
+ {
+ OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\DataverseSample.json", _output);
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions("DV", doc, new ConsoleLogger(_output)).ToArray();
+
+ Assert.NotNull(functions);
+ Assert.Equal(3, functions.Count());
+
+ Assert.Equal(new List() { "GetLead", "PostLead", "QualifyLead" }, functions.Select(f => f.Name).ToList());
+ Assert.Equal(new List() { "GetLead", "PostLead", "QualifyLead" }, functions.Select(f => f.OriginalName).ToList());
+
+ // "x-ms-require-user-confirmation"
+ Assert.Equal(new List() { false, true, true }, functions.Select(f => f.RequiresUserConfirmation).ToList());
+
+ // "x-ms-explicit-input" in "QualifyLead" function parameters
+ Assert.Equal(4, functions[2].RequiredParameters.Length);
+ Assert.False(functions[2].RequiredParameters[0].ConnectorType.ExplicitInput); // "leadId"
+ Assert.True(functions[2].RequiredParameters[1].ConnectorType.ExplicitInput); // "CreateAccount"
+ Assert.True(functions[2].RequiredParameters[2].ConnectorType.ExplicitInput); // "CreateContact"
+ Assert.True(functions[2].RequiredParameters[3].ConnectorType.ExplicitInput); // "CreateOpportunity"
+ Assert.Single(functions[2].HiddenRequiredParameters);
+ Assert.False(functions[2].HiddenRequiredParameters[0].ConnectorType.ExplicitInput); // "Status"
+ Assert.Empty(functions[2].OptionalParameters);
+
+ // "x-ms-visibility"
+ (0..3).ForAll(i => Assert.Equal(Visibility.None, functions[2].RequiredParameters[i].ConnectorType.Visibility));
+ Assert.Equal(Visibility.Internal, functions[2].HiddenRequiredParameters[0].ConnectorType.Visibility); // "Status"
+
+ // "enum"
+ Assert.Equal(FormulaType.Decimal, functions[1].OptionalParameters[2].ConnectorType.FormulaType); // "leadsourcecode"
+ Assert.True(functions[1].OptionalParameters[2].ConnectorType.IsEnum);
+ Assert.Equal(Enumerable.Range(1, 10).Select(i => (decimal)i).ToArray(), functions[1].OptionalParameters[2].ConnectorType.EnumValues.Select(fv => (decimal)fv.ToObject()));
+ Assert.Equal("Advertisement, Employee Referral, External Referral, Partner, Public Relations, Seminar, Trade Show, Web, Word of Mouth, Other", string.Join(", ", functions[1].OptionalParameters[2].ConnectorType.EnumDisplayNames));
+ Assert.Equal(4m, functions[1].OptionalParameters[2].ConnectorType.Enum["Partner"].ToObject());
+
+ // "x-ms-enum-display-name"
+ Assert.NotNull(functions[1].OptionalParameters[2].ConnectorType.EnumDisplayNames);
+ Assert.Equal("Advertisement", functions[1].OptionalParameters[2].ConnectorType.EnumDisplayNames[0]);
+ Assert.Equal("Employee Referral", functions[1].OptionalParameters[2].ConnectorType.EnumDisplayNames[1]);
+
+ Assert.True(functions[1].RequiredParameters[2].ConnectorType.IsEnum); // "msdyn_company@odata.bind"
+ Assert.Equal("2b629105-4a26-4607-97a5-0715059e0a55", functions[1].RequiredParameters[2].ConnectorType.EnumValues[0].ToObject());
+ Assert.Equal("5cacddd3-d47f-4023-a68e-0ce3e0d401fb", functions[1].RequiredParameters[2].ConnectorType.EnumValues[1].ToObject());
+ Assert.Equal("INMF", functions[1].RequiredParameters[2].ConnectorType.EnumDisplayNames[0]);
+ Assert.Equal("MYMF", functions[1].RequiredParameters[2].ConnectorType.EnumDisplayNames[1]);
+ }
+
+ [Fact]
+ public void VisibilityTest()
+ {
+ OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\AzureBlobStorage.json", _output);
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions("AzBlob", doc, new ConsoleLogger(_output)).ToArray();
+
+ ConnectorFunction createFileV2 = functions.First(f => f.Name == "CreateFileV2");
+
+ Assert.Equal(4, createFileV2.RequiredParameters.Length);
+ Assert.Equal(3, createFileV2.OptionalParameters.Length);
+ Assert.Empty(createFileV2.HiddenRequiredParameters);
+
+ Assert.Equal("important", createFileV2.Visibility);
+
+ Assert.Equal("dataset", createFileV2.RequiredParameters[0].Name);
+ Assert.Equal("folderPath", createFileV2.RequiredParameters[1].Name);
+ Assert.Equal("name", createFileV2.RequiredParameters[2].Name);
+ Assert.Equal("file", createFileV2.RequiredParameters[3].Name);
+ Assert.Equal(FormulaType.Blob, createFileV2.RequiredParameters[3].FormulaType);
+ (0..3).ForAll(i => Assert.Equal(Visibility.None, createFileV2.RequiredParameters[i].ConnectorType.Visibility));
+
+ Assert.Equal("queryParametersSingleEncoded", createFileV2.OptionalParameters[0].Name);
+ Assert.Equal("Content-Type", createFileV2.OptionalParameters[1].Name);
+ Assert.Equal("ReadFileMetadataFromServer", createFileV2.OptionalParameters[2].Name);
+ Assert.Equal(Visibility.Internal, createFileV2.OptionalParameters[0].ConnectorType.Visibility);
+ Assert.Equal(Visibility.Advanced, createFileV2.OptionalParameters[1].ConnectorType.Visibility);
+ Assert.Equal(Visibility.Internal, createFileV2.OptionalParameters[2].ConnectorType.Visibility);
+
+ Assert.Equal(Visibility.None, createFileV2.ReturnParameterType.Visibility);
+
+ ConnectorFunction listFolderV4 = functions.First(f => f.Name == "ListFolderV4");
+
+ Assert.Equal(Visibility.None, listFolderV4.ReturnParameterType.Visibility);
+ Assert.Equal(Visibility.None, listFolderV4.ReturnParameterType.Fields[0].Visibility);
+ Assert.Equal(Visibility.Advanced, listFolderV4.ReturnParameterType.Fields[1].Visibility);
+ Assert.Equal(Visibility.Advanced, listFolderV4.ReturnParameterType.Fields[2].Visibility);
+ }
+
+ [Fact]
+ public void DynamicReturnValueTest()
+ {
+ using HttpClient httpClient = new ();
+ OpenApiDocument doc = Helpers.ReadSwagger(@"Swagger\SQL Server.json", _output);
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions("SQL", doc, new ConsoleLogger(_output)).ToArray();
+
+ ConnectorFunction createFileV2 = functions.First(f => f.Name == "ExecuteProcedureV2");
+
+ Assert.Equal(4, createFileV2.RequiredParameters.Length);
+ Assert.Empty(createFileV2.OptionalParameters);
+ Assert.Empty(createFileV2.HiddenRequiredParameters);
+
+ Assert.NotNull(createFileV2.DynamicReturnSchema);
+ Assert.Null(createFileV2.DynamicReturnProperty);
+
+ Assert.Equal("GetProcedureV2", createFileV2.DynamicReturnSchema.OperationId);
+ Assert.NotNull(createFileV2.DynamicReturnSchema.ConnectorFunction);
+ Assert.Equal("GetProcedureV2", createFileV2.DynamicReturnSchema.ConnectorFunction.Name);
+ Assert.Equal("schema/procedureresultschema", createFileV2.DynamicReturnSchema.ValuePath);
+ Assert.Equal(3, createFileV2.DynamicReturnSchema.ParameterMap.Count);
+
+ Assert.True(createFileV2.DynamicReturnSchema.ParameterMap["server"] is DynamicConnectorExtensionValue dv1 && dv1.Reference == "server");
+ Assert.True(createFileV2.DynamicReturnSchema.ParameterMap["database"] is DynamicConnectorExtensionValue dv2 && dv2.Reference == "database");
+ Assert.True(createFileV2.DynamicReturnSchema.ParameterMap["procedure"] is DynamicConnectorExtensionValue dv3 && dv3.Reference == "procedure");
+
+ ConnectorFunction executePassThroughNativeQueryV2 = functions.First(f => f.Name == "ExecutePassThroughNativeQueryV2");
+
+ Assert.Equal(2, executePassThroughNativeQueryV2.RequiredParameters.Length);
+ Assert.Equal(3, executePassThroughNativeQueryV2.OptionalParameters.Length);
+ Assert.Empty(executePassThroughNativeQueryV2.HiddenRequiredParameters);
+
+ Assert.NotNull(executePassThroughNativeQueryV2.DynamicReturnSchema);
+ Assert.NotNull(executePassThroughNativeQueryV2.DynamicReturnProperty);
+
+ Assert.Equal("GetPassThroughNativeQueryMetadataV2", executePassThroughNativeQueryV2.DynamicReturnSchema.OperationId);
+ Assert.NotNull(executePassThroughNativeQueryV2.DynamicReturnSchema.ConnectorFunction);
+ Assert.Equal("GetPassThroughNativeQueryMetadataV2", executePassThroughNativeQueryV2.DynamicReturnSchema.ConnectorFunction.Name);
+ Assert.Equal("schema/queryresults", executePassThroughNativeQueryV2.DynamicReturnSchema.ValuePath);
+ Assert.Equal(4, executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap.Count);
+ Assert.True(executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap["server"] is DynamicConnectorExtensionValue dv4 && dv4.Reference == "server");
+ Assert.True(executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap["database"] is DynamicConnectorExtensionValue dv5 && dv5.Reference == "database");
+ Assert.True(executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap["query"] is DynamicConnectorExtensionValue dv6 && dv6.Reference == "query");
+ Assert.True(executePassThroughNativeQueryV2.DynamicReturnSchema.ParameterMap["formalParameters"] is DynamicConnectorExtensionValue dv7 && dv7.Reference == "formalParameters");
+
+ Assert.Equal("GetPassThroughNativeQueryMetadataV2", executePassThroughNativeQueryV2.DynamicReturnProperty.OperationId);
+ Assert.NotNull(executePassThroughNativeQueryV2.DynamicReturnProperty.ConnectorFunction);
+ Assert.Equal("GetPassThroughNativeQueryMetadataV2", executePassThroughNativeQueryV2.DynamicReturnProperty.ConnectorFunction.Name);
+ Assert.Equal("schema/queryresults", executePassThroughNativeQueryV2.DynamicReturnProperty.ItemValuePath);
+ Assert.Equal(4, executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap.Count);
+ Assert.True(executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap["server"] is DynamicConnectorExtensionValue dv8 && dv8.Reference == "server");
+ Assert.True(executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap["database"] is DynamicConnectorExtensionValue dv9 && dv9.Reference == "database");
+ Assert.True(executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap["query/query"] is DynamicConnectorExtensionValue dv10 && dv10.Reference == "query/query");
+ Assert.True(executePassThroughNativeQueryV2.DynamicReturnProperty.ParameterMap["query/formalParameters"] is DynamicConnectorExtensionValue dv11 && dv11.Reference == "query/formalParameters");
+ }
+
+ [Fact]
+ public async Task DirectIntellisenseTest()
+ {
+ using var testConnector = new LoggingTestServer(@"Swagger\SQL Server.json", _output);
+ using var httpClient = new HttpClient(testConnector);
+ using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1002-002.azure-apihub.net", "ddadf2c7-ebdd-ec01-a5d1-502dc07f04b4" /* environment Id */, "4bf9a87fc9054b6db3a4d07a1c1f5a5b" /* connectionId */, () => "eyJ0eXAi...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
+
+ BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("SQL", client, console: _output);
+
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions("SQL", testConnector._apiDocument, new ConsoleLogger(_output)).ToArray();
+ ConnectorFunction executeProcedureV2 = functions.First(f => f.Name == "ExecuteProcedureV2");
+
+ Assert.True(executeProcedureV2.RequiredParameters[0].SupportsDynamicIntellisense);
+ Assert.True(executeProcedureV2.RequiredParameters[1].SupportsDynamicIntellisense);
+ Assert.True(executeProcedureV2.RequiredParameters[2].SupportsDynamicIntellisense);
+ Assert.True(executeProcedureV2.RequiredParameters[3].SupportsDynamicIntellisense);
+
+ // Keeping only for debugging
+ //FormulaValue result = await executeProcedureV2.InvokeAync(client, new FormulaValue[]
+ //{
+ // FormulaValue.New("pfxdev-sql.database.windows.net"),
+ // FormulaValue.New("connectortest"),
+ // FormulaValue.New("sp_1"),
+ // FormulaValue.NewRecordFromFields(new NamedValue[] { new NamedValue("p1", FormulaValue.New(38)) })
+ //}, CancellationToken.None).ConfigureAwait(false);
+
+ testConnector.SetResponseFromFile(@"Responses\SQL Server Intellisense Response 3.json");
+ ConnectorParameters parameters1 = await executeProcedureV2.GetParameterSuggestionsAsync(
+ new NamedValue[]
+ {
+ new NamedValue("server", FormulaValue.New("pfxdev-sql.database.windows.net")),
+ new NamedValue("database", FormulaValue.New("connectortest"))
+ },
+ executeProcedureV2.RequiredParameters[2], // procedure
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ ConnectorParameterWithSuggestions suggestions1 = parameters1.ParametersWithSuggestions[2];
+ Assert.NotNull(suggestions1);
+ Assert.NotNull(suggestions1.Suggestions);
+ Assert.Equal(2, suggestions1.Suggestions.Count());
+
+ testConnector.SetResponseFromFile(@"Responses\SQL Server Intellisense Response2 1.json");
+ ConnectorParameters parameters2 = await executeProcedureV2.GetParameterSuggestionsAsync(
+ new NamedValue[]
+ {
+ new NamedValue("server", FormulaValue.New("pfxdev-sql.database.windows.net")),
+ new NamedValue("database", FormulaValue.New("connectortest")),
+ new NamedValue("procedure", FormulaValue.New("sp_1"))
+ },
+ executeProcedureV2.RequiredParameters[3], // parameters
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ ConnectorParameterWithSuggestions suggestions2 = parameters2.ParametersWithSuggestions[3];
+ Assert.NotNull(suggestions2);
+ Assert.NotNull(suggestions2.Suggestions);
+ Assert.Single(suggestions2.Suggestions);
+
+ Assert.True(executeProcedureV2.ReturnParameterType.SupportsDynamicIntellisense);
+
+ testConnector.SetResponseFromFile(@"Responses\SQL Server Intellisense Response2 1.json");
+ ConnectorType returnType = await executeProcedureV2.GetConnectorReturnTypeAsync(
+ new NamedValue[]
+ {
+ new NamedValue("server", FormulaValue.New("pfxdev-sql.database.windows.net")),
+ new NamedValue("database", FormulaValue.New("connectortest")),
+ new NamedValue("procedure", FormulaValue.New("sp_1"))
+ },
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ Assert.NotNull(returnType);
+ Assert.True(returnType.FormulaType is RecordType);
+
+ string input = testConnector._log.ToString();
+ var version = PowerPlatformConnectorClient.Version;
+ string expected = $@"POST https://tip1002-002.azure-apihub.net/invoke
+ authority: tip1002-002.azure-apihub.net
+ Authorization: Bearer eyJ0eXAi...
+ path: /invoke
+ scheme: https
+ x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/ddadf2c7-ebdd-ec01-a5d1-502dc07f04b4
+ x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
+ x-ms-request-method: GET
+ x-ms-request-url: /apim/sql/4bf9a87fc9054b6db3a4d07a1c1f5a5b/v2/datasets/pfxdev-sql.database.windows.net,connectortest/procedures
+ x-ms-user-agent: PowerFx/{version}
+POST https://tip1002-002.azure-apihub.net/invoke
+ authority: tip1002-002.azure-apihub.net
+ Authorization: Bearer eyJ0eXAi...
+ path: /invoke
+ scheme: https
+ x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/ddadf2c7-ebdd-ec01-a5d1-502dc07f04b4
+ x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
+ x-ms-request-method: GET
+ x-ms-request-url: /apim/sql/4bf9a87fc9054b6db3a4d07a1c1f5a5b/v2/$metadata.json/datasets/pfxdev-sql.database.windows.net,connectortest/procedures/sp_1
+ x-ms-user-agent: PowerFx/{version}
+POST https://tip1002-002.azure-apihub.net/invoke
+ authority: tip1002-002.azure-apihub.net
+ Authorization: Bearer eyJ0eXAi...
+ path: /invoke
+ scheme: https
+ x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/ddadf2c7-ebdd-ec01-a5d1-502dc07f04b4
+ x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
+ x-ms-request-method: GET
+ x-ms-request-url: /apim/sql/4bf9a87fc9054b6db3a4d07a1c1f5a5b/v2/$metadata.json/datasets/pfxdev-sql.database.windows.net,connectortest/procedures/sp_1
+ x-ms-user-agent: PowerFx/{version}
+";
+
+ Assert.Equal(expected, input);
+ }
+
+ [Fact]
+ public async Task DataverseTest()
+ {
+ using var testConnector = new LoggingTestServer(@"Swagger\Dataverse.json", _output);
+ using var httpClient = new HttpClient(testConnector);
+ using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1-shared.azure-apim.net", "Default-9f6be790-4a16-4dd6-9850-44a0d2649aef" /* environment Id */, "461a30624723445c9ba87313d8bbefa3" /* connectionId */, () => "eyJ0eXAiO...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
+
+ BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("DV", client, console: _output);
+
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions(new ConnectorSettings("DV") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, testConnector._apiDocument).ToArray();
+ ConnectorFunction createRecord = functions.First(f => f.Name == "CreateRecordWithOrganization");
+
+ testConnector.SetResponseFromFile(@"Responses\Dataverse_Response_1.json");
+ ConnectorParameters parameters1 = await createRecord.GetParameterSuggestionsAsync(
+ new NamedValue[]
+ {
+ new NamedValue("organization", FormulaValue.New("https://org283e9949.crm10.dynamics.com"))
+ },
+ createRecord.RequiredParameters[1], // entityName
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ ConnectorParameterWithSuggestions suggestions1 = parameters1.ParametersWithSuggestions[1];
+ Assert.Equal(651, suggestions1.Suggestions.Count);
+ Assert.Equal("AAD Users", suggestions1.Suggestions[0].DisplayName);
+ Assert.Equal("aadusers", ((StringValue)suggestions1.Suggestions[0].Suggestion).Value);
+
+ testConnector.SetResponseFromFile(@"Responses\Dataverse_Response_2.json");
+ ConnectorParameters parameters2 = await createRecord.GetParameterSuggestionsAsync(
+ new NamedValue[]
+ {
+ new NamedValue("organization", FormulaValue.New("https://org283e9949.crm10.dynamics.com")),
+ new NamedValue("entityName", FormulaValue.New("accounts"))
+ },
+ createRecord.RequiredParameters[2], // item
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ ConnectorParameterWithSuggestions suggestions2 = parameters2.ParametersWithSuggestions[2];
+ Assert.Equal(119, suggestions2.Suggestions.Count);
+ Assert.Equal("accountcategorycode", suggestions2.Suggestions[0].DisplayName);
+ Assert.Equal("Decimal", suggestions2.Suggestions[0].Suggestion.Type.ToString());
+
+ string input = testConnector._log.ToString();
+ var version = PowerPlatformConnectorClient.Version;
+ string expected = @$"POST https://tip1-shared.azure-apim.net/invoke
+ authority: tip1-shared.azure-apim.net
+ Authorization: Bearer eyJ0eXAiO...
+ organization: https://org283e9949.crm10.dynamics.com
+ path: /invoke
+ scheme: https
+ x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/Default-9f6be790-4a16-4dd6-9850-44a0d2649aef
+ x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
+ x-ms-request-method: POST
+ x-ms-request-url: /apim/commondataserviceforapps/461a30624723445c9ba87313d8bbefa3/v1.0/$metadata.json/GetEntityListEnum/GetEntitiesWithOrganization
+ x-ms-user-agent: PowerFx/{version}
+POST https://tip1-shared.azure-apim.net/invoke
+ authority: tip1-shared.azure-apim.net
+ Authorization: Bearer eyJ0eXAiO...
+ organization: https://org283e9949.crm10.dynamics.com
+ path: /invoke
+ scheme: https
+ x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/Default-9f6be790-4a16-4dd6-9850-44a0d2649aef
+ x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
+ x-ms-request-method: GET
+ x-ms-request-url: /apim/commondataserviceforapps/461a30624723445c9ba87313d8bbefa3/v1.0/$metadata.json/entities/accounts/postitem
+ x-ms-user-agent: PowerFx/{version}
+";
+
+ Assert.Equal(expected, input);
+ }
+
+ [Theory]
+
+ // Very slow -- [InlineData(@"Swagger\Dataverse 2.json")]
+ // Very slow -- [InlineData(@"Swagger\Dataverse 3.json")]
+ [InlineData(@"Swagger\PowerPlatformForAdmins.json")]
+ public async Task DataverseTest2(string swaggerFile)
+ {
+ PowerFxConfig powerFxConfig = new PowerFxConfig();
+ OpenApiDocument doc = Helpers.ReadSwagger(swaggerFile, _output);
+
+ OpenApiParser.GetFunctions("namespace", doc); // missing logger
+ powerFxConfig.AddActionConnector("namespace", doc);
+ }
+
+ [Fact]
+ public async Task CardsForPowerApps_Invoke()
+ {
+ using var testConnector = new LoggingTestServer(@"Swagger\CardsForPowerApps.json", _output);
+ using var httpClient = new HttpClient(testConnector);
+ using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1002-002.azure-apihub.net", "7592282b-e371-e3f6-8e04-e8f23e64227c" /* environment Id */, "shared-cardsforpower-eafc4fa0-c560-4eba-a5b2-3e1ebc63193a" /* connectionId */, () => "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dC...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
+
+ BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("DV", client, console: _output);
+
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions(
+ new ConnectorSettings("DV")
+ {
+ Compatibility = ConnectorCompatibility.SwaggerCompatibility,
+ ReturnUnknownRecordFieldsAsUntypedObjects = true
+ },
+ testConnector._apiDocument).ToArray();
+ ConnectorFunction createCardInstance = functions.First(f => f.Name == "CreateCardInstance");
+
+ testConnector.SetResponseFromFile(@"Responses\CardsForPowerApps_CreateCardInstance.json");
+ var result = await createCardInstance.InvokeAsync(
+ new FormulaValue[]
+ {
+ FormulaValue.New("card"),
+ FormulaValue.NewRecordFromFields(
+ new NamedValue("inputs", FormulaValue.NewRecordFromFields(
+ new NamedValue("property1", FormulaValue.New("test1")),
+ new NamedValue("property2", FormulaValue.New("test2"))))),
+ },
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ string input = testConnector._log.ToString();
+ Assert.Equal("AdaptiveCard", (((RecordValue)result).GetField("type") as UntypedObjectValue).Impl.GetString());
+ Assert.Equal(
+ $@"POST https://tip1002-002.azure-apihub.net/invoke
+ authority: tip1002-002.azure-apihub.net
+ Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dC...
+ path: /invoke
+ scheme: https
+ x-ms-client-environment-id: /providers/Microsoft.PowerApps/environments/7592282b-e371-e3f6-8e04-e8f23e64227c
+ x-ms-client-session-id: a41bd03b-6c3c-4509-a844-e8c51b61f878
+ x-ms-request-method: POST
+ x-ms-request-url: /apim/cardsforpowerapps/shared-cardsforpower-eafc4fa0-c560-4eba-a5b2-3e1ebc63193a/cards/cards/card/instances
+ x-ms-user-agent: PowerFx/{PowerPlatformConnectorClient.Version}
+ [content-header] Content-Type: application/json; charset=utf-8
+ [body] {{""inputs"":{{""property1"":""test1"",""property2"":""test2""}}}}
+", input);
+ }
+
+ [Fact]
+ public async Task CardsForPowerApps_Suggestion()
+ {
+ using var testConnector = new LoggingTestServer(@"Swagger\CardsForPowerApps.json", _output);
+ using var httpClient = new HttpClient(testConnector);
+ using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1002-002.azure-apihub.net", "7592282b-e371-e3f6-8e04-e8f23e64227c" /* environment Id */, "shared-cardsforpower-eafc4fa0-c560-4eba-a5b2-3e1ebc63193a" /* connectionId */, () => "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dC...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
+
+ BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("DV", client, console: _output);
+
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions(new ConnectorSettings("DV") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, testConnector._apiDocument).ToArray();
+ ConnectorFunction createCardInstance = functions.First(f => f.Name == "CreateCardInstance");
+
+ testConnector.SetResponseFromFile(@"Responses\CardsForPowerApps_Suggestions.json");
+ ConnectorParameters parameters = await createCardInstance.GetParameterSuggestionsAsync(
+ new NamedValue[]
+ {
+ },
+ createCardInstance.RequiredParameters[0], // cardid
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ ConnectorParameterWithSuggestions suggestions = parameters.ParametersWithSuggestions[0];
+ Assert.Equal(2, suggestions.Suggestions.Count);
+ Assert.Equal("test", suggestions.Suggestions[0].DisplayName);
+ Assert.Equal("testWithInputs", suggestions.Suggestions[1].DisplayName);
+ }
+
+ [Fact]
+ public async Task Teams_GetMessageDetails_WithComplexParameterReference()
+ {
+ using var testConnector = new LoggingTestServer(@"Swagger\Teams.json", _output);
+ using var httpClient = new HttpClient(testConnector);
+ using PowerPlatformConnectorClient client = new PowerPlatformConnectorClient("https://tip1002-002.azure-apihub.net", "7592282b-e371-e3f6-8e04-e8f23e64227c" /* environment Id */, "shared-cardsforpower-eafc4fa0-c560-4eba-a5b2-3e1ebc63193a" /* connectionId */, () => "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dC...", httpClient) { SessionId = "a41bd03b-6c3c-4509-a844-e8c51b61f878" };
+
+ BaseRuntimeConnectorContext runtimeContext = new TestConnectorRuntimeContext("DV", client, console: _output);
+
+ ConnectorFunction[] functions = OpenApiParser.GetFunctions(new ConnectorSettings("DV") { Compatibility = ConnectorCompatibility.SwaggerCompatibility }, testConnector._apiDocument).ToArray();
+ ConnectorFunction getMessageDetails = functions.First(f => f.Name == "GetMessageDetails");
+
+ testConnector.SetResponseFromFile(@"Responses\Teams_GetMessageDetails_InputType.json");
+ ConnectorParameters parameters = await getMessageDetails.GetParameterSuggestionsAsync(
+ new NamedValue[]
+ {
+ new NamedValue("messageId", FormulaValue.New("messageId")),
+ new NamedValue("threadType", FormulaValue.New("channel")),
+ },
+ getMessageDetails.RequiredParameters[2], // body
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ var bodyConnectorType = parameters.ParametersWithSuggestions[2].ConnectorType;
+
+ ConnectorParameterWithSuggestions suggestions = parameters.ParametersWithSuggestions[2];
+ testConnector.SetResponseFromFile(@"Responses\Teams_GetMessageDetails_GetSuggestionsForChannel.json");
+
+ var connectorTypeWithSuggestions = await getMessageDetails.GetConnectorSuggestionsAsync(
+ new NamedValue[]
+ {
+ new NamedValue("messageId", FormulaValue.New("messageId")),
+ new NamedValue("threadType", FormulaValue.New("channel")),
+ new NamedValue("body", FormulaValue.NewRecordFromFields(
+ new NamedValue("recipient", FormulaValue.NewRecordFromFields(
+ new NamedValue("groupId", FormulaValue.New("groupIdValue")))))),
+ },
+ bodyConnectorType.Fields[0].Fields[1], // channelId
+ runtimeContext,
+ CancellationToken.None).ConfigureAwait(false);
+
+ Assert.Equal(2, connectorTypeWithSuggestions.ConnectorSuggestions.Suggestions.Count);
+ Assert.Equal("channelName", connectorTypeWithSuggestions.ConnectorSuggestions.Suggestions[0].DisplayName);
+ Assert.Equal("channelName2", connectorTypeWithSuggestions.ConnectorSuggestions.Suggestions[1].DisplayName);
+ }
+ }
+
+ public static class Extensions
+ {
+ public static RecordType MakeRecordType(params (string, FormulaType)[] columns)
+ {
+ RecordType rt = RecordType.Empty();
+
+ foreach ((string name, FormulaType type) in columns)
+ {
+ rt = rt.Add(name, type);
+ }
+
+ return rt;
+ }
+
+ public static TableType MakeTableType(params (string, FormulaType)[] columns)
+ {
+ TableType tt = TableType.Empty();
+
+ foreach ((string name, FormulaType type) in columns)
+ {
+ tt = tt.Add(name, type);
+ }
+
+ return tt;
+ }
+
+ public static OptionSetValueType MakeOptionSetType(string name, params string[] names)
+ {
+ return MakeOptionSet(name, names).FormulaType;
+ }
+
+ public static OptionSet MakeOptionSet(string name, params string[] names)
+ {
+ return new OptionSet(name, DisplayNameUtility.MakeUnique(names.ToDictionary(n => n, n => n)));
+ }
+ }
+
#pragma warning restore SA1118, SA1117, SA1119, SA1137
}
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/PowerAppsForMakersTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PowerAppsForMakersTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/PowerAppsForMakersTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PowerAppsForMakersTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/PowerPlatformConnectorClientTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PowerPlatformConnectorClientTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/PowerPlatformConnectorClientTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PowerPlatformConnectorClientTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/PowerPlatformConnectorTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PowerPlatformConnectorTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/PowerPlatformConnectorTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PowerPlatformConnectorTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/PowerPlatformTabularTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PowerPlatformTabularTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/PowerPlatformTabularTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PowerPlatformTabularTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/PriorityOrderer.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PriorityOrderer.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/PriorityOrderer.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PriorityOrderer.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/PriorityOrdererTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PriorityOrdererTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/PriorityOrdererTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PriorityOrdererTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/PublicSurfaceTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PublicSurfaceTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/PublicSurfaceTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/PublicSurfaceTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Azure Cognitive Service for Language v2.1_Response.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Azure Cognitive Service for Language v2.1_Response.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Azure Cognitive Service for Language v2.1_Response.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Azure Cognitive Service for Language v2.1_Response.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Azure Cognitive Service for Language_Response.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Azure Cognitive Service for Language_Response.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Azure Cognitive Service for Language_Response.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Azure Cognitive Service for Language_Response.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_GetFileContentV2.raw b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_GetFileContentV2.raw
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_GetFileContentV2.raw
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_GetFileContentV2.raw
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_ListRootFolderV3_response.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_ListRootFolderV3_response.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_ListRootFolderV3_response.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_ListRootFolderV3_response.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Paging_Response1.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Paging_Response1.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Paging_Response1.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Paging_Response1.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Paging_Response2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Paging_Response2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Paging_Response2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Paging_Response2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Paging_Response3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Paging_Response3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Paging_Response3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Paging_Response3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Response.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Response.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Response.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Response.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Response2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Response2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/AzureBlobStorage_Response2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/AzureBlobStorage_Response2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Bing Maps GetRouteV3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Bing Maps GetRouteV3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Bing Maps GetRouteV3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Bing Maps GetRouteV3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/CardsForPowerApps_CreateCardInstance.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/CardsForPowerApps_CreateCardInstance.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/CardsForPowerApps_CreateCardInstance.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/CardsForPowerApps_CreateCardInstance.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/CardsForPowerApps_Suggestions.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/CardsForPowerApps_Suggestions.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/CardsForPowerApps_Suggestions.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/CardsForPowerApps_Suggestions.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Dataverse_Response_1.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Dataverse_Response_1.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Dataverse_Response_1.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Dataverse_Response_1.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Dataverse_Response_2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Dataverse_Response_2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Dataverse_Response_2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Dataverse_Response_2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Dataverse_Response_3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Dataverse_Response_3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Dataverse_Response_3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Dataverse_Response_3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response1.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response1.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response1.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response1.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response4.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response4.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response4.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response4.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response5.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response5.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EXO_Response5.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EXO_Response5.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EmptyResponse.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EmptyResponse.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/EmptyResponse.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/EmptyResponse.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/HttpCall_1.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/HttpCall_1.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/HttpCall_1.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/HttpCall_1.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Invalid.txt b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Invalid.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Invalid.txt
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Invalid.txt
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/MSNWeather_Response.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/MSNWeather_Response.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/MSNWeather_Response.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/MSNWeather_Response.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/MSNWeather_Response2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/MSNWeather_Response2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/MSNWeather_Response2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/MSNWeather_Response2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook ExportEmailV2.txt b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook ExportEmailV2.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook ExportEmailV2.txt
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook ExportEmailV2.txt
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook FindMeetingTimesV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook FindMeetingTimesV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook FindMeetingTimesV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook FindMeetingTimesV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook FlagV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook FlagV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook FlagV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook FlagV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetEmails.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetEmails.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetEmails.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetEmails.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetEmailsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetEmailsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetEmailsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetEmailsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetMailTipsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetMailTipsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetMailTipsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetMailTipsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetRoomListsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetRoomListsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetRoomListsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetRoomListsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetRooms.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetRooms.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook GetRooms.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook GetRooms.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook V4CalendarPostItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook V4CalendarPostItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office 365 Outlook V4CalendarPostItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office 365 Outlook V4CalendarPostItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office365_DirectsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office365_DirectsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office365_DirectsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office365_DirectsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office365_SearchV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office365_SearchV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office365_SearchV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office365_SearchV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office365_UserProfileV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office365_UserProfileV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Office365_UserProfileV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Office365_UserProfileV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_00.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_00.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_00.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_00.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_01.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_01.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_01.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_01.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_02.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_02.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_02.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_02.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_03.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_03.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_03.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_03.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_04.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_04.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_04.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_04.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_05.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_05.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_05.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_05.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_06.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_06.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_06.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_06.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_07.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_07.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_07.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_07.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_08.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_08.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_08.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_08.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_09.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_09.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_09.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_09.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_10.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_10.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_10.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_10.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_11.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_11.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_11.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_11.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_12.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_12.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_12.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_12.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_13.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_13.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_13.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_13.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_14.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_14.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_14.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_14.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_15.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_15.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_15.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_15.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_16.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_16.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_16.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_16.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_17.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_17.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_17.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_17.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_18.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_18.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_18.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_18.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_19.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_19.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_19.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_19.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_20.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_20.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_20.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_20.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_21.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_21.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_21.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_21.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_22.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_22.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_DVReturnType_22.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_DVReturnType_22.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_AddMemberToGroup.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_AddMemberToGroup.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_AddMemberToGroup.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_AddMemberToGroup.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_CreateCalendarEvent.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_CreateCalendarEvent.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_CreateCalendarEvent.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_CreateCalendarEvent.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_CreateCalendarEventV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_CreateCalendarEventV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_CreateCalendarEventV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_CreateCalendarEventV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_CreateCalendarEvent_ToDelete.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_CreateCalendarEvent_ToDelete.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_CreateCalendarEvent_ToDelete.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_CreateCalendarEvent_ToDelete.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_CreateCalendarEvent_ToUpdate.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_CreateCalendarEvent_ToUpdate.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_CreateCalendarEvent_ToUpdate.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_CreateCalendarEvent_ToUpdate.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_HttpRequest.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_HttpRequest.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_HttpRequest.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_HttpRequest.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_HttpRequestV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_HttpRequestV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_HttpRequestV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_HttpRequestV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListGroupMembers.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListGroupMembers.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListGroupMembers.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListGroupMembers.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListGroupsWithFilter.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListGroupsWithFilter.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListGroupsWithFilter.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListGroupsWithFilter.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListGroups_01.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListGroups_01.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListGroups_01.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListGroups_01.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListGroups_02.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListGroups_02.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListGroups_02.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListGroups_02.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListOwnedGroups.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListOwnedGroups.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListOwnedGroups.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListOwnedGroups.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListOwnedGroupsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListOwnedGroupsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListOwnedGroupsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListOwnedGroupsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListOwnedGroupsV3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListOwnedGroupsV3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_ListOwnedGroupsV3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_ListOwnedGroupsV3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_UpdateCalendarEvent.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_UpdateCalendarEvent.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Groups_UpdateCalendarEvent.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Groups_UpdateCalendarEvent.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarDeleteItem_NotFound.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarDeleteItem_NotFound.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarDeleteItem_NotFound.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarDeleteItem_NotFound.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetItems.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetItems.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetItems.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetItems.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetTable.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetTable.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetTable.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetTable.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetTables.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetTables.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetTables.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetTables.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetTablesV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetTablesV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarGetTablesV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarGetTablesV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarPatchItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarPatchItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarPatchItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarPatchItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarPostItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarPostItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_CalendarPostItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_CalendarPostItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetItemV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetItemV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetItemV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetItemV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetItems.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetItems.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetItems.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetItems.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetItemsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetItemsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetItemsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetItemsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetTable.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetTable.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetTable.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetTable.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetTables.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetTables.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetTables.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetTables.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetTablesV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetTablesV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactGetTablesV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactGetTablesV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactPatchItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactPatchItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactPatchItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactPatchItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactPatchItemV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactPatchItemV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactPatchItemV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactPatchItemV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactPostItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactPostItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactPostItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactPostItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactPostItemV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactPostItemV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ContactPostItemV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ContactPostItemV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ExportEmail.eml b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ExportEmail.eml
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_ExportEmail.eml
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_ExportEmail.eml
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_FindMeetingTimes.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_FindMeetingTimes.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_FindMeetingTimes.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_FindMeetingTimes.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_FindMeetingTimesV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_FindMeetingTimesV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_FindMeetingTimesV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_FindMeetingTimesV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_FlagV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_FlagV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_FlagV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_FlagV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetAttachment.png b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetAttachment.png
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetAttachment.png
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetAttachment.png
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetAttachmentV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetAttachmentV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetAttachmentV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetAttachmentV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetDataSets.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetDataSets.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetDataSets.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetDataSets.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetDataSetsMetadata.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetDataSetsMetadata.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetDataSetsMetadata.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetDataSetsMetadata.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmail.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmail.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmail.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmail.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmailV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmailV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmailV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmailV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmails.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmails.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmails.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmails.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmailsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmailsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmailsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmailsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmailsV3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmailsV3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEmailsV3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEmailsV3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEventsCalendarView.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEventsCalendarView.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEventsCalendarView.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEventsCalendarView.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEventsCalendarViewV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEventsCalendarViewV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEventsCalendarViewV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEventsCalendarViewV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEventsCalendarViewV3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEventsCalendarViewV3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEventsCalendarViewV3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEventsCalendarViewV3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEventsCalendarView_Error.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEventsCalendarView_Error.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetEventsCalendarView_Error.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetEventsCalendarView_Error.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetMailTips.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetMailTips.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetMailTips.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetMailTips.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetMailTipsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetMailTipsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetMailTipsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetMailTipsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomLists.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomLists.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomLists.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomLists.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomListsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomListsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomListsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomListsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRooms.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRooms.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRooms.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRooms.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomsInRoomList.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomsInRoomList.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomsInRoomList.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomsInRoomList.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomsInRoomListV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomsInRoomListV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomsInRoomListV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomsInRoomListV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomsV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomsV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetRoomsV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetRoomsV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetSensitivityLabels.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetSensitivityLabels.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_GetSensitivityLabels.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_GetSensitivityLabels.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_HttpRequest.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_HttpRequest.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_HttpRequest.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_HttpRequest.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_MarkAsReadV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_MarkAsReadV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_MarkAsReadV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_MarkAsReadV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_MarkAsReadV3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_MarkAsReadV3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_MarkAsReadV3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_MarkAsReadV3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_Move.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_Move.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_Move.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_Move.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_MoveV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_MoveV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_MoveV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_MoveV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_SetAutomaticRepliesSettingV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_SetAutomaticRepliesSettingV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_SetAutomaticRepliesSettingV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_SetAutomaticRepliesSettingV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarGetItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarGetItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarGetItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarGetItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarGetItems.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarGetItems.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarGetItems.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarGetItems.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarGetItems2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarGetItems2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarGetItems2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarGetItems2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarPatchItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarPatchItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarPatchItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarPatchItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarPostItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarPostItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V2CalendarPostItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V2CalendarPostItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V3CalendarGetItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V3CalendarGetItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V3CalendarGetItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V3CalendarGetItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V3CalendarGetItems.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V3CalendarGetItems.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V3CalendarGetItems.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V3CalendarGetItems.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V3CalendarPatchItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V3CalendarPatchItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V3CalendarPatchItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V3CalendarPatchItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V3CalendarPostItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V3CalendarPostItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V3CalendarPostItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V3CalendarPostItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V4CalendarGetItems.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V4CalendarGetItems.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V4CalendarGetItems.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V4CalendarGetItems.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V4CalendarPatchItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V4CalendarPatchItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V4CalendarPatchItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V4CalendarPatchItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V4CalendarPostItem.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V4CalendarPostItem.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Outlook_V4CalendarPostItem.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Outlook_V4CalendarPostItem.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_DirectReportsV2_03.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_DirectReportsV2_03.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_DirectReportsV2_03.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_DirectReportsV2_03.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_DirectReports_01.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_DirectReports_01.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_DirectReports_01.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_DirectReports_01.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_DirectReports_02.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_DirectReports_02.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_DirectReports_02.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_DirectReports_02.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_DirectReports_03.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_DirectReports_03.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_DirectReports_03.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_DirectReports_03.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_HttpRequest.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_HttpRequest.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_HttpRequest.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_HttpRequest.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_Manager.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_Manager.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_Manager.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_Manager.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_Manager404.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_Manager404.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_Manager404.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_Manager404.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_ManagerV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_ManagerV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_ManagerV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_ManagerV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_MyProfile.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_MyProfile.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_MyProfile.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_MyProfile.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_MyProfileV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_MyProfileV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_MyProfileV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_MyProfileV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_MyProfileV2A.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_MyProfileV2A.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_MyProfileV2A.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_MyProfileV2A.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_MyTrendingDocuments.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_MyTrendingDocuments.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_MyTrendingDocuments.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_MyTrendingDocuments.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_RelevantPeople.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_RelevantPeople.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_RelevantPeople.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_RelevantPeople.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_SearchUser.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_SearchUser.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_SearchUser.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_SearchUser.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_SearchUser2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_SearchUser2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_SearchUser2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_SearchUser2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_SearchUserV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_SearchUserV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_SearchUserV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_SearchUserV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_TrendingDocuments.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_TrendingDocuments.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_TrendingDocuments.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_TrendingDocuments.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_UserPhotoMetadata.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_UserPhotoMetadata.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_UserPhotoMetadata.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_UserPhotoMetadata.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_UserProfile.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_UserProfile.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_UserProfile.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_UserProfile.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_UserProfileV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_UserProfileV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_UserProfileV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_UserProfileV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_UserProfileV2A.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_UserProfileV2A.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_O365Users_UserProfileV2A.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_O365Users_UserProfileV2A.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_ServiceNowReturnType.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_ServiceNowReturnType.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Response_ServiceNowReturnType.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Response_ServiceNowReturnType.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SF GetData.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SF GetData.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SF GetData.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SF GetData.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SF GetDatasetsMetadata.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SF GetDatasetsMetadata.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SF GetDatasetsMetadata.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SF GetDatasetsMetadata.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SF GetSchema.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SF GetSchema.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SF GetSchema.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SF GetSchema.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SF GetTables.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SF GetTables.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SF GetTables.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SF GetTables.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SP GetData.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SP GetData.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SP GetData.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SP GetData.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SP GetDatasetsMetadata.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SP GetDatasetsMetadata.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SP GetDatasetsMetadata.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SP GetDatasetsMetadata.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SP GetTable.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SP GetTable.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SP GetTable.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SP GetTable.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SP GetTables.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SP GetTables.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SP GetTables.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SP GetTables.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response1.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response1.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response1.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response1.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response4.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response4.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response4.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response4.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response5.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response5.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SPO_Response5.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SPO_Response5.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL GetDatasetsMetadata.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL GetDatasetsMetadata.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL GetDatasetsMetadata.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL GetDatasetsMetadata.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL GetTables.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL GetTables.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL GetTables.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL GetTables.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server ExecuteStoredProcedureV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server ExecuteStoredProcedureV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server ExecuteStoredProcedureV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server ExecuteStoredProcedureV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Get First Customers.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Get First Customers.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Get First Customers.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Get First Customers.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server GetProceduresV2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server GetProceduresV2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server GetProceduresV2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server GetProceduresV2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Error.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Error.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Error.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Error.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response 1.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response 1.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response 1.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response 1.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response 2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response 2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response 2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response 2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response 3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response 3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response 3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response 3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response Error.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response Error.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response Error.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response Error.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response2 1.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response2 1.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response2 1.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response2 1.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response2 2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response2 2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Intellisense Response2 2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Intellisense Response2 2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Load Customers DB.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Load Customers DB.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server Load Customers DB.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server Load Customers DB.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server TestAllFunctions.jsonSet b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server TestAllFunctions.jsonSet
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/SQL Server TestAllFunctions.jsonSet
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/SQL Server TestAllFunctions.jsonSet
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Teams_GetMessageDetails_GetSuggestionsForChannel.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Teams_GetMessageDetails_GetSuggestionsForChannel.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Teams_GetMessageDetails_GetSuggestionsForChannel.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Teams_GetMessageDetails_GetSuggestionsForChannel.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Teams_GetMessageDetails_InputType.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Teams_GetMessageDetails_InputType.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Responses/Teams_GetMessageDetails_InputType.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Responses/Teams_GetMessageDetails_InputType.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Azure Cognitive Service for Language v2.1.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Azure Cognitive Service for Language v2.1.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Azure Cognitive Service for Language v2.1.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Azure Cognitive Service for Language v2.1.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Azure Cognitive Service for Language v2.2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Azure Cognitive Service for Language v2.2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Azure Cognitive Service for Language v2.2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Azure Cognitive Service for Language v2.2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Azure Cognitive Service for Language.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Azure Cognitive Service for Language.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Azure Cognitive Service for Language.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Azure Cognitive Service for Language.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Azure Open AI.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Azure Open AI.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Azure Open AI.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Azure Open AI.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/AzureAppService.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/AzureAppService.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/AzureAppService.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/AzureAppService.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/AzureBlobStorage.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/AzureBlobStorage.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/AzureBlobStorage.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/AzureBlobStorage.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Bing_Maps.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Bing_Maps.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Bing_Maps.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Bing_Maps.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/CardsForPowerApps.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/CardsForPowerApps.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/CardsForPowerApps.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/CardsForPowerApps.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/DadJokes.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/DadJokes.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/DadJokes.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/DadJokes.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Dataverse 2.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Dataverse 2.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Dataverse 2.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Dataverse 2.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Dataverse 3.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Dataverse 3.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Dataverse 3.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Dataverse 3.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Dataverse.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Dataverse.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Dataverse.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Dataverse.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/DataverseSample.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/DataverseSample.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/DataverseSample.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/DataverseSample.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Eden AI.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Eden AI.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Eden AI.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Eden AI.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/ExcelOnlineBusiness.swagger.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/ExcelOnlineBusiness.swagger.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/ExcelOnlineBusiness.swagger.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/ExcelOnlineBusiness.swagger.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Language - Question Answering.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Language - Question Answering.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Language - Question Answering.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Language - Question Answering.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/MSNWeather.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/MSNWeather.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/MSNWeather.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/MSNWeather.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Office_365_Groups.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Office_365_Groups.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Office_365_Groups.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Office_365_Groups.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Office_365_Outlook.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Office_365_Outlook.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Office_365_Outlook.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Office_365_Outlook.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Office_365_Users.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Office_365_Users.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Office_365_Users.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Office_365_Users.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/PetStore.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/PetStore.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/PetStore.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/PetStore.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/PowerAppsForMakers.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/PowerAppsForMakers.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/PowerAppsForMakers.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/PowerAppsForMakers.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/PowerPlatformForAdmins.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/PowerPlatformForAdmins.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/PowerPlatformForAdmins.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/PowerPlatformForAdmins.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/SQL Server.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/SQL Server.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/SQL Server.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/SQL Server.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/SalesForce.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/SalesForce.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/SalesForce.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/SalesForce.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/ServiceNow.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/ServiceNow.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/ServiceNow.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/ServiceNow.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/SharePoint.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/SharePoint.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/SharePoint.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/SharePoint.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Teams.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Teams.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/Teams.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/Teams.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/TestConnector12.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/TestConnector12.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/TestConnector12.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/TestConnector12.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/TestOpenAPI.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/TestOpenAPI.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/TestOpenAPI.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/TestOpenAPI.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/ZenDesk.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/ZenDesk.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/ZenDesk.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/ZenDesk.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/shared_sendmail.json b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/shared_sendmail.json
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/Swagger/shared_sendmail.json
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/Swagger/shared_sendmail.json
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/SwaggerFailureTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/SwaggerFailureTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/SwaggerFailureTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/SwaggerFailureTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/TestConnectorRuntimeContext.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/TestConnectorRuntimeContext.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/TestConnectorRuntimeContext.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/TestConnectorRuntimeContext.cs
diff --git a/src/tests/Microsoft.PowerFx.Connectors.Tests/ThreadingTests.cs b/src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/ThreadingTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Connectors.Tests/ThreadingTests.cs
rename to src/tests/Microsoft.PowerFx.Connectors.Tests.Shared/ThreadingTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/AnalyzeThreadSafety.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/AnalyzeThreadSafety.cs
similarity index 98%
rename from src/tests/Microsoft.PowerFx.Core.Tests/AnalyzeThreadSafety.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/AnalyzeThreadSafety.cs
index b51ae8e32..6e4c520b7 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/AnalyzeThreadSafety.cs
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/AnalyzeThreadSafety.cs
@@ -2,14 +2,14 @@
// Licensed under the MIT license.
using System;
-using System.Collections.Concurrent;
+using System.Collections.Concurrent;
using System.Collections.Generic;
-using System.Diagnostics;
-using System.Globalization;
+using System.Diagnostics;
+using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
-using Microsoft.PowerFx.Core.Texl.Builtins;
+using Microsoft.PowerFx.Core.Texl.Builtins;
using Xunit;
namespace Microsoft.PowerFx.Core.Tests
@@ -18,84 +18,84 @@ namespace Microsoft.PowerFx.Core.Tests
/// Analyze assemblies for thread safety issues.
///
public class AnalyzeThreadSafety
- {
- // Return true if safe, false on error.
- public static bool VerifyThreadSafeImmutable(Type t)
- {
- int errors = 0;
-
- var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly;
-
- // Check out all fields and properties.
- foreach (var prop in t.GetProperties(flags))
- {
- var name = prop.Name;
- if (prop.CanWrite)
- {
- var isInitKeyword = prop.SetMethod.ReturnParameter.GetRequiredCustomModifiers().Contains(typeof(System.Runtime.CompilerServices.IsExternalInit));
- if (!isInitKeyword)
- {
- // No mutable properties allowed. Init only ok.
- Debugger.Log(0, string.Empty, $"{t.Name}.{name} has setter\r\n");
- errors++;
- }
- }
-
- Assert.True(prop.CanRead);
-
- var propType = prop.PropertyType;
-
- if (!IsTypeImmutable(propType))
- {
- // valuetypes are copies, so no contention
- if (!prop.PropertyType.IsValueType)
- {
- // Fail.
- Debugger.Log(0, string.Empty, $"{t.Name}.{name} returns mutable value\r\n");
- errors++;
- }
- }
- }
-
- foreach (var field in t.GetFields(flags))
- {
- var name = field.Name;
-
- if (name.StartsWith("<"))
- {
- // Ignore compile generated fields.
- continue;
- }
-
- // ReadOnly
- if (!field.IsInitOnly)
- {
- Debugger.Log(0, string.Empty, $"{t.Name}.{name} is not readonly\r\n");
- errors++;
- }
-
- if (field.GetCustomAttributes().Any() ||
- IsTypeConcurrent(field.FieldType))
- {
- continue;
- }
-
- if (!IsTypeImmutable(field.FieldType))
- {
- // Fail.
- Debugger.Log(0, string.Empty, $"{t.Name}.{name} returns mutable value\r\n");
- errors++;
- }
- }
-
- if (errors > 0)
- {
- Debugger.Log(0, string.Empty, $"\r\n");
- return false;
- }
-
- return true;
- }
+ {
+ // Return true if safe, false on error.
+ public static bool VerifyThreadSafeImmutable(Type t)
+ {
+ int errors = 0;
+
+ var flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly;
+
+ // Check out all fields and properties.
+ foreach (var prop in t.GetProperties(flags))
+ {
+ var name = prop.Name;
+ if (prop.CanWrite)
+ {
+ var isInitKeyword = prop.SetMethod.ReturnParameter.GetRequiredCustomModifiers().Contains(typeof(System.Runtime.CompilerServices.IsExternalInit));
+ if (!isInitKeyword)
+ {
+ // No mutable properties allowed. Init only ok.
+ Debugger.Log(0, string.Empty, $"{t.Name}.{name} has setter\r\n");
+ errors++;
+ }
+ }
+
+ Assert.True(prop.CanRead);
+
+ var propType = prop.PropertyType;
+
+ if (!IsTypeImmutable(propType))
+ {
+ // valuetypes are copies, so no contention
+ if (!prop.PropertyType.IsValueType)
+ {
+ // Fail.
+ Debugger.Log(0, string.Empty, $"{t.Name}.{name} returns mutable value\r\n");
+ errors++;
+ }
+ }
+ }
+
+ foreach (var field in t.GetFields(flags))
+ {
+ var name = field.Name;
+
+ if (name.StartsWith("<"))
+ {
+ // Ignore compile generated fields.
+ continue;
+ }
+
+ // ReadOnly
+ if (!field.IsInitOnly)
+ {
+ Debugger.Log(0, string.Empty, $"{t.Name}.{name} is not readonly\r\n");
+ errors++;
+ }
+
+ if (field.GetCustomAttributes().Any() ||
+ IsTypeConcurrent(field.FieldType))
+ {
+ continue;
+ }
+
+ if (!IsTypeImmutable(field.FieldType))
+ {
+ // Fail.
+ Debugger.Log(0, string.Empty, $"{t.Name}.{name} returns mutable value\r\n");
+ errors++;
+ }
+ }
+
+ if (errors > 0)
+ {
+ Debugger.Log(0, string.Empty, $"\r\n");
+ return false;
+ }
+
+ return true;
+ }
// Verify there are no "unsafe" static fields that could be threading issues.
// Bugs - list of field types types that don't work. This should be driven to 0.
@@ -186,65 +186,65 @@ namespace Microsoft.PowerFx.Core.Tests
// Batch up errors so we can see all at once.
Assert.Empty(errors);
- }
-
- // $$$ Supersedes ImmutabilityTests.
- // This is more aggressive (includes private fields), but they don't all pass. So assert is disabled.
- public static void CheckImmutableTypes(Assembly[] assemblies, bool enableAssert = false)
- {
- foreach (var assembly in assemblies)
- {
- foreach (Type type in assembly.GetTypes())
- {
+ }
+
+ // $$$ Supersedes ImmutabilityTests.
+ // This is more aggressive (includes private fields), but they don't all pass. So assert is disabled.
+ public static void CheckImmutableTypes(Assembly[] assemblies, bool enableAssert = false)
+ {
+ foreach (var assembly in assemblies)
+ {
+ foreach (Type type in assembly.GetTypes())
+ {
if (type.Name.StartsWith("<", StringComparison.OrdinalIgnoreCase))
{
continue; // exclude compiler generated closures.
- }
-
- // includes base types
- var attr = type.GetInterfaces().Select(x => x.GetCustomAttributes().OfType());
- if (attr == null)
- {
- continue;
- }
-
- // Common pattern is a writeable derived type (like Dict vs. IReadOnlyDict).
- var attrNotSafe = type.GetCustomAttribute(inherit: false);
- if (attrNotSafe != null)
- {
- var attribute = type.GetCustomAttribute(inherit: false);
- if (attribute != null)
- {
- Assert.True(false); // Class can't have both safe & unsafe together.
- }
-
- continue;
- }
-
- bool ok = AnalyzeThreadSafety.VerifyThreadSafeImmutable(type);
-
- // Enable this, per https://github.com/microsoft/Power-Fx/issues/1519
- if (enableAssert)
- {
- Assert.True(ok);
- }
- }
- }
+ }
+
+ // includes base types
+ var attr = type.GetInterfaces().Select(x => x.GetCustomAttributes().OfType());
+ if (attr == null)
+ {
+ continue;
+ }
+
+ // Common pattern is a writeable derived type (like Dict vs. IReadOnlyDict).
+ var attrNotSafe = type.GetCustomAttribute(inherit: false);
+ if (attrNotSafe != null)
+ {
+ var attribute = type.GetCustomAttribute(inherit: false);
+ if (attribute != null)
+ {
+ Assert.True(false); // Class can't have both safe & unsafe together.
+ }
+
+ continue;
+ }
+
+ bool ok = AnalyzeThreadSafety.VerifyThreadSafeImmutable(type);
+
+ // Enable this, per https://github.com/microsoft/Power-Fx/issues/1519
+ if (enableAssert)
+ {
+ Assert.True(ok);
+ }
+ }
+ }
}
-
- private static bool IsTypeConcurrent(Type type)
- {
+
+ private static bool IsTypeConcurrent(Type type)
+ {
if (type.IsGenericType)
{
- var genericDef = type.GetGenericTypeDefinition();
- if (genericDef == typeof(ConcurrentDictionary<,>))
- {
- return true;
- }
- }
-
- return false;
- }
+ var genericDef = type.GetGenericTypeDefinition();
+ if (genericDef == typeof(ConcurrentDictionary<,>))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
private static bool IsFieldVolatile(FieldInfo field)
{
@@ -259,23 +259,23 @@ namespace Microsoft.PowerFx.Core.Tests
{
// Primitives
typeof(object),
- typeof(string),
+ typeof(string),
typeof(System.Type),
typeof(Random),
typeof(DateTime),
typeof(System.Text.RegularExpressions.Regex),
- typeof(System.Numerics.BigInteger),
- typeof(NumberFormatInfo),
-
- // Generics
- typeof(IReadOnlyDictionary<,>),
- typeof(IReadOnlyCollection<>),
- typeof(IReadOnlyList<>),
- typeof(Nullable<>),
- typeof(IEnumerable<>),
- typeof(KeyValuePair<,>),
- typeof(ISet<>)
- };
+ typeof(System.Numerics.BigInteger),
+ typeof(NumberFormatInfo),
+
+ // Generics
+ typeof(IReadOnlyDictionary<,>),
+ typeof(IReadOnlyCollection<>),
+ typeof(IReadOnlyList<>),
+ typeof(Nullable<>),
+ typeof(IEnumerable<>),
+ typeof(KeyValuePair<,>),
+ typeof(ISet<>)
+ };
// If the instance is readonly, is the type itself immutable ?
internal static bool IsTypeImmutable(Type t)
@@ -300,20 +300,20 @@ namespace Microsoft.PowerFx.Core.Tests
// Collection classes should be a IReadOnly. Verify their T is also safe.
if (t.IsGenericType)
{
- var genericDef = t.GetGenericTypeDefinition();
- if (_knownImmutableTypes.Contains(genericDef))
- {
- var typeArgs = t.GetGenericArguments();
- foreach (var arg in typeArgs)
- {
- var isArgSafe = IsTypeImmutable(arg) || arg.IsValueType;
- if (!isArgSafe)
- {
- return false;
- }
- }
+ var genericDef = t.GetGenericTypeDefinition();
+ if (_knownImmutableTypes.Contains(genericDef))
+ {
+ var typeArgs = t.GetGenericArguments();
+ foreach (var arg in typeArgs)
+ {
+ var isArgSafe = IsTypeImmutable(arg) || arg.IsValueType;
+ if (!isArgSafe)
+ {
+ return false;
+ }
+ }
- return true;
+ return true;
}
}
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/AssemblyProperties.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/AssemblyProperties.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/AssemblyProperties.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/AssemblyProperties.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/AssociatedDataSourcesTests/TestDVEntity.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/AssociatedDataSourcesTests/TestDVEntity.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/AssociatedDataSourcesTests/TestDVEntity.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/AssociatedDataSourcesTests/TestDVEntity.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/AssociatedDataSourcesTests/TestDelegationValidation.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/AssociatedDataSourcesTests/TestDelegationValidation.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/AssociatedDataSourcesTests/TestDelegationValidation.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/AssociatedDataSourcesTests/TestDelegationValidation.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/AssociatedDataSourcesTests/TestUpdateDataQuerySelects.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/AssociatedDataSourcesTests/TestUpdateDataQuerySelects.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/AssociatedDataSourcesTests/TestUpdateDataQuerySelects.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/AssociatedDataSourcesTests/TestUpdateDataQuerySelects.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/AttributeParserTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/AttributeParserTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/AttributeParserTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/AttributeParserTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/BinderTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/BinderTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/BinderTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/BinderTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/BinderUtilsTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/BinderUtilsTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/BinderUtilsTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/BinderUtilsTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/BindingEngineTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/BindingEngineTests.cs
similarity index 98%
rename from src/tests/Microsoft.PowerFx.Core.Tests/BindingEngineTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/BindingEngineTests.cs
index b2601f3cb..565e0428b 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/BindingEngineTests.cs
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/BindingEngineTests.cs
@@ -1,25 +1,25 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
-using System;
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Globalization;
using System.Linq;
-using Microsoft.PowerFx.Core.Functions;
-using Microsoft.PowerFx.Core.Localization;
+using Microsoft.PowerFx.Core.Functions;
+using Microsoft.PowerFx.Core.Localization;
using Microsoft.PowerFx.Core.Tests;
-using Microsoft.PowerFx.Core.Texl.Builtins;
-using Microsoft.PowerFx.Core.Types;
-using Microsoft.PowerFx.Core.Utils;
-using Microsoft.PowerFx.Syntax;
+using Microsoft.PowerFx.Core.Texl.Builtins;
+using Microsoft.PowerFx.Core.Types;
+using Microsoft.PowerFx.Core.Utils;
+using Microsoft.PowerFx.Syntax;
using Microsoft.PowerFx.Types;
using Xunit;
-using Xunit.Sdk;
-
+using Xunit.Sdk;
+
namespace Microsoft.PowerFx.Tests
{
public class BindingEngineTests : PowerFxTest
- {
+ {
[Fact]
public void CheckSuccess()
{
@@ -54,8 +54,8 @@ namespace Microsoft.PowerFx.Tests
Assert.Equal("3 * x", str);
var r = RecordType.Empty().Add(
- new NamedFormulaType("x", FormulaType.Number));
-
+ new NamedFormulaType("x", FormulaType.Number));
+
var check = engine.Check(parse, r);
Assert.True(check.IsSuccess);
@@ -69,7 +69,7 @@ namespace Microsoft.PowerFx.Tests
public void CheckChainingParseSuccess()
{
var opts = new ParserOptions
- {
+ {
AllowsSideEffects = true
};
@@ -94,8 +94,8 @@ namespace Microsoft.PowerFx.Tests
var result = engine.Parse("3*1+");
Assert.True(result.HasError);
- Assert.Single(result.Errors);
-
+ Assert.Single(result.Errors);
+
AssertContainsError(result, "Error 4-4: Expected an operand");
}
@@ -109,8 +109,8 @@ namespace Microsoft.PowerFx.Tests
Assert.False(result.IsSuccess);
Assert.True(result.Errors.Count() >= 1);
AssertContainsError(result, "Error 4-4: Expected an operand");
- }
-
+ }
+
[Fact]
public void CheckParseErrorCommaSeparatedLocale()
{
@@ -136,14 +136,14 @@ namespace Microsoft.PowerFx.Tests
var result = Engine.Parse("Function(args; separated; by; semicolons) + 123,456", options: new ParserOptions(CultureInfo.GetCultureInfo("de-DE")));
Assert.True(result.IsSuccess);
- }
-
- [Fact]
- public void CheckNullRef()
- {
- var engine = new Engine(new PowerFxConfig());
- Assert.Throws(() => engine.Check((string)null));
- }
+ }
+
+ [Fact]
+ public void CheckNullRef()
+ {
+ var engine = new Engine(new PowerFxConfig());
+ Assert.Throws(() => engine.Check((string)null));
+ }
[Fact]
public void CheckBindError()
@@ -154,22 +154,22 @@ namespace Microsoft.PowerFx.Tests
Assert.False(result.IsSuccess);
AssertContainsError(result, "Error 2-5: Name isn't valid. 'foo' isn't recognized");
- }
-
- [Theory]
-
- // Binding errors
- [InlineData("3+foo+2", "Error 2-5: Il nome non è valido. \"foo\" non riconosciuto.", "it-IT")]
- [InlineData("Foo()", "Error 0-5: 'Foo' est une fonction inconnue ou non prise en charge.", "fr-FR")]
- [InlineData("AAA", "Error 0-3: O nome não é válido. 'AAA' não é reconhecido.", "pt-BR")]
- [InlineData("Bar()", "Error 0-5: \"Bar\" — неизвестная или неподдерживаемая функция.", "ru-RU")]
- [InlineData("Table({a:BB})", "Error 9-11: Name isn't valid. 'BB' isn't recognized.", "en-US")]
-
- // Parse errors
- [InlineData("2e.5", "Error 1-2: È previsto un operatore. A questo punto della formula è previsto un operatore, ad esempio +, * o &.", "it-IT")]
- [InlineData(".2.3", "Error 0-1: Caractères inattendus. Des caractères sont utilisés dans la formule de manière inattendue.", "fr-FR")]
- [InlineData("2EEE5", "Error 1-5: Operador esperado. Esperamos um operador como +, * ou & neste ponto na fórmula.", "pt-BR")]
- [InlineData("7E1111111", "Error 0-9: Numerická hodnota je príliš veľká.", "sk-SK")]
+ }
+
+ [Theory]
+
+ // Binding errors
+ [InlineData("3+foo+2", "Error 2-5: Il nome non è valido. \"foo\" non riconosciuto.", "it-IT")]
+ [InlineData("Foo()", "Error 0-5: 'Foo' est une fonction inconnue ou non prise en charge.", "fr-FR")]
+ [InlineData("AAA", "Error 0-3: O nome não é válido. 'AAA' não é reconhecido.", "pt-BR")]
+ [InlineData("Bar()", "Error 0-5: \"Bar\" — неизвестная или неподдерживаемая функция.", "ru-RU")]
+ [InlineData("Table({a:BB})", "Error 9-11: Name isn't valid. 'BB' isn't recognized.", "en-US")]
+
+ // Parse errors
+ [InlineData("2e.5", "Error 1-2: È previsto un operatore. A questo punto della formula è previsto un operatore, ad esempio +, * o &.", "it-IT")]
+ [InlineData(".2.3", "Error 0-1: Caractères inattendus. Des caractères sont utilisés dans la formule de manière inattendue.", "fr-FR")]
+ [InlineData("2EEE5", "Error 1-5: Operador esperado. Esperamos um operador como +, * ou & neste ponto na fórmula.", "pt-BR")]
+ [InlineData("7E1111111", "Error 0-9: Numerická hodnota je príliš veľká.", "sk-SK")]
[InlineData("4E88888", "Error 0-7: Numeric value is too large.", "en-US")]
public void CheckBindError2(string expression, string expected, string locale)
{
@@ -214,15 +214,15 @@ namespace Microsoft.PowerFx.Tests
Assert.False(result.IsSuccess);
Assert.Single(result.Errors);
AssertContainsError(result, "Error 31-34: Name isn't valid. 'foo' isn't recognized");
- }
-
+ }
+
[Fact]
public void CheckDottedBindError()
{
var config = new PowerFxConfig();
var engine = new Engine(config);
var result = engine.Check("First([1,2,3]).foo");
- Assert.False(result.IsSuccess);
+ Assert.False(result.IsSuccess);
Assert.Single(result.Errors);
AssertContainsError(result, "Error 14-18: Name isn't valid. 'foo' isn't recognized.");
}
@@ -233,7 +233,7 @@ namespace Microsoft.PowerFx.Tests
var config = new PowerFxConfig();
var engine = new Engine(config);
var result = engine.Check("[1,2,3].foo");
- Assert.False(result.IsSuccess);
+ Assert.False(result.IsSuccess);
Assert.Single(result.Errors);
AssertContainsError(result, "Error 7-11: Deprecated use of '.'. Please use the 'ShowColumns' function instead.");
}
@@ -258,229 +258,229 @@ namespace Microsoft.PowerFx.Tests
var engine = new Engine(config);
var formula = "Behavior(); Behavior()";
- var options = new ParserOptions { AllowsSideEffects = true };
-
+ var options = new ParserOptions { AllowsSideEffects = true };
+
var result1 = engine.Check(formula, options: options);
Assert.True(result1.IsSuccess);
var parseResult2 = engine.Parse(formula, options);
var result2 = engine.Check(parseResult2);
Assert.True(result2.IsSuccess);
- }
-
- [Fact]
- public void CheckRecursiveCustomType()
- {
+ }
+
+ [Fact]
+ public void CheckRecursiveCustomType()
+ {
var config = new PowerFxConfig();
- var engine = new Engine(config);
-
- var lazyTypeInstance = new LazyRecursiveRecordType();
-
- var result = engine.Check(
- "Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop" +
- ".Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop" +
- ".Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop" +
- ".Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop", lazyTypeInstance);
-
+ var engine = new Engine(config);
+
+ var lazyTypeInstance = new LazyRecursiveRecordType();
+
+ var result = engine.Check(
+ "Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop" +
+ ".Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop" +
+ ".Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop" +
+ ".Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop.Loop", lazyTypeInstance);
+
Assert.True(result.IsSuccess);
- Assert.IsType(result.ReturnType);
- Assert.Equal(lazyTypeInstance, result.ReturnType);
-
- // We never needed to iterate the fields of the lazy type
+ Assert.IsType(result.ReturnType);
+ Assert.Equal(lazyTypeInstance, result.ReturnType);
+
+ // We never needed to iterate the fields of the lazy type
Assert.False(lazyTypeInstance.EnumerableIterated);
- }
-
- [Fact]
- public void CheckFunctionsWithColumnIdentifierAndLambda_OneFunction()
- {
- var config = new PowerFxConfig();
- var gotException = false;
-
- try
- {
- config.AddFunction(new LambdaAndColumnIdentifierFunction());
- }
- catch (ArgumentException ex)
- {
- Assert.Equal("This function is ambiguous, it contains lambda expressions and column identifiers for the same argument.", ex.Message);
- gotException = true;
- }
- finally
- {
- Assert.True(gotException);
- }
- }
-
- [Fact]
- public void CheckFunctionsWithColumnIdentifierAndLambda_Overloads_TwoFunctions()
- {
- var funcs = new TexlFunction[] { new LambdaFunction(0x1), new ColumnIdentifierFunction(0x1) };
-
- for (var i = 0; i < 2; i++)
- {
- var config = new PowerFxConfig();
- var gotException = false;
-
- config.AddFunction(funcs[i % 2]);
-
- try
- {
- config.AddFunction(funcs[(i + 1) % 2]);
- }
- catch (ArgumentException ex)
- {
- Assert.Equal("This function is ambiguous, it contains lambda expressions and column identifiers for the same argument.", ex.Message);
- gotException = true;
- }
- finally
- {
- Assert.True(gotException);
- }
- }
- }
-
- [Fact]
- public void CheckFunctionsWithColumnIdentifierAndLambda_Overloads_NoConflict()
- {
- var funcs = new TexlFunction[] { new LambdaFunction(0x1), new ColumnIdentifierFunction(0x2) };
-
- for (var i = 0; i < 2; i++)
- {
- var config = new PowerFxConfig();
-
- config.AddFunction(funcs[i % 2]);
- config.AddFunction(funcs[(i + 1) % 2]);
- }
- }
-
- [Fact]
- public void CheckFunctionsWithColumnIdentifierAndLambda_Overloads_NoConflict2()
- {
- var funcs = new TexlFunction[] { new LambdaFunction(0x1), new ColumnIdentifierFunction(0x2), new LambdaFunction(0x4), new ColumnIdentifierFunction(0x8) };
-
- for (var i = 0; i < 4; i++)
- {
- var config = new PowerFxConfig();
-
- config.AddFunction(funcs[i % 4]);
- config.AddFunction(funcs[(i + 1) % 4]);
- config.AddFunction(funcs[(i + 2) % 4]);
- config.AddFunction(funcs[(i + 3) % 4]);
- }
- }
-
- [Fact]
- public void CheckFunctionsWithColumnIdentifierAndLambda_Overloads_Conflict()
- {
- var funcs = new TexlFunction[] { new LambdaFunction(0x1), new ColumnIdentifierFunction(0x2), new ColumnIdentifierFunction(0x1) };
-
- for (var i = 0; i < 3; i++)
- {
- var config = new PowerFxConfig();
- var gotException = false;
-
- try
- {
- config.AddFunction(funcs[i % 3]);
- config.AddFunction(funcs[(i + 1) % 3]);
- config.AddFunction(funcs[(i + 2) % 3]);
- }
- catch (ArgumentException ex)
- {
- Assert.Equal("This function is ambiguous, it contains lambda expressions and column identifiers for the same argument.", ex.Message);
- gotException = true;
- }
- finally
- {
- Assert.True(gotException);
- }
- }
- }
-
- internal class LazyRecursiveRecordType : RecordType
- {
- public override IEnumerable FieldNames => GetFieldNames();
-
- public bool EnumerableIterated = false;
-
- public LazyRecursiveRecordType()
- : base()
- {
- }
-
- public override bool TryGetFieldType(string name, out FormulaType type)
- {
- switch (name)
- {
- case "SomeString":
- type = FormulaType.String;
- return true;
- case "Loop":
- type = this;
- return true;
- default:
- type = FormulaType.Blank;
- return false;
- }
- }
-
- private IEnumerable GetFieldNames()
- {
- EnumerableIterated = true;
-
- yield return "SomeString";
- yield return "Loop";
- }
-
- public override bool Equals(object other)
- {
- return other is LazyRecursiveRecordType; // All the same
- }
-
- public override int GetHashCode()
- {
- return 1;
- }
- }
-
- [Fact]
- public void CheckTypeUnionLazy()
- {
+ }
+
+ [Fact]
+ public void CheckFunctionsWithColumnIdentifierAndLambda_OneFunction()
+ {
var config = new PowerFxConfig();
- var engine = new Engine(config);
-
- var lazyTypeInstance = new LazyRecursiveRecordType();
-
- var result = engine.Check("First(Table(Loop, {A: SomeString}))", lazyTypeInstance);
-
+ var gotException = false;
+
+ try
+ {
+ config.AddFunction(new LambdaAndColumnIdentifierFunction());
+ }
+ catch (ArgumentException ex)
+ {
+ Assert.Equal("This function is ambiguous, it contains lambda expressions and column identifiers for the same argument.", ex.Message);
+ gotException = true;
+ }
+ finally
+ {
+ Assert.True(gotException);
+ }
+ }
+
+ [Fact]
+ public void CheckFunctionsWithColumnIdentifierAndLambda_Overloads_TwoFunctions()
+ {
+ var funcs = new TexlFunction[] { new LambdaFunction(0x1), new ColumnIdentifierFunction(0x1) };
+
+ for (var i = 0; i < 2; i++)
+ {
+ var config = new PowerFxConfig();
+ var gotException = false;
+
+ config.AddFunction(funcs[i % 2]);
+
+ try
+ {
+ config.AddFunction(funcs[(i + 1) % 2]);
+ }
+ catch (ArgumentException ex)
+ {
+ Assert.Equal("This function is ambiguous, it contains lambda expressions and column identifiers for the same argument.", ex.Message);
+ gotException = true;
+ }
+ finally
+ {
+ Assert.True(gotException);
+ }
+ }
+ }
+
+ [Fact]
+ public void CheckFunctionsWithColumnIdentifierAndLambda_Overloads_NoConflict()
+ {
+ var funcs = new TexlFunction[] { new LambdaFunction(0x1), new ColumnIdentifierFunction(0x2) };
+
+ for (var i = 0; i < 2; i++)
+ {
+ var config = new PowerFxConfig();
+
+ config.AddFunction(funcs[i % 2]);
+ config.AddFunction(funcs[(i + 1) % 2]);
+ }
+ }
+
+ [Fact]
+ public void CheckFunctionsWithColumnIdentifierAndLambda_Overloads_NoConflict2()
+ {
+ var funcs = new TexlFunction[] { new LambdaFunction(0x1), new ColumnIdentifierFunction(0x2), new LambdaFunction(0x4), new ColumnIdentifierFunction(0x8) };
+
+ for (var i = 0; i < 4; i++)
+ {
+ var config = new PowerFxConfig();
+
+ config.AddFunction(funcs[i % 4]);
+ config.AddFunction(funcs[(i + 1) % 4]);
+ config.AddFunction(funcs[(i + 2) % 4]);
+ config.AddFunction(funcs[(i + 3) % 4]);
+ }
+ }
+
+ [Fact]
+ public void CheckFunctionsWithColumnIdentifierAndLambda_Overloads_Conflict()
+ {
+ var funcs = new TexlFunction[] { new LambdaFunction(0x1), new ColumnIdentifierFunction(0x2), new ColumnIdentifierFunction(0x1) };
+
+ for (var i = 0; i < 3; i++)
+ {
+ var config = new PowerFxConfig();
+ var gotException = false;
+
+ try
+ {
+ config.AddFunction(funcs[i % 3]);
+ config.AddFunction(funcs[(i + 1) % 3]);
+ config.AddFunction(funcs[(i + 2) % 3]);
+ }
+ catch (ArgumentException ex)
+ {
+ Assert.Equal("This function is ambiguous, it contains lambda expressions and column identifiers for the same argument.", ex.Message);
+ gotException = true;
+ }
+ finally
+ {
+ Assert.True(gotException);
+ }
+ }
+ }
+
+ internal class LazyRecursiveRecordType : RecordType
+ {
+ public override IEnumerable FieldNames => GetFieldNames();
+
+ public bool EnumerableIterated = false;
+
+ public LazyRecursiveRecordType()
+ : base()
+ {
+ }
+
+ public override bool TryGetFieldType(string name, out FormulaType type)
+ {
+ switch (name)
+ {
+ case "SomeString":
+ type = FormulaType.String;
+ return true;
+ case "Loop":
+ type = this;
+ return true;
+ default:
+ type = FormulaType.Blank;
+ return false;
+ }
+ }
+
+ private IEnumerable GetFieldNames()
+ {
+ EnumerableIterated = true;
+
+ yield return "SomeString";
+ yield return "Loop";
+ }
+
+ public override bool Equals(object other)
+ {
+ return other is LazyRecursiveRecordType; // All the same
+ }
+
+ public override int GetHashCode()
+ {
+ return 1;
+ }
+ }
+
+ [Fact]
+ public void CheckTypeUnionLazy()
+ {
+ var config = new PowerFxConfig();
+ var engine = new Engine(config);
+
+ var lazyTypeInstance = new LazyRecursiveRecordType();
+
+ var result = engine.Check("First(Table(Loop, {A: SomeString}))", lazyTypeInstance);
+
Assert.True(result.IsSuccess);
- Assert.IsType(result.ReturnType);
-
- Assert.Equal("![A:s, Loop:r!, SomeString:s]", result.ReturnType._type.ToString());
-
- // Union operations require iterating fields
+ Assert.IsType(result.ReturnType);
+
+ Assert.Equal("![A:s, Loop:r!, SomeString:s]", result.ReturnType._type.ToString());
+
+ // Union operations require iterating fields
Assert.True(lazyTypeInstance.EnumerableIterated);
- }
-
- [Fact]
- public void CheckShuffleLazyTable()
- {
+ }
+
+ [Fact]
+ public void CheckShuffleLazyTable()
+ {
var config = new PowerFxConfig();
- var engine = new Engine(config);
-
- var lazyTypeInstance = new LazyRecursiveRecordType().ToTable();
-
- var result = engine.Check("Shuffle(Table)", RecordType.Empty().Add("Table", lazyTypeInstance));
- Assert.True(result.IsSuccess);
-
+ var engine = new Engine(config);
+
+ var lazyTypeInstance = new LazyRecursiveRecordType().ToTable();
+
+ var result = engine.Check("Shuffle(Table)", RecordType.Empty().Add("Table", lazyTypeInstance));
+ Assert.True(result.IsSuccess);
+
var tableType = Assert.IsType(result.ReturnType);
Assert.IsType(tableType.ToRecord());
- }
+ }
- ///
- /// A function with behavior/side-effects used in testing.
+ ///
+ /// A function with behavior/side-effects used in testing.
///
- internal class BehaviorFunction : TexlFunction
+ internal class BehaviorFunction : TexlFunction
{
public BehaviorFunction()
: base(
@@ -494,18 +494,18 @@ namespace Microsoft.PowerFx.Tests
0, // no args
0)
{
- }
-
- public override bool IsSelfContained => false;
-
- public override IEnumerable GetSignatures()
- {
- yield break;
- }
- }
-
- // Example of function that requires AI disclaimer.
- internal class AISummarizeFunction : TexlFunction
+ }
+
+ public override bool IsSelfContained => false;
+
+ public override IEnumerable GetSignatures()
+ {
+ yield break;
+ }
+ }
+
+ // Example of function that requires AI disclaimer.
+ internal class AISummarizeFunction : TexlFunction
{
public AISummarizeFunction()
: base(
@@ -519,99 +519,99 @@ namespace Microsoft.PowerFx.Tests
0, // no args
0)
{
- }
-
- public override bool IsSelfContained => false;
-
- public override IEnumerable GetSignatures()
- {
- yield break;
- }
- }
-
- internal class LambdaAndColumnIdentifierFunction : TexlFunction
- {
- public LambdaAndColumnIdentifierFunction()
- : base(DPath.Root, "LambdaAndColumnIdentifierFunction", "LambdaAndColumnIdentifierFunction", TexlStrings.AboutSet, FunctionCategories.Text, DType.Boolean, 0x1, 1, 1)
- {
- }
-
- public override bool HasLambdas => true;
-
- public override bool HasColumnIdentifiers => true;
-
- public override bool IsSelfContained => false;
-
- public override IEnumerable GetSignatures()
- {
- yield break;
- }
-
- public override bool IsLambdaParam(TexlNode node, int index)
- {
- return true;
- }
-
- public override ParamIdentifierStatus GetIdentifierParamStatus(TexlNode node, Features features, int index)
- {
- return ParamIdentifierStatus.AlwaysIdentifier;
- }
- }
-
- internal class LambdaFunction : TexlFunction
- {
- private readonly int _mask = 0;
-
- public LambdaFunction(int mask)
- : base(DPath.Root, "TestFunction1", "TestFunction1", TexlStrings.AboutSet, FunctionCategories.Text, DType.Boolean, mask, 1, 1)
- {
- _mask = mask;
- }
-
- public override bool HasLambdas => true;
-
- public override bool HasColumnIdentifiers => false;
-
- public override bool IsSelfContained => false;
-
- public override IEnumerable GetSignatures()
- {
- yield break;
- }
-
- public override bool IsLambdaParam(TexlNode node, int index)
- {
- return (_mask & (1 << index)) != 0;
- }
- }
-
- internal class ColumnIdentifierFunction : TexlFunction
- {
- private readonly int _mask = 0;
-
- public ColumnIdentifierFunction(int mask)
- : base(DPath.Root, "TestFunction1", "TestFunction1", TexlStrings.AboutSet, FunctionCategories.Text, DType.Boolean, 0x0, 1, 1)
- {
- _mask = mask;
- }
-
- public override bool HasLambdas => false;
-
- public override bool HasColumnIdentifiers => true;
-
- public override bool IsSelfContained => false;
-
- public override IEnumerable GetSignatures()
- {
- yield break;
- }
-
- public override ParamIdentifierStatus GetIdentifierParamStatus(TexlNode node, Features features, int index)
- {
- return (_mask & (1 << index)) != 0 ? ParamIdentifierStatus.AlwaysIdentifier : ParamIdentifierStatus.NeverIdentifier;
- }
- }
-
+ }
+
+ public override bool IsSelfContained => false;
+
+ public override IEnumerable GetSignatures()
+ {
+ yield break;
+ }
+ }
+
+ internal class LambdaAndColumnIdentifierFunction : TexlFunction
+ {
+ public LambdaAndColumnIdentifierFunction()
+ : base(DPath.Root, "LambdaAndColumnIdentifierFunction", "LambdaAndColumnIdentifierFunction", TexlStrings.AboutSet, FunctionCategories.Text, DType.Boolean, 0x1, 1, 1)
+ {
+ }
+
+ public override bool HasLambdas => true;
+
+ public override bool HasColumnIdentifiers => true;
+
+ public override bool IsSelfContained => false;
+
+ public override IEnumerable GetSignatures()
+ {
+ yield break;
+ }
+
+ public override bool IsLambdaParam(TexlNode node, int index)
+ {
+ return true;
+ }
+
+ public override ParamIdentifierStatus GetIdentifierParamStatus(TexlNode node, Features features, int index)
+ {
+ return ParamIdentifierStatus.AlwaysIdentifier;
+ }
+ }
+
+ internal class LambdaFunction : TexlFunction
+ {
+ private readonly int _mask = 0;
+
+ public LambdaFunction(int mask)
+ : base(DPath.Root, "TestFunction1", "TestFunction1", TexlStrings.AboutSet, FunctionCategories.Text, DType.Boolean, mask, 1, 1)
+ {
+ _mask = mask;
+ }
+
+ public override bool HasLambdas => true;
+
+ public override bool HasColumnIdentifiers => false;
+
+ public override bool IsSelfContained => false;
+
+ public override IEnumerable GetSignatures()
+ {
+ yield break;
+ }
+
+ public override bool IsLambdaParam(TexlNode node, int index)
+ {
+ return (_mask & (1 << index)) != 0;
+ }
+ }
+
+ internal class ColumnIdentifierFunction : TexlFunction
+ {
+ private readonly int _mask = 0;
+
+ public ColumnIdentifierFunction(int mask)
+ : base(DPath.Root, "TestFunction1", "TestFunction1", TexlStrings.AboutSet, FunctionCategories.Text, DType.Boolean, 0x0, 1, 1)
+ {
+ _mask = mask;
+ }
+
+ public override bool HasLambdas => false;
+
+ public override bool HasColumnIdentifiers => true;
+
+ public override bool IsSelfContained => false;
+
+ public override IEnumerable GetSignatures()
+ {
+ yield break;
+ }
+
+ public override ParamIdentifierStatus GetIdentifierParamStatus(TexlNode node, Features features, int index)
+ {
+ return (_mask & (1 << index)) != 0 ? ParamIdentifierStatus.AlwaysIdentifier : ParamIdentifierStatus.NeverIdentifier;
+ }
+ }
+
private void AssertContainsError(IOperationStatus result, string errorMessage)
{
Assert.Contains(result.Errors, x => x.ToString().StartsWith(errorMessage));
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/BlobTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/BlobTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/BlobTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/BlobTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/CharacterUtilsTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/CharacterUtilsTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/CharacterUtilsTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/CharacterUtilsTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/CheckResultTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/CheckResultTests.cs
similarity index 99%
rename from src/tests/Microsoft.PowerFx.Core.Tests/CheckResultTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/CheckResultTests.cs
index 948fbdcd6..f0a438b8d 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/CheckResultTests.cs
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/CheckResultTests.cs
@@ -4,11 +4,11 @@
using System;
using System.Collections.Generic;
using System.Globalization;
-using System.Linq;
-using Microsoft.PowerFx.Core.Tests.Helpers;
+using System.Linq;
+using Microsoft.PowerFx.Core.Tests.Helpers;
using Microsoft.PowerFx.Core.Utils;
using Microsoft.PowerFx.Syntax;
-using Microsoft.PowerFx.Types;
+using Microsoft.PowerFx.Types;
using Xunit;
namespace Microsoft.PowerFx.Core.Tests
@@ -144,36 +144,36 @@ namespace Microsoft.PowerFx.Core.Tests
Assert.Throws(() => check.SetText(parseResult));
Assert.Same(parseResult, check.Parse);
- }
-
- [Theory]
-
- [InlineData("\"Something\"", "Something", true)]
- [InlineData("1", 1d, true)]
- [InlineData("true", true, true)]
- [InlineData("GUID(\"ac98f780-0df8-427d-8c09-50f09b5f9cf5\")", "ac98f780-0df8-427d-8c09-50f09b5f9cf5", true)]
- [InlineData("GUID()", null, false)]
- [InlineData("Abs(2)", null, false)]
+ }
+
+ [Theory]
+
+ [InlineData("\"Something\"", "Something", true)]
+ [InlineData("1", 1d, true)]
+ [InlineData("true", true, true)]
+ [InlineData("GUID(\"ac98f780-0df8-427d-8c09-50f09b5f9cf5\")", "ac98f780-0df8-427d-8c09-50f09b5f9cf5", true)]
+ [InlineData("GUID()", null, false)]
+ [InlineData("Abs(2)", null, false)]
public void GetParseLiteralsTests(string expression, object expected, bool canGetAsLiteral)
{
var check = new CheckResult(new Engine());
- var parseResult = Engine.Parse(expression, options: new PowerFx.ParserOptions() { NumberIsFloat = true });
+ var parseResult = Engine.Parse(expression, options: new PowerFx.ParserOptions() { NumberIsFloat = true });
check.SetText(parseResult);
- check.ApplyParse();
-
+ check.ApplyParse();
+
var gotLiteral = check.TryGetAsLiteral(out var value);
- Assert.Equal(canGetAsLiteral, gotLiteral);
-
- if (gotLiteral)
- {
- if (expression.StartsWith("GUID("))
- {
- expected = Guid.Parse((string)expected);
- }
-
- Assert.Equal(expected, value);
+ Assert.Equal(canGetAsLiteral, gotLiteral);
+
+ if (gotLiteral)
+ {
+ if (expression.StartsWith("GUID("))
+ {
+ expected = Guid.Parse((string)expected);
+ }
+
+ Assert.Equal(expected, value);
}
}
@@ -198,8 +198,8 @@ namespace Microsoft.PowerFx.Core.Tests
[InlineData("1+", false)]
public void BasicParseErrors2(string expr, bool numberIsFloat)
{
- var check = new CheckResult(new Engine());
- check.SetText(expr, numberIsFloat ? _numberIsFloatOpts : null); // parse error
+ var check = new CheckResult(new Engine());
+ check.SetText(expr, numberIsFloat ? _numberIsFloatOpts : null); // parse error
// Can still try to bind even with parse errors.
// But some information like Returntype isn't computed.
@@ -216,9 +216,9 @@ namespace Microsoft.PowerFx.Core.Tests
// Still assign some types
var node = ((BinaryOpNode)parse.Root).Left;
- var type = check.GetNodeType(node);
+ var type = check.GetNodeType(node);
Assert.Equal(numberIsFloat ? FormulaType.Number : FormulaType.Decimal, type);
- }
+ }
// Ensure we can pass in ParserOptions.
[Fact]
@@ -291,96 +291,96 @@ namespace Microsoft.PowerFx.Core.Tests
check.ApplyParse();
Assert.Throws(() => check.ApplyBinding());
- }
-
- [Fact]
- public void GetFunctionInfoTest()
- {
- var check = new CheckResult(new Engine())
- .SetText("Power(3,2)")
- .SetBindingInfo();
-
- var node = (CallNode)check.ApplyParse().Root;
-
- var info = check.GetFunctionInfo(node);
-
- Assert.Equal("Power", info.Name);
- var sigs = info.Signatures.Single();
- Assert.Equal("Power(base, exponent)", sigs.DebugToString());
- }
-
- [Fact]
- public void GetFunctionInfoTestNull()
- {
- var check = new CheckResult(new Engine())
- .SetText("Power(3,2)")
- .SetBindingInfo();
-
- Assert.Throws(() => check.GetFunctionInfo(null));
- }
-
- [Fact]
- public void GetFunctionMissingTest()
- {
- var check = new CheckResult(new Engine())
- .SetText("Missing(3,2)")
- .SetBindingInfo();
-
- var node = (CallNode)check.ApplyParse().Root;
-
- // No function Info.
- var info = check.GetFunctionInfo(node);
- Assert.Null(info);
}
- [Theory]
-
+ [Fact]
+ public void GetFunctionInfoTest()
+ {
+ var check = new CheckResult(new Engine())
+ .SetText("Power(3,2)")
+ .SetBindingInfo();
+
+ var node = (CallNode)check.ApplyParse().Root;
+
+ var info = check.GetFunctionInfo(node);
+
+ Assert.Equal("Power", info.Name);
+ var sigs = info.Signatures.Single();
+ Assert.Equal("Power(base, exponent)", sigs.DebugToString());
+ }
+
+ [Fact]
+ public void GetFunctionInfoTestNull()
+ {
+ var check = new CheckResult(new Engine())
+ .SetText("Power(3,2)")
+ .SetBindingInfo();
+
+ Assert.Throws(() => check.GetFunctionInfo(null));
+ }
+
+ [Fact]
+ public void GetFunctionMissingTest()
+ {
+ var check = new CheckResult(new Engine())
+ .SetText("Missing(3,2)")
+ .SetBindingInfo();
+
+ var node = (CallNode)check.ApplyParse().Root;
+
+ // No function Info.
+ var info = check.GetFunctionInfo(node);
+ Assert.Null(info);
+ }
+
+ [Theory]
+
// ****When Coercion is not allowed.****
- [InlineData("\"test string\"", false, true, "s", "")]
-
+ [InlineData("\"test string\"", false, true, "s", "")]
+
// (even with coercion not allowed, we coerce numerics.)
- [InlineData("Float(12)", false, true, "w", "")]
- [InlineData("Float(12)", false, true, "n", "")]
- [InlineData("Decimal(12)", false, true, "w", "")]
- [InlineData("Decimal(12)", false, true, "n", "")]
- [InlineData("{a:12, b:15}", false, false, "n", "Type mismatch between source and target types. Expected Number; Found Record.")]
-
- // (even with coercion not allowed, we coerce numerics.)
- [InlineData("{a:Float(12), b:Float(15)}", false, true, "![a:w,b:n]", "")]
- [InlineData("{a:Decimal(12), b:Decimal(15)}", false, true, "![a:w,b:n]", "")]
-
- // missing field
- [InlineData("{a:Decimal(12), b:Decimal(15)}", false, false, "![a:w,b:n,c:s]", "Type mismatch between source and target record types. Given type has missing fields: c.")]
-
- // extra field
- [InlineData("{a:Decimal(12), b:Decimal(15)}", false, false, "![a:w]", "Type mismatch between source and target record types. Given type has extra fields: b.")]
- [InlineData("{a:12, b:15}", false, false, "*[a:w,b:w]", "Type mismatch between source and target types. Expected Table; Found Record.")]
- [InlineData("{a:12, b:15}", false, false, "![a:w,b:s]", "Type mismatch between source and target record types. Field name: b Expected Text; Found Decimal.")]
-
- // ****When Coercion is allowed****
- [InlineData("\"test string\"", true, true, "s", "")]
+ [InlineData("Float(12)", false, true, "w", "")]
+ [InlineData("Float(12)", false, true, "n", "")]
+ [InlineData("Decimal(12)", false, true, "w", "")]
+ [InlineData("Decimal(12)", false, true, "n", "")]
+ [InlineData("{a:12, b:15}", false, false, "n", "Type mismatch between source and target types. Expected Number; Found Record.")]
+
+ // (even with coercion not allowed, we coerce numerics.)
+ [InlineData("{a:Float(12), b:Float(15)}", false, true, "![a:w,b:n]", "")]
+ [InlineData("{a:Decimal(12), b:Decimal(15)}", false, true, "![a:w,b:n]", "")]
+
+ // missing field
+ [InlineData("{a:Decimal(12), b:Decimal(15)}", false, false, "![a:w,b:n,c:s]", "Type mismatch between source and target record types. Given type has missing fields: c.")]
+
+ // extra field
+ [InlineData("{a:Decimal(12), b:Decimal(15)}", false, false, "![a:w]", "Type mismatch between source and target record types. Given type has extra fields: b.")]
+ [InlineData("{a:12, b:15}", false, false, "*[a:w,b:w]", "Type mismatch between source and target types. Expected Table; Found Record.")]
+ [InlineData("{a:12, b:15}", false, false, "![a:w,b:s]", "Type mismatch between source and target record types. Field name: b Expected Text; Found Decimal.")]
+
+ // ****When Coercion is allowed****
+ [InlineData("\"test string\"", true, true, "s", "")]
[InlineData("\"test string\"", true, true, "n", "")]
- [InlineData("12", true, true, "w", "")]
- [InlineData("12", true, true, "n", "")]
+ [InlineData("12", true, true, "w", "")]
+ [InlineData("12", true, true, "n", "")]
[InlineData("{a:12, b:15}", true, false, "n", "Given Record type cannot be coerced to source type Number.")]
- [InlineData("{a:12, b:15}", true, true, "![a:n,b:n]", "")]
- [InlineData("{a:12, b:15}", true, false, "*[a:w,b:n]", "Type mismatch between source and target types. Expected Table; Found Record.")]
- [InlineData("{a:Float(12), b:Float(15)}", true, true, "![a:w,b:n]", "")]
- [InlineData("{a:Decimal(12), b:Decimal(15)}", true, true, "![a:w,b:n]", "")]
-
- // (with coercion allowed, aggregate's field also coerces)
- [InlineData("{a:12, b:15}", true, true, "![a:w,b:s]", "")]
-
- // missing field
- [InlineData("{a:Decimal(12), b:Decimal(15)}", true, false, "![a:w,b:n,c:s]", "Type mismatch between source and target record types. Given type has missing fields: c.")]
-
- // extra field
+ [InlineData("{a:12, b:15}", true, true, "![a:n,b:n]", "")]
+ [InlineData("{a:12, b:15}", true, false, "*[a:w,b:n]", "Type mismatch between source and target types. Expected Table; Found Record.")]
+ [InlineData("{a:Float(12), b:Float(15)}", true, true, "![a:w,b:n]", "")]
+ [InlineData("{a:Decimal(12), b:Decimal(15)}", true, true, "![a:w,b:n]", "")]
+
+ // (with coercion allowed, aggregate's field also coerces)
+ [InlineData("{a:12, b:15}", true, true, "![a:w,b:s]", "")]
+
+ // missing field
+ [InlineData("{a:Decimal(12), b:Decimal(15)}", true, false, "![a:w,b:n,c:s]", "Type mismatch between source and target record types. Given type has missing fields: c.")]
+
+ // extra field
[InlineData("{a:Decimal(12), b:Decimal(15)}", true, false, "![a:w]", "Type mismatch between source and target record types. Given type has extra fields: b.")]
public void CheckResultExpectedReturnValueString(string inputExpr, bool allowCoerceTo, bool isSuccess, string expectedType, string errorMsg)
- {
- var expectedFormulaType = FormulaType.Build(TestUtils.DT(expectedType));
+ {
+ var expectedFormulaType = FormulaType.Build(TestUtils.DT(expectedType));
CheckResultExpectedReturnValue(inputExpr, allowCoerceTo, isSuccess, errorMsg, expectedFormulaType);
- }
+ }
[Fact]
public void BindingSetRecordType()
@@ -522,11 +522,11 @@ namespace Microsoft.PowerFx.Core.Tests
[InlineData("123+abc", "#$decimal$# + #$firstname$#", true)] // display names
[InlineData("123+", "#$decimal$# + #$error$#", false)] // error
[InlineData("123,456", "#$decimal$#", true)] // locales
- [InlineData("Power(2,3)", "Power(#$decimal$#)", true)] // functions aren't Pii
-
- // Unkown public function are PII
- [InlineData("MadeUpFunction(1)", "#$function$#(#$decimal$#)", true)]
- [InlineData("Power(MadeUpFunction(1))", "Power(#$function$#(#$decimal$#))", true)]
+ [InlineData("Power(2,3)", "Power(#$decimal$#)", true)] // functions aren't Pii
+
+ // Unkown public function are PII
+ [InlineData("MadeUpFunction(1)", "#$function$#(#$decimal$#)", true)]
+ [InlineData("Power(MadeUpFunction(1))", "Power(#$function$#(#$decimal$#))", true)]
[InlineData("Power(Clear(1))", "Power(Clear(#$decimal$#))", true)]
public void TestApplyGetLogging(string expr, string execptedLog, bool success)
{
@@ -539,85 +539,85 @@ namespace Microsoft.PowerFx.Core.Tests
var log = check.ApplyGetLogging();
Assert.Equal(success, check.IsSuccess);
Assert.Equal(execptedLog, log);
- }
-
- [Theory]
- [InlineData("ShowColumns(Table, Name)")]
- public void ApplyLoggingWithBinding(string expr)
- {
- var tableType = TableType.Empty().Add("Name", FormulaType.String);
- var symbolTable = new SymbolTable();
- symbolTable.AddVariable("Table", tableType);
-
- CheckResult check = new CheckResult(new Engine())
- .SetText(expr)
- .SetBindingInfo(symbolTable);
-
- var errors = check.ApplyErrors();
- Assert.Empty(errors);
-
- var anon = check.ApplyGetLogging();
- }
-
- [Fact]
- public void TestSummary()
- {
- var check = new CheckResult(new Engine());
-
+ }
+
+ [Theory]
+ [InlineData("ShowColumns(Table, Name)")]
+ public void ApplyLoggingWithBinding(string expr)
+ {
+ var tableType = TableType.Empty().Add("Name", FormulaType.String);
+ var symbolTable = new SymbolTable();
+ symbolTable.AddVariable("Table", tableType);
+
+ CheckResult check = new CheckResult(new Engine())
+ .SetText(expr)
+ .SetBindingInfo(symbolTable);
+
+ var errors = check.ApplyErrors();
+ Assert.Empty(errors);
+
+ var anon = check.ApplyGetLogging();
+ }
+
+ [Fact]
+ public void TestSummary()
+ {
+ var check = new CheckResult(new Engine());
+
var r1 = RecordType.Empty()
.Add(new NamedFormulaType("new_field", FormulaType.Number, "Field"));
check.SetText("1", new PowerFx.ParserOptions { AllowsSideEffects = true });
- check.SetBindingInfo(r1);
+ check.SetBindingInfo(r1);
+
+ var summary = check.ApplyGetContextSummary();
+
+ Assert.True(summary.AllowsSideEffects);
+ Assert.False(summary.IsPreV1Semantics);
+ Assert.Null(summary.ExpectedReturnType);
+ Assert.Single(summary.SuggestedSymbols);
+
+ var sym1 = summary.SuggestedSymbols.First();
+
+ Assert.Equal("Field", sym1.DisplayName);
+ Assert.Equal("Field", sym1.BestName);
+ Assert.Equal("new_field", sym1.Name);
+ Assert.Equal(FormulaType.Number, sym1.Type);
+ Assert.False(sym1.Properties.CanSet);
+ Assert.False(sym1.Properties.CanMutate);
+
+ var type1 = sym1.Slot.Owner.GetTypeFromSlot(sym1.Slot);
+ Assert.Equal(FormulaType.Number, type1);
+ }
- var summary = check.ApplyGetContextSummary();
-
- Assert.True(summary.AllowsSideEffects);
- Assert.False(summary.IsPreV1Semantics);
- Assert.Null(summary.ExpectedReturnType);
- Assert.Single(summary.SuggestedSymbols);
-
- var sym1 = summary.SuggestedSymbols.First();
-
- Assert.Equal("Field", sym1.DisplayName);
- Assert.Equal("Field", sym1.BestName);
- Assert.Equal("new_field", sym1.Name);
- Assert.Equal(FormulaType.Number, sym1.Type);
- Assert.False(sym1.Properties.CanSet);
- Assert.False(sym1.Properties.CanMutate);
-
- var type1 = sym1.Slot.Owner.GetTypeFromSlot(sym1.Slot);
- Assert.Equal(FormulaType.Number, type1);
- }
-
private void CheckResultExpectedReturnValue(string inputExpr, bool allowCoerceTo, bool isSuccess, string errorMsg, FormulaType expectedReturnType)
{
var check = new CheckResult(PrimitiveValueConversionsTests.GetEngineWithFeatureGatedFunctions())
.SetText(inputExpr)
.SetBindingInfo()
- .SetExpectedReturnValue(expectedReturnType, allowCoerceTo);
-
- check.ApplyBinding();
-
+ .SetExpectedReturnValue(expectedReturnType, allowCoerceTo);
+
+ check.ApplyBinding();
+
CheckExpectedReturn(check, isSuccess, errorMsg, expectedReturnType);
- }
-
+ }
+
private void CheckResultExpectedReturnTypes(string inputExpr, bool isSuccess, string errorMsg, FormulaType[] returnTypes, FormulaType expectedType)
- {
-#pragma warning disable CS0618 // Type or member is obsolete
+ {
+#pragma warning disable CS0618 // Type or member is obsolete
var check = new CheckResult(new Engine())
.SetText(inputExpr)
.SetBindingInfo()
- .SetExpectedReturnValue(returnTypes);
-#pragma warning restore CS0618 // Type or member is obsolete
-
- check.ApplyBinding();
-
+ .SetExpectedReturnValue(returnTypes);
+#pragma warning restore CS0618 // Type or member is obsolete
+
+ check.ApplyBinding();
+
CheckExpectedReturn(check, isSuccess, errorMsg, expectedType);
- }
-
- private void CheckExpectedReturn(CheckResult check, bool isSuccess, string errorMsg, FormulaType expectedType)
- {
+ }
+
+ private void CheckExpectedReturn(CheckResult check, bool isSuccess, string errorMsg, FormulaType expectedType)
+ {
if (isSuccess)
{
Assert.True(check.IsSuccess);
@@ -628,7 +628,7 @@ namespace Microsoft.PowerFx.Core.Tests
try
{
- var errors = check.ApplyErrors();
+ var errors = check.ApplyErrors();
exMsg = errors.First().Message;
Assert.False(check.IsSuccess);
}
@@ -638,7 +638,7 @@ namespace Microsoft.PowerFx.Core.Tests
}
Assert.True(errorMsg.Contains(exMsg), exMsg);
- }
+ }
}
}
}
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/CompatTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/CompatTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/CompatTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/CompatTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/CoreUtilExtensionTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/CoreUtilExtensionTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/CoreUtilExtensionTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/CoreUtilExtensionTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/DNameTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/DNameTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/DNameTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/DNameTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/DPathTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/DPathTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/DPathTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/DPathTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/DerivedEngineTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/DerivedEngineTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/DerivedEngineTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/DerivedEngineTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/DisplayNameOptionSetTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/DisplayNameOptionSetTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/DisplayNameOptionSetTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/DisplayNameOptionSetTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/DisplayNameTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/DisplayNameTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/DisplayNameTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/DisplayNameTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/DisplayNameUtilTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/DisplayNameUtilTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/DisplayNameUtilTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/DisplayNameUtilTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/Docs/EngineSchemaChecker.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/Docs/EngineSchemaChecker.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/Docs/EngineSchemaChecker.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/Docs/EngineSchemaChecker.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/EngineTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/EngineTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/EngineTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/EngineTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/EnumSyncTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/EnumSyncTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/EnumSyncTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/EnumSyncTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionErrorTests.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionErrorTests.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionErrorTests.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionErrorTests.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Abs.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Abs.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Abs.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Abs.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AbsT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AbsT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AbsT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AbsT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Acumatica.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Acumatica.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Acumatica.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Acumatica.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AddColumns.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AddColumns.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AddColumns.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AddColumns.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AddColumns_NumberIsFloatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AddColumns_NumberIsFloatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AddColumns_NumberIsFloatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AddColumns_NumberIsFloatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AddColumns_SupportColumnNamesAsIdentifiers.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AddColumns_SupportColumnNamesAsIdentifiers.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AddColumns_SupportColumnNamesAsIdentifiers.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AddColumns_SupportColumnNamesAsIdentifiers.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AddColumns_SupportColumnNamesAsIdentifiers_NumberIsFloatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AddColumns_SupportColumnNamesAsIdentifiers_NumberIsFloatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AddColumns_SupportColumnNamesAsIdentifiers_NumberIsFloatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AddColumns_SupportColumnNamesAsIdentifiers_NumberIsFloatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AndOrCases.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AndOrCases.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/AndOrCases.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/AndOrCases.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercion.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercion.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercion.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercion.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercionT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercionT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercionT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercionT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercionT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercionT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercionT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercionT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercion_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercion_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercion_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercion_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercion_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercion_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ArgCoercion_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ArgCoercion_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Average.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Average.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Average.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Average.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/BasicCoercion.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/BasicCoercion.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/BasicCoercion.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/BasicCoercion.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/BasicCoercion_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/BasicCoercion_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/BasicCoercion_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/BasicCoercion_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/BasicCoercion_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/BasicCoercion_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/BasicCoercion_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/BasicCoercion_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Blank.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Blank.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Blank.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Blank.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Blob.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Blob.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Blob.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Blob.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Boolean.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Boolean.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Boolean.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Boolean.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/BooleanT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/BooleanT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/BooleanT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/BooleanT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Chaining.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Chaining.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Chaining.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Chaining.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Char.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Char.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Char.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Char.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CharT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CharT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CharT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CharT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CharT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CharT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CharT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CharT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Clear.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Clear.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Clear.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Clear.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Clear_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Clear_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Clear_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Clear_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Clear_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Clear_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Clear_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Clear_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Coalesce.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Coalesce.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Coalesce.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Coalesce.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Coalesce_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Coalesce_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Coalesce_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Coalesce_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Coalesce_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Coalesce_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Coalesce_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Coalesce_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Collect.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Collect.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Collect.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Collect.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Collect_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Collect_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Collect_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Collect_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Collect_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Collect_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Collect_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Collect_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Color.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Color.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Color.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Color.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ColorFade.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ColorFade.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ColorFade.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ColorFade.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ColorFadeT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ColorFadeT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ColorFadeT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ColorFadeT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Color_StronglyTypedEnums.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Color_StronglyTypedEnums.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Color_StronglyTypedEnums.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Color_StronglyTypedEnums.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Color_StronglyTypedEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Color_StronglyTypedEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Color_StronglyTypedEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Color_StronglyTypedEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ColumnNames.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ColumnNames.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ColumnNames.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ColumnNames.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Concat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Concat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Concat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Concat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Concatenate.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Concatenate.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Concatenate.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Concatenate.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ConcatenateT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ConcatenateT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ConcatenateT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ConcatenateT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ConcatenateT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ConcatenateT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ConcatenateT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ConcatenateT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Count.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Count.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Count.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Count.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CountA.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CountA.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CountA.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CountA.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CountIf.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CountIf.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CountIf.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CountIf.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CountRows.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CountRows.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/CountRows.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/CountRows.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Date.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Date.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Date.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Date.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_StronglyTypedBuiltinEnums.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_StronglyTypedBuiltinEnums.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_StronglyTypedBuiltinEnums.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_StronglyTypedBuiltinEnums.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_StronglyTypedEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_StronglyTypedEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_StronglyTypedEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_StronglyTypedEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_TimeZone_Beirut.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_TimeZone_Beirut.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_TimeZone_Beirut.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_TimeZone_Beirut.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_TimeZone_London.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_TimeZone_London.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_TimeZone_London.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_TimeZone_London.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_TimeZone_Seattle.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_TimeZone_Seattle.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_TimeZone_Seattle.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_TimeZone_Seattle.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_TimeZone_UTC.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_TimeZone_UTC.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateAdd_TimeZone_UTC.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateAdd_TimeZone_UTC.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff_StronglyTypedBuiltinEnums.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff_StronglyTypedBuiltinEnums.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff_StronglyTypedBuiltinEnums.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff_StronglyTypedBuiltinEnums.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff_StronglyTypedEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff_StronglyTypedEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff_StronglyTypedEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff_StronglyTypedEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff_TimeZone_Lord_Howe_Island.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff_TimeZone_Lord_Howe_Island.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff_TimeZone_Lord_Howe_Island.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff_TimeZone_Lord_Howe_Island.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff_TimeZone_Seattle.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff_TimeZone_Seattle.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateDiff_TimeZone_Seattle.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateDiff_TimeZone_Seattle.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateTime.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateTime.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateTime.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateTime.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateTimeValue_TimeZone_Paris.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateTimeValue_TimeZone_Paris.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateTimeValue_TimeZone_Paris.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateTimeValue_TimeZone_Paris.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateTimeValue_TimeZone_Seattle.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateTimeValue_TimeZone_Seattle.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateTimeValue_TimeZone_Seattle.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateTimeValue_TimeZone_Seattle.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateValue.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateValue.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateValue.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateValue.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateValue_TimeZone_London.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateValue_TimeZone_London.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateValue_TimeZone_London.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateValue_TimeZone_London.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateValue_TimeZone_Paris.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateValue_TimeZone_Paris.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateValue_TimeZone_Paris.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateValue_TimeZone_Paris.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateValue_TimeZone_Seattle.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateValue_TimeZone_Seattle.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DateValue_TimeZone_Seattle.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DateValue_TimeZone_Seattle.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Date_TimeZone_Paris.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Date_TimeZone_Paris.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Date_TimeZone_Paris.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Date_TimeZone_Paris.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Date_TimeZone_Seattle.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Date_TimeZone_Seattle.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Date_TimeZone_Seattle.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Date_TimeZone_Seattle.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Date_TimeZone_UTC.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Date_TimeZone_UTC.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Date_TimeZone_UTC.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Date_TimeZone_UTC.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Dec2Hex.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Dec2Hex.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Dec2Hex.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Dec2Hex.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalBoot.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalBoot.txt
similarity index 96%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalBoot.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalBoot.txt
index 69469a8d6..32ae83d20 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalBoot.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalBoot.txt
@@ -1,56 +1,56 @@
-#SETUP: EnableExpressionChaining,MutationFunctionsTestSetup,ConsistentOneColumnTableResult
-#SETUP: NumberIsFloat
-
-// Tests that can't be run in decimal yet and have #SKIP directives
-// Once decimal is done, this #SKIPs can be removed and this file can be removed
-
->> Boolean(If(1/0<2,[1]))
-Error({Kind:ErrorKind.Div0})
-
->> Boolean(If(1<0,[1]))
-Blank()
-
->> Boolean(Filter([1,2,3], Value > 10))
-Table()
-
->> ForAll(Boolean([3, 1/0, 0, Sqrt(-1)]), IfError(Text(Value), $"ErrorKind={FirstError.Kind}"))
-Table({Value:"true"},{Value:"ErrorKind=13"},{Value:"false"},{Value:"ErrorKind=24"})
-
->> Switch(2,1,"a",Sqrt(-1),"b","c")
-Error({Kind:ErrorKind.Numeric})
-
-// Errors not evaluated are not returned
->> Switch(2,1,"a",2,"b",Sqrt(-1),"c","d")
-"b"
-
->> Abs(Table({a:1/0},{a:Power(-3,2)}))
-Table({Value:Error({Kind:ErrorKind.Div0})},{Value:9})
-
-// Multiple errors
->> Count(Table({a:1/0},{a:Sqrt(-1)}))
-Error({Kind:ErrorKind.Div0})
-
-// Multiple errors
->> Count(Table({a:Sqrt(-1)},{a:1/0}))
-Error({Kind:ErrorKind.Numeric})
-
-// All error values
->> CountA(Table({a:1/0},{a:Sqrt(-1)}))
-Error({Kind:ErrorKind.Div0})
-
-// All error values
->> CountA(Table({a:Sqrt(-1)},{a:1/0}))
-Error({Kind:ErrorKind.Numeric})
-
->> CountRows(Table({a:1/0},{a:Sqrt(-1)}))
-2
-
-// Distinct values where expression handles errors
->> Distinct(Table({a:1},{a:2},{a:If(1/0<2,{a:2}).a},{a:7},{a:Sqrt(-1)},{a:-13},{a:2}), IfError(a,-FirstError.Kind))
-Table({Value:1},{Value:2},{Value:-13},{Value:7},{Value:-24})
-
-// Distinct which ignores columns with errors
->> Distinct(Table({a:10,b:1/0},{a:9,b:Sqrt(-1)},{a:8,b:3},{a:10,b:1/0},{a:8,b:Ln(-1)}), a)
-Table({Value:10},{Value:9},{Value:8})
-
-
+#SETUP: EnableExpressionChaining,MutationFunctionsTestSetup,ConsistentOneColumnTableResult
+#SETUP: NumberIsFloat
+
+// Tests that can't be run in decimal yet and have #SKIP directives
+// Once decimal is done, this #SKIPs can be removed and this file can be removed
+
+>> Boolean(If(1/0<2,[1]))
+Error({Kind:ErrorKind.Div0})
+
+>> Boolean(If(1<0,[1]))
+Blank()
+
+>> Boolean(Filter([1,2,3], Value > 10))
+Table()
+
+>> ForAll(Boolean([3, 1/0, 0, Sqrt(-1)]), IfError(Text(Value), $"ErrorKind={FirstError.Kind}"))
+Table({Value:"true"},{Value:"ErrorKind=13"},{Value:"false"},{Value:"ErrorKind=24"})
+
+>> Switch(2,1,"a",Sqrt(-1),"b","c")
+Error({Kind:ErrorKind.Numeric})
+
+// Errors not evaluated are not returned
+>> Switch(2,1,"a",2,"b",Sqrt(-1),"c","d")
+"b"
+
+>> Abs(Table({a:1/0},{a:Power(-3,2)}))
+Table({Value:Error({Kind:ErrorKind.Div0})},{Value:9})
+
+// Multiple errors
+>> Count(Table({a:1/0},{a:Sqrt(-1)}))
+Error({Kind:ErrorKind.Div0})
+
+// Multiple errors
+>> Count(Table({a:Sqrt(-1)},{a:1/0}))
+Error({Kind:ErrorKind.Numeric})
+
+// All error values
+>> CountA(Table({a:1/0},{a:Sqrt(-1)}))
+Error({Kind:ErrorKind.Div0})
+
+// All error values
+>> CountA(Table({a:Sqrt(-1)},{a:1/0}))
+Error({Kind:ErrorKind.Numeric})
+
+>> CountRows(Table({a:1/0},{a:Sqrt(-1)}))
+2
+
+// Distinct values where expression handles errors
+>> Distinct(Table({a:1},{a:2},{a:If(1/0<2,{a:2}).a},{a:7},{a:Sqrt(-1)},{a:-13},{a:2}), IfError(a,-FirstError.Kind))
+Table({Value:1},{Value:2},{Value:-13},{Value:7},{Value:-24})
+
+// Distinct which ignores columns with errors
+>> Distinct(Table({a:10,b:1/0},{a:9,b:Sqrt(-1)},{a:8,b:3},{a:10,b:1/0},{a:8,b:Ln(-1)}), a)
+Table({Value:10},{Value:9},{Value:8})
+
+
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalDotnetRuntime.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalDotnetRuntime.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalDotnetRuntime.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalDotnetRuntime.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalIntReturn.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalIntReturn.txt
similarity index 97%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalIntReturn.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalIntReturn.txt
index 75a5725cf..06469ec28 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalIntReturn.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalIntReturn.txt
@@ -1,78 +1,78 @@
-#SETUP: disable:NumberIsFloat
-
-// Some functions return integer results, that are typed decimal or float based on NumberIsFloat
-
->> Len( "abc") + 1.0000000000000000000000001
-4.0000000000000000000000001
-
->> ForAll( Len( ["abc","defg"] ), Value * 1.0000000000000000000000001 )
-Table({Value:3.0000000000000000000000003},{Value:4.0000000000000000000000004})
-
->> Count( [1,2,3,Blank()] ) + 1.0000000000000000000000001
-4.0000000000000000000000001
-
->> CountA( ["a","b","c",Blank()] ) + 1.0000000000000000000000001
-4.0000000000000000000000001
-
->> CountRows( ["a","b","c",Blank()] ) + 1.0000000000000000000000001
-5.0000000000000000000000001
-
->> CountIf( ["a","b","c","ee",Blank()], Len(Value) = 1 ) + 1.0000000000000000000000001
-4.0000000000000000000000001
-
->> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Years ) + 1.0000000000000000000001
-11.0000000000000000000001
-
->> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Months ) + 1.0000000000000000000001
-112.0000000000000000000001
-
->> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Quarters ) + 1.0000000000000000000001
-38.0000000000000000000001
-
->> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Days ) + 1.0000000000000000000001
-3387.0000000000000000000001
-
->> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Hours ) + 1.0000000000000000000001
-81268.0000000000000000000001
-
->> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Minutes ) + 1.0000000000000000000001
-4876031.0000000000000000000001
-
->> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Seconds ) + 1.00000000000000001
-292561770.00000000000000001
-
->> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Milliseconds ) + 1.00000000000000001
-292561769001.00000000000000001
-
->> Year( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
-1991.0000000000000000000001
-
->> Month( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
-4.0000000000000000000001
-
->> Day( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
-3.0000000000000000000001
-
->> Hour( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
-6.0000000000000000000001
-
->> Minute( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
-21.0000000000000000000001
-
->> Second( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
-55.0000000000000000000001
-
->> RandBetween(11,11) + 1.00000000000000000000000001
-12.00000000000000000000000001
-
->> Hex2Dec( "1234BEEF" ) + 1.00000000000000000001
-305446640.00000000000000000001
-
->> Hex2Dec( "1234BEEF" ) + 0.99999999999999999999
-305446639.99999999999999999999
-
-
-
-
-
-
+#SETUP: disable:NumberIsFloat
+
+// Some functions return integer results, that are typed decimal or float based on NumberIsFloat
+
+>> Len( "abc") + 1.0000000000000000000000001
+4.0000000000000000000000001
+
+>> ForAll( Len( ["abc","defg"] ), Value * 1.0000000000000000000000001 )
+Table({Value:3.0000000000000000000000003},{Value:4.0000000000000000000000004})
+
+>> Count( [1,2,3,Blank()] ) + 1.0000000000000000000000001
+4.0000000000000000000000001
+
+>> CountA( ["a","b","c",Blank()] ) + 1.0000000000000000000000001
+4.0000000000000000000000001
+
+>> CountRows( ["a","b","c",Blank()] ) + 1.0000000000000000000000001
+5.0000000000000000000000001
+
+>> CountIf( ["a","b","c","ee",Blank()], Len(Value) = 1 ) + 1.0000000000000000000000001
+4.0000000000000000000000001
+
+>> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Years ) + 1.0000000000000000000001
+11.0000000000000000000001
+
+>> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Months ) + 1.0000000000000000000001
+112.0000000000000000000001
+
+>> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Quarters ) + 1.0000000000000000000001
+38.0000000000000000000001
+
+>> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Days ) + 1.0000000000000000000001
+3387.0000000000000000000001
+
+>> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Hours ) + 1.0000000000000000000001
+81268.0000000000000000000001
+
+>> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Minutes ) + 1.0000000000000000000001
+4876031.0000000000000000000001
+
+>> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Seconds ) + 1.00000000000000001
+292561770.00000000000000001
+
+>> DateDiff( DateTime(1990,11,2,5,20,54), DateTime(2000,2,9,8,30,23), TimeUnit.Milliseconds ) + 1.00000000000000001
+292561769001.00000000000000001
+
+>> Year( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
+1991.0000000000000000000001
+
+>> Month( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
+4.0000000000000000000001
+
+>> Day( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
+3.0000000000000000000001
+
+>> Hour( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
+6.0000000000000000000001
+
+>> Minute( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
+21.0000000000000000000001
+
+>> Second( DateTime(1990,3,2,5,20,54) ) + 1.0000000000000000000001
+55.0000000000000000000001
+
+>> RandBetween(11,11) + 1.00000000000000000000000001
+12.00000000000000000000000001
+
+>> Hex2Dec( "1234BEEF" ) + 1.00000000000000000001
+305446640.00000000000000000001
+
+>> Hex2Dec( "1234BEEF" ) + 0.99999999999999999999
+305446639.99999999999999999999
+
+
+
+
+
+
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalIntReturn_DVDecimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalIntReturn_DVDecimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalIntReturn_DVDecimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalIntReturn_DVDecimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloatDisabled_DVDecimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloatDisabled_DVDecimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloatDisabled_DVDecimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloatDisabled_DVDecimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport_PowerFxV1.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport_PowerFxV1.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport_PowerFxV1.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport_PowerFxV1.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport_PowerFxV1Disabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport_PowerFxV1Disabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport_PowerFxV1Disabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalMathFuncs_NumberIsFloat_Constructors_DecimalSupport_PowerFxV1Disabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalNonMathFuncs.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalNonMathFuncs.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalNonMathFuncs.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalNonMathFuncs.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalNonMathFuncs_DVDecimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalNonMathFuncs_DVDecimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalNonMathFuncs_DVDecimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalNonMathFuncs_DVDecimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalOps.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalOps.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalOps.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalOps.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalOps_DVDecimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalOps_DVDecimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalOps_DVDecimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalOps_DVDecimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalOverflow.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalOverflow.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DecimalOverflow.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DecimalOverflow.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Disable_ConsistentOneColumnTableResult.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Disable_ConsistentOneColumnTableResult.txt
similarity index 84%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Disable_ConsistentOneColumnTableResult.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Disable_ConsistentOneColumnTableResult.txt
index 1bdf40a32..57b869abd 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Disable_ConsistentOneColumnTableResult.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Disable_ConsistentOneColumnTableResult.txt
@@ -1,10 +1,10 @@
-#SETUP: disable:ConsistentOneColumnTableResult
-
->> Char(["55", "56", "57"])
-Table({Result:"7"},{Result:"8"},{Result:"9"})
-
->> Concatenate(-1, ["456", "abc"] )
-Table({Result:"-1456"},{Result:"-1abc"})
-
->> Concatenate(Table({a: -1}, {a: 123}), Table({a: "456"}, {a: "abc"}))
+#SETUP: disable:ConsistentOneColumnTableResult
+
+>> Char(["55", "56", "57"])
+Table({Result:"7"},{Result:"8"},{Result:"9"})
+
+>> Concatenate(-1, ["456", "abc"] )
+Table({Result:"-1456"},{Result:"-1abc"})
+
+>> Concatenate(Table({a: -1}, {a: 123}), Table({a: "456"}, {a: "abc"}))
Table({Result:"-1456"},{Result:"123abc"})
\ No newline at end of file
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Distinct.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Distinct.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Distinct.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Distinct.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Distinct_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Distinct_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Distinct_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Distinct_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Distinct_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Distinct_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Distinct_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Distinct_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Distinct_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Distinct_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Distinct_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Distinct_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DropColumns_SupportColumnNamesAsIdentifiers.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DropColumns_SupportColumnNamesAsIdentifiers.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DropColumns_SupportColumnNamesAsIdentifiers.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DropColumns_SupportColumnNamesAsIdentifiers.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DropColumns_SupportColumnNamesAsIdentifiersDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DropColumns_SupportColumnNamesAsIdentifiersDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/DropColumns_SupportColumnNamesAsIdentifiersDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/DropColumns_SupportColumnNamesAsIdentifiersDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/EDateEOMonth.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/EDateEOMonth.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/EDateEOMonth.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/EDateEOMonth.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/EncodeHTML.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/EncodeHTML.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/EncodeHTML.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/EncodeHTML.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/EncodeURL.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/EncodeURL.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/EncodeURL.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/EncodeURL.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/EndsWith.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/EndsWith.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/EndsWith.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/EndsWith.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Equality.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Equality.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Equality.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Equality.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Error.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Error.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Error.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Error.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ErrorKinds.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ErrorKinds.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ErrorKinds.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ErrorKinds.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ErrorKinds_ColumnNamesAsIdentifiers.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ErrorKinds_ColumnNamesAsIdentifiers.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ErrorKinds_ColumnNamesAsIdentifiers.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ErrorKinds_ColumnNamesAsIdentifiers.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ErrorKinds_ColumnNamesAsIdentifiersDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ErrorKinds_ColumnNamesAsIdentifiersDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ErrorKinds_ColumnNamesAsIdentifiersDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ErrorKinds_ColumnNamesAsIdentifiersDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ErrorKinds_StronlyTypedBuiltinEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ErrorKinds_StronlyTypedBuiltinEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ErrorKinds_StronlyTypedBuiltinEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ErrorKinds_StronlyTypedBuiltinEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Escaping.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Escaping.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Escaping.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Escaping.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Exp.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Exp.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Exp.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Exp.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ExpT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ExpT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ExpT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ExpT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FilterFunctions.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FilterFunctions.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FilterFunctions.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FilterFunctions.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FilterFunctions_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FilterFunctions_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FilterFunctions_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FilterFunctions_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FilterFunctions_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FilterFunctions_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FilterFunctions_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FilterFunctions_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FilterLookUp_TwoArg_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FilterLookUp_TwoArg_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FilterLookUp_TwoArg_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FilterLookUp_TwoArg_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Find.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Find.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Find.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Find.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FindT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FindT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FindT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FindT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FindT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FindT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FindT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FindT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Find_StronglyTypedBuiltinEnums.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Find_StronglyTypedBuiltinEnums.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Find_StronglyTypedBuiltinEnums.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Find_StronglyTypedBuiltinEnums.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Find_StronglyTypedBuiltinEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Find_StronglyTypedBuiltinEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Find_StronglyTypedBuiltinEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Find_StronglyTypedBuiltinEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLast.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLast.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLast.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLast.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN_RequiredSecondArgument.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN_RequiredSecondArgument.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN_RequiredSecondArgument.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN_RequiredSecondArgument.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN_RequiredSecondArgumentDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN_RequiredSecondArgumentDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN_RequiredSecondArgumentDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN_RequiredSecondArgumentDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLastN_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLastN_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLast_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLast_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLast_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLast_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLast_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLast_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FirstLast_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FirstLast_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FloatLarge.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FloatLarge.txt
similarity index 97%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FloatLarge.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FloatLarge.txt
index c9769d942..155962a43 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/FloatLarge.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/FloatLarge.txt
@@ -1,120 +1,120 @@
-#SETUP: NumberIsFloat
-
-// Tests that take or result in large floating point values, outside the range of Decimal (~ +/- 1E29)
-// These cause problems with the serialization/deserialization test in BaseRunner.cs/RunAsync2
-
->> Abs(1E+308)
-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Abs(-1E+308)
-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Abs(Value("1E+308"))
-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Abs(Value("-1E+308"))
-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Value( "1e100" )
-1E+100
-
->> 1e100
-1E+100
-
-// Excel returns 5.5799E+186
->> Exp(430)
-5579910311786366000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Int(Value("1E+308"))
-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Int(Value("-1E+308"))
--100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Power(Exp(42.5),2)
-8223012714622878000000000000000000000
-
->> Round(Value("1E+308"),10)
-1E+308
-
-// Excel shows typo in the formula and suggest to change the formula to Sqrt(E1+308)
->> Sqrt(Value("1E+308"))
-10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
-//PowerFx shows error message "Argument to SQRT function should be non-negative number", while Excel shows typo in the formula and suggest to change the formula to Sqrt(-E1+308)
->> Sqrt(-1E+308)
-Error({Kind:ErrorKind.Numeric})
-
->> 1E+308 * 1000
-Error({Kind:ErrorKind.Numeric})
-
->> 1E-308 / 1000
-0
-
->> Sum(1E+308,1E+308)
-Error({Kind:ErrorKind.Numeric})
-
-// Overflow in calculation
->> Sum(1e308, 1e308, 1e308, 1e308, 1e308)
-Error({Kind:ErrorKind.Numeric})
-
-// Overflow in calculation
->> VarP(1e200, 2e200, 3e200, 4e200)
-Error({Kind:ErrorKind.Numeric})
-
->> Round(1E+308,10)
-1E+308
-
->> Max(1E+308, 1E+308)
-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Min(1E+308, 1E+308)
-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-
->> Mod(1E+300,1E-20)
-6.0682893566359166E-21
-
->> Dec2Hex([1,1e-45,1e45,2])
-Table({Value:"1"},{Value:"0"},{Value:Error({Kind:ErrorKind.Numeric})},{Value:"2"})
-
-// Infinity
->> StdevP(-1.7e308,1.7e308)
-Error({Kind:ErrorKind.Numeric})
-
->> Acot(1e100)
-0
-
->> Acot(-1e100)
-3.141592654
-
->> Atan(1e100)
-1.570796327
-
->> Atan(-1e100)
--1.570796327
-
->> Substitute("HelloHelloHello", "He", "Je", 5e100)
-"HelloHelloHello"
-
->> Replace("abcd", 5e100, 1, "P")
-"abcdP"
-
-// Excel shows typo in the formula and suggest to change the formula to Ln(E1+308)
->> Ln(1E+308)
-709.19620864
-
-// Excel shows typo in the formula and suggest to change the formula to Ln(E1+308)
->> Ln(-1E+308)
-Error({Kind:ErrorKind.Numeric})
-
-// Overflow in calculation
->> StdevP(1e200, 2e200, 3e200, 4e200)
-Error({Kind:ErrorKind.Numeric})
-
->> Round(Atan([0, 1e100, -1e100, 1, -1, Blank()]), 4)
-Table({Value:0},{Value:1.5708},{Value:-1.5708},{Value:0.7854},{Value:-0.7854},{Value:0})
-
->> Round(Acot([0, 1e100, -1e100, 1, -1, Blank()]), 4)
-Table({Value:1.5708},{Value:0},{Value:3.1416},{Value:0.7854},{Value:2.3562},{Value:1.5708})
-
-
+#SETUP: NumberIsFloat
+
+// Tests that take or result in large floating point values, outside the range of Decimal (~ +/- 1E29)
+// These cause problems with the serialization/deserialization test in BaseRunner.cs/RunAsync2
+
+>> Abs(1E+308)
+100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Abs(-1E+308)
+100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Abs(Value("1E+308"))
+100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Abs(Value("-1E+308"))
+100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Value( "1e100" )
+1E+100
+
+>> 1e100
+1E+100
+
+// Excel returns 5.5799E+186
+>> Exp(430)
+5579910311786366000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Int(Value("1E+308"))
+100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Int(Value("-1E+308"))
+-100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Power(Exp(42.5),2)
+8223012714622878000000000000000000000
+
+>> Round(Value("1E+308"),10)
+1E+308
+
+// Excel shows typo in the formula and suggest to change the formula to Sqrt(E1+308)
+>> Sqrt(Value("1E+308"))
+10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+//PowerFx shows error message "Argument to SQRT function should be non-negative number", while Excel shows typo in the formula and suggest to change the formula to Sqrt(-E1+308)
+>> Sqrt(-1E+308)
+Error({Kind:ErrorKind.Numeric})
+
+>> 1E+308 * 1000
+Error({Kind:ErrorKind.Numeric})
+
+>> 1E-308 / 1000
+0
+
+>> Sum(1E+308,1E+308)
+Error({Kind:ErrorKind.Numeric})
+
+// Overflow in calculation
+>> Sum(1e308, 1e308, 1e308, 1e308, 1e308)
+Error({Kind:ErrorKind.Numeric})
+
+// Overflow in calculation
+>> VarP(1e200, 2e200, 3e200, 4e200)
+Error({Kind:ErrorKind.Numeric})
+
+>> Round(1E+308,10)
+1E+308
+
+>> Max(1E+308, 1E+308)
+100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Min(1E+308, 1E+308)
+100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+
+>> Mod(1E+300,1E-20)
+6.0682893566359166E-21
+
+>> Dec2Hex([1,1e-45,1e45,2])
+Table({Value:"1"},{Value:"0"},{Value:Error({Kind:ErrorKind.Numeric})},{Value:"2"})
+
+// Infinity
+>> StdevP(-1.7e308,1.7e308)
+Error({Kind:ErrorKind.Numeric})
+
+>> Acot(1e100)
+0
+
+>> Acot(-1e100)
+3.141592654
+
+>> Atan(1e100)
+1.570796327
+
+>> Atan(-1e100)
+-1.570796327
+
+>> Substitute("HelloHelloHello", "He", "Je", 5e100)
+"HelloHelloHello"
+
+>> Replace("abcd", 5e100, 1, "P")
+"abcdP"
+
+// Excel shows typo in the formula and suggest to change the formula to Ln(E1+308)
+>> Ln(1E+308)
+709.19620864
+
+// Excel shows typo in the formula and suggest to change the formula to Ln(E1+308)
+>> Ln(-1E+308)
+Error({Kind:ErrorKind.Numeric})
+
+// Overflow in calculation
+>> StdevP(1e200, 2e200, 3e200, 4e200)
+Error({Kind:ErrorKind.Numeric})
+
+>> Round(Atan([0, 1e100, -1e100, 1, -1, Blank()]), 4)
+Table({Value:0},{Value:1.5708},{Value:-1.5708},{Value:0.7854},{Value:-0.7854},{Value:0})
+
+>> Round(Acot([0, 1e100, -1e100, 1, -1, Blank()]), 4)
+Table({Value:1.5708},{Value:0},{Value:3.1416},{Value:0.7854},{Value:2.3562},{Value:1.5708})
+
+
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ForAll.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ForAll.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ForAll.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ForAll.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ForAll_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ForAll_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ForAll_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ForAll_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ForAll_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ForAll_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ForAll_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ForAll_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/GUID.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/GUID.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/GUID.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/GUID.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Hex2Dec.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Hex2Dec.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Hex2Dec.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Hex2Dec.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/If.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/If.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/If.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/If.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IfError.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IfError.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IfError.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IfError.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IfError_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IfError_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IfError_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IfError_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IfError_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IfError_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IfError_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IfError_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/If_AllowsSideEffects.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/If_AllowsSideEffects.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/If_AllowsSideEffects.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/If_AllowsSideEffects.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/If_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/If_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/If_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/If_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/If_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/If_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/If_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/If_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Index.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Index.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Index.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Index.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Index_TableSyntaxDoesntWrapRecordsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Index_TableSyntaxDoesntWrapRecordsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Index_TableSyntaxDoesntWrapRecordsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Index_TableSyntaxDoesntWrapRecordsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Int.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Int.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Int.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Int.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IntT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IntT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IntT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IntT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IntT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IntT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IntT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IntT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsBlankOrError.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsBlankOrError.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsBlankOrError.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsBlankOrError.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsEmpty.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsEmpty.txt
similarity index 94%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsEmpty.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsEmpty.txt
index e6e13eef1..303594466 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsEmpty.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsEmpty.txt
@@ -1,128 +1,128 @@
-#SETUP: RestrictedIsEmptyArguments
-
-// NUMERIC RECORDS
-
->> IsEmpty([1234])
-false
-
->> IsEmpty([1, 2, 3, 4, 5])
-false
-
-
-// BOOLEAN RECORDS
-
->> IsEmpty([false])
-false
-
->> IsEmpty( ["Hello"])
-false
-
-
-// STRING RECORDS
-
->> IsEmpty([""])
-false
-
->> IsEmpty(Table({a:"1"},{a:"two"},{a:"three"},{a:"four"},{a:"five"}))
-false
-
-
-// DATE/TIME/DATETIMEVALUE RECORDS
-
->> IsEmpty([Date(2022,12,12)])
-false
-
->> IsEmpty([Time(6,30,30)])
-false
-
->> IsEmpty(Table({a:DateTimeValue("5/12/2022 6:30:30 PM")},{a:DateTimeValue("May 19, 2022")}))
-false
-
-
-// BLANK RECORDS
-
->> IsEmpty([])
-true
-
->> IsEmpty(Blank())
-true
-
->> IsEmpty(If(1<0,[1,2,3]))
-true
-
->> IsEmpty([Blank()])
-false
-
->> IsEmpty([Blank(),Blank(),Blank(),Blank(),Blank()])
-false
-
->> IsEmpty(Table(Blank()))
-false
-
->> IsEmpty(Table({a:Blank()}))
-false
-
->> IsEmpty(Table({a:Blank()},{a:Blank()},{a:Blank()}))
-false
-
->> IsEmpty(LastN([1,2,3,4], Blank()))
-true
-
-
-// ERROR RECORDS
-
->> IsEmpty([1/0])
-false
-
->> IsEmpty(Table({a:1/0},{a:Sqrt(-1)}))
-false
-
-
-// EMPTY TABLES OF DIFFERENT DATATYPES
-
-// Numeric Properties
->> IsEmpty(Filter([1, 2, 3], Value > 10))
-true
-
-// String Properties
->> IsEmpty(Filter(["one", "two"], Len(Value) > 5))
-true
-
-// Boolean Properties
->> IsEmpty(Filter([true, false], Len(Value) > 5))
-true
-
-// Date Properties
->> IsEmpty(Filter([Date(2022,12,1), Date(2022,2,2)], Value > Date(2022,12,4)))
-true
-
-// Time Properties
->> IsEmpty(Filter([Time(4,0,0), Time(4,30,0)], Value > Time(5,0,0)))
-true
-
-// DateTime Properties
->> IsEmpty(Filter([DateTime(2022,6,19,16,0,0), DateTime(2022,6,18,4,30,0)], Value > DateTime(2022,6,19,16,0,0)))
-true
-
-// Multiple Datatype Properties
->> IsEmpty(
- Filter(
- Table(
- {a:1,b:true,c:Date(2022,12,1),d:Time(12,34,56),e:DateTime(2012,12,12,12,12,12)},
- {a:5,b:false,c:Date(2022,12,1),d:Time(5,0,0),e:DateTime(2012,12,12,12,12,12)},
- {a:6,b:true,c:Date(2022,12,1),d:Time(12,34,56),e:DateTime(2022,6,19,16,0,0)}
- ),a > 10))
-true
-
-// INVALID ARGUMENTS
->> IsEmpty("")
-Errors: Error 8-10: Invalid argument type (Text). Expecting a Table value instead.
-
->> IsEmpty({})
-Errors: Error 8-10: Invalid argument type (Record). Expecting a Table value instead.
-
->> IsEmpty(0)
-Errors: Error 8-9: Invalid argument type (Decimal). Expecting a Table value instead.
-
->> IsEmpty(false)
-Errors: Error 8-13: Invalid argument type (Boolean). Expecting a Table value instead.
+#SETUP: RestrictedIsEmptyArguments
+
+// NUMERIC RECORDS
+
+>> IsEmpty([1234])
+false
+
+>> IsEmpty([1, 2, 3, 4, 5])
+false
+
+
+// BOOLEAN RECORDS
+
+>> IsEmpty([false])
+false
+
+>> IsEmpty( ["Hello"])
+false
+
+
+// STRING RECORDS
+
+>> IsEmpty([""])
+false
+
+>> IsEmpty(Table({a:"1"},{a:"two"},{a:"three"},{a:"four"},{a:"five"}))
+false
+
+
+// DATE/TIME/DATETIMEVALUE RECORDS
+
+>> IsEmpty([Date(2022,12,12)])
+false
+
+>> IsEmpty([Time(6,30,30)])
+false
+
+>> IsEmpty(Table({a:DateTimeValue("5/12/2022 6:30:30 PM")},{a:DateTimeValue("May 19, 2022")}))
+false
+
+
+// BLANK RECORDS
+
+>> IsEmpty([])
+true
+
+>> IsEmpty(Blank())
+true
+
+>> IsEmpty(If(1<0,[1,2,3]))
+true
+
+>> IsEmpty([Blank()])
+false
+
+>> IsEmpty([Blank(),Blank(),Blank(),Blank(),Blank()])
+false
+
+>> IsEmpty(Table(Blank()))
+false
+
+>> IsEmpty(Table({a:Blank()}))
+false
+
+>> IsEmpty(Table({a:Blank()},{a:Blank()},{a:Blank()}))
+false
+
+>> IsEmpty(LastN([1,2,3,4], Blank()))
+true
+
+
+// ERROR RECORDS
+
+>> IsEmpty([1/0])
+false
+
+>> IsEmpty(Table({a:1/0},{a:Sqrt(-1)}))
+false
+
+
+// EMPTY TABLES OF DIFFERENT DATATYPES
+
+// Numeric Properties
+>> IsEmpty(Filter([1, 2, 3], Value > 10))
+true
+
+// String Properties
+>> IsEmpty(Filter(["one", "two"], Len(Value) > 5))
+true
+
+// Boolean Properties
+>> IsEmpty(Filter([true, false], Len(Value) > 5))
+true
+
+// Date Properties
+>> IsEmpty(Filter([Date(2022,12,1), Date(2022,2,2)], Value > Date(2022,12,4)))
+true
+
+// Time Properties
+>> IsEmpty(Filter([Time(4,0,0), Time(4,30,0)], Value > Time(5,0,0)))
+true
+
+// DateTime Properties
+>> IsEmpty(Filter([DateTime(2022,6,19,16,0,0), DateTime(2022,6,18,4,30,0)], Value > DateTime(2022,6,19,16,0,0)))
+true
+
+// Multiple Datatype Properties
+>> IsEmpty(
+ Filter(
+ Table(
+ {a:1,b:true,c:Date(2022,12,1),d:Time(12,34,56),e:DateTime(2012,12,12,12,12,12)},
+ {a:5,b:false,c:Date(2022,12,1),d:Time(5,0,0),e:DateTime(2012,12,12,12,12,12)},
+ {a:6,b:true,c:Date(2022,12,1),d:Time(12,34,56),e:DateTime(2022,6,19,16,0,0)}
+ ),a > 10))
+true
+
+// INVALID ARGUMENTS
+>> IsEmpty("")
+Errors: Error 8-10: Invalid argument type (Text). Expecting a Table value instead.
+
+>> IsEmpty({})
+Errors: Error 8-10: Invalid argument type (Record). Expecting a Table value instead.
+
+>> IsEmpty(0)
+Errors: Error 8-9: Invalid argument type (Decimal). Expecting a Table value instead.
+
+>> IsEmpty(false)
+Errors: Error 8-13: Invalid argument type (Boolean). Expecting a Table value instead.
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsMatch.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsMatch.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsMatch.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsMatch.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsMatch_StronglyTypedEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsMatch_StronglyTypedEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsMatch_StronglyTypedEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsMatch_StronglyTypedEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsNumeric.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsNumeric.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsNumeric.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsNumeric.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsToday.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsToday.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/IsToday.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/IsToday.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_FR.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_FR.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_FR.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_FR.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_OptionSets.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_OptionSets.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_OptionSets.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_OptionSets.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_US.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_US.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_US.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_US.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/JSON_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/JSON_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Language.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Language.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Language.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Language.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Left.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Left.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Left.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Left.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LeftRightT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LeftRightT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LeftRightT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LeftRightT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LeftRightT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LeftRightT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LeftRightT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LeftRightT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Len.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Len.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Len.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Len.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LenT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LenT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LenT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LenT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LenT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LenT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LenT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LenT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Ln.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Ln.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Ln.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Ln.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LnT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LnT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LnT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LnT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LnT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LnT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/LnT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/LnT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Log.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Log.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Log.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Log.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Lookup.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Lookup.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Lookup.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Lookup.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Lookup_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Lookup_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Lookup_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Lookup_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Lookup_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Lookup_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Lookup_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Lookup_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Lower.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Lower.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Lower.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Lower.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Match.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Match.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Match.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Match.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MatchAll.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MatchAll.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MatchAll.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MatchAll.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MatchAll_StronglyTypedEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MatchAll_StronglyTypedEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MatchAll_StronglyTypedEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MatchAll_StronglyTypedEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Match_StronglyTypedEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Match_StronglyTypedEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Match_StronglyTypedEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Match_StronglyTypedEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Mid.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Mid.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Mid.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Mid.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MidT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MidT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MidT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MidT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MidT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MidT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MidT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MidT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MinMax.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MinMax.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MinMax.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MinMax.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MinMax_NumberIsFloat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MinMax_NumberIsFloat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MinMax_NumberIsFloat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MinMax_NumberIsFloat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MinMax_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MinMax_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MinMax_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MinMax_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MinMax_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MinMax_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/MinMax_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/MinMax_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Mod.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Mod.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Mod.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Mod.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ModT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ModT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ModT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ModT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ModT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ModT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ModT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ModT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ModT_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ModT_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ModT_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ModT_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ModT_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ModT_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ModT_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ModT_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Mod_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Mod_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Mod_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Mod_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Mod_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Mod_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Mod_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Mod_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Find.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Find.txt
similarity index 97%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Find.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Find.txt
index fea1a2780..3d66812a5 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Find.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Find.txt
@@ -1,256 +1,256 @@
-// ************************* SCALAR PARAMETERS *************************
-
->> Find(",", "LastName,FirstName", Blank())
-Blank()
-
-// ************************* TABLE PARAMETERS *************************
-
-// ======================== SCENARIO 1 ========================
-// findText: null, withinText: null, startIndex: [{ start: 1 }]
-
->> Find(If(1<0,["string"]),If(1<0,["string"]),Table({start:1}))
-Table({Result:1})
-
-// ======================== SCENARIO 2 ========================
-// findText: null, withinText: null, startIndex: [{ start: 2 }]
-
->> Find(If(1<0,["string"]),If(1<0,["string"]),Table({start:2}))
-Table({Result:Error({Kind:ErrorKind.InvalidArgument})})
-
-// ======================== SCENARIO 3 ========================
-// findText: null, withinText: "textToBeSearchedIn", startIndex: [{ start: 5 }]
-
->> Find(If(1<0,["string"]),"textToBeSearchedIn",Table({start:5}))
-Table({Result:5})
-
-// ======================== SCENARIO 4 ========================
-// findText: "textToSearch", withinText: null, startIndex: [{ start: 1 }]
-
->> Find("textToSearch",If(1<0,["string"]),[1])
-Table({Result:Blank()})
-
-// ======================== SCENARIO 5 ========================
-// findText: [{ find: null }, { find: '' }, { find: ',' }], withinText: null, startIndex: 1
-
->> Find(Table(
- {find: Blank()},
- {find: ""},
- {find: ","}),
- If(1<0,["string"]),1)
-Table({Result:1},{Result:1},{Result:Blank()})
-
-// ======================== SCENARIO 6 ========================
-// findText: [{ find: null }, { find: '' }, { find: ',' }], withinText: null, startIndex: [{ start: 1 }, { start: 2 }, { start: 3 }]
-
->> Find(Table(
- {find: Blank()},
- {find: ""},
- {find: ","}),
- If(1<0,["string"]),[1,2,3])
-Table({Result:1},{Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:Error({Kind:ErrorKind.InvalidArgument})})
-
-// ======================== SCENARIO 7 ========================
-// findText: null, withinText: [{ within: null }, { within: '' }, { within: 'textToBeSearchedIn' }], startIndex: 1
-
->> Find(If(1<0,["string"]),
- Table(
- {within: Blank()},
- {within: ""},
- {within: "textToBeSearchedIn"}),
- 1)
-Table({Result:1},{Result:1},{Result:1})
-// Question: Is the StartIndex parameter correct?
-
-// ======================== SCENARIO 8 ========================
-// findText: null, withinText: [{ within: null }, { within: '' }, { within: 'textToBeSearchedIn' }], startIndex: [{ start: 1 }, { start: 2 }, { start: 3 }]
-
->> Find(If(1<0,["string"]),
- Table(
- {within: Blank()},
- {within: ""},
- {within: "textToBeSearchedIn"}),
- [1,2,3])
-Table({Result:1},{Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:3})
-
-// ======================== SCENARIO 15 ========================
-// findText: [{ find: null }, { find: '' }, { find: ',' }], withinText: null,
-
->> Find(
- Table({find: Blank()},{find: ""},{find: ","}),
- If(1<0,["string"]))
-Table({Result:1},{Result:1},{Result:Blank()})
-
-// ======================== SCENARIO 16 ========================
-// findText: null, withinText: [{ within: null }, { within: '' }, { within: 'textToBeSearchedIn' }]
-
->> Find(
- If(1<0,["string"]),
- Table({within: Blank()},{within: ""},{within: "textToBeSearchedIn"}))
-Table({Result:1},{Result:1},{Result:1})
-
-// ======================== SCENARIO 20 ========================
-// findText: [{ find: null }, { find: ',' }]
-// withinText: [{ within: 'lastName,firstName' },{ within: 'lastName,firstName,' },{ within: 'lastName,firstName' },{ within: null }]
-
->> Find(
- Table({find: Blank()},{find: ","}),
- Table({within: "lastName,firstName"},{within: "lastName,firstName,"},{within: "lastName,firstName"},{within: Blank()})
- )
-Table({Result:1},{Result:9},{Result:1},{Result:1})
-
-// ======================== SCENARIO 21 ========================
-// findText: [{ find: null }, { find: ',' }, { find: '' }, { find: 'findMe' }], withinText: [{ within: null }, { within: 'lastName,firstName' }]
-
->> Find(
- Table({find: Blank()},{find: ","},{find: ""},{find: "findMe"}),
- Table({within: Blank()},{within: "lastName,firstName"})
- )
-Table({Result:1},{Result:9},{Result:1},{Result:Blank()})
-
-// ======================== SCENARIO 22 ========================
-// findText: [{ find: null }, { find: ',' }], WithinText: [{ within: 'lastName,firstName' }], startIndex: [{ start: 9 }, { start: 2 }, { start: 3 }]
-
->> Find(
- Table({find: Blank()},{find: ","}),
- Table({within: "lastName,firstName"}),
- [9,2,3]
- )
-Table({Result:9},{Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:Error({Kind:ErrorKind.InvalidArgument})})
-
-// ======================== SCENARIO 23 ========================
-// findText: [{ find: null }, { find: ',' }, { find: '' }, { find: 'findMe' }]
-// withinText: [{ within: null }, { within: 'lastName,firstName' }]
-// startIndex: 10
-
->> Find(
- Table({find: Blank()},{find: ","},{find: ""},{find: "findMe"}),
- Table({within: Blank()},{within: "lastName,firstName"}),
- 10
- )
-Table({Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:Blank()},{Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:Error({Kind:ErrorKind.InvalidArgument})})
-
-// ======================== SCENARIO 24 ========================
-// findText: [{ find: ',' }, { find: null }], withinText: 'lastName,firstName', startIndex: [{ start: 1 }, { start: 2 }, { start: 3 }]
-
->> Find(
- Table({find: ","},{find: Blank()}),
- "lastName,firstName",
- [1,2,3]
- )
-Table({Result:9},{Result:2},{Result:3})
-
-// ======================== SCENARIO 25 ========================
-// findText: ',', withinText: [{ within: null }, { within: 'lastName,firstName' }, { within: 'lastName,firstName' }], startIndex: [{ start: 1 }, { start: 2 }],
-
->> Find(
- ",",
- Table({within:Blank()},{within:"lastName,firstName"},{within:"lastName,firstName"}),
- [1,2]
- )
-Table({Result:Blank()},{Result:9},{Result:Blank()})
-
-// ======================== SCENARIO 31 ========================
-// findText: [],withinText: [{ within: null }, { within: 'lastName,firstName' }, { within: 'lastName,firstName' }], startIndex: 2
-
->> Find(
- Filter(["string"], Len(Value) > 10),
- Table({within:Blank()},{within:"lastName,firstName"},{within:"lastName,firstName"}),
- 2)
-Table()
-
-// ======================== SCENARIO 32 ========================
-// findText: [], withinText: 'textToSearch', startIndex: [{ start: 1 }, { start: 2 }],
-
->> Find(
- Filter(["string"], Len(Value) > 10),
- "textToSearch",
- [1,2])
-Table()
-
-// ======================== SCENARIO 33 ========================
-// findText: [{ find: ',' }, { find: null }, { find: '' }], withinText: [], startIndex: 2
-
->> Find(
- Table({find:","},{find:Blank()},{find:""}),
- Filter(["string"], Len(Value) > 10),
- 2)
-Table()
-
-// ======================== SCENARIO 34 ========================
-// findText: ',', withinText: [], startIndex: [{ start: 1 }, { start: 1 }],
-
->> Find(
- ",",
- Filter(["string"], Len(Value) > 10),
- [1,1])
-Table()
-
-// ======================== SCENARIO 35 ========================
-// findText: [{ find: null }, { find: ',' }, { find: '' }, { find: 'findMe' }],
-// withinText: [{ within: null }, { within: 'lastName,firstName' }, { within: 'lastName,firstName' }],
-// startIndex: [],
-
->> Find(
- Table({find: Blank()},{find: ","},{find: ""},{find: "findMe"}),
- Table({within:Blank()},{within:"lastName,firstName"},{within:"lastName,firstName"}),
- Filter([1, 2, 3], Value > 100)
- )
-Table()
-
-// ======================== SCENARIO 36 ========================
-// findText: ',', withinText: [{ within: null }, { within: 'lastName,firstName' }], startIndex: []
-
->> Find(
- ",",
- Table({within: Blank()},{within: "lastName,firstName"}),
- Filter([1, 2, 3], Value > 100)
- )
-Table()
-
-// ======================== SCENARIO 37 ========================
-// findText: 'c', withinText: [{ within: 'abc' }, { within: anError }, { within: 'cde' }],
-
->> Find(
- "c",
- Table({within: "abc"},{within: Error({Kind: Validation})}, {within: "cde"})
- )
-Table({Result:3},{Result:Error({Kind:ErrorKind.Validation})},{Result:1})
-
-// ======================== SCENARIO 38 ========================
-// findText: 'c', withinText: [{ within: 'abc' }, anError, { within: 'cde' }],
-
->> Find(
- "c",
- Table({within: "abc"},{within: Error({Kind: Validation})}, {within: "cde"}),
- [3,1/0,1]
- )
-Table({Result:3},{Result:Error({Kind:ErrorKind.Validation})},{Result:1})
-
-// ======================== SCENARIO 39 ========================
-// findText: [{ find: 'a' }, { find: anError }, { find: 'b' }], withinText: 'abc',
-
->> Find(
- Table({find:"a"},{find:Error({Kind: Validation})},{find:"b"}),
- "abc",
- [1,1/0,2]
- )
-Table({Result:1},{Result:Error({Kind:ErrorKind.Validation})},{Result:2})
-
-// ======================== SCENARIO 40 ========================
-// findText: [{ find: 'a' }, { find: anError }, { find: 'b' }, anError, { find: 'c' }],
-// withinText: [{ within: 'abc' }, anError, { within: anError }, anError, { within: 'abc' }],
-
->> Find(
- Table({find:"a"},{find:Error({Kind: Validation})},{find:"b"},{find:Error({Kind: InvalidArgument})},{find:"c"}),
- Table({within:"abc"}, Error({Kind: InvalidArgument}), {within:Error({Kind: Validation})}, Error({Kind: Div0}), {within:"abc"})
- )
-Table({Result:1},Error({Kind:ErrorKind.InvalidArgument}),{Result:Error({Kind:ErrorKind.Validation})},Error({Kind:ErrorKind.Div0}),{Result:3})
-
-// ======================== SCENARIO 42 ========================
-// findText: anError, withinText: [{ within: 'First' }, { within: 'Second' }]
-
->> Find(
- Text(1/0),
- Table({within:"First"},{within:"Second"}),
- )
-Table({Result:Error({Kind:ErrorKind.Div0})},{Result:Error({Kind:ErrorKind.Div0})})
+// ************************* SCALAR PARAMETERS *************************
+
+>> Find(",", "LastName,FirstName", Blank())
+Blank()
+
+// ************************* TABLE PARAMETERS *************************
+
+// ======================== SCENARIO 1 ========================
+// findText: null, withinText: null, startIndex: [{ start: 1 }]
+
+>> Find(If(1<0,["string"]),If(1<0,["string"]),Table({start:1}))
+Table({Result:1})
+
+// ======================== SCENARIO 2 ========================
+// findText: null, withinText: null, startIndex: [{ start: 2 }]
+
+>> Find(If(1<0,["string"]),If(1<0,["string"]),Table({start:2}))
+Table({Result:Error({Kind:ErrorKind.InvalidArgument})})
+
+// ======================== SCENARIO 3 ========================
+// findText: null, withinText: "textToBeSearchedIn", startIndex: [{ start: 5 }]
+
+>> Find(If(1<0,["string"]),"textToBeSearchedIn",Table({start:5}))
+Table({Result:5})
+
+// ======================== SCENARIO 4 ========================
+// findText: "textToSearch", withinText: null, startIndex: [{ start: 1 }]
+
+>> Find("textToSearch",If(1<0,["string"]),[1])
+Table({Result:Blank()})
+
+// ======================== SCENARIO 5 ========================
+// findText: [{ find: null }, { find: '' }, { find: ',' }], withinText: null, startIndex: 1
+
+>> Find(Table(
+ {find: Blank()},
+ {find: ""},
+ {find: ","}),
+ If(1<0,["string"]),1)
+Table({Result:1},{Result:1},{Result:Blank()})
+
+// ======================== SCENARIO 6 ========================
+// findText: [{ find: null }, { find: '' }, { find: ',' }], withinText: null, startIndex: [{ start: 1 }, { start: 2 }, { start: 3 }]
+
+>> Find(Table(
+ {find: Blank()},
+ {find: ""},
+ {find: ","}),
+ If(1<0,["string"]),[1,2,3])
+Table({Result:1},{Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:Error({Kind:ErrorKind.InvalidArgument})})
+
+// ======================== SCENARIO 7 ========================
+// findText: null, withinText: [{ within: null }, { within: '' }, { within: 'textToBeSearchedIn' }], startIndex: 1
+
+>> Find(If(1<0,["string"]),
+ Table(
+ {within: Blank()},
+ {within: ""},
+ {within: "textToBeSearchedIn"}),
+ 1)
+Table({Result:1},{Result:1},{Result:1})
+// Question: Is the StartIndex parameter correct?
+
+// ======================== SCENARIO 8 ========================
+// findText: null, withinText: [{ within: null }, { within: '' }, { within: 'textToBeSearchedIn' }], startIndex: [{ start: 1 }, { start: 2 }, { start: 3 }]
+
+>> Find(If(1<0,["string"]),
+ Table(
+ {within: Blank()},
+ {within: ""},
+ {within: "textToBeSearchedIn"}),
+ [1,2,3])
+Table({Result:1},{Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:3})
+
+// ======================== SCENARIO 15 ========================
+// findText: [{ find: null }, { find: '' }, { find: ',' }], withinText: null,
+
+>> Find(
+ Table({find: Blank()},{find: ""},{find: ","}),
+ If(1<0,["string"]))
+Table({Result:1},{Result:1},{Result:Blank()})
+
+// ======================== SCENARIO 16 ========================
+// findText: null, withinText: [{ within: null }, { within: '' }, { within: 'textToBeSearchedIn' }]
+
+>> Find(
+ If(1<0,["string"]),
+ Table({within: Blank()},{within: ""},{within: "textToBeSearchedIn"}))
+Table({Result:1},{Result:1},{Result:1})
+
+// ======================== SCENARIO 20 ========================
+// findText: [{ find: null }, { find: ',' }]
+// withinText: [{ within: 'lastName,firstName' },{ within: 'lastName,firstName,' },{ within: 'lastName,firstName' },{ within: null }]
+
+>> Find(
+ Table({find: Blank()},{find: ","}),
+ Table({within: "lastName,firstName"},{within: "lastName,firstName,"},{within: "lastName,firstName"},{within: Blank()})
+ )
+Table({Result:1},{Result:9},{Result:1},{Result:1})
+
+// ======================== SCENARIO 21 ========================
+// findText: [{ find: null }, { find: ',' }, { find: '' }, { find: 'findMe' }], withinText: [{ within: null }, { within: 'lastName,firstName' }]
+
+>> Find(
+ Table({find: Blank()},{find: ","},{find: ""},{find: "findMe"}),
+ Table({within: Blank()},{within: "lastName,firstName"})
+ )
+Table({Result:1},{Result:9},{Result:1},{Result:Blank()})
+
+// ======================== SCENARIO 22 ========================
+// findText: [{ find: null }, { find: ',' }], WithinText: [{ within: 'lastName,firstName' }], startIndex: [{ start: 9 }, { start: 2 }, { start: 3 }]
+
+>> Find(
+ Table({find: Blank()},{find: ","}),
+ Table({within: "lastName,firstName"}),
+ [9,2,3]
+ )
+Table({Result:9},{Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:Error({Kind:ErrorKind.InvalidArgument})})
+
+// ======================== SCENARIO 23 ========================
+// findText: [{ find: null }, { find: ',' }, { find: '' }, { find: 'findMe' }]
+// withinText: [{ within: null }, { within: 'lastName,firstName' }]
+// startIndex: 10
+
+>> Find(
+ Table({find: Blank()},{find: ","},{find: ""},{find: "findMe"}),
+ Table({within: Blank()},{within: "lastName,firstName"}),
+ 10
+ )
+Table({Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:Blank()},{Result:Error({Kind:ErrorKind.InvalidArgument})},{Result:Error({Kind:ErrorKind.InvalidArgument})})
+
+// ======================== SCENARIO 24 ========================
+// findText: [{ find: ',' }, { find: null }], withinText: 'lastName,firstName', startIndex: [{ start: 1 }, { start: 2 }, { start: 3 }]
+
+>> Find(
+ Table({find: ","},{find: Blank()}),
+ "lastName,firstName",
+ [1,2,3]
+ )
+Table({Result:9},{Result:2},{Result:3})
+
+// ======================== SCENARIO 25 ========================
+// findText: ',', withinText: [{ within: null }, { within: 'lastName,firstName' }, { within: 'lastName,firstName' }], startIndex: [{ start: 1 }, { start: 2 }],
+
+>> Find(
+ ",",
+ Table({within:Blank()},{within:"lastName,firstName"},{within:"lastName,firstName"}),
+ [1,2]
+ )
+Table({Result:Blank()},{Result:9},{Result:Blank()})
+
+// ======================== SCENARIO 31 ========================
+// findText: [],withinText: [{ within: null }, { within: 'lastName,firstName' }, { within: 'lastName,firstName' }], startIndex: 2
+
+>> Find(
+ Filter(["string"], Len(Value) > 10),
+ Table({within:Blank()},{within:"lastName,firstName"},{within:"lastName,firstName"}),
+ 2)
+Table()
+
+// ======================== SCENARIO 32 ========================
+// findText: [], withinText: 'textToSearch', startIndex: [{ start: 1 }, { start: 2 }],
+
+>> Find(
+ Filter(["string"], Len(Value) > 10),
+ "textToSearch",
+ [1,2])
+Table()
+
+// ======================== SCENARIO 33 ========================
+// findText: [{ find: ',' }, { find: null }, { find: '' }], withinText: [], startIndex: 2
+
+>> Find(
+ Table({find:","},{find:Blank()},{find:""}),
+ Filter(["string"], Len(Value) > 10),
+ 2)
+Table()
+
+// ======================== SCENARIO 34 ========================
+// findText: ',', withinText: [], startIndex: [{ start: 1 }, { start: 1 }],
+
+>> Find(
+ ",",
+ Filter(["string"], Len(Value) > 10),
+ [1,1])
+Table()
+
+// ======================== SCENARIO 35 ========================
+// findText: [{ find: null }, { find: ',' }, { find: '' }, { find: 'findMe' }],
+// withinText: [{ within: null }, { within: 'lastName,firstName' }, { within: 'lastName,firstName' }],
+// startIndex: [],
+
+>> Find(
+ Table({find: Blank()},{find: ","},{find: ""},{find: "findMe"}),
+ Table({within:Blank()},{within:"lastName,firstName"},{within:"lastName,firstName"}),
+ Filter([1, 2, 3], Value > 100)
+ )
+Table()
+
+// ======================== SCENARIO 36 ========================
+// findText: ',', withinText: [{ within: null }, { within: 'lastName,firstName' }], startIndex: []
+
+>> Find(
+ ",",
+ Table({within: Blank()},{within: "lastName,firstName"}),
+ Filter([1, 2, 3], Value > 100)
+ )
+Table()
+
+// ======================== SCENARIO 37 ========================
+// findText: 'c', withinText: [{ within: 'abc' }, { within: anError }, { within: 'cde' }],
+
+>> Find(
+ "c",
+ Table({within: "abc"},{within: Error({Kind: Validation})}, {within: "cde"})
+ )
+Table({Result:3},{Result:Error({Kind:ErrorKind.Validation})},{Result:1})
+
+// ======================== SCENARIO 38 ========================
+// findText: 'c', withinText: [{ within: 'abc' }, anError, { within: 'cde' }],
+
+>> Find(
+ "c",
+ Table({within: "abc"},{within: Error({Kind: Validation})}, {within: "cde"}),
+ [3,1/0,1]
+ )
+Table({Result:3},{Result:Error({Kind:ErrorKind.Validation})},{Result:1})
+
+// ======================== SCENARIO 39 ========================
+// findText: [{ find: 'a' }, { find: anError }, { find: 'b' }], withinText: 'abc',
+
+>> Find(
+ Table({find:"a"},{find:Error({Kind: Validation})},{find:"b"}),
+ "abc",
+ [1,1/0,2]
+ )
+Table({Result:1},{Result:Error({Kind:ErrorKind.Validation})},{Result:2})
+
+// ======================== SCENARIO 40 ========================
+// findText: [{ find: 'a' }, { find: anError }, { find: 'b' }, anError, { find: 'c' }],
+// withinText: [{ within: 'abc' }, anError, { within: anError }, anError, { within: 'abc' }],
+
+>> Find(
+ Table({find:"a"},{find:Error({Kind: Validation})},{find:"b"},{find:Error({Kind: InvalidArgument})},{find:"c"}),
+ Table({within:"abc"}, Error({Kind: InvalidArgument}), {within:Error({Kind: Validation})}, Error({Kind: Div0}), {within:"abc"})
+ )
+Table({Result:1},Error({Kind:ErrorKind.InvalidArgument}),{Result:Error({Kind:ErrorKind.Validation})},Error({Kind:ErrorKind.Div0}),{Result:3})
+
+// ======================== SCENARIO 42 ========================
+// findText: anError, withinText: [{ within: 'First' }, { within: 'Second' }]
+
+>> Find(
+ Text(1/0),
+ Table({within:"First"},{within:"Second"}),
+ )
+Table({Result:Error({Kind:ErrorKind.Div0})},{Result:Error({Kind:ErrorKind.Div0})})
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/ISOWeekNum.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/ISOWeekNum.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/ISOWeekNum.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/ISOWeekNum.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/If.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/If.txt
similarity index 96%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/If.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/If.txt
index c460bbb7d..72a0f3b2a 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/If.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/If.txt
@@ -1,145 +1,145 @@
-// ************************************** FIRST CONDITION TRUE CASES **************************************
-
-// The first condition is true, and the corresponding Date ThenResult is returned.
->> If(true, Date(2022,4,22), Date(2022,4,23))
-Date(4,22,2022)
-
-// The first condition is true, and the corresponding Time ThenResult is returned.
-//Excel doesn't ignore the seconds part and returns 12:50:00 PM
->> If(Time(12,50,50)>Time(12,49,00), Time(12,50,50), Time(12,49,00))
-12:50 PM
-
-// The first condition is true, and the corresponding DateTimeValue ThenResult is returned.
->> If(DateTimeValue("1/1/2000 12:00:00:00 AM")>Time(12,49,00), DateTimeValue("1/1/2000 12:00:00:00 AM"), Time(12,49,00))
-1/1/2000 12:00 AM
-
-//Excel returns error
->> If("a", 2, 3)
-3
-
-// ************************************** FIRST CONDITION FALSE CASES **************************************
-
-// Both the first and second conditions are false, a DefaultResult was provided, and it's returned
->> If( 5>25, "Result1", IsNumeric("25"), "Result2", "Result3")
-"Result3"
-
-// Both the first and second conditions are false, a DefaultResult isn't provided, hence returned Blank
->> If( 5>25, "Result1", IsNumeric("25"), "Result2")
-Blank()
-
-// ***************** FIRST ARGUMENT NUMBER, SECOND ARGUMENT OTHER DATAYPE *****************
-
-//Number to Date Coercion
->> If(false,1,Date(2012,12,14))
-1355472000000
-
-//Number to Date Coercion
->> If(false,1,DateValue("12/14/2012"))
-1355472000000
-
-//Number to Time Coercion
->> If(false,1,Time(12,35,55))
-74155000
-
-//Number to Time Coercion
->> If(false,1,TimeValue("12:35:55"))
-74155000
-
-//Number to DateTime Coercion
->> If(false,1,DateTimeValue("1/1/2000 12:00:00:00 AM"))
-946713600000
-
-// ***************** FIRST ARGUMENT STRING, SECOND ARGUMENT OTHER DATAYPE *****************
-
-//String to Date Coercion
->> If(false,"Hello",DateValue("12/14/2012"))
-Date(12,14,2012)
-
-//String to DateTime Coercion
->> If(false,"Hello",DateTimeValue("1/1/2000 12:00:00:00 AM"))
-"1/1/2000 12:00 AM"
-
-// ***************** FIRST ARGUMENT BOOLEAN, SECOND ARGUMENT OTHER DATAYPE *****************
-
-//Boolean to String Coercion
-////Excel returns "Good morning"
->> If(false,true,"Good morning")
-false
-
-// ***************** FIRST ARGUMENT DATE, SECOND ARGUMENT OTHER DATAYPE *****************
-
-//Date to Date Coercion
->> If(false,Date(2012,12,14),DateValue("1/1/2014"))
-Date(1,1,2014)
-
-//Date to Date Coercion
->> If(false,Date(2012,12,14),Date(2014,1,1))
-Date(1,1,2014)
-
-//Date to Number Coercion
->> If(false,Date(2012,12,14),1)
-Date(12,31,1969)
-
-//Date to Time Coercion
->> If(false,Date(2012,12,14),Time(12,35,55))
-1/1/1970 12:35 PM
-
-//Date to Time Coercion
->> If(false,Date(2012,12,14),TimeValue("12:35:55"))
-1/1/1970 12:35 PM
-
-//Date to DateTime Coercion
->> If(false,Date(2012,12,14),DateTimeValue("1/1/2000 12:00:00:00 AM"))
-1/1/2000 12:00 AM
-
-// ***************** FIRST ARGUMENT TIME, SECOND ARGUMENT OTHER DATAYPE *****************
-
-//Time to Time Coercion
->> If(false,Time(12,35,55),Time(5,20,40))
-5:20 AM
-
-//Time to Time Coercion
->> If(false,Time(12,35,55),TimeValue("5:20:40"))
-5:20 AM
-
-//Time to Number Coercion
->> If(false,Time(12,35,55),1)
-4:00 PM
-
-//Time to Date Coercion
->> If(false,Time(12,35,55),Date(2014,2,15))
-2/15/2014 12:00 AM
-
-//Time to Date Coercion
->> If(false,Time(12,35,55),DateValue("2/15/2014"))
-2/15/2014 12:00 AM
-
-//Time to DateTime Coercion
->> If(false,Time(12,35,55),DateTimeValue("1/1/2000 12:00:00:00 AM"))
-1/1/2000 12:00 AM
-
-// ***************** FIRST ARGUMENT DATETIME, SECOND ARGUMENT OTHER DATAYPE *****************
-
-//DateTime to DateTime Coercion
->> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),DateTimeValue("12/1/2004 12:00:00:00 AM"))
-12/1/2004 12:00 AM
-
-//DateTime to Number Coercion
->> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),1)
-12/31/1969 4:00 PM
-
-//DateTime to Date Coercion
->> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),Date(2014,2,15))
-2/15/2014 12:00 AM
-
-//DateTime to Date Coercion
->> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),DateValue("2/15/2014"))
-2/15/2014 12:00 AM
-
-//DateTime to Time Coercion
->> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),TimeValue("12:35:55"))
-1/1/1970 12:35 PM
-
-//DateTime to Time Coercion
->> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),Time(12,35,55))
+// ************************************** FIRST CONDITION TRUE CASES **************************************
+
+// The first condition is true, and the corresponding Date ThenResult is returned.
+>> If(true, Date(2022,4,22), Date(2022,4,23))
+Date(4,22,2022)
+
+// The first condition is true, and the corresponding Time ThenResult is returned.
+//Excel doesn't ignore the seconds part and returns 12:50:00 PM
+>> If(Time(12,50,50)>Time(12,49,00), Time(12,50,50), Time(12,49,00))
+12:50 PM
+
+// The first condition is true, and the corresponding DateTimeValue ThenResult is returned.
+>> If(DateTimeValue("1/1/2000 12:00:00:00 AM")>Time(12,49,00), DateTimeValue("1/1/2000 12:00:00:00 AM"), Time(12,49,00))
+1/1/2000 12:00 AM
+
+//Excel returns error
+>> If("a", 2, 3)
+3
+
+// ************************************** FIRST CONDITION FALSE CASES **************************************
+
+// Both the first and second conditions are false, a DefaultResult was provided, and it's returned
+>> If( 5>25, "Result1", IsNumeric("25"), "Result2", "Result3")
+"Result3"
+
+// Both the first and second conditions are false, a DefaultResult isn't provided, hence returned Blank
+>> If( 5>25, "Result1", IsNumeric("25"), "Result2")
+Blank()
+
+// ***************** FIRST ARGUMENT NUMBER, SECOND ARGUMENT OTHER DATAYPE *****************
+
+//Number to Date Coercion
+>> If(false,1,Date(2012,12,14))
+1355472000000
+
+//Number to Date Coercion
+>> If(false,1,DateValue("12/14/2012"))
+1355472000000
+
+//Number to Time Coercion
+>> If(false,1,Time(12,35,55))
+74155000
+
+//Number to Time Coercion
+>> If(false,1,TimeValue("12:35:55"))
+74155000
+
+//Number to DateTime Coercion
+>> If(false,1,DateTimeValue("1/1/2000 12:00:00:00 AM"))
+946713600000
+
+// ***************** FIRST ARGUMENT STRING, SECOND ARGUMENT OTHER DATAYPE *****************
+
+//String to Date Coercion
+>> If(false,"Hello",DateValue("12/14/2012"))
+Date(12,14,2012)
+
+//String to DateTime Coercion
+>> If(false,"Hello",DateTimeValue("1/1/2000 12:00:00:00 AM"))
+"1/1/2000 12:00 AM"
+
+// ***************** FIRST ARGUMENT BOOLEAN, SECOND ARGUMENT OTHER DATAYPE *****************
+
+//Boolean to String Coercion
+////Excel returns "Good morning"
+>> If(false,true,"Good morning")
+false
+
+// ***************** FIRST ARGUMENT DATE, SECOND ARGUMENT OTHER DATAYPE *****************
+
+//Date to Date Coercion
+>> If(false,Date(2012,12,14),DateValue("1/1/2014"))
+Date(1,1,2014)
+
+//Date to Date Coercion
+>> If(false,Date(2012,12,14),Date(2014,1,1))
+Date(1,1,2014)
+
+//Date to Number Coercion
+>> If(false,Date(2012,12,14),1)
+Date(12,31,1969)
+
+//Date to Time Coercion
+>> If(false,Date(2012,12,14),Time(12,35,55))
+1/1/1970 12:35 PM
+
+//Date to Time Coercion
+>> If(false,Date(2012,12,14),TimeValue("12:35:55"))
+1/1/1970 12:35 PM
+
+//Date to DateTime Coercion
+>> If(false,Date(2012,12,14),DateTimeValue("1/1/2000 12:00:00:00 AM"))
+1/1/2000 12:00 AM
+
+// ***************** FIRST ARGUMENT TIME, SECOND ARGUMENT OTHER DATAYPE *****************
+
+//Time to Time Coercion
+>> If(false,Time(12,35,55),Time(5,20,40))
+5:20 AM
+
+//Time to Time Coercion
+>> If(false,Time(12,35,55),TimeValue("5:20:40"))
+5:20 AM
+
+//Time to Number Coercion
+>> If(false,Time(12,35,55),1)
+4:00 PM
+
+//Time to Date Coercion
+>> If(false,Time(12,35,55),Date(2014,2,15))
+2/15/2014 12:00 AM
+
+//Time to Date Coercion
+>> If(false,Time(12,35,55),DateValue("2/15/2014"))
+2/15/2014 12:00 AM
+
+//Time to DateTime Coercion
+>> If(false,Time(12,35,55),DateTimeValue("1/1/2000 12:00:00:00 AM"))
+1/1/2000 12:00 AM
+
+// ***************** FIRST ARGUMENT DATETIME, SECOND ARGUMENT OTHER DATAYPE *****************
+
+//DateTime to DateTime Coercion
+>> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),DateTimeValue("12/1/2004 12:00:00:00 AM"))
+12/1/2004 12:00 AM
+
+//DateTime to Number Coercion
+>> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),1)
+12/31/1969 4:00 PM
+
+//DateTime to Date Coercion
+>> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),Date(2014,2,15))
+2/15/2014 12:00 AM
+
+//DateTime to Date Coercion
+>> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),DateValue("2/15/2014"))
+2/15/2014 12:00 AM
+
+//DateTime to Time Coercion
+>> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),TimeValue("12:35:55"))
+1/1/1970 12:35 PM
+
+//DateTime to Time Coercion
+>> If(false,DateTimeValue("11/1/2000 12:00:00:00 AM"),Time(12,35,55))
1/1/1970 12:35 PM
\ No newline at end of file
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Sort.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Sort.txt
similarity index 99%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Sort.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Sort.txt
index 527fd72c0..f561a2f7f 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Sort.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Sort.txt
@@ -1,432 +1,432 @@
-// ******** NUMBER PARAMETERS ********
-
->> Sort([-2, -1, 5, 1, 2], Value)
-[-2,-1,1,2,5]
-
->> Sort([-2, -1, 5, 1, 2], Value, SortOrder.Descending)
-[5,2,1,-1,-2]
-
->> Sort([-2, -1, -1E+308, 1, 2], Value)
-[-1e+308,-2,-1,1,2]
-
->> Sort([-2, -1, 1E+308, 1, 2], Value)
-[-2,-1,1,2,1e+308]
-
->> Sort([{a:8, b:-1}, {a:2}, {b:5}], Value.a)
-[{a:2},{a:8,b:-1},{b:5}]
-
->> Sort([{a:8, b:-1}, {a:2}, {b:5}], Value.b, SortOrder.Descending)
-[{b:5},{a:8,b:-1},{a:2}]
-
-// ******** STRING PARAMETERS ********
-
->> Sort(["a", "b", "D", "x", "J", "C"], Value)
-["a","b","C","D","J","x"]
-
->> Sort(["a", "b", "D", "x", "J", "C"], Value, SortOrder.Descending)
-["x","J","D","C","b","a"]
-
->> Sort(["a", "b", "B", "x", "D", "C"], Value)
-["a","b","B","C","D","x"]
-
->> Sort(["Hello", "hellO", "hello", "heLLo", "HELLO", "hElLo"], Value)
-["hello","hellO","heLLo","hElLo","Hello","HELLO"]
-
->> Sort(["Hello", "hellO", "1", "%", "2", "hElLo"], Value)
-["%","1","2","hellO","hElLo","Hello"]
-
->> Sort(["a", "b", Blank(), "x", "J", "C"], Value)
-["a","b","C","J","x",Blank()]
-
->> Sort(["a", "b", Blank(), "x", "J", "C"], Value, SortOrder.Descending)
-["x","J","C","b","a",Blank()]
-
-// ******** BOOLEAN PARAMETERS ********
-
->> Sort([true,false,true,false,true], Value)
-[false,false,true,true,true]
-
->> Sort([true,false,true,false,true], Value, SortOrder.Descending)
-[true,true,true,false,false]
-
->> Sort([true,false,Blank(),false,true], Value)
-[false,false,true,true,Blank()]
-
->> Sort([true,false,Blank(),false,true], Value, SortOrder.Descending)
-[true,true,false,false,Blank()]
-
-// ******** DATE PARAMETERS ********
-
->> Sort([Date(2020, 01, 05), Date(2020, 01, 01), Date(1995, 01, 01)], Value)
-[Date(1995,1,1),Date(2020,1,1),Date(2020,1,5)]
-
->> Sort([Date(2020, 01, 05), Date(2012,12,14), Date(2022,1,1)], Value)
-[Date(2012,12,14),Date(2020,1,5),Date(2022,1,1)]
-
->> Sort([Date(2020, 01, 05), Date(2020, 01, 01), Date(1995, 01, 01)], Value, SortOrder.Descending)
-[Date(2020,1,5),Date(2020,1,1),Date(1995,1,1)]
-
->> Sort([Date(2020, 01, 05), Date(2012,12,14), Blank(), Date(2022,1,1)], Value, SortOrder.Descending)
-[Date(2022,1,1),Date(2020,1,5),Date(2012,12,14),Blank()]
-
-// ******** TIME PARAMETERS ********
-
->> Sort([Time(12,35,55), Time(23, 01, 01), Time(5,30,50)], Value)
-["05:30:50.000","12:35:55.000","23:01:01.000"]
-
->> Sort([Time(12,35,55), Time(23, 01, 01), Time(5,30,50)], Value, SortOrder.Descending)
-["23:01:01.000","12:35:55.000","05:30:50.000"]
-
->> Sort([Time(17,29,0), Blank(), Time(5,30,50)], Value)
-["05:30:50.000","17:29:00.000",Blank()]
-
-// ******** DATETIME PARAMETERS ********
-
->> Sort([DateTime(2019,5,16,8,0,0), DateTime(2019,5,16,20,0,0), DateTime(2019,5,16,20,0,1)], Value)
-[DateTime(2019,5,16,8,0,0,0),DateTime(2019,5,16,20,0,0,0),DateTime(2019,5,16,20,0,1,0)]
-
->> Sort([DateTime(2019,5,16,8,0,0), DateTime(2019,5,16,20,0,0), DateTime(2019,5,16,20,0,1)], Value, SortOrder.Descending)
-[DateTime(2019,5,16,20,0,1,0),DateTime(2019,5,16,20,0,0,0),DateTime(2019,5,16,8,0,0,0)]
-
-// ******** NULL and ERROR PARAMETERS ********
-
->> Sort([Blank()],true)
-[Blank()]
-
-//Blank passed as the table record
->> Sort([Blank()], Value)
-[Blank()]
-
->> Sort([Blank(),Blank()], Value, SortOrder.Descending)
-[Blank(),Blank()]
-
->> Sort([-2, Blank(), 5, 1, 2], Value)
-[-2,1,2,5,Blank()]
-
->> Sort([-2, Blank(), 5, 1, 2], Value, SortOrder.Descending)
-[5,2,1,-2,Blank()]
-
->> Sort([-2, -Blank(), 5, 1, 2], Value)
-[-2,0,1,2,5]
-
-//Blank sort formula parameter
->> Sort([Blank()], Blank())
-[Blank()]
-
->> Sort([-2, -1, 5, 1, 2], Blank())
-[-2,-1,5,1,2]
-
->> Sort([-2, -1, 5, 1, 2])
-[-2,-1,5,1,2]
-
-// ******** MULTI COLUMN SORT CASES ********
-
-// SORT ON NUMERIC COLUMN "AGE" - ASCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Age)
-Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()})
-
-
-// SORT ON NUMERIC COLUMN "AGE" - DESCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Age, SortOrder.Descending)
-Table({Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()})
-
-// SORT ON BOOLEAN COLUMN "Vaccinated" - ASCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), Vaccinated)
-Table({Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()})
-
-
-// SORT ON BOOLEAN COLUMN "Vaccinated" - DESCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), Vaccinated, SortOrder.Descending)
-Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()})
-
-// SORT ON STRING COLUMN "First" - ASCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),First)
-Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()})
-
-
-// SORT ON STRING COLUMN "First" - DESCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), First, SortOrder.Descending)
-Table({Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()})
-
-// EMBEDDED SORT - FIRST ON STRING COLUMN "First" AND THEN ON "Last" - ASCENDING ORDER
-
->> Sort(Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Last),First)
-Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()})
-
-
-// EMBEDDED SORT - FIRST ON STRING COLUMN "First" AND THEN ON "Last" - DESCENDING ORDER
-
->> Sort(Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Last,SortOrder.Descending),First,SortOrder.Descending)
-Table({Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()})
-
-
-// Blank() PASSED AS SORT FORMULA - ASCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), Blank())
-Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true})
-
-
-// Blank() PASSED AS SORT FORMULA - DESCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), Blank(),SortOrder.Descending)
-Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true})
-
-
-// SORT A TABLE WITH ERROR ROWS - ASCENDING ORDER
-
-//Sort by First Name
->> Sort(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- If(Left("Hello", -1) = "", { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true }),
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false }
- ),If(IsBlankOrError(ThisRecord), Blank(), First))
-Table({First:"Alice",Last:"Smith",Age:5,Gender:"Female",Vaccinated:true,HasDog:true},{First:"Bob",Last:"Smith",Age:2,Gender:"Male",Vaccinated:true,HasDog:true},{First:"Dora",Last:"TheExplorer",Age:4,Gender:"Female",Vaccinated:false,HasDog:true},{First:"John",Last:"Batali",Age:17,Gender:"Male",Vaccinated:false,HasDog:false},Error({Kind:ErrorKind.InvalidArgument}))
-
-
-// SORT A TABLE WITH BLANK ROWS - ASCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- Blank(),
- Blank(),
- Blank(),
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- Blank(),
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- Blank(),
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),If(IsBlank(Value),Blank(),Value.First))
-Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},Blank(),Blank(),Blank(),Blank(),Blank())
-
-// SORT ON TABLE WITH WITH ERROR VALUES FOR SOME COLUMNS, BUT DOESN'T TOUCH ERROR - ASCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Left("Hello", -1), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Left("Hello", -1), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() }),First)
-Table({First:"Alice",Last:"Smith",Age:5,Gender:"Female",Vaccinated:true,HasDog:true},{First:"Bob",Last:"Smith",Age:2,Gender:"Male",Vaccinated:true,HasDog:true},{First:"Emily",Last:"Jones",Age:29,Gender:"Female",Vaccinated:true,HasDog:false},{First:"Helio",Last:Error({Kind:ErrorKind.InvalidArgument}),Age:263,Gender:"Unknown",Vaccinated:Blank(),HasDog:false},{First:"John",Last:"Batali",Age:17,Gender:"Male",Vaccinated:false,HasDog:false},{First:"Mary",Last:"Harris",Age:48,Gender:"Female",Vaccinated:false,HasDog:false},{First:"Titan",Last:Error({Kind:ErrorKind.InvalidArgument}),Age:792,Gender:"Unknown",Vaccinated:Blank(),HasDog:false})
-
-
-// SORT ON TABLE WITH ERROR VALUES FOR SOME COLUMNS, BUT THE ERROR IS HANDLED - ASCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Left("Hello", -1), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Left("Hello", -1), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() }),If(IsBlankOrError(Last),"",Last))
-Table({First:"Helio",Last:Error({Kind:ErrorKind.InvalidArgument}),Age:263,Gender:"Unknown",Vaccinated:Blank(),HasDog:false},{First:"Titan",Last:Error({Kind:ErrorKind.InvalidArgument}),Age:792,Gender:"Unknown",Vaccinated:Blank(),HasDog:false},{First:"John",Last:"Batali",Age:17,Gender:"Male",Vaccinated:false,HasDog:false},{First:"Mary",Last:"Harris",Age:48,Gender:"Female",Vaccinated:false,HasDog:false},{First:"Emily",Last:"Jones",Age:29,Gender:"Female",Vaccinated:true,HasDog:false},{First:"Bob",Last:"Smith",Age:2,Gender:"Male",Vaccinated:true,HasDog:true},{First:"Alice",Last:"Smith",Age:5,Gender:"Female",Vaccinated:true,HasDog:true})
-
-// SORT HIERARCHICAL DATA ON BOOL EXPRESSION - ASCENDING ORDER
-
->> Sort(Table(
- { First: "Bob", Age: 2, Properties: { Vaccinated: true, HasDog: true }},
- { First: "Alice", Age: 5, Properties: { Vaccinated: true, HasDog: true }},
- { First: "John", Age: 17, Properties: { Vaccinated: false, HasDog: false }},
- { First: "Emily", Age: 29, Properties: { Vaccinated: true, HasDog: Blank() }},
- { First: "Helio", Age: 63, Properties: { Vaccinated: Blank(), HasDog: Blank() }},
- { First: "Mary", Age: 48, Properties: Blank()},
- { First: "Titan", Age: 79, Properties: Blank() }),Coalesce(Properties.HasDog, false))
-Table({Age:17,First:"John",Properties:{HasDog:false,Vaccinated:false}},{Age:2,First:"Bob",Properties:{HasDog:true,Vaccinated:true}},{Age:5,First:"Alice",Properties:{HasDog:true,Vaccinated:true}},{Age:29,First:"Emily",Properties:{HasDog:Blank(),Vaccinated:true}},{Age:63,First:"Helio",Properties:{HasDog:Blank(),Vaccinated:Blank()}},{Age:48,First:"Mary",Properties:Blank()},{Age:79,First:"Titan",Properties:Blank()})
+// ******** NUMBER PARAMETERS ********
+
+>> Sort([-2, -1, 5, 1, 2], Value)
+[-2,-1,1,2,5]
+
+>> Sort([-2, -1, 5, 1, 2], Value, SortOrder.Descending)
+[5,2,1,-1,-2]
+
+>> Sort([-2, -1, -1E+308, 1, 2], Value)
+[-1e+308,-2,-1,1,2]
+
+>> Sort([-2, -1, 1E+308, 1, 2], Value)
+[-2,-1,1,2,1e+308]
+
+>> Sort([{a:8, b:-1}, {a:2}, {b:5}], Value.a)
+[{a:2},{a:8,b:-1},{b:5}]
+
+>> Sort([{a:8, b:-1}, {a:2}, {b:5}], Value.b, SortOrder.Descending)
+[{b:5},{a:8,b:-1},{a:2}]
+
+// ******** STRING PARAMETERS ********
+
+>> Sort(["a", "b", "D", "x", "J", "C"], Value)
+["a","b","C","D","J","x"]
+
+>> Sort(["a", "b", "D", "x", "J", "C"], Value, SortOrder.Descending)
+["x","J","D","C","b","a"]
+
+>> Sort(["a", "b", "B", "x", "D", "C"], Value)
+["a","b","B","C","D","x"]
+
+>> Sort(["Hello", "hellO", "hello", "heLLo", "HELLO", "hElLo"], Value)
+["hello","hellO","heLLo","hElLo","Hello","HELLO"]
+
+>> Sort(["Hello", "hellO", "1", "%", "2", "hElLo"], Value)
+["%","1","2","hellO","hElLo","Hello"]
+
+>> Sort(["a", "b", Blank(), "x", "J", "C"], Value)
+["a","b","C","J","x",Blank()]
+
+>> Sort(["a", "b", Blank(), "x", "J", "C"], Value, SortOrder.Descending)
+["x","J","C","b","a",Blank()]
+
+// ******** BOOLEAN PARAMETERS ********
+
+>> Sort([true,false,true,false,true], Value)
+[false,false,true,true,true]
+
+>> Sort([true,false,true,false,true], Value, SortOrder.Descending)
+[true,true,true,false,false]
+
+>> Sort([true,false,Blank(),false,true], Value)
+[false,false,true,true,Blank()]
+
+>> Sort([true,false,Blank(),false,true], Value, SortOrder.Descending)
+[true,true,false,false,Blank()]
+
+// ******** DATE PARAMETERS ********
+
+>> Sort([Date(2020, 01, 05), Date(2020, 01, 01), Date(1995, 01, 01)], Value)
+[Date(1995,1,1),Date(2020,1,1),Date(2020,1,5)]
+
+>> Sort([Date(2020, 01, 05), Date(2012,12,14), Date(2022,1,1)], Value)
+[Date(2012,12,14),Date(2020,1,5),Date(2022,1,1)]
+
+>> Sort([Date(2020, 01, 05), Date(2020, 01, 01), Date(1995, 01, 01)], Value, SortOrder.Descending)
+[Date(2020,1,5),Date(2020,1,1),Date(1995,1,1)]
+
+>> Sort([Date(2020, 01, 05), Date(2012,12,14), Blank(), Date(2022,1,1)], Value, SortOrder.Descending)
+[Date(2022,1,1),Date(2020,1,5),Date(2012,12,14),Blank()]
+
+// ******** TIME PARAMETERS ********
+
+>> Sort([Time(12,35,55), Time(23, 01, 01), Time(5,30,50)], Value)
+["05:30:50.000","12:35:55.000","23:01:01.000"]
+
+>> Sort([Time(12,35,55), Time(23, 01, 01), Time(5,30,50)], Value, SortOrder.Descending)
+["23:01:01.000","12:35:55.000","05:30:50.000"]
+
+>> Sort([Time(17,29,0), Blank(), Time(5,30,50)], Value)
+["05:30:50.000","17:29:00.000",Blank()]
+
+// ******** DATETIME PARAMETERS ********
+
+>> Sort([DateTime(2019,5,16,8,0,0), DateTime(2019,5,16,20,0,0), DateTime(2019,5,16,20,0,1)], Value)
+[DateTime(2019,5,16,8,0,0,0),DateTime(2019,5,16,20,0,0,0),DateTime(2019,5,16,20,0,1,0)]
+
+>> Sort([DateTime(2019,5,16,8,0,0), DateTime(2019,5,16,20,0,0), DateTime(2019,5,16,20,0,1)], Value, SortOrder.Descending)
+[DateTime(2019,5,16,20,0,1,0),DateTime(2019,5,16,20,0,0,0),DateTime(2019,5,16,8,0,0,0)]
+
+// ******** NULL and ERROR PARAMETERS ********
+
+>> Sort([Blank()],true)
+[Blank()]
+
+//Blank passed as the table record
+>> Sort([Blank()], Value)
+[Blank()]
+
+>> Sort([Blank(),Blank()], Value, SortOrder.Descending)
+[Blank(),Blank()]
+
+>> Sort([-2, Blank(), 5, 1, 2], Value)
+[-2,1,2,5,Blank()]
+
+>> Sort([-2, Blank(), 5, 1, 2], Value, SortOrder.Descending)
+[5,2,1,-2,Blank()]
+
+>> Sort([-2, -Blank(), 5, 1, 2], Value)
+[-2,0,1,2,5]
+
+//Blank sort formula parameter
+>> Sort([Blank()], Blank())
+[Blank()]
+
+>> Sort([-2, -1, 5, 1, 2], Blank())
+[-2,-1,5,1,2]
+
+>> Sort([-2, -1, 5, 1, 2])
+[-2,-1,5,1,2]
+
+// ******** MULTI COLUMN SORT CASES ********
+
+// SORT ON NUMERIC COLUMN "AGE" - ASCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Age)
+Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()})
+
+
+// SORT ON NUMERIC COLUMN "AGE" - DESCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Age, SortOrder.Descending)
+Table({Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()})
+
+// SORT ON BOOLEAN COLUMN "Vaccinated" - ASCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), Vaccinated)
+Table({Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()})
+
+
+// SORT ON BOOLEAN COLUMN "Vaccinated" - DESCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), Vaccinated, SortOrder.Descending)
+Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()})
+
+// SORT ON STRING COLUMN "First" - ASCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),First)
+Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()})
+
+
+// SORT ON STRING COLUMN "First" - DESCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), First, SortOrder.Descending)
+Table({Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()})
+
+// EMBEDDED SORT - FIRST ON STRING COLUMN "First" AND THEN ON "Last" - ASCENDING ORDER
+
+>> Sort(Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Last),First)
+Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()})
+
+
+// EMBEDDED SORT - FIRST ON STRING COLUMN "First" AND THEN ON "Last" - DESCENDING ORDER
+
+>> Sort(Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Last,SortOrder.Descending),First,SortOrder.Descending)
+Table({Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()})
+
+
+// Blank() PASSED AS SORT FORMULA - ASCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), Blank())
+Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true})
+
+
+// Blank() PASSED AS SORT FORMULA - DESCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: Blank(), Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Liam", Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Fiona", Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 63, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 79, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: "Ivor", Last: Blank(), Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }), Blank(),SortOrder.Descending)
+Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:Blank(),Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:"Liam",Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:"Fiona",Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:63,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:79,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:Blank(),First:"Ivor",Gender:"Female",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true})
+
+
+// SORT A TABLE WITH ERROR ROWS - ASCENDING ORDER
+
+//Sort by First Name
+>> Sort(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ If(Left("Hello", -1) = "", { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true }),
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false }
+ ),If(IsBlankOrError(ThisRecord), Blank(), First))
+Table({First:"Alice",Last:"Smith",Age:5,Gender:"Female",Vaccinated:true,HasDog:true},{First:"Bob",Last:"Smith",Age:2,Gender:"Male",Vaccinated:true,HasDog:true},{First:"Dora",Last:"TheExplorer",Age:4,Gender:"Female",Vaccinated:false,HasDog:true},{First:"John",Last:"Batali",Age:17,Gender:"Male",Vaccinated:false,HasDog:false},Error({Kind:ErrorKind.InvalidArgument}))
+
+
+// SORT A TABLE WITH BLANK ROWS - ASCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ Blank(),
+ Blank(),
+ Blank(),
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ Blank(),
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ Blank(),
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),If(IsBlank(Value),Blank(),Value.First))
+Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},Blank(),Blank(),Blank(),Blank(),Blank())
+
+// SORT ON TABLE WITH WITH ERROR VALUES FOR SOME COLUMNS, BUT DOESN'T TOUCH ERROR - ASCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Left("Hello", -1), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Left("Hello", -1), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() }),First)
+Table({First:"Alice",Last:"Smith",Age:5,Gender:"Female",Vaccinated:true,HasDog:true},{First:"Bob",Last:"Smith",Age:2,Gender:"Male",Vaccinated:true,HasDog:true},{First:"Emily",Last:"Jones",Age:29,Gender:"Female",Vaccinated:true,HasDog:false},{First:"Helio",Last:Error({Kind:ErrorKind.InvalidArgument}),Age:263,Gender:"Unknown",Vaccinated:Blank(),HasDog:false},{First:"John",Last:"Batali",Age:17,Gender:"Male",Vaccinated:false,HasDog:false},{First:"Mary",Last:"Harris",Age:48,Gender:"Female",Vaccinated:false,HasDog:false},{First:"Titan",Last:Error({Kind:ErrorKind.InvalidArgument}),Age:792,Gender:"Unknown",Vaccinated:Blank(),HasDog:false})
+
+
+// SORT ON TABLE WITH ERROR VALUES FOR SOME COLUMNS, BUT THE ERROR IS HANDLED - ASCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Left("Hello", -1), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Left("Hello", -1), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() }),If(IsBlankOrError(Last),"",Last))
+Table({First:"Helio",Last:Error({Kind:ErrorKind.InvalidArgument}),Age:263,Gender:"Unknown",Vaccinated:Blank(),HasDog:false},{First:"Titan",Last:Error({Kind:ErrorKind.InvalidArgument}),Age:792,Gender:"Unknown",Vaccinated:Blank(),HasDog:false},{First:"John",Last:"Batali",Age:17,Gender:"Male",Vaccinated:false,HasDog:false},{First:"Mary",Last:"Harris",Age:48,Gender:"Female",Vaccinated:false,HasDog:false},{First:"Emily",Last:"Jones",Age:29,Gender:"Female",Vaccinated:true,HasDog:false},{First:"Bob",Last:"Smith",Age:2,Gender:"Male",Vaccinated:true,HasDog:true},{First:"Alice",Last:"Smith",Age:5,Gender:"Female",Vaccinated:true,HasDog:true})
+
+// SORT HIERARCHICAL DATA ON BOOL EXPRESSION - ASCENDING ORDER
+
+>> Sort(Table(
+ { First: "Bob", Age: 2, Properties: { Vaccinated: true, HasDog: true }},
+ { First: "Alice", Age: 5, Properties: { Vaccinated: true, HasDog: true }},
+ { First: "John", Age: 17, Properties: { Vaccinated: false, HasDog: false }},
+ { First: "Emily", Age: 29, Properties: { Vaccinated: true, HasDog: Blank() }},
+ { First: "Helio", Age: 63, Properties: { Vaccinated: Blank(), HasDog: Blank() }},
+ { First: "Mary", Age: 48, Properties: Blank()},
+ { First: "Titan", Age: 79, Properties: Blank() }),Coalesce(Properties.HasDog, false))
+Table({Age:17,First:"John",Properties:{HasDog:false,Vaccinated:false}},{Age:2,First:"Bob",Properties:{HasDog:true,Vaccinated:true}},{Age:5,First:"Alice",Properties:{HasDog:true,Vaccinated:true}},{Age:29,First:"Emily",Properties:{HasDog:Blank(),Vaccinated:true}},{Age:63,First:"Helio",Properties:{HasDog:Blank(),Vaccinated:Blank()}},{Age:48,First:"Mary",Properties:Blank()},{Age:79,First:"Titan",Properties:Blank()})
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Switch.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Switch.txt
similarity index 96%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Switch.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Switch.txt
index 53955ae2f..2966504cd 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Switch.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Switch.txt
@@ -1,192 +1,192 @@
-// =========================Null, Empty String and Error cases =========================
-
-// Switch case with Error as the condition and as exact match
->> Switch(1/0,1,0,1/0,3,2,5,2,7,11)
-Error({Kind:ErrorKind.Div0})
-
-// =========================Null, Empty String and Error cases =========================
-
->> Switch(1/0,"zero","one","two")",
-Error({Kind:ErrorKind.Div0})
-
->> Switch("zero",1/0,"one","two")",
-Error({Kind:ErrorKind.Div0})
-
->> Switch("zero","one",1/0,"two")",
-"two"
-
->> Switch("zero","one","two",1/0)",
-Error({Kind:ErrorKind.Div0})
-
-// ====================== FIRST RESULT NUMBER, SECOND RESULT OTHER DATAYPE ======================
-
-//Number-Date
->> Switch("Case1","Case2",1,"Case1",Date(2000,1,4))
-946972800000
-
->> Switch("Case1","Case2",1,"Case1",DateValue("1/10/2000"))
-947491200000
-
-//Number-Time
->> Switch("Case1","Case2",1,"Case1",Time(6,30,40))
-52240000
-
->> Switch("Case1","Case2",1,"Case1",TimeValue("6:00:00"))
-50400000
-
-//Number-DateTime
->> Switch("Case1","Case2",1,"Case1",DateTimeValue("4/1/2001 10:00:00"))
-986144400000
-
-// ====================== FIRST RESULT STRING, SECOND RESULT OTHER DATAYPE ======================
-
->> Switch("Case1","Case2","1","Case1",DateValue("1/10/2000"))
-Date(2000,1,10)
-
-//String-Time
->> Switch("Case1","Case2","1","Case1",Time(6,30,40))
-52240000
-
->> Switch("Case1","Case2","1","Case1",TimeValue("6:00:00"))
-50400000
-
-//String-DateTime
->> Switch("Case1","Case2","1","Case1",DateTimeValue("4/1/2001 10:00:00"))
-986144400000
-
-// ====================== FIRST RESULT BOOLEAN, SECOND RESULT OTHER DATAYPE ======================
-
->> Switch("Case1","Case2",true,"Case1","1")
-false
-
->> Switch("Case1","Case2",true,"Case1","AB$%^")
-false
-
-//Boolean-Date
->> Switch("Case1","Case2",true,"Case1",Date(2000,1,4))
-false
-
->> Switch("Case1","Case2",false,"Case1",DateValue("1/10/2000"))
-false
-
-//Boolean-Time
->> Switch("Case1","Case2",true,"Case1",Time(6,30,40))
-false
-
->> Switch("Case1","Case2",false,"Case1",TimeValue("6:00:00"))
-false
-
-//Boolean-DateTime
->> Switch("Case1","Case2",true,"Case1",DateTimeValue("4/1/2001 10:00:00"))
-false
-
-// ====================== FIRST RESULT DATE, SECOND RESULT OTHER DATAYPE ======================
-
-//Date-Number
->> Switch("Case1","Case2",Date(2000,1,4),"Case1",0)
-Date(1969,12,31)
-
->> Switch("Case1","Case2",Date(2000,1,4),"Case1",-23.5)
-Date(1969,12,31)
-
->> Switch("Case1","Case2",Date(2000,1,4),"Case1",100)
-Date(1969,12,31)
-
-//Date-String
->> Switch("Case1","Case2",Date(2000,1,4),"Case1","1")
-Date(2001,1,1)
-
->> Switch("Case1","Case2",Date(2000,1,4),"Case1","200")
-Date(200,1,1)
-
->> Switch("Case1","Case2",Date(2000,1,4),"Case1","-12.5")
-Date(2001,12,5)
-
-//Date-Boolean
->> Switch("Case1","Case2",Date(2000,1,4),"Case1",false)
-Error({Kind:ErrorKind.InvalidArgument})
-
->> Switch("Case1","Case2",Date(2000,1,4),"Case1",true)
-Error({Kind:ErrorKind.InvalidArgument})
-
->> Switch("Case1","Case2",Date(2000,1,4),"Case1",DateValue("1/10/2000"))
-Date(2000,1,10)
-
-//Date-Time
->> Switch("Case1","Case2",Date(2000,1,4),"Case1",Time(6,30,40))
-1/1/1970 6:30 AM
-
->> Switch("Case1","Case2",Date(2000,1,4),"Case1",TimeValue("6:00:00"))
-1/1/1970 6:00 AM
-
-// ====================== FIRST RESULT TIME, SECOND RESULT OTHER DATAYPE ======================
-
-//Time-Number
->> Switch("Case1","Case2",Time(6,30,30),"Case1",0)
-4:00 PM
-
->> Switch("Case1","Case2",Time(6,30,30),"Case1",-23.5)
-3:59 PM
-
->> Switch("Case1","Case2",Time(6,30,30),"Case1",100)
-4:00 PM
-
->> Switch("Case1","Case2",Time(6,30,30),"Case1","-12.5")
-12:00 AM
-
-//Time-Boolean
->> Switch("Case1","Case2",Time(6,30,30),"Case1",false)
-Error({Kind:ErrorKind.Div0})
-
->> Switch("Case1","Case2",Time(6,30,30),"Case1",true)
-Error({Kind:ErrorKind.Div0})
-
-//Time-Date
->> Switch("Case1","Case2",Time(6,30,30),"Case1",Date(2000,1,5))
-1/5/2000 12:00 AM
-
->> Switch("Case1","Case2",Time(6,30,30),"Case1",DateValue("1/10/2000"))
-1/10/2000 12:00 AM
-
-// ====================== FIRST RESULT DATETIME, SECOND RESULT OTHER DATAYPE ======================
-
-//DateTime-Number
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",0)
-12/31/1969 4:00 PM
-
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",-23.5)
-12/31/1969 3:59 PM
-
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",100)
-12/31/1969 4:00 PM
-
-//DateTime-String
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1","1")
-1/1/2001 12:00 AM
-
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1","200")
-1/1/200 12:00 AM
-
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1","-12.5")
-12/5/2001 12:00 AM
-
-//DateTime-Boolean
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",false)
-Error({Kind:ErrorKind.Div0})
-
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",true)
-Error({Kind:ErrorKind.Div0})
-
-//DateTime-Date
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",Date(2000,1,5))
-1/5/2000 12:00 AM
-
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",DateValue("1/10/2000"))
-1/10/2000 12:00 AM
-
-//DateTime-Time
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",Time(6,30,40))
-1/1/1970 6:30 AM
-
->> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",TimeValue("6:00:00"))
-1/1/1970 6:00 AM
+// =========================Null, Empty String and Error cases =========================
+
+// Switch case with Error as the condition and as exact match
+>> Switch(1/0,1,0,1/0,3,2,5,2,7,11)
+Error({Kind:ErrorKind.Div0})
+
+// =========================Null, Empty String and Error cases =========================
+
+>> Switch(1/0,"zero","one","two")",
+Error({Kind:ErrorKind.Div0})
+
+>> Switch("zero",1/0,"one","two")",
+Error({Kind:ErrorKind.Div0})
+
+>> Switch("zero","one",1/0,"two")",
+"two"
+
+>> Switch("zero","one","two",1/0)",
+Error({Kind:ErrorKind.Div0})
+
+// ====================== FIRST RESULT NUMBER, SECOND RESULT OTHER DATAYPE ======================
+
+//Number-Date
+>> Switch("Case1","Case2",1,"Case1",Date(2000,1,4))
+946972800000
+
+>> Switch("Case1","Case2",1,"Case1",DateValue("1/10/2000"))
+947491200000
+
+//Number-Time
+>> Switch("Case1","Case2",1,"Case1",Time(6,30,40))
+52240000
+
+>> Switch("Case1","Case2",1,"Case1",TimeValue("6:00:00"))
+50400000
+
+//Number-DateTime
+>> Switch("Case1","Case2",1,"Case1",DateTimeValue("4/1/2001 10:00:00"))
+986144400000
+
+// ====================== FIRST RESULT STRING, SECOND RESULT OTHER DATAYPE ======================
+
+>> Switch("Case1","Case2","1","Case1",DateValue("1/10/2000"))
+Date(2000,1,10)
+
+//String-Time
+>> Switch("Case1","Case2","1","Case1",Time(6,30,40))
+52240000
+
+>> Switch("Case1","Case2","1","Case1",TimeValue("6:00:00"))
+50400000
+
+//String-DateTime
+>> Switch("Case1","Case2","1","Case1",DateTimeValue("4/1/2001 10:00:00"))
+986144400000
+
+// ====================== FIRST RESULT BOOLEAN, SECOND RESULT OTHER DATAYPE ======================
+
+>> Switch("Case1","Case2",true,"Case1","1")
+false
+
+>> Switch("Case1","Case2",true,"Case1","AB$%^")
+false
+
+//Boolean-Date
+>> Switch("Case1","Case2",true,"Case1",Date(2000,1,4))
+false
+
+>> Switch("Case1","Case2",false,"Case1",DateValue("1/10/2000"))
+false
+
+//Boolean-Time
+>> Switch("Case1","Case2",true,"Case1",Time(6,30,40))
+false
+
+>> Switch("Case1","Case2",false,"Case1",TimeValue("6:00:00"))
+false
+
+//Boolean-DateTime
+>> Switch("Case1","Case2",true,"Case1",DateTimeValue("4/1/2001 10:00:00"))
+false
+
+// ====================== FIRST RESULT DATE, SECOND RESULT OTHER DATAYPE ======================
+
+//Date-Number
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1",0)
+Date(1969,12,31)
+
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1",-23.5)
+Date(1969,12,31)
+
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1",100)
+Date(1969,12,31)
+
+//Date-String
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1","1")
+Date(2001,1,1)
+
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1","200")
+Date(200,1,1)
+
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1","-12.5")
+Date(2001,12,5)
+
+//Date-Boolean
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1",false)
+Error({Kind:ErrorKind.InvalidArgument})
+
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1",true)
+Error({Kind:ErrorKind.InvalidArgument})
+
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1",DateValue("1/10/2000"))
+Date(2000,1,10)
+
+//Date-Time
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1",Time(6,30,40))
+1/1/1970 6:30 AM
+
+>> Switch("Case1","Case2",Date(2000,1,4),"Case1",TimeValue("6:00:00"))
+1/1/1970 6:00 AM
+
+// ====================== FIRST RESULT TIME, SECOND RESULT OTHER DATAYPE ======================
+
+//Time-Number
+>> Switch("Case1","Case2",Time(6,30,30),"Case1",0)
+4:00 PM
+
+>> Switch("Case1","Case2",Time(6,30,30),"Case1",-23.5)
+3:59 PM
+
+>> Switch("Case1","Case2",Time(6,30,30),"Case1",100)
+4:00 PM
+
+>> Switch("Case1","Case2",Time(6,30,30),"Case1","-12.5")
+12:00 AM
+
+//Time-Boolean
+>> Switch("Case1","Case2",Time(6,30,30),"Case1",false)
+Error({Kind:ErrorKind.Div0})
+
+>> Switch("Case1","Case2",Time(6,30,30),"Case1",true)
+Error({Kind:ErrorKind.Div0})
+
+//Time-Date
+>> Switch("Case1","Case2",Time(6,30,30),"Case1",Date(2000,1,5))
+1/5/2000 12:00 AM
+
+>> Switch("Case1","Case2",Time(6,30,30),"Case1",DateValue("1/10/2000"))
+1/10/2000 12:00 AM
+
+// ====================== FIRST RESULT DATETIME, SECOND RESULT OTHER DATAYPE ======================
+
+//DateTime-Number
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",0)
+12/31/1969 4:00 PM
+
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",-23.5)
+12/31/1969 3:59 PM
+
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",100)
+12/31/1969 4:00 PM
+
+//DateTime-String
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1","1")
+1/1/2001 12:00 AM
+
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1","200")
+1/1/200 12:00 AM
+
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1","-12.5")
+12/5/2001 12:00 AM
+
+//DateTime-Boolean
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",false)
+Error({Kind:ErrorKind.Div0})
+
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",true)
+Error({Kind:ErrorKind.Div0})
+
+//DateTime-Date
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",Date(2000,1,5))
+1/5/2000 12:00 AM
+
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",DateValue("1/10/2000"))
+1/10/2000 12:00 AM
+
+//DateTime-Time
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",Time(6,30,40))
+1/1/1970 6:30 AM
+
+>> Switch("Case1","Case2",DateTimeValue("4/1/2001 10:00:00"),"Case1",TimeValue("6:00:00"))
+1/1/1970 6:00 AM
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Value.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Value.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/Value.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/Value.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/WeekNum.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/WeekNum.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/NotYetReady/WeekNum.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/NotYetReady/WeekNum.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Div_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Div_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Div_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Div_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Div_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Div_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Div_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Div_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Div_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Div_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Div_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Div_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Decimal_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Decimal_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Decimal_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Decimal_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Decimal_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Decimal_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Decimal_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Decimal_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_DifferentTypes_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_DifferentTypes_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_DifferentTypes_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_DifferentTypes_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_DifferentTypes_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_DifferentTypes_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_DifferentTypes_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_DifferentTypes_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float_V1Compat_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float_V1Compat_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Eq_Float_V1Compat_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Eq_Float_V1Compat_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Exp_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Exp_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Exp_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Exp_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Exp_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Exp_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Exp_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Exp_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Exp_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Exp_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Exp_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Exp_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Float_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Float_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Float_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Float_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Float_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Float_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Geq_Float_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Geq_Float_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Float_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Float_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Float_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Float_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Float_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Float_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Gt_Float_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Gt_Float_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Float_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Float_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Float_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Float_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Float_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Float_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Leq_Float_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Leq_Float_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Float_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Float_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Float_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Float_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Float_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Float_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Lt_Float_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Lt_Float_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Minus_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Minus_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Minus_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Minus_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Minus_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Minus_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Minus_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Minus_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Minus_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Minus_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Minus_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Minus_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mod_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mod_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mod_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mod_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mod_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mod_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mod_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mod_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mod_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mod_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mod_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mod_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mul_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mul_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mul_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mul_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mul_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mul_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mul_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mul_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mul_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mul_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Mul_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Mul_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Decimal_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Decimal_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Decimal_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Decimal_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Decimal_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Decimal_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Decimal_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Decimal_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float_V1Compat_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float_V1Compat_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Neq_Float_V1Compat_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Neq_Float_V1Compat_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Plus_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Plus_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Plus_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Plus_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Plus_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Plus_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Plus_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Plus_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Plus_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Plus_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Plus_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Plus_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Unary_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Unary_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Unary_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Unary_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Unary_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Unary_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Unary_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Unary_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Unary_Float_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Unary_Float_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OpMatrix_Unary_Float_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OpMatrix_Unary_Float_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OptionSet.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OptionSet.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/OptionSet.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/OptionSet.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ParseJson.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ParseJson.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ParseJson.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ParseJson.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ParseJson_Arithmetic.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ParseJson_Arithmetic.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ParseJson_Arithmetic.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ParseJson_Arithmetic.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ParseJson_Coercions.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ParseJson_Coercions.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ParseJson_Coercions.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ParseJson_Coercions.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Patch_PatchRecord.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Patch_PatchRecord.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Patch_PatchRecord.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Patch_PatchRecord.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Patch_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Patch_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Patch_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Patch_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/PlainText.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/PlainText.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/PlainText.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/PlainText.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Power.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Power.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Power.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Power.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Proper.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Proper.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Proper.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Proper.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/README.md b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/README.md
similarity index 97%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/README.md
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/README.md
index ac5f66d0d..7b8a88901 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/README.md
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/README.md
@@ -1,98 +1,98 @@
-# Expression Tests
-
-This directory contains Power Fx expression tests in a simple .txt file format.
-
-Tests are in the form:
-```
->> test expression
-test result or #SKIP directive
-blank line
-```
-
-Test expression can be multiple lines using significant white space at the beginning of continuation lines (like Python and YAML).
-
-## Configuration testing
-
-These tests are run with different configurations of features and parser options.
-Most tests are not impacted by these differences and should be placed in a top level file
-with no suffix and few #SEUTP directives for features that are not
-directly being tested.
-
-There may be some tests that are sensitive to the configuration. These should be broken
-out into their own file and the suffix reflects roughly the configuration that is needed.
-
-For example:
-- **MinMax.txt**: Tests common Min and Max function scenarios that are not sensitive to the configuration.
- For example, `Max(1,2)` is always `2`.
-- **MinMax_NumberIsFloat.txt**: Tests that are specific to floating point operation and would not work properly with
- Decimal numbers. For example, `Max(1e300,1.1e300)`. This file contains a `#SETUP: NumberIsFloat` directive.
-- **MinMax_V1Compat.txt**: Tests that have the old behavior before PowerFxV1CompatibilityRules was introduced.
- This file contains a `#SETUP: PowerFxV1CompaitilibyRules` to prevent it from being run if that switch is disabled.
-- **MinMax_V1CompatDisabled.txt**: Tests for the new PowerFxV1CompatibilityRules behavior.
- This file contains a `#SETUP: disable:PowerFxV1CompaitilibyRules` to prevent it from being run if that switch is disabled.
-
-## File Directives
-
-File directives appear at the top of the file.
-
-Each direcive may be followed by an end of line comment.
-
-Multiple directives are allowed in a file, except for #OVERRIDE.
-
-### SETUP
-
-```
-#SETUP: handler | [disable:]flag
-```
-
-Specifies the setup handler, engine Features, and ParserOption flags required by this test.
-
-If the test environment cannot satisfy the needs of #SETUP, the test file is skipped.
-
-It is OK to turn on flags that are not directly being tested. For example, `#SETUP: TableSyntaxDoesntWrapRecords` is common
-as many tests are written using [ ] notation for defining tables.
-
-### OVERRIDE
-
-```
-#OVERRIDE: filename
-```
-
-Test results or #SKIP in this file override the same test in the named file.
-
-### DISABLE
-
-```
-#DISABLE: filename
-```
-
-Disables a test file. All #DISABLE directives are handled before any tests are run.
-
-## Test Directives
-
-### SKIP
-
-```
-#SKIP: comment
-```
-
-Use this directive in place of a result to skip a test.
-Comment should include why the test was skipped, ideally with a link an issue filed for repair and the expected result after the repair.
-
-For example
-```
->> Abs(Table({a:1/0},{a:Power(-3,2)}))
-#SKIP: waiting on https://github.com/microsoft/Power-Fx/issues/1204 expected: Table({Value:Error({Kind:ErrorKind.Div0})},{Value:9})
-```
-
-## Numbers
-
-Since Power Fx works with both Decimal and Float numbers, when not directly testing the limits of these,
-it is best to pick numbers in the range -1e28 to 1e28 and to not have infinitely repeating results.
-For example, instead of testing with 1/3 which has a different precision in decimal and floating point, stick to
-1/4, 1/8, or 1/2 that have an exact representation within 12 decimal places.
-
-Do not use the Float or Decimal functions at this time. Not all hosts have these functions yet.
-If writing a test specifically for NumberIsFloat, use the Value function instead.
-All the tests are run with both Decimal and Float configurations, so there is no need to have tests
-that vary on just this one difference.
+# Expression Tests
+
+This directory contains Power Fx expression tests in a simple .txt file format.
+
+Tests are in the form:
+```
+>> test expression
+test result or #SKIP directive
+blank line
+```
+
+Test expression can be multiple lines using significant white space at the beginning of continuation lines (like Python and YAML).
+
+## Configuration testing
+
+These tests are run with different configurations of features and parser options.
+Most tests are not impacted by these differences and should be placed in a top level file
+with no suffix and few #SEUTP directives for features that are not
+directly being tested.
+
+There may be some tests that are sensitive to the configuration. These should be broken
+out into their own file and the suffix reflects roughly the configuration that is needed.
+
+For example:
+- **MinMax.txt**: Tests common Min and Max function scenarios that are not sensitive to the configuration.
+ For example, `Max(1,2)` is always `2`.
+- **MinMax_NumberIsFloat.txt**: Tests that are specific to floating point operation and would not work properly with
+ Decimal numbers. For example, `Max(1e300,1.1e300)`. This file contains a `#SETUP: NumberIsFloat` directive.
+- **MinMax_V1Compat.txt**: Tests that have the old behavior before PowerFxV1CompatibilityRules was introduced.
+ This file contains a `#SETUP: PowerFxV1CompaitilibyRules` to prevent it from being run if that switch is disabled.
+- **MinMax_V1CompatDisabled.txt**: Tests for the new PowerFxV1CompatibilityRules behavior.
+ This file contains a `#SETUP: disable:PowerFxV1CompaitilibyRules` to prevent it from being run if that switch is disabled.
+
+## File Directives
+
+File directives appear at the top of the file.
+
+Each direcive may be followed by an end of line comment.
+
+Multiple directives are allowed in a file, except for #OVERRIDE.
+
+### SETUP
+
+```
+#SETUP: handler | [disable:]flag
+```
+
+Specifies the setup handler, engine Features, and ParserOption flags required by this test.
+
+If the test environment cannot satisfy the needs of #SETUP, the test file is skipped.
+
+It is OK to turn on flags that are not directly being tested. For example, `#SETUP: TableSyntaxDoesntWrapRecords` is common
+as many tests are written using [ ] notation for defining tables.
+
+### OVERRIDE
+
+```
+#OVERRIDE: filename
+```
+
+Test results or #SKIP in this file override the same test in the named file.
+
+### DISABLE
+
+```
+#DISABLE: filename
+```
+
+Disables a test file. All #DISABLE directives are handled before any tests are run.
+
+## Test Directives
+
+### SKIP
+
+```
+#SKIP: comment
+```
+
+Use this directive in place of a result to skip a test.
+Comment should include why the test was skipped, ideally with a link an issue filed for repair and the expected result after the repair.
+
+For example
+```
+>> Abs(Table({a:1/0},{a:Power(-3,2)}))
+#SKIP: waiting on https://github.com/microsoft/Power-Fx/issues/1204 expected: Table({Value:Error({Kind:ErrorKind.Div0})},{Value:9})
+```
+
+## Numbers
+
+Since Power Fx works with both Decimal and Float numbers, when not directly testing the limits of these,
+it is best to pick numbers in the range -1e28 to 1e28 and to not have infinitely repeating results.
+For example, instead of testing with 1/3 which has a different precision in decimal and floating point, stick to
+1/4, 1/8, or 1/2 that have an exact representation within 12 decimal places.
+
+Do not use the Float or Decimal functions at this time. Not all hosts have these functions yet.
+If writing a test specifically for NumberIsFloat, use the Value function instead.
+All the tests are run with both Decimal and Float configurations, so there is no need to have tests
+that vary on just this one difference.
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RGBA.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RGBA.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RGBA.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RGBA.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Rand.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Rand.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Rand.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Rand.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Rand_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Rand_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Rand_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Rand_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Rand_DecimalSupport.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Rand_DecimalSupport.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Rand_DecimalSupport.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Rand_DecimalSupport.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Rand_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Rand_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Rand_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Rand_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Record.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Record.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Record.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Record.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Record_TableSyntaxDoesntWrapRecordsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Record_TableSyntaxDoesntWrapRecordsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Record_TableSyntaxDoesntWrapRecordsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Record_TableSyntaxDoesntWrapRecordsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Remove.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Remove.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Remove_V1Compact.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove_V1Compact.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Remove_V1Compact.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Remove_V1Compact.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RenameColumns_SupportColumnNamesAsIdentifiers.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RenameColumns_SupportColumnNamesAsIdentifiers.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RenameColumns_SupportColumnNamesAsIdentifiers.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RenameColumns_SupportColumnNamesAsIdentifiers.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RenameColumns_SupportColumnNamesAsIdentifiersDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RenameColumns_SupportColumnNamesAsIdentifiersDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RenameColumns_SupportColumnNamesAsIdentifiersDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RenameColumns_SupportColumnNamesAsIdentifiersDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Replace.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Replace.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Replace.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Replace.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ReservedKeyword.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ReservedKeyword.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ReservedKeyword.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ReservedKeyword.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ReservedKeyword_Disabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ReservedKeyword_Disabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ReservedKeyword_Disabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ReservedKeyword_Disabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ReservedKeyword_Enabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ReservedKeyword_Enabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ReservedKeyword_Enabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ReservedKeyword_Enabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Right.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Right.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Right.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Right.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Round.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Round.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Round.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Round.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundDown.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundDown.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundDown.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundDown.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundDownT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundDownT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundDownT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundDownT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundDownT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundDownT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundDownT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundDownT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundUp.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundUp.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundUp.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundUp.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundUpT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundUpT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundUpT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundUpT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundUpT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundUpT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundUpT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundUpT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundingOps.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundingOps.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/RoundingOps.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/RoundingOps.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SQLCompiler.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SQLCompiler.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SQLCompiler.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SQLCompiler.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Search.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Search.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Search.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Search.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Search_SupportColumnNamesAsIdentifiersDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Search_SupportColumnNamesAsIdentifiersDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Search_SupportColumnNamesAsIdentifiersDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Search_SupportColumnNamesAsIdentifiersDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sequence.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sequence.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sequence.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sequence.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sequence_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sequence_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sequence_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sequence_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sequence_Decimal_DVDecimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sequence_Decimal_DVDecimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sequence_Decimal_DVDecimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sequence_Decimal_DVDecimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sequence_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sequence_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sequence_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sequence_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ShowColumns.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ShowColumns.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ShowColumns.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ShowColumns.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ShowColumns_SupportColumnNamesAsIdentifiersDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ShowColumns_SupportColumnNamesAsIdentifiersDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ShowColumns_SupportColumnNamesAsIdentifiersDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ShowColumns_SupportColumnNamesAsIdentifiersDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ShowColumns_WithMutationSetup.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ShowColumns_WithMutationSetup.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/ShowColumns_WithMutationSetup.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/ShowColumns_WithMutationSetup.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Shuffle.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Shuffle.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Shuffle.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Shuffle.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SingleColumnTableCoercion.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SingleColumnTableCoercion.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SingleColumnTableCoercion.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SingleColumnTableCoercion.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SingleColumnTableCoercion_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SingleColumnTableCoercion_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SingleColumnTableCoercion_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SingleColumnTableCoercion_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sort.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sort.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sort.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sort.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumns.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumns.txt
similarity index 99%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumns.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumns.txt
index 1207b8a27..37ad4f40b 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumns.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumns.txt
@@ -1,652 +1,652 @@
->> SortByColumns([1],"Value")
-Table({Value:1})
-
->> SortByColumns([-2, -1, 0, 1, 2], "Value")
-Table({Value:-2},{Value:-1},{Value:0},{Value:1},{Value:2})
-
->> SortByColumns(Table({Value:-2},{Value:-1},{Value:1},{Value:2},{Value:5}),"Value")
-Table({Value:-2},{Value:-1},{Value:1},{Value:2},{Value:5})
-
-
-// ******** NUMBER PARAMETERS ********
-
->> SortByColumns([-2, -1, 5, 1, 2], "Value")
-Table({Value:-2},{Value:-1},{Value:1},{Value:2},{Value:5})
-
->> SortByColumns([-2, -1, 5, 1, 2], "Value", SortOrder.Descending)
-Table({Value:5},{Value:2},{Value:1},{Value:-1},{Value:-2})
-
->> SortByColumns(Table({a:8, b:-1}, {a:2}, {b:5}), "a")
-Table({a:2,b:Blank()},{a:8,b:-1},{a:Blank(),b:5})
-
->> SortByColumns(Table({a:8, b:-1}, {a:2}, {b:5}), "b", SortOrder.Descending)
-Table({a:Blank(),b:5},{a:8,b:-1},{a:2,b:Blank()})
-
-// ******** STRING PARAMETERS ********
-
->> SortByColumns(["a", "b", "D", "x", "J", "C"], "Value")
-Table({Value:"a"},{Value:"b"},{Value:"C"},{Value:"D"},{Value:"J"},{Value:"x"})
-
->> SortByColumns(["a", "b", "D", "x", "J", "C"], "Value", SortOrder.Descending)
-Table({Value:"x"},{Value:"J"},{Value:"D"},{Value:"C"},{Value:"b"},{Value:"a"})
-
->> SortByColumns(["a", "b", "B", "x", "D", "C"], "Value")
-Table({Value:"a"},{Value:"b"},{Value:"B"},{Value:"C"},{Value:"D"},{Value:"x"})
-
->> SortByColumns(["Hello", "hellO", "hello", "heLLo", "HELLO", "hElLo"], "Value")
-Table({Value:"hello"},{Value:"hellO"},{Value:"heLLo"},{Value:"hElLo"},{Value:"Hello"},{Value:"HELLO"})
-
->> SortByColumns(["Hello", "hellO", "1", "%", "2", "hElLo"], "Value")
-Table({Value:"%"},{Value:"1"},{Value:"2"},{Value:"hellO"},{Value:"hElLo"},{Value:"Hello"})
-
->> SortByColumns(["a", "b", Blank(), "x", "J", "C"], "Value")
-Table({Value:"a"},{Value:"b"},{Value:"C"},{Value:"J"},{Value:"x"},{Value:Blank()})
-
->> SortByColumns(["a", "b", Blank(), "x", "J", "C"], "Value", SortOrder.Descending)
-Table({Value:"x"},{Value:"J"},{Value:"C"},{Value:"b"},{Value:"a"},{Value:Blank()})
-
-// ******** BOOLEAN PARAMETERS ********
-
->> SortByColumns([true,false,true,false,true], "Value")
-Table({Value:false},{Value:false},{Value:true},{Value:true},{Value:true})
-
->> SortByColumns([true,false,true,false,true], "Value", SortOrder.Descending)
-Table({Value:true},{Value:true},{Value:true},{Value:false},{Value:false})
-//
->> SortByColumns([true,false,Blank(),false,true], "Value")
-Table({Value:false},{Value:false},{Value:true},{Value:true},{Value:Blank()})
-
->> SortByColumns([true,false,Blank(),false,true], "Value", SortOrder.Descending)
-Table({Value:true},{Value:true},{Value:false},{Value:false},{Value:Blank()})
-
-// ******** DATE PARAMETERS ********
-
->> SortByColumns([Date(2020, 01, 05), Date(2020, 01, 01), Date(1995, 01, 01)], "Value")
-Table({Value:Date(1995,1,1)},{Value:Date(2020,1,1)},{Value:Date(2020,1,5)})
-
->> SortByColumns([Date(2020, 01, 05), Date(2012,12,14), Date(2022,1,1)], "Value")
-Table({Value:Date(2012,12,14)},{Value:Date(2020,1,5)},{Value:Date(2022,1,1)})
-
->> SortByColumns([Date(2020, 01, 05), Date(2020, 01, 01), Date(1995, 01, 01)], "Value", SortOrder.Descending)
-Table({Value:Date(2020,1,5)},{Value:Date(2020,1,1)},{Value:Date(1995,1,1)})
-
->> SortByColumns([Date(2020, 01, 05), Date(2012,12,14), Blank(), Date(2022,1,1)], "Value", SortOrder.Descending)
-Table({Value:Date(2022,1,1)},{Value:Date(2020,1,5)},{Value:Date(2012,12,14)},{Value:Blank()})
-
-// ******** TIME PARAMETERS ********
-
->> SortByColumns([Time(12,35,55), Time(23, 01, 01), Time(5,30,50)], "Value")
-Table({Value:Time(5,30,50,0)},{Value:Time(12,35,55,0)},{Value:Time(23,1,1,0)})
-
->> SortByColumns([Time(12,35,55), Time(23, 01, 01), Time(5,30,50)], "Value", SortOrder.Descending)
-Table({Value:Time(23,1,1,0)},{Value:Time(12,35,55,0)},{Value:Time(5,30,50,0)})
-
->> SortByColumns([Time(17,29,0), Blank(), Time(5,30,50)], "Value")
-Table({Value:Time(5,30,50,0)},{Value:Time(17,29,0,0)},{Value:Blank()})
-
-// ******** DATETIME PARAMETERS ********
-
->> SortByColumns([DateTime(2019,5,16,8,0,0), DateTime(2019,5,16,20,0,0), DateTime(2019,5,16,20,0,1)], "Value")
-Table({Value:DateTime(2019,5,16,8,0,0,0)},{Value:DateTime(2019,5,16,20,0,0,0)},{Value:DateTime(2019,5,16,20,0,1,0)})
-
->> SortByColumns([DateTime(2019,5,16,8,0,0), DateTime(2019,5,16,20,0,0), DateTime(2019,5,16,20,0,1)], "Value", SortOrder.Descending)
-Table({Value:DateTime(2019,5,16,20,0,1,0)},{Value:DateTime(2019,5,16,20,0,0,0)},{Value:DateTime(2019,5,16,8,0,0,0)})
-
-
-// ******** NULL and ERROR PARAMETERS ********
-
->> SortByColumns([-2, -1, 5, 1, 2], "Value", If(1/0<2,SortOrder.Ascending,SortOrder.Descending))
-Error({Kind:ErrorKind.Div0})
-
-//Error passed as one of the table records
->> SortByColumns([-2, -1, 5, 1/0, 2], "Value")
-Error({Kind:ErrorKind.Div0})
-
->> SortByColumns(["a", "b", "D", "x", "J", Error({Kind: 11})], "Value")
-Error({Kind:ErrorKind.Validation})
-
-
->> SortByColumns(Table({Value:Blank()}),"Value")
-Table({Value:Blank()})
-
->> SortByColumns([{Value:Blank()},{Value:Blank()}], "Value", SortOrder.Descending)
-Table({Value:Blank()},{Value:Blank()})
-
->> SortByColumns([-2, Blank(), 5, 1, 2], "Value")
-Table({Value:-2},{Value:1},{Value:2},{Value:5},{Value:Blank()})
-
->> SortByColumns([-2, -Blank(), 5, 1, 2], "Value")
-Table({Value:-2},{Value:0},{Value:1},{Value:2},{Value:5})
-
->> SortByColumns([-2, Blank(), 5, 1, 2, -Blank()], "Value", SortOrder.Descending)
-Table({Value:5},{Value:2},{Value:1},{Value:0},{Value:-2},{Value:Blank()})
-
-// Sort on error source
->> SortByColumns(If(Left("Hello", -1) = "",[1,2,3,4]), "Value", SortOrder.Ascending)
-Error({Kind:ErrorKind.InvalidArgument})
-
-// Sort null table with single valid column
->> SortByColumns(If(1<0,[1,2,3]), "Value",SortOrder.Ascending)
-Blank()
-
-//Sort empty table with single valid column - ascending order
->> SortByColumns(Filter([1, 2, 3], Value > 100), "Value", SortOrder.Ascending)
-Table()
-
-//Sort empty table with multiple valid column - ascending order
->> SortByColumns(Filter(Table({Value1:1,Value2:2}), Value1>100), "Value1", SortOrder.Ascending,"Value2", SortOrder.Ascending)
-Table()
-
-
-// ******** MULTI COLUMN SORT CASES ********
-
-// SORT ON NUMERIC COLUMN "AGE" - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"Age")
-Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
-
-
-// SORT ON NUMERIC COLUMN "AGE" - DESCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"Age", SortOrder.Descending)
-Table({Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
-
-
-// SORT ON BOOL COLUMN "VACCINATED" - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"Vaccinated")
-Table({Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
-
-
-// SORT ON BOOL COLUMN "VACCINATED" - DESCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"Vaccinated", SortOrder.Descending)
-Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
-
-
-// SORT ON STRING COLUMN "FIRST" - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First")
-Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
-
-
-// SORT ON STRING COLUMN "FIRST" - DESCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First",SortOrder.Descending)
-Table({Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
-
-
-// SORT HIERARCHICAL DATA ON BOOL COLUMN "HasID - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Age: 2, HasId: true, Properties: { Vaccinated: true, HasDog: true } },
- { First: "Alice", Age: 5, HasId: false, Properties: { Vaccinated: true, HasDog: false } },
- { First: Blank(), Age: 12, HasId: true, Properties: { Vaccinated: Blank(), HasDog: true } },
- { First: Blank(), Age: 12, HasId: false, Properties: Blank() },
- { First: "Mary", Age: 12, HasId: false, Properties: Blank() },
- { First: "Wonderland", Age: 5, HasId: Blank(), Properties: { Vaccinated: true, HasDog: Blank() } },
- { First: "Samantha", Age: 15, HasId: Blank(), Properties: { Vaccinated: Blank(), HasDog: Blank() } }), "HasId")
-Table({Age:5,First:"Alice",HasId:false,Properties:{HasDog:false,Vaccinated:true}},{Age:12,First:Blank(),HasId:false,Properties:Blank()},{Age:12,First:"Mary",HasId:false,Properties:Blank()},{Age:2,First:"Bob",HasId:true,Properties:{HasDog:true,Vaccinated:true}},{Age:12,First:Blank(),HasId:true,Properties:{HasDog:true,Vaccinated:Blank()}},{Age:5,First:"Wonderland",HasId:Blank(),Properties:{HasDog:Blank(),Vaccinated:true}},{Age:15,First:"Samantha",HasId:Blank(),Properties:{HasDog:Blank(),Vaccinated:Blank()}})
-
-
-// SORT HIERARCHICAL DATA ON BOOL COLUMN "HasID - DESCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Age: 2, HasId: true, Properties: { Vaccinated: true, HasDog: true } },
- { First: "Alice", Age: 5, HasId: false, Properties: { Vaccinated: true, HasDog: false } },
- { First: Blank(), Age: 12, HasId: true, Properties: { Vaccinated: Blank(), HasDog: true } },
- { First: Blank(), Age: 12, HasId: false, Properties: Blank() },
- { First: "Mary", Age: 12, HasId: false, Properties: Blank() },
- { First: "Wonderland", Age: 5, HasId: Blank(), Properties: { Vaccinated: true, HasDog: Blank() } },
- { First: "Samantha", Age: 15, HasId: Blank(), Properties: { Vaccinated: Blank(), HasDog: Blank() } }), "HasId",SortOrder.Descending)
-Table({Age:2,First:"Bob",HasId:true,Properties:{HasDog:true,Vaccinated:true}},{Age:12,First:Blank(),HasId:true,Properties:{HasDog:true,Vaccinated:Blank()}},{Age:5,First:"Alice",HasId:false,Properties:{HasDog:false,Vaccinated:true}},{Age:12,First:Blank(),HasId:false,Properties:Blank()},{Age:12,First:"Mary",HasId:false,Properties:Blank()},{Age:5,First:"Wonderland",HasId:Blank(),Properties:{HasDog:Blank(),Vaccinated:true}},{Age:15,First:"Samantha",HasId:Blank(),Properties:{HasDog:Blank(),Vaccinated:Blank()}})
-
-
-// SORT A TABLE WITH ERROR ROWS - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- If(Left("Hello", -1) = "", { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true }),
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false }
- ),"First")
-Error({Kind:ErrorKind.InvalidArgument})
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- If(Left("Hello", -1) = "", { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true }),
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false }
- ),"First", SortOrder.Descending)
-Error({Kind:ErrorKind.InvalidArgument})
-
-
-// SORT A TABLE WITH BLANK ROWS - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- Blank(),
- Blank(),
- Blank(),
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- Blank(),
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- Blank(),
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First")
-Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},Blank(),Blank(),Blank(),Blank(),Blank())
-
-
-// SORT A TABLE WITH BLANK ROWS - DESCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- Blank(),
- Blank(),
- Blank(),
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- Blank(),
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- Blank(),
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First", SortOrder.Descending)
-Table({Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},Blank(),Blank(),Blank(),Blank(),Blank())
-
-
-// SORT A TABLE WITH NO VALUES FOR SOME COLUMNS
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2 },
- { First: "Alice" },
- Blank(),
- Blank(),
- Blank(),
- { First: "John", Last: "Batali", Age: 17 },
- { First: "Emily", Age: 29 }), "Last", SortOrder.Ascending, "Age", SortOrder.Descending)
-Table({Age:17,First:"John",Last:"Batali"},{Age:2,First:"Bob",Last:"Smith"},{Age:29,First:"Emily",Last:Blank()},{Age:Blank(),First:"Alice",Last:Blank()},Blank(),Blank(),Blank())
-
-// SORT BY MULTIPLE COLUMNS - TEST 1
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Bob", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "John", Last: "Newman", Age: 6, Gender: "Female", Vaccinated: false, HasDog: true }), "First", SortOrder.Ascending, "Last", SortOrder.Descending, "Age", SortOrder.Descending, "Gender", SortOrder.Descending, "Vaccinated", SortOrder.Ascending)
-Table({Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:1,First:"John",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"John",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:6,First:"John",Gender:"Female",HasDog:true,Last:"Newman",Vaccinated:false},{Age:5,First:"John",Gender:"Female",HasDog:true,Last:"Bob",Vaccinated:true},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()})
-
-
-// SORT BY MULTIPLE COLUMNS - TEST 2
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Bob", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "John", Last: "Newman", Age: 6, Gender: "Female", Vaccinated: false, HasDog: true }), "First", SortOrder.Ascending, "Last", SortOrder.Ascending, "Age", SortOrder.Ascending, "Gender", SortOrder.Ascending, "Vaccinated", SortOrder.Descending)
-Table({Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:5,First:"John",Gender:"Female",HasDog:true,Last:"Bob",Vaccinated:true},{Age:6,First:"John",Gender:"Female",HasDog:true,Last:"Newman",Vaccinated:false},{Age:2,First:"John",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:1,First:"John",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false})
-
-
-// SORT BY MULTIPLE COLUMNS - TABLE WITH BLANK ROWS
-
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
- Blank(),
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: true, HasDog: true },
- Blank(),
- { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: false, HasDog: true },
- Blank(),
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: false, HasDog: true },
- { First: "John", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
- { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "John", Last: "Bob", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "John", Last: "Newman", Age: 6, Gender: "Female", Vaccinated: false, HasDog: true }), "First", SortOrder.Ascending, "Last", SortOrder.Descending, "Age", SortOrder.Descending, "Gender", SortOrder.Descending, "Vaccinated", SortOrder.Ascending)
-Table({Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:1,First:"John",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"John",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:6,First:"John",Gender:"Female",HasDog:true,Last:"Newman",Vaccinated:false},{Age:5,First:"John",Gender:"Female",HasDog:true,Last:"Bob",Vaccinated:true},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},Blank(),Blank(),Blank())
-
-
-// SORT ON TABLE WITH COLUMNS HAVING SPECIAL CHARACTERS - DESCENDING ORDER
-
->> SortByColumns(Table(
- { 'A\"B': "Bob" }, { 'A\"B': "Alice" }, { 'A\"B': "Mary" }, { 'A\"B': "Wonderland" }, { 'A\"B': "Samantha" }), "A\""B", SortOrder.Descending)
-Table({'A\"B':"Wonderland"},{'A\"B':"Samantha"},{'A\"B':"Mary"},{'A\"B':"Bob"},{'A\"B':"Alice"})
-
-// SORT ON TABLE WITH SOME COLUMNS HAVING ERROR VALUES - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Helio", Last: Left("Hello", -1), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Left("Hello", -1), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() }),"Last", SortOrder.Ascending,"Age", SortOrder.Descending)
-Error({Kind:ErrorKind.InvalidArgument})
-
-
-// SORT ON TABLE WITH SOME COLUMNS HAVING ERROR VALUES, BUT DOESN"T TOUCH ERROR - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: "Helio", Last: Left("Hello", -1), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Left("Hello", -1), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() }),"First", SortOrder.Ascending,"Age", SortOrder.Descending)
-Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Error({Kind:ErrorKind.InvalidArgument}),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Error({Kind:ErrorKind.InvalidArgument}),Vaccinated:Blank()})
-
-
-// SORT ON TABLE WITH ERROR PASSED AS SORT ORDER - ASCENDING ORDER
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First", If(Char(-1) <> "a", SortOrder.Ascending))
-Error({Kind:ErrorKind.InvalidArgument})
-
-
-// MULTIPLE COLUMNS USED FOR SORTING ORDER
-
->> SortByColumns(Table(
- {Flavor: "Chocolate", Quantity:100, Quantity2:100, Quantity3:100, Quantity4:100, Quantity5:100, Quantity6:100, Quantity7:100, Quantity8:100, Quantity9:100, Quantity10:100, Quantity11:100, Quantity12:100, Quantity13:100, Quantity14:100, Quantity15:100, Quantity16:100, Quantity17:100, Quantity18:100, Quantity19:100, Quantity20:100}),"Quantity", SortOrder.Ascending, "Quantity2", SortOrder.Ascending, "Quantity3", SortOrder.Ascending, "Quantity4", SortOrder.Ascending, "Quantity5", SortOrder.Ascending, "Quantity6", SortOrder.Ascending, "Quantity7", SortOrder.Ascending, "Quantity8", SortOrder.Ascending, "Quantity9", SortOrder.Ascending, "Quantity10", SortOrder.Ascending, "Quantity11", SortOrder.Ascending, "Quantity12", SortOrder.Ascending, "Quantity13", SortOrder.Ascending, "Quantity14", SortOrder.Ascending, "Quantity15", SortOrder.Ascending, "Quantity16", SortOrder.Ascending, "Quantity17", SortOrder.Ascending, "Quantity18", SortOrder.Ascending, "Quantity19", SortOrder.Ascending, "Quantity20", SortOrder.Ascending)
-Table({Flavor:"Chocolate",Quantity:100,Quantity10:100,Quantity11:100,Quantity12:100,Quantity13:100,Quantity14:100,Quantity15:100,Quantity16:100,Quantity17:100,Quantity18:100,Quantity19:100,Quantity2:100,Quantity20:100,Quantity3:100,Quantity4:100,Quantity5:100,Quantity6:100,Quantity7:100,Quantity8:100,Quantity9:100})
-
-
-// SAME COLUMN USED TO SPECIFY CONFLICTING SORT ORDERS
-
->> SortByColumns(Table(
- {Flavor: "Chocolate", Quantity:100, OnOrder:150},
- {Flavor: "Vanilla", Quantity:200, OnOrder:20},
- {Flavor: "Strawberry", Quantity:300, OnOrder:20},
- {Flavor: "Mint", Quantity:60, OnOrder:100},
- {Flavor: "Pistachio", Quantity:200, OnOrder:10}),"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending)
-Table({Flavor:"Pistachio",OnOrder:10,Quantity:200},{Flavor:"Vanilla",OnOrder:20,Quantity:200},{Flavor:"Strawberry",OnOrder:20,Quantity:300},{Flavor:"Mint",OnOrder:100,Quantity:60},{Flavor:"Chocolate",OnOrder:150,Quantity:100})
-
-
-//SAME COLUMN USED MULTIPLE TIMES FOR SORTING ORDER
-
->> SortByColumns(Table(
- {Flavor: "Chocolate", Quantity:100, OnOrder:150},
- {Flavor: "Vanilla", Quantity:200, OnOrder:20},
- {Flavor: "Strawberry", Quantity:300, OnOrder:20},
- {Flavor: "Mint", Quantity:60, OnOrder:100},
- {Flavor: "Pistachio", Quantity:200, OnOrder:10}),"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending)
-Table({Flavor:"Pistachio",OnOrder:10,Quantity:200},{Flavor:"Vanilla",OnOrder:20,Quantity:200},{Flavor:"Strawberry",OnOrder:20,Quantity:300},{Flavor:"Mint",OnOrder:100,Quantity:60},{Flavor:"Chocolate",OnOrder:150,Quantity:100})
-
-// ###### SortByColumns, column + ascending/descending overload ######
-
-// Legacy behavior: we can pass non-string literals to the column name in SortByColumns
->> SortByColumns([1,3,2],Left("Value234", 5))
-Table({Value:1},{Value:2},{Value:3})
-
->> SortByColumns([1,3,2],Left("Value234", 5), SortOrder.Descending)
-Table({Value:3},{Value:2},{Value:1})
-
->> SortByColumns(Table({a:1, b:"one"}, {a:2, b:"two"}, {a:3, b:"three"}, {a:4, b:"four"}), If(1>0,"a","b"))
-Table({a:1,b:"one"},{a:2,b:"two"},{a:3,b:"three"},{a:4,b:"four"})
-
->> SortByColumns(Table({a:1, b:"one"}, {a:2, b:"two"}, {a:3, b:"three"}, {a:4, b:"four"}), If(1<0,"a","b"))
-Table({a:4,b:"four"},{a:1,b:"one"},{a:3,b:"three"},{a:2,b:"two"})
-
->> SortByColumns(Table({a:1,b:"one"}, {a:2, b:"two"}, {a:1,b:"onebis"},{a:3, b:"three"}, {a:4, b:"four"}, {a:3, b:"threebis"}), "a", SortOrder.Ascending, Left("b1", 1), SortOrder.Descending)
-Table({a:1,b:"onebis"},{a:1,b:"one"},{a:2,b:"two"},{a:3,b:"threebis"},{a:3,b:"three"},{a:4,b:"four"})
-
->> SortByColumns(Table({a:1, b:1111}, {a:2, b:222}, {a:3, b:33}), If(1>0,"columndoesnotexist"))
-Error({Kind:ErrorKind.InvalidFunctionUsage})
-
->> SortByColumns(Table({a:1,b:"one"}, {a:2, b:"two"}, {a:1,b:"onebis"},{a:3, b:"three"}, {a:4, b:"four"}, {a:3, b:"threebis"}), "a", SortOrder.Ascending, Left("b1", 2), SortOrder.Descending)
-Error({Kind:ErrorKind.InvalidFunctionUsage})
-
->> SortByColumns(Table(
- { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
- { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
- { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
- { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
- { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
- { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
- { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
- { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
- { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
- { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
- { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Left("Hello", -1), SortOrder.Ascending,"Age", SortOrder.Descending)
-Error({Kind:ErrorKind.InvalidArgument})
-
-// ###### SortByColumns, column + order table overload ######
-
->> SortByColumns([1,3,2],Left("Value234", 5), [2,3,1])
-Table({Value:2},{Value:3},{Value:1})
-
->> SortByColumns(Table({a:1, b:"one"}, {a:2, b:"two"}, {a:3, b:"three"}, {a:4, b:"four"}), If(1<0,"a","b"), ["four", "three", "two", "one"])
-Table({a:4,b:"four"},{a:3,b:"three"},{a:2,b:"two"},{a:1,b:"one"})
-
-// If order table does not match the column to be sorted, results are unchanged
->> SortByColumns(Table({a:1, b:"one"}, {a:2, b:"two"}, {a:3, b:"three"}, {a:4, b:"four"}), If(1>0,"a","b"), ["four", "three", "two", "one"])
-Table({a:1,b:"one"},{a:2,b:"two"},{a:3,b:"three"},{a:4,b:"four"})
-
->> SortByColumns(Table({a:1, b:1111}, {a:2, b:222}, {a:3, b:33}), If(1>0,"columndoesnotexist"), [1,2,3])
-Error({Kind:ErrorKind.InvalidFunctionUsage})
-
-// ###### SortByColumns, column as (scope) variable ######
-
->> With({ col:"a" }, SortByColumns(Table({a:1,b:"one"},{a:2,b:"two"},{a:3,b:"three"}), col, SortOrder.Descending))
-Table({a:3,b:"three"},{a:2,b:"two"},{a:1,b:"one"})
-
->> With({ col:"b" }, SortByColumns(Table({a:1,b:"one"},{a:2,b:"two"},{a:3,b:"three"}), col, SortOrder.Descending))
-Table({a:2,b:"two"},{a:3,b:"three"},{a:1,b:"one"})
+>> SortByColumns([1],"Value")
+Table({Value:1})
+
+>> SortByColumns([-2, -1, 0, 1, 2], "Value")
+Table({Value:-2},{Value:-1},{Value:0},{Value:1},{Value:2})
+
+>> SortByColumns(Table({Value:-2},{Value:-1},{Value:1},{Value:2},{Value:5}),"Value")
+Table({Value:-2},{Value:-1},{Value:1},{Value:2},{Value:5})
+
+
+// ******** NUMBER PARAMETERS ********
+
+>> SortByColumns([-2, -1, 5, 1, 2], "Value")
+Table({Value:-2},{Value:-1},{Value:1},{Value:2},{Value:5})
+
+>> SortByColumns([-2, -1, 5, 1, 2], "Value", SortOrder.Descending)
+Table({Value:5},{Value:2},{Value:1},{Value:-1},{Value:-2})
+
+>> SortByColumns(Table({a:8, b:-1}, {a:2}, {b:5}), "a")
+Table({a:2,b:Blank()},{a:8,b:-1},{a:Blank(),b:5})
+
+>> SortByColumns(Table({a:8, b:-1}, {a:2}, {b:5}), "b", SortOrder.Descending)
+Table({a:Blank(),b:5},{a:8,b:-1},{a:2,b:Blank()})
+
+// ******** STRING PARAMETERS ********
+
+>> SortByColumns(["a", "b", "D", "x", "J", "C"], "Value")
+Table({Value:"a"},{Value:"b"},{Value:"C"},{Value:"D"},{Value:"J"},{Value:"x"})
+
+>> SortByColumns(["a", "b", "D", "x", "J", "C"], "Value", SortOrder.Descending)
+Table({Value:"x"},{Value:"J"},{Value:"D"},{Value:"C"},{Value:"b"},{Value:"a"})
+
+>> SortByColumns(["a", "b", "B", "x", "D", "C"], "Value")
+Table({Value:"a"},{Value:"b"},{Value:"B"},{Value:"C"},{Value:"D"},{Value:"x"})
+
+>> SortByColumns(["Hello", "hellO", "hello", "heLLo", "HELLO", "hElLo"], "Value")
+Table({Value:"hello"},{Value:"hellO"},{Value:"heLLo"},{Value:"hElLo"},{Value:"Hello"},{Value:"HELLO"})
+
+>> SortByColumns(["Hello", "hellO", "1", "%", "2", "hElLo"], "Value")
+Table({Value:"%"},{Value:"1"},{Value:"2"},{Value:"hellO"},{Value:"hElLo"},{Value:"Hello"})
+
+>> SortByColumns(["a", "b", Blank(), "x", "J", "C"], "Value")
+Table({Value:"a"},{Value:"b"},{Value:"C"},{Value:"J"},{Value:"x"},{Value:Blank()})
+
+>> SortByColumns(["a", "b", Blank(), "x", "J", "C"], "Value", SortOrder.Descending)
+Table({Value:"x"},{Value:"J"},{Value:"C"},{Value:"b"},{Value:"a"},{Value:Blank()})
+
+// ******** BOOLEAN PARAMETERS ********
+
+>> SortByColumns([true,false,true,false,true], "Value")
+Table({Value:false},{Value:false},{Value:true},{Value:true},{Value:true})
+
+>> SortByColumns([true,false,true,false,true], "Value", SortOrder.Descending)
+Table({Value:true},{Value:true},{Value:true},{Value:false},{Value:false})
+//
+>> SortByColumns([true,false,Blank(),false,true], "Value")
+Table({Value:false},{Value:false},{Value:true},{Value:true},{Value:Blank()})
+
+>> SortByColumns([true,false,Blank(),false,true], "Value", SortOrder.Descending)
+Table({Value:true},{Value:true},{Value:false},{Value:false},{Value:Blank()})
+
+// ******** DATE PARAMETERS ********
+
+>> SortByColumns([Date(2020, 01, 05), Date(2020, 01, 01), Date(1995, 01, 01)], "Value")
+Table({Value:Date(1995,1,1)},{Value:Date(2020,1,1)},{Value:Date(2020,1,5)})
+
+>> SortByColumns([Date(2020, 01, 05), Date(2012,12,14), Date(2022,1,1)], "Value")
+Table({Value:Date(2012,12,14)},{Value:Date(2020,1,5)},{Value:Date(2022,1,1)})
+
+>> SortByColumns([Date(2020, 01, 05), Date(2020, 01, 01), Date(1995, 01, 01)], "Value", SortOrder.Descending)
+Table({Value:Date(2020,1,5)},{Value:Date(2020,1,1)},{Value:Date(1995,1,1)})
+
+>> SortByColumns([Date(2020, 01, 05), Date(2012,12,14), Blank(), Date(2022,1,1)], "Value", SortOrder.Descending)
+Table({Value:Date(2022,1,1)},{Value:Date(2020,1,5)},{Value:Date(2012,12,14)},{Value:Blank()})
+
+// ******** TIME PARAMETERS ********
+
+>> SortByColumns([Time(12,35,55), Time(23, 01, 01), Time(5,30,50)], "Value")
+Table({Value:Time(5,30,50,0)},{Value:Time(12,35,55,0)},{Value:Time(23,1,1,0)})
+
+>> SortByColumns([Time(12,35,55), Time(23, 01, 01), Time(5,30,50)], "Value", SortOrder.Descending)
+Table({Value:Time(23,1,1,0)},{Value:Time(12,35,55,0)},{Value:Time(5,30,50,0)})
+
+>> SortByColumns([Time(17,29,0), Blank(), Time(5,30,50)], "Value")
+Table({Value:Time(5,30,50,0)},{Value:Time(17,29,0,0)},{Value:Blank()})
+
+// ******** DATETIME PARAMETERS ********
+
+>> SortByColumns([DateTime(2019,5,16,8,0,0), DateTime(2019,5,16,20,0,0), DateTime(2019,5,16,20,0,1)], "Value")
+Table({Value:DateTime(2019,5,16,8,0,0,0)},{Value:DateTime(2019,5,16,20,0,0,0)},{Value:DateTime(2019,5,16,20,0,1,0)})
+
+>> SortByColumns([DateTime(2019,5,16,8,0,0), DateTime(2019,5,16,20,0,0), DateTime(2019,5,16,20,0,1)], "Value", SortOrder.Descending)
+Table({Value:DateTime(2019,5,16,20,0,1,0)},{Value:DateTime(2019,5,16,20,0,0,0)},{Value:DateTime(2019,5,16,8,0,0,0)})
+
+
+// ******** NULL and ERROR PARAMETERS ********
+
+>> SortByColumns([-2, -1, 5, 1, 2], "Value", If(1/0<2,SortOrder.Ascending,SortOrder.Descending))
+Error({Kind:ErrorKind.Div0})
+
+//Error passed as one of the table records
+>> SortByColumns([-2, -1, 5, 1/0, 2], "Value")
+Error({Kind:ErrorKind.Div0})
+
+>> SortByColumns(["a", "b", "D", "x", "J", Error({Kind: 11})], "Value")
+Error({Kind:ErrorKind.Validation})
+
+
+>> SortByColumns(Table({Value:Blank()}),"Value")
+Table({Value:Blank()})
+
+>> SortByColumns([{Value:Blank()},{Value:Blank()}], "Value", SortOrder.Descending)
+Table({Value:Blank()},{Value:Blank()})
+
+>> SortByColumns([-2, Blank(), 5, 1, 2], "Value")
+Table({Value:-2},{Value:1},{Value:2},{Value:5},{Value:Blank()})
+
+>> SortByColumns([-2, -Blank(), 5, 1, 2], "Value")
+Table({Value:-2},{Value:0},{Value:1},{Value:2},{Value:5})
+
+>> SortByColumns([-2, Blank(), 5, 1, 2, -Blank()], "Value", SortOrder.Descending)
+Table({Value:5},{Value:2},{Value:1},{Value:0},{Value:-2},{Value:Blank()})
+
+// Sort on error source
+>> SortByColumns(If(Left("Hello", -1) = "",[1,2,3,4]), "Value", SortOrder.Ascending)
+Error({Kind:ErrorKind.InvalidArgument})
+
+// Sort null table with single valid column
+>> SortByColumns(If(1<0,[1,2,3]), "Value",SortOrder.Ascending)
+Blank()
+
+//Sort empty table with single valid column - ascending order
+>> SortByColumns(Filter([1, 2, 3], Value > 100), "Value", SortOrder.Ascending)
+Table()
+
+//Sort empty table with multiple valid column - ascending order
+>> SortByColumns(Filter(Table({Value1:1,Value2:2}), Value1>100), "Value1", SortOrder.Ascending,"Value2", SortOrder.Ascending)
+Table()
+
+
+// ******** MULTI COLUMN SORT CASES ********
+
+// SORT ON NUMERIC COLUMN "AGE" - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"Age")
+Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
+
+
+// SORT ON NUMERIC COLUMN "AGE" - DESCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"Age", SortOrder.Descending)
+Table({Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
+
+
+// SORT ON BOOL COLUMN "VACCINATED" - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"Vaccinated")
+Table({Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
+
+
+// SORT ON BOOL COLUMN "VACCINATED" - DESCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"Vaccinated", SortOrder.Descending)
+Table({Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
+
+
+// SORT ON STRING COLUMN "FIRST" - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First")
+Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
+
+
+// SORT ON STRING COLUMN "FIRST" - DESCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First",SortOrder.Descending)
+Table({Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Clark",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Allen",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Brown",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:Blank(),Last:"Walker",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:Blank(),Last:"Rodriguez",Vaccinated:Blank()})
+
+
+// SORT HIERARCHICAL DATA ON BOOL COLUMN "HasID - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Age: 2, HasId: true, Properties: { Vaccinated: true, HasDog: true } },
+ { First: "Alice", Age: 5, HasId: false, Properties: { Vaccinated: true, HasDog: false } },
+ { First: Blank(), Age: 12, HasId: true, Properties: { Vaccinated: Blank(), HasDog: true } },
+ { First: Blank(), Age: 12, HasId: false, Properties: Blank() },
+ { First: "Mary", Age: 12, HasId: false, Properties: Blank() },
+ { First: "Wonderland", Age: 5, HasId: Blank(), Properties: { Vaccinated: true, HasDog: Blank() } },
+ { First: "Samantha", Age: 15, HasId: Blank(), Properties: { Vaccinated: Blank(), HasDog: Blank() } }), "HasId")
+Table({Age:5,First:"Alice",HasId:false,Properties:{HasDog:false,Vaccinated:true}},{Age:12,First:Blank(),HasId:false,Properties:Blank()},{Age:12,First:"Mary",HasId:false,Properties:Blank()},{Age:2,First:"Bob",HasId:true,Properties:{HasDog:true,Vaccinated:true}},{Age:12,First:Blank(),HasId:true,Properties:{HasDog:true,Vaccinated:Blank()}},{Age:5,First:"Wonderland",HasId:Blank(),Properties:{HasDog:Blank(),Vaccinated:true}},{Age:15,First:"Samantha",HasId:Blank(),Properties:{HasDog:Blank(),Vaccinated:Blank()}})
+
+
+// SORT HIERARCHICAL DATA ON BOOL COLUMN "HasID - DESCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Age: 2, HasId: true, Properties: { Vaccinated: true, HasDog: true } },
+ { First: "Alice", Age: 5, HasId: false, Properties: { Vaccinated: true, HasDog: false } },
+ { First: Blank(), Age: 12, HasId: true, Properties: { Vaccinated: Blank(), HasDog: true } },
+ { First: Blank(), Age: 12, HasId: false, Properties: Blank() },
+ { First: "Mary", Age: 12, HasId: false, Properties: Blank() },
+ { First: "Wonderland", Age: 5, HasId: Blank(), Properties: { Vaccinated: true, HasDog: Blank() } },
+ { First: "Samantha", Age: 15, HasId: Blank(), Properties: { Vaccinated: Blank(), HasDog: Blank() } }), "HasId",SortOrder.Descending)
+Table({Age:2,First:"Bob",HasId:true,Properties:{HasDog:true,Vaccinated:true}},{Age:12,First:Blank(),HasId:true,Properties:{HasDog:true,Vaccinated:Blank()}},{Age:5,First:"Alice",HasId:false,Properties:{HasDog:false,Vaccinated:true}},{Age:12,First:Blank(),HasId:false,Properties:Blank()},{Age:12,First:"Mary",HasId:false,Properties:Blank()},{Age:5,First:"Wonderland",HasId:Blank(),Properties:{HasDog:Blank(),Vaccinated:true}},{Age:15,First:"Samantha",HasId:Blank(),Properties:{HasDog:Blank(),Vaccinated:Blank()}})
+
+
+// SORT A TABLE WITH ERROR ROWS - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ If(Left("Hello", -1) = "", { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true }),
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false }
+ ),"First")
+Error({Kind:ErrorKind.InvalidArgument})
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ If(Left("Hello", -1) = "", { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true }),
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false }
+ ),"First", SortOrder.Descending)
+Error({Kind:ErrorKind.InvalidArgument})
+
+
+// SORT A TABLE WITH BLANK ROWS - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ Blank(),
+ Blank(),
+ Blank(),
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ Blank(),
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ Blank(),
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First")
+Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},Blank(),Blank(),Blank(),Blank(),Blank())
+
+
+// SORT A TABLE WITH BLANK ROWS - DESCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ Blank(),
+ Blank(),
+ Blank(),
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ Blank(),
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ Blank(),
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First", SortOrder.Descending)
+Table({Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:32,First:"Nizam",Gender:"Male",HasDog:false,Last:"Lewis",Vaccinated:true},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:20,First:"Maria",Gender:"Female",HasDog:false,Last:"Martinez",Vaccinated:true},{Age:17,First:"John",Gender:"Male",HasDog:false,Last:"Batali",Vaccinated:false},{Age:29,First:"Jaideep",Gender:"Male",HasDog:false,Last:"Lopez",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Blank(),Vaccinated:Blank()},{Age:29,First:"Emily",Gender:"Female",HasDog:Blank(),Last:"Jones",Vaccinated:true},{Age:4,First:"Dora",Gender:"Female",HasDog:true,Last:"TheExplorer",Vaccinated:Blank()},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:27,First:"Andrew",Gender:"Male",HasDog:false,Last:"Lee",Vaccinated:true},{Age:40,First:"Amelia",Gender:"Female",HasDog:Blank(),Last:"Bedelia",Vaccinated:Blank()},{Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},Blank(),Blank(),Blank(),Blank(),Blank())
+
+
+// SORT A TABLE WITH NO VALUES FOR SOME COLUMNS
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2 },
+ { First: "Alice" },
+ Blank(),
+ Blank(),
+ Blank(),
+ { First: "John", Last: "Batali", Age: 17 },
+ { First: "Emily", Age: 29 }), "Last", SortOrder.Ascending, "Age", SortOrder.Descending)
+Table({Age:17,First:"John",Last:"Batali"},{Age:2,First:"Bob",Last:"Smith"},{Age:29,First:"Emily",Last:Blank()},{Age:Blank(),First:"Alice",Last:Blank()},Blank(),Blank(),Blank())
+
+// SORT BY MULTIPLE COLUMNS - TEST 1
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Bob", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "John", Last: "Newman", Age: 6, Gender: "Female", Vaccinated: false, HasDog: true }), "First", SortOrder.Ascending, "Last", SortOrder.Descending, "Age", SortOrder.Descending, "Gender", SortOrder.Descending, "Vaccinated", SortOrder.Ascending)
+Table({Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:1,First:"John",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"John",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:6,First:"John",Gender:"Female",HasDog:true,Last:"Newman",Vaccinated:false},{Age:5,First:"John",Gender:"Female",HasDog:true,Last:"Bob",Vaccinated:true},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()})
+
+
+// SORT BY MULTIPLE COLUMNS - TEST 2
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Bob", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "John", Last: "Newman", Age: 6, Gender: "Female", Vaccinated: false, HasDog: true }), "First", SortOrder.Ascending, "Last", SortOrder.Ascending, "Age", SortOrder.Ascending, "Gender", SortOrder.Ascending, "Vaccinated", SortOrder.Descending)
+Table({Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:5,First:"John",Gender:"Female",HasDog:true,Last:"Bob",Vaccinated:true},{Age:6,First:"John",Gender:"Female",HasDog:true,Last:"Newman",Vaccinated:false},{Age:2,First:"John",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:1,First:"John",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false})
+
+
+// SORT BY MULTIPLE COLUMNS - TABLE WITH BLANK ROWS
+
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
+ Blank(),
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: true, HasDog: true },
+ Blank(),
+ { First: "Bob", Last: "Walker", Age: 1, Gender: "Female", Vaccinated: false, HasDog: true },
+ Blank(),
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "Andrew", Last: "Smith", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 2, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Bob", Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: 4, Gender: "Female", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: "John", Last: "Walker", Age: 1, Gender: "Male", Vaccinated: false, HasDog: true },
+ { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: Blank(), Last: "James", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "John", Last: "Bob", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "John", Last: "Newman", Age: 6, Gender: "Female", Vaccinated: false, HasDog: true }), "First", SortOrder.Ascending, "Last", SortOrder.Descending, "Age", SortOrder.Descending, "Gender", SortOrder.Descending, "Vaccinated", SortOrder.Ascending)
+Table({Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Andrew",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:true},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:1,First:"Bob",Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:false},{Age:2,First:"Bob",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:1,First:"John",Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:2,First:"John",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:6,First:"John",Gender:"Female",HasDog:true,Last:"Newman",Vaccinated:false},{Age:5,First:"John",Gender:"Female",HasDog:true,Last:"Bob",Vaccinated:true},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:false},{Age:4,First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Male",HasDog:true,Last:"Walker",Vaccinated:false},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"Walker",Vaccinated:true},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},{Age:Blank(),First:Blank(),Gender:"Female",HasDog:true,Last:"James",Vaccinated:Blank()},Blank(),Blank(),Blank())
+
+
+// SORT ON TABLE WITH COLUMNS HAVING SPECIAL CHARACTERS - DESCENDING ORDER
+
+>> SortByColumns(Table(
+ { 'A\"B': "Bob" }, { 'A\"B': "Alice" }, { 'A\"B': "Mary" }, { 'A\"B': "Wonderland" }, { 'A\"B': "Samantha" }), "A\""B", SortOrder.Descending)
+Table({'A\"B':"Wonderland"},{'A\"B':"Samantha"},{'A\"B':"Mary"},{'A\"B':"Bob"},{'A\"B':"Alice"})
+
+// SORT ON TABLE WITH SOME COLUMNS HAVING ERROR VALUES - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Helio", Last: Left("Hello", -1), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Left("Hello", -1), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() }),"Last", SortOrder.Ascending,"Age", SortOrder.Descending)
+Error({Kind:ErrorKind.InvalidArgument})
+
+
+// SORT ON TABLE WITH SOME COLUMNS HAVING ERROR VALUES, BUT DOESN"T TOUCH ERROR - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: "Helio", Last: Left("Hello", -1), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Left("Hello", -1), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() }),"First", SortOrder.Ascending,"Age", SortOrder.Descending)
+Table({Age:5,First:"Alice",Gender:"Female",HasDog:true,Last:"Smith",Vaccinated:true},{Age:2,First:"Bob",Gender:"Male",HasDog:true,Last:"Smith",Vaccinated:true},{Age:263,First:"Helio",Gender:"Unknown",HasDog:Blank(),Last:Error({Kind:ErrorKind.InvalidArgument}),Vaccinated:Blank()},{Age:48,First:"Mary",Gender:"Female",HasDog:false,Last:"Harris",Vaccinated:false},{Age:792,First:"Titan",Gender:"Unknown",HasDog:Blank(),Last:Error({Kind:ErrorKind.InvalidArgument}),Vaccinated:Blank()})
+
+
+// SORT ON TABLE WITH ERROR PASSED AS SORT ORDER - ASCENDING ORDER
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),"First", If(Char(-1) <> "a", SortOrder.Ascending))
+Error({Kind:ErrorKind.InvalidArgument})
+
+
+// MULTIPLE COLUMNS USED FOR SORTING ORDER
+
+>> SortByColumns(Table(
+ {Flavor: "Chocolate", Quantity:100, Quantity2:100, Quantity3:100, Quantity4:100, Quantity5:100, Quantity6:100, Quantity7:100, Quantity8:100, Quantity9:100, Quantity10:100, Quantity11:100, Quantity12:100, Quantity13:100, Quantity14:100, Quantity15:100, Quantity16:100, Quantity17:100, Quantity18:100, Quantity19:100, Quantity20:100}),"Quantity", SortOrder.Ascending, "Quantity2", SortOrder.Ascending, "Quantity3", SortOrder.Ascending, "Quantity4", SortOrder.Ascending, "Quantity5", SortOrder.Ascending, "Quantity6", SortOrder.Ascending, "Quantity7", SortOrder.Ascending, "Quantity8", SortOrder.Ascending, "Quantity9", SortOrder.Ascending, "Quantity10", SortOrder.Ascending, "Quantity11", SortOrder.Ascending, "Quantity12", SortOrder.Ascending, "Quantity13", SortOrder.Ascending, "Quantity14", SortOrder.Ascending, "Quantity15", SortOrder.Ascending, "Quantity16", SortOrder.Ascending, "Quantity17", SortOrder.Ascending, "Quantity18", SortOrder.Ascending, "Quantity19", SortOrder.Ascending, "Quantity20", SortOrder.Ascending)
+Table({Flavor:"Chocolate",Quantity:100,Quantity10:100,Quantity11:100,Quantity12:100,Quantity13:100,Quantity14:100,Quantity15:100,Quantity16:100,Quantity17:100,Quantity18:100,Quantity19:100,Quantity2:100,Quantity20:100,Quantity3:100,Quantity4:100,Quantity5:100,Quantity6:100,Quantity7:100,Quantity8:100,Quantity9:100})
+
+
+// SAME COLUMN USED TO SPECIFY CONFLICTING SORT ORDERS
+
+>> SortByColumns(Table(
+ {Flavor: "Chocolate", Quantity:100, OnOrder:150},
+ {Flavor: "Vanilla", Quantity:200, OnOrder:20},
+ {Flavor: "Strawberry", Quantity:300, OnOrder:20},
+ {Flavor: "Mint", Quantity:60, OnOrder:100},
+ {Flavor: "Pistachio", Quantity:200, OnOrder:10}),"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending)
+Table({Flavor:"Pistachio",OnOrder:10,Quantity:200},{Flavor:"Vanilla",OnOrder:20,Quantity:200},{Flavor:"Strawberry",OnOrder:20,Quantity:300},{Flavor:"Mint",OnOrder:100,Quantity:60},{Flavor:"Chocolate",OnOrder:150,Quantity:100})
+
+
+//SAME COLUMN USED MULTIPLE TIMES FOR SORTING ORDER
+
+>> SortByColumns(Table(
+ {Flavor: "Chocolate", Quantity:100, OnOrder:150},
+ {Flavor: "Vanilla", Quantity:200, OnOrder:20},
+ {Flavor: "Strawberry", Quantity:300, OnOrder:20},
+ {Flavor: "Mint", Quantity:60, OnOrder:100},
+ {Flavor: "Pistachio", Quantity:200, OnOrder:10}),"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending, "OnOrder", SortOrder.Descending,"OnOrder", SortOrder.Ascending)
+Table({Flavor:"Pistachio",OnOrder:10,Quantity:200},{Flavor:"Vanilla",OnOrder:20,Quantity:200},{Flavor:"Strawberry",OnOrder:20,Quantity:300},{Flavor:"Mint",OnOrder:100,Quantity:60},{Flavor:"Chocolate",OnOrder:150,Quantity:100})
+
+// ###### SortByColumns, column + ascending/descending overload ######
+
+// Legacy behavior: we can pass non-string literals to the column name in SortByColumns
+>> SortByColumns([1,3,2],Left("Value234", 5))
+Table({Value:1},{Value:2},{Value:3})
+
+>> SortByColumns([1,3,2],Left("Value234", 5), SortOrder.Descending)
+Table({Value:3},{Value:2},{Value:1})
+
+>> SortByColumns(Table({a:1, b:"one"}, {a:2, b:"two"}, {a:3, b:"three"}, {a:4, b:"four"}), If(1>0,"a","b"))
+Table({a:1,b:"one"},{a:2,b:"two"},{a:3,b:"three"},{a:4,b:"four"})
+
+>> SortByColumns(Table({a:1, b:"one"}, {a:2, b:"two"}, {a:3, b:"three"}, {a:4, b:"four"}), If(1<0,"a","b"))
+Table({a:4,b:"four"},{a:1,b:"one"},{a:3,b:"three"},{a:2,b:"two"})
+
+>> SortByColumns(Table({a:1,b:"one"}, {a:2, b:"two"}, {a:1,b:"onebis"},{a:3, b:"three"}, {a:4, b:"four"}, {a:3, b:"threebis"}), "a", SortOrder.Ascending, Left("b1", 1), SortOrder.Descending)
+Table({a:1,b:"onebis"},{a:1,b:"one"},{a:2,b:"two"},{a:3,b:"threebis"},{a:3,b:"three"},{a:4,b:"four"})
+
+>> SortByColumns(Table({a:1, b:1111}, {a:2, b:222}, {a:3, b:33}), If(1>0,"columndoesnotexist"))
+Error({Kind:ErrorKind.InvalidFunctionUsage})
+
+>> SortByColumns(Table({a:1,b:"one"}, {a:2, b:"two"}, {a:1,b:"onebis"},{a:3, b:"three"}, {a:4, b:"four"}, {a:3, b:"threebis"}), "a", SortOrder.Ascending, Left("b1", 2), SortOrder.Descending)
+Error({Kind:ErrorKind.InvalidFunctionUsage})
+
+>> SortByColumns(Table(
+ { First: "Bob", Last: "Smith", Age: 2, Gender: "Male", Vaccinated: true, HasDog: true },
+ { First: "Alice", Last: "Smith", Age: 5, Gender: "Female", Vaccinated: true, HasDog: true },
+ { First: Blank(), Last: "Clark", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Allen", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Brown", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "John", Last: "Batali", Age: 17, Gender: "Male", Vaccinated: false, HasDog: false },
+ { First: "Emily", Last: "Jones", Age: 29, Gender: "Female", Vaccinated: true, HasDog: Blank() },
+ { First: "Helio", Last: Blank(), Age: 263, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Mary", Last: "Harris", Age: 48, Gender: "Female", Vaccinated: false, HasDog: false },
+ { First: "Titan", Last: Blank(), Age: 792, Gender: "Unknown", Vaccinated: Blank(), HasDog: Blank() },
+ { First: Blank(), Last: "Walker", Age: Blank(), Gender: "Male", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Andrew", Last: "Lee", Age: 27, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Nizam", Last: "Lewis", Age: 32, Gender: "Male", Vaccinated: true, HasDog: false },
+ { First: "Amelia", Last: "Bedelia", Age: 40, Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Dora", Last: "TheExplorer", Age: 4, Gender: "Female", Vaccinated: Blank(), HasDog: true },
+ { First: "Maria", Last: "Martinez", Age: 20, Gender: "Female", Vaccinated: true, HasDog: false },
+ { First: Blank(), Last: "Rodriguez", Age: Blank(), Gender: "Female", Vaccinated: Blank(), HasDog: Blank() },
+ { First: "Jaideep", Last: "Lopez", Age: 29, Gender: "Male", Vaccinated: true, HasDog: false }),Left("Hello", -1), SortOrder.Ascending,"Age", SortOrder.Descending)
+Error({Kind:ErrorKind.InvalidArgument})
+
+// ###### SortByColumns, column + order table overload ######
+
+>> SortByColumns([1,3,2],Left("Value234", 5), [2,3,1])
+Table({Value:2},{Value:3},{Value:1})
+
+>> SortByColumns(Table({a:1, b:"one"}, {a:2, b:"two"}, {a:3, b:"three"}, {a:4, b:"four"}), If(1<0,"a","b"), ["four", "three", "two", "one"])
+Table({a:4,b:"four"},{a:3,b:"three"},{a:2,b:"two"},{a:1,b:"one"})
+
+// If order table does not match the column to be sorted, results are unchanged
+>> SortByColumns(Table({a:1, b:"one"}, {a:2, b:"two"}, {a:3, b:"three"}, {a:4, b:"four"}), If(1>0,"a","b"), ["four", "three", "two", "one"])
+Table({a:1,b:"one"},{a:2,b:"two"},{a:3,b:"three"},{a:4,b:"four"})
+
+>> SortByColumns(Table({a:1, b:1111}, {a:2, b:222}, {a:3, b:33}), If(1>0,"columndoesnotexist"), [1,2,3])
+Error({Kind:ErrorKind.InvalidFunctionUsage})
+
+// ###### SortByColumns, column as (scope) variable ######
+
+>> With({ col:"a" }, SortByColumns(Table({a:1,b:"one"},{a:2,b:"two"},{a:3,b:"three"}), col, SortOrder.Descending))
+Table({a:3,b:"three"},{a:2,b:"two"},{a:1,b:"one"})
+
+>> With({ col:"b" }, SortByColumns(Table({a:1,b:"one"},{a:2,b:"two"},{a:3,b:"three"}), col, SortOrder.Descending))
+Table({a:2,b:"two"},{a:3,b:"three"},{a:1,b:"one"})
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersEnabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersEnabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersEnabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersEnabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersEnabled_V1CompatEnabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersEnabled_V1CompatEnabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersEnabled_V1CompatEnabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumnsOrderTable_ColumnNamesAsIdentifiersEnabled_V1CompatEnabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumns_ColumnNamesAsIdentifiersEnabled_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumns_ColumnNamesAsIdentifiersEnabled_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumns_ColumnNamesAsIdentifiersEnabled_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumns_ColumnNamesAsIdentifiersEnabled_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumns_ColumnNamesAsIdentifiersEnabled_V1CompatEnabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumns_ColumnNamesAsIdentifiersEnabled_V1CompatEnabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SortByColumns_ColumnNamesAsIdentifiersEnabled_V1CompatEnabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SortByColumns_ColumnNamesAsIdentifiersEnabled_V1CompatEnabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sort_OptionSets.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sort_OptionSets.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sort_OptionSets.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sort_OptionSets.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Split.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Split.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Split.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Split.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Split_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Split_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Split_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Split_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sqrt.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sqrt.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sqrt.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sqrt.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SqrtT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SqrtT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SqrtT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SqrtT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SqrtT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SqrtT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SqrtT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SqrtT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StartsWith.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StartsWith.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StartsWith.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StartsWith.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StdevP.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StdevP.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StdevP.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StdevP.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StringInterpolate.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StringInterpolate.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StringInterpolate.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StringInterpolate.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnum_BuiltInEnums.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnum_BuiltInEnums.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnum_BuiltInEnums.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnum_BuiltInEnums.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnum_BuiltInEnums_PreV1.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnum_BuiltInEnums_PreV1.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnum_BuiltInEnums_PreV1.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnum_BuiltInEnums_PreV1.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnum_TestEnums.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnum_TestEnums.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnum_TestEnums.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnum_TestEnums.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnum_TestEnums_PreV1.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnum_TestEnums_PreV1.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnum_TestEnums_PreV1.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnum_TestEnums_PreV1.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnums.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnums.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnums.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnums.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnums_PreV1.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnums_PreV1.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/StronglyTypedEnums_PreV1.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/StronglyTypedEnums_PreV1.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Substitute.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Substitute.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Substitute.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Substitute.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SubstituteT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SubstituteT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SubstituteT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SubstituteT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SubstituteT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SubstituteT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/SubstituteT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/SubstituteT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sum.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sum.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Sum.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Sum.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Summarize.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Summarize.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Summarize.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Summarize.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Table.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Table.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Table.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Table.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableCoercion.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableCoercion.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableCoercion.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableCoercion.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableCoercion_StronglyTypedEnum.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableCoercion_StronglyTypedEnum.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableCoercion_StronglyTypedEnum.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableCoercion_StronglyTypedEnum.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableCoercion_StronglyTypedEnumDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableCoercion_StronglyTypedEnumDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableCoercion_StronglyTypedEnumDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableCoercion_StronglyTypedEnumDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableMathfuncs.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableMathfuncs.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableMathfuncs.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableMathfuncs.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableNodes.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableNodes.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableNodes.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableNodes.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableStringfuncs.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableStringfuncs.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableStringfuncs.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableStringfuncs.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableStringfuncsT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableStringfuncsT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TableStringfuncsT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TableStringfuncsT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Table_Mutation.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Table_Mutation.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Table_Mutation.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Table_Mutation.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Table_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Table_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Table_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Table_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TabularOverloadsBlanksAndErrors.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TabularOverloadsBlanksAndErrors.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TabularOverloadsBlanksAndErrors.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TabularOverloadsBlanksAndErrors.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TabularOverloadsBlanksAndErrorsT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TabularOverloadsBlanksAndErrorsT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TabularOverloadsBlanksAndErrorsT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TabularOverloadsBlanksAndErrorsT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Testing.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Testing.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Testing.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Testing.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TextFirst.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TextFirst.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TextFirst.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TextFirst.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_DefaultNumber_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_DefaultNumber_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_DefaultNumber_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_DefaultNumber_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_DefaultNumber_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_DefaultNumber_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_DefaultNumber_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_DefaultNumber_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_ExcelCompat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_ExcelCompat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_ExcelCompat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_ExcelCompat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_ExcelCompat_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_ExcelCompat_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_ExcelCompat_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_ExcelCompat_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_ExcelCompat_PowerFxV1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_ExcelCompat_PowerFxV1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_ExcelCompat_PowerFxV1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_ExcelCompat_PowerFxV1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_ExcelCompat_PowerFxV1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_ExcelCompat_PowerFxV1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_ExcelCompat_PowerFxV1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_ExcelCompat_PowerFxV1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_Format.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_Format.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_Format.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_Format.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_Format_PowerFxV1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_Format_PowerFxV1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_Format_PowerFxV1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_Format_PowerFxV1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_Format_PowerFxV1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_Format_PowerFxV1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Text_Format_PowerFxV1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Text_Format_PowerFxV1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Time.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Time.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Time.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Time.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trace.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trace.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trace.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trace.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trace_StronglyTypedBuiltinEnums.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trace_StronglyTypedBuiltinEnums.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trace_StronglyTypedBuiltinEnums.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trace_StronglyTypedBuiltinEnums.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trace_StronglyTypedBuiltinEnumsDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trace_StronglyTypedBuiltinEnumsDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trace_StronglyTypedBuiltinEnumsDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trace_StronglyTypedBuiltinEnumsDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TrigFunctions.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TrigFunctions.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TrigFunctions.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TrigFunctions.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TrigTableFunctions.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TrigTableFunctions.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TrigTableFunctions.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TrigTableFunctions.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TrigTableFunctions_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TrigTableFunctions_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TrigTableFunctions_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TrigTableFunctions_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trim.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trim.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trim.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trim.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TrimEnds.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TrimEnds.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TrimEnds.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TrimEnds.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trunc.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trunc.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Trunc.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Trunc.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TruncT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TruncT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TruncT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TruncT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TruncT_ConsistentOneColumnTableResultDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TruncT_ConsistentOneColumnTableResultDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/TruncT_ConsistentOneColumnTableResultDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/TruncT_ConsistentOneColumnTableResultDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UniChar.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UniChar.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UniChar.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UniChar.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UniCharT.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UniCharT.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UniCharT.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UniCharT.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UntypedBlankAsTable.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UntypedBlankAsTable.txt
similarity index 95%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UntypedBlankAsTable.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UntypedBlankAsTable.txt
index 47418d207..7c005b80e 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UntypedBlankAsTable.txt
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UntypedBlankAsTable.txt
@@ -1,100 +1,100 @@
-
-// Consider an untyped blank, such as the return type from Blank(), as an argument to a single column table enabled function.
-//
-// We favor treating these as a scalar blank, rather than a table blank. Scalar is the simpler form and more likely
-// what the maker wanted. This treatment is also consistent with Canvas.
-//
-// A typed Blank, such as returned from a database or If(1<0,"foo") is fine, it specifically an untyped Blank that is odd.
-//
-// In general, a function that takes a blank table argument will return a blank table.
-
->> Concatenate("a",Blank(),"b")
-"ab"
-
->> Concatenate(["a","b"],Blank())
-Table({Value:"a"},{Value:"b"})
-
->> Concatenate(Blank(),["a","b"])
-Table({Value:"a"},{Value:"b"})
-
->> Left(["abc","def"],2)
-Table({Value:"ab"},{Value:"de"})
-
->> Left(["abc","def"],Blank())
-Table({Value:""},{Value:""})
-
->> Left("abcd",[2,3])
-Table({Value:"ab"},{Value:"abc"})
-
->> Left(Blank(),[2,3])
-Table({Value:""},{Value:""})
-
->> Right(["abc","def"],2)
-Table({Value:"bc"},{Value:"ef"})
-
->> Right(["abc","def"],Blank())
-Table({Value:""},{Value:""})
-
->> Right("abc",[2,3])
-Table({Value:"bc"},{Value:"abc"})
-
->> Right(Blank(),[2,3])
-Table({Value:""},{Value:""})
-
->> Mid(["abc","def"],2)
-Table({Value:"bc"},{Value:"ef"})
-
->> Mid(["abc","def"],Blank())
-Table({Value:Error({Kind:ErrorKind.InvalidArgument})},{Value:Error({Kind:ErrorKind.InvalidArgument})})
-
->> Mid(["abc","def"],3,Blank())
-Table({Value:""},{Value:""})
-
->> Mid(Blank(),[1,2])
-Table({Value:""},{Value:""})
-
->> Mod([10,22],[3,4])
-Table({Value:1},{Value:2})
-
->> Mod([1,2],Blank())
-Table({Value:Error({Kind:ErrorKind.Div0})},{Value:Error({Kind:ErrorKind.Div0})})
-
->> Mod(Blank(),[3,4])
-Table({Value:0},{Value:0})
-
->> Power(Blank(),3)
-0
-
->> Power(Blank(),[3])
-Table({Value:0})
-
->> Power(If(1<0,[1]),3)
-Blank()
-
->> Log(Blank(),3)
-Error({Kind:ErrorKind.Numeric})
-
->> Log(Blank(),[3])
-Table({Value:Error({Kind:ErrorKind.Numeric})})
-
->> Log(If(1<0,[1]),3)
-Blank()
-
->> Sum([4,5],Blank())
-Blank()
-
->> Sum(If(1<0,[1,2,3]),4)
-Blank()
-
->> Sum(If(1<0,[1,2,3]),Blank())
-Blank()
-
-// one argument, single column table functions, will treat Blank() as a scalar
->> Sin(Blank())
-0
-
->> Len(Blank())
-0
-
->> Abs(Blank())
-0
+
+// Consider an untyped blank, such as the return type from Blank(), as an argument to a single column table enabled function.
+//
+// We favor treating these as a scalar blank, rather than a table blank. Scalar is the simpler form and more likely
+// what the maker wanted. This treatment is also consistent with Canvas.
+//
+// A typed Blank, such as returned from a database or If(1<0,"foo") is fine, it specifically an untyped Blank that is odd.
+//
+// In general, a function that takes a blank table argument will return a blank table.
+
+>> Concatenate("a",Blank(),"b")
+"ab"
+
+>> Concatenate(["a","b"],Blank())
+Table({Value:"a"},{Value:"b"})
+
+>> Concatenate(Blank(),["a","b"])
+Table({Value:"a"},{Value:"b"})
+
+>> Left(["abc","def"],2)
+Table({Value:"ab"},{Value:"de"})
+
+>> Left(["abc","def"],Blank())
+Table({Value:""},{Value:""})
+
+>> Left("abcd",[2,3])
+Table({Value:"ab"},{Value:"abc"})
+
+>> Left(Blank(),[2,3])
+Table({Value:""},{Value:""})
+
+>> Right(["abc","def"],2)
+Table({Value:"bc"},{Value:"ef"})
+
+>> Right(["abc","def"],Blank())
+Table({Value:""},{Value:""})
+
+>> Right("abc",[2,3])
+Table({Value:"bc"},{Value:"abc"})
+
+>> Right(Blank(),[2,3])
+Table({Value:""},{Value:""})
+
+>> Mid(["abc","def"],2)
+Table({Value:"bc"},{Value:"ef"})
+
+>> Mid(["abc","def"],Blank())
+Table({Value:Error({Kind:ErrorKind.InvalidArgument})},{Value:Error({Kind:ErrorKind.InvalidArgument})})
+
+>> Mid(["abc","def"],3,Blank())
+Table({Value:""},{Value:""})
+
+>> Mid(Blank(),[1,2])
+Table({Value:""},{Value:""})
+
+>> Mod([10,22],[3,4])
+Table({Value:1},{Value:2})
+
+>> Mod([1,2],Blank())
+Table({Value:Error({Kind:ErrorKind.Div0})},{Value:Error({Kind:ErrorKind.Div0})})
+
+>> Mod(Blank(),[3,4])
+Table({Value:0},{Value:0})
+
+>> Power(Blank(),3)
+0
+
+>> Power(Blank(),[3])
+Table({Value:0})
+
+>> Power(If(1<0,[1]),3)
+Blank()
+
+>> Log(Blank(),3)
+Error({Kind:ErrorKind.Numeric})
+
+>> Log(Blank(),[3])
+Table({Value:Error({Kind:ErrorKind.Numeric})})
+
+>> Log(If(1<0,[1]),3)
+Blank()
+
+>> Sum([4,5],Blank())
+Blank()
+
+>> Sum(If(1<0,[1,2,3]),4)
+Blank()
+
+>> Sum(If(1<0,[1,2,3]),Blank())
+Blank()
+
+// one argument, single column table functions, will treat Blank() as a scalar
+>> Sin(Blank())
+0
+
+>> Len(Blank())
+0
+
+>> Abs(Blank())
+0
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UntypedBlankAsTable_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UntypedBlankAsTable_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UntypedBlankAsTable_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UntypedBlankAsTable_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UntypedBlankAsTable_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UntypedBlankAsTable_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/UntypedBlankAsTable_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/UntypedBlankAsTable_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Upper.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Upper.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Upper.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Upper.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Value.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Value.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Value.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Value.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/VarP.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/VarP.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/VarP.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/VarP.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/WeekNum.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/WeekNum.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/WeekNum.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/WeekNum.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/WeekNum_StronglyTypedEnumDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/WeekNum_StronglyTypedEnumDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/WeekNum_StronglyTypedEnumDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/WeekNum_StronglyTypedEnumDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Weekday.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Weekday.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Weekday.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Weekday.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Weekday_StronglyTypedEnum.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Weekday_StronglyTypedEnum.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Weekday_StronglyTypedEnum.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Weekday_StronglyTypedEnum.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Weekday_StronglyTypedEnumDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Weekday_StronglyTypedEnumDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/Weekday_StronglyTypedEnumDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/Weekday_StronglyTypedEnumDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With_Decimal.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With_Decimal.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With_Decimal.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With_Decimal.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With_Float.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With_Float.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With_Float.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With_Float.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/With_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/With_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/arithmetic.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/arithmetic.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/arithmetic.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/arithmetic.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inScalar.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inScalar.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inScalar.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inScalar.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inScalar_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inScalar_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inScalar_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inScalar_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inScalar_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inScalar_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inScalar_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inScalar_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inTable.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inTable.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inTable.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inTable.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inTable_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inTable_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inTable_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inTable_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inTable_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inTable_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/inTable_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/inTable_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/literals.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/literals.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/literals.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/literals.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/mathfuncs.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/mathfuncs.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/mathfuncs.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/mathfuncs.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/string.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/string.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/string.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/string.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/switch.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/switch.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/switch.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/switch.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/switch_V1Compat.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/switch_V1Compat.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/switch_V1Compat.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/switch_V1Compat.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/switch_V1CompatDisabled.txt b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/switch_V1CompatDisabled.txt
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestCases/switch_V1CompatDisabled.txt
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestCases/switch_V1CompatDisabled.txt
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestHelpers/BaseRunner.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestHelpers/BaseRunner.cs
similarity index 99%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestHelpers/BaseRunner.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestHelpers/BaseRunner.cs
index 42cfcb4a1..00d7b40b7 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestHelpers/BaseRunner.cs
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestHelpers/BaseRunner.cs
@@ -4,10 +4,10 @@
using System;
using System.Diagnostics;
using System.Linq;
-using System.Text;
+using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
using Microsoft.PowerFx.Types;
namespace Microsoft.PowerFx.Core.Tests
@@ -82,21 +82,21 @@ namespace Microsoft.PowerFx.Core.Tests
/// Maximum time to run test - this catches potential hangs in the engine.
/// Any test should easily run in under 1s.
///
- public static TimeSpan Timeout = TimeSpan.FromSeconds(20);
-
+ public static TimeSpan Timeout = TimeSpan.FromSeconds(20);
+
///
/// Should the NumberIsFloat parser flag be in effect.
- ///
+ ///
public bool NumberIsFloat { get; set; }
///
/// What base Features should be enabled, before adding file level #SETUP and #DISABLE.
- ///
- public Features Features = Features.None;
-
- ///
- /// Logger action.
- ///
+ ///
+ public Features Features = Features.None;
+
+ ///
+ /// Logger action.
+ ///
public Action Log = null;
///
@@ -184,7 +184,7 @@ namespace Microsoft.PowerFx.Core.Tests
FormulaValue originalResult = null;
var expected = testCase.Expected;
-
+
var expectedSkip = Regex.Match(expected, "^\\s*\\#skip", RegexOptions.IgnoreCase).Success;
if (expectedSkip)
{
@@ -196,7 +196,7 @@ namespace Microsoft.PowerFx.Core.Tests
{
runResult = await RunAsyncInternal(testCase.Input, testCase.SetupHandlerName).ConfigureAwait(false);
result = runResult.Value;
- originalResult = runResult.OriginalValue;
+ originalResult = runResult.OriginalValue;
// Unsupported is just for ignoring large groups of inherited tests.
// If it's an override, then the override should specify the exact error.
@@ -213,26 +213,26 @@ namespace Microsoft.PowerFx.Core.Tests
// Errors: Error 15-16: Incompatible types for comparison. These types can't be compared: UntypedObject, UntypedObject.
var expectedCompilerError = expected.StartsWith("Errors: Error") || expected.StartsWith("Errors: Warning"); // $$$ Match error message.
if (expectedCompilerError)
- {
- string[] expectedStrArr = expected.Replace("Errors: ", string.Empty).Split("|");
- string[] actualStrArr = runResult.Errors.Select(err => err.ToString()).ToArray();
- bool isValid = true;
+ {
+ string[] expectedStrArr = expected.Replace("Errors: ", string.Empty).Split("|");
+ string[] actualStrArr = runResult.Errors.Select(err => err.ToString()).ToArray();
+ bool isValid = true;
+
+ // Try both unaltered comparison and by replacing Decimal with Number for errors,
+ // for tests that are run with and without NumberIsFloat set.
+ foreach (var exp in expectedStrArr)
+ {
+ if (!actualStrArr.Contains(exp) &&
+ !(NumberIsFloat && actualStrArr.Contains(Regex.Replace(exp, "(? = "NumberIsFloat" was specified
- // = "disable:NumberIsFloat" was specified
- //
- // Use "Default" for all settings not explicilty called out. Without Default, if a setting is not
- // specified, the test can be run with or without the setting.
- //
- // Setting strings are validated by here. Any of these are possible choices:
- // * Engine.Features, determined through reflection
- // * TexlParser.Flags, determined through reflection
- // * Default, special case
- // * PowerFxV1, special case, will expand to its constituent Features
- // * Other handlers listed in this routine
- public static Dictionary ParseSetupString(string setup)
- {
- var settings = new Dictionary();
- var possible = new HashSet();
- var powerFxV1 = new Dictionary();
-
- // Features
- foreach (var featureProperty in typeof(Features).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
- {
- if (featureProperty.PropertyType == typeof(bool) && featureProperty.CanWrite)
- {
- possible.Add(featureProperty.Name);
- if ((bool)featureProperty.GetValue(Features.PowerFxV1))
- {
- powerFxV1.Add(featureProperty.Name, true);
- }
- }
- }
-
- // Parser Flags
- foreach (var parserFlag in System.Enum.GetValues(typeof(TexlParser.Flags)))
- {
- possible.Add(parserFlag.ToString());
- }
-
- possible.Add("AllEnumsSetup");
- possible.Add("AllEnumsPlusTestEnumsSetup");
- possible.Add("AsyncTestSetup");
- possible.Add("Blob");
- possible.Add("DecimalSupport");
- possible.Add("Default");
- possible.Add("DisableMemChecks");
- possible.Add("EnableJsonFunctions");
- possible.Add("MutationFunctionsTestSetup");
- possible.Add("OptionSetSortTestSetup");
- possible.Add("OptionSetTestSetup");
+ public string TestRoot { get; set; } = GetDefaultTestDir();
+
+ // Parses a comma delimited setup string, as found in TxtFileDataAttributes and the start of .txt files,
+ // into a dictionary for passing to AddDir, AddFile, etc. This routine is used both to determine what
+ // the current testing context supports (with TxtFileDataAtrributes) and what a given .txt file requires
+ // (with AddFile). These two dictionaries must be compatible and not contradict for a test to run.
+ //
+ // Dictionary contents, with NumberIsFloat as an example:
+ // = "NumberIsFloat" was specified
+ // = "disable:NumberIsFloat" was specified
+ //
+ // Use "Default" for all settings not explicilty called out. Without Default, if a setting is not
+ // specified, the test can be run with or without the setting.
+ //
+ // Setting strings are validated by here. Any of these are possible choices:
+ // * Engine.Features, determined through reflection
+ // * TexlParser.Flags, determined through reflection
+ // * Default, special case
+ // * PowerFxV1, special case, will expand to its constituent Features
+ // * Other handlers listed in this routine
+ public static Dictionary ParseSetupString(string setup)
+ {
+ var settings = new Dictionary();
+ var possible = new HashSet();
+ var powerFxV1 = new Dictionary();
+
+ // Features
+ foreach (var featureProperty in typeof(Features).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
+ {
+ if (featureProperty.PropertyType == typeof(bool) && featureProperty.CanWrite)
+ {
+ possible.Add(featureProperty.Name);
+ if ((bool)featureProperty.GetValue(Features.PowerFxV1))
+ {
+ powerFxV1.Add(featureProperty.Name, true);
+ }
+ }
+ }
+
+ // Parser Flags
+ foreach (var parserFlag in System.Enum.GetValues(typeof(TexlParser.Flags)))
+ {
+ possible.Add(parserFlag.ToString());
+ }
+
+ possible.Add("AllEnumsSetup");
+ possible.Add("AllEnumsPlusTestEnumsSetup");
+ possible.Add("AsyncTestSetup");
+ possible.Add("Blob");
+ possible.Add("DecimalSupport");
+ possible.Add("Default");
+ possible.Add("DisableMemChecks");
+ possible.Add("EnableJsonFunctions");
+ possible.Add("MutationFunctionsTestSetup");
+ possible.Add("OptionSetSortTestSetup");
+ possible.Add("OptionSetTestSetup");
possible.Add("PowerFxV1");
possible.Add("RegEx");
- possible.Add("TimeZoneInfo");
+ possible.Add("TimeZoneInfo");
possible.Add("TraceSetup");
-
- foreach (Match match in Regex.Matches(setup, @"(disable:)?(([\w]+|//)(\([^\)]*\))?)"))
- {
- bool enabled = !(match.Groups[1].Value == "disable:");
- var name = match.Groups[3].Value;
- var complete = match.Groups[2].Value;
-
- // end of line comment on settings string
- if (name == "//")
- {
- break;
- }
-
- if (!possible.Contains(name))
- {
- throw new ArgumentException($"Setup string not found: {name} from \"{setup}\"");
- }
-
- settings.Add(complete, enabled);
-
- if (match.Groups[2].Value == "PowerFxV1")
- {
- foreach (var pfx1Feature in powerFxV1)
- {
- settings.Add(pfx1Feature.Key, true);
- }
- }
- }
-
- return settings;
+
+ foreach (Match match in Regex.Matches(setup, @"(disable:)?(([\w]+|//)(\([^\)]*\))?)"))
+ {
+ bool enabled = !(match.Groups[1].Value == "disable:");
+ var name = match.Groups[3].Value;
+ var complete = match.Groups[2].Value;
+
+ // end of line comment on settings string
+ if (name == "//")
+ {
+ break;
+ }
+
+ if (!possible.Contains(name))
+ {
+ throw new ArgumentException($"Setup string not found: {name} from \"{setup}\"");
+ }
+
+ settings.Add(complete, enabled);
+
+ if (match.Groups[2].Value == "PowerFxV1")
+ {
+ foreach (var pfx1Feature in powerFxV1)
+ {
+ settings.Add(pfx1Feature.Key, true);
+ }
+ }
+ }
+
+ return settings;
}
public void AddDir(Dictionary setup, string directory = "")
@@ -158,23 +158,23 @@ namespace Microsoft.PowerFx.Core.Tests
// Directive should start with #, end in : like "#SETUP:"
// Returns true if matched; false if not. Throws on error.
private static bool TryParseDirective(string line, string directive, out string param)
- {
+ {
if (line.StartsWith(directive, StringComparison.OrdinalIgnoreCase))
- {
- param = line.Substring(directive.Length).Trim();
-
- // strip any end of line comment
- if (param.Contains("//"))
- {
- param = param.Substring(0, param.IndexOf("//"));
- }
-
+ {
+ param = line.Substring(directive.Length).Trim();
+
+ // strip any end of line comment
+ if (param.Contains("//"))
+ {
+ param = param.Substring(0, param.IndexOf("//"));
+ }
+
return true;
- }
- else
- {
- param = null;
- return false;
+ }
+ else
+ {
+ param = null;
+ return false;
}
}
@@ -191,10 +191,10 @@ namespace Microsoft.PowerFx.Core.Tests
Exception ParseError(int lineNumber, string message) => new InvalidOperationException(
$"{Path.GetFileName(thisFile)} {lineNumber}: {message}");
- TestCase test = null;
-
- string fileSetup = null;
- string fileOveride = null;
+ TestCase test = null;
+
+ string fileSetup = null;
+ string fileOveride = null;
Dictionary fileSetupDict = new Dictionary();
var i = -1;
@@ -218,29 +218,29 @@ namespace Microsoft.PowerFx.Core.Tests
// Can apply to multiple files.
var countRemoved = Tests.RemoveAll(test => string.Equals(Path.GetFileName(test.SourceFile), fileDisable, StringComparison.OrdinalIgnoreCase));
}
- else if (TryParseDirective(line, "#SETUP:", out var thisSetup))
- {
- foreach (var flag in ParseSetupString(thisSetup))
- {
- if (fileSetupDict.ContainsKey(flag.Key) && fileSetupDict[flag.Key] != flag.Value)
- {
- // Multiple setup lines are fine, but can't contradict.
- // ParseSetupString may expand aggregate handlers, such as PowerFxV1, which may create unexpected contradictions.
- throw new InvalidOperationException($"Duplicate and contradictory #SETUP directives: {line} {(flag.Value ? string.Empty : "disable:")}{flag.Key}");
- }
- else
- {
- fileSetupDict.Add(flag.Key, flag.Value);
- }
- }
+ else if (TryParseDirective(line, "#SETUP:", out var thisSetup))
+ {
+ foreach (var flag in ParseSetupString(thisSetup))
+ {
+ if (fileSetupDict.ContainsKey(flag.Key) && fileSetupDict[flag.Key] != flag.Value)
+ {
+ // Multiple setup lines are fine, but can't contradict.
+ // ParseSetupString may expand aggregate handlers, such as PowerFxV1, which may create unexpected contradictions.
+ throw new InvalidOperationException($"Duplicate and contradictory #SETUP directives: {line} {(flag.Value ? string.Empty : "disable:")}{flag.Key}");
+ }
+ else
+ {
+ fileSetupDict.Add(flag.Key, flag.Value);
+ }
+ }
}
else if (TryParseDirective(line, "#OVERRIDE:", out var thisOveride))
- {
- if (fileOveride != null)
- {
- throw new InvalidOperationException($"Can't have multiple #OVERRIDE: directives");
- }
-
+ {
+ if (fileOveride != null)
+ {
+ throw new InvalidOperationException($"Can't have multiple #OVERRIDE: directives");
+ }
+
fileOveride = thisOveride;
}
else
@@ -253,20 +253,20 @@ namespace Microsoft.PowerFx.Core.Tests
}
break;
- }
-
- // If the test is incompatible with the base setup, skip it.
- // It is OK for the test to turn on handlers and features that don't conflict.
- foreach (var flag in fileSetupDict)
- {
- if ((setup.ContainsKey(flag.Key) && flag.Value != setup[flag.Key]) ||
- (!setup.ContainsKey(flag.Key) && setup.ContainsKey("Default") && flag.Value != setup["Default"]))
- {
- return;
- }
- }
-
- fileSetup = string.Join(",", fileSetupDict.Select(i => (i.Value ? string.Empty : "disable:") + i.Key));
+ }
+
+ // If the test is incompatible with the base setup, skip it.
+ // It is OK for the test to turn on handlers and features that don't conflict.
+ foreach (var flag in fileSetupDict)
+ {
+ if ((setup.ContainsKey(flag.Key) && flag.Value != setup[flag.Key]) ||
+ (!setup.ContainsKey(flag.Key) && setup.ContainsKey("Default") && flag.Value != setup["Default"]))
+ {
+ return;
+ }
+ }
+
+ fileSetup = string.Join(",", fileSetupDict.Select(i => (i.Value ? string.Empty : "disable:") + i.Key));
List duplicateTests = new List();
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestHelpers/TestRunnerSummary.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestHelpers/TestRunnerSummary.cs
similarity index 100%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestHelpers/TestRunnerSummary.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestHelpers/TestRunnerSummary.cs
diff --git a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestHelpers/TxtFileDataAttribute.cs b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestHelpers/TxtFileDataAttribute.cs
similarity index 99%
rename from src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestHelpers/TxtFileDataAttribute.cs
rename to src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestHelpers/TxtFileDataAttribute.cs
index 5799b9c5d..00b5516f7 100644
--- a/src/tests/Microsoft.PowerFx.Core.Tests/ExpressionTestHelpers/TxtFileDataAttribute.cs
+++ b/src/tests/Microsoft.PowerFx.Core.Tests.Shared/ExpressionTestHelpers/TxtFileDataAttribute.cs
@@ -6,10 +6,10 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
-using System.Text.RegularExpressions;
-using Microsoft.PowerFx.Core.Parser;
-using Microsoft.PowerFx.Core.Utils;
-using Microsoft.PowerFx.Types;
+using System.Text.RegularExpressions;
+using Microsoft.PowerFx.Core.Parser;
+using Microsoft.PowerFx.Core.Utils;
+using Microsoft.PowerFx.Types;
using Xunit.Sdk;
namespace Microsoft.PowerFx.Core.Tests
@@ -24,17 +24,17 @@ namespace Microsoft.PowerFx.Core.Tests
{
private readonly string _filePathCommon;
private readonly string _filePathSpecific;
- private readonly string _engineName;
- private readonly Dictionary _setup;
+ private readonly string _engineName;
+ private readonly Dictionary _setup;
public TxtFileDataAttribute(string filePathCommon, string filePathSpecific, string engineName, string setup)
{
_filePathCommon = filePathCommon;
_filePathSpecific = filePathSpecific;
- _engineName = engineName;
+ _engineName = engineName;
_setup = TestRunner.ParseSetupString(setup);
- }
-
+ }
+
public override IEnumerable