diff --git a/tests/FSharp.Data.Core.Tests/FSharp.Data.Core.Tests.fsproj b/tests/FSharp.Data.Core.Tests/FSharp.Data.Core.Tests.fsproj index 94f0b2e9b..f27aa7ec5 100644 --- a/tests/FSharp.Data.Core.Tests/FSharp.Data.Core.Tests.fsproj +++ b/tests/FSharp.Data.Core.Tests/FSharp.Data.Core.Tests.fsproj @@ -41,6 +41,7 @@ + diff --git a/tests/FSharp.Data.Core.Tests/InferenceEngines.fs b/tests/FSharp.Data.Core.Tests/InferenceEngines.fs new file mode 100644 index 000000000..967083542 --- /dev/null +++ b/tests/FSharp.Data.Core.Tests/InferenceEngines.fs @@ -0,0 +1,208 @@ +module FSharp.Data.Tests.InferenceEngines + +open NUnit.Framework +open FsUnit +open System +open System.Globalization +open System.Xml.Linq +open System.Reflection +open FSharp.Data +open FSharp.Data.Runtime +open FSharp.Data.Runtime.StructuralTypes +open FSharp.Data.Runtime.StructuralInference + +// Test JsonInference functionality through reflection since it's an internal module +[] +let ``JsonInference.inferType handles null values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + jsonInferenceModule |> should not' (be null) + + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + inferTypeMethod |> should not' (be null) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonNull = JsonValue.Null + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonNull |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles boolean values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonBool = JsonValue.Boolean true + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonBool |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles string values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonString = JsonValue.String "hello" + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonString |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles integer number values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonNumber = JsonValue.Number 42M + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonNumber |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles decimal number values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonNumber = JsonValue.Number 42.5M + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonNumber |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles float values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonFloat = JsonValue.Float 3.14 + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonFloat |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles Bit0 special case correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonZero = JsonValue.Number 0M + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonZero |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles Bit1 special case correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonOne = JsonValue.Number 1M + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonOne |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles array values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonArray = JsonValue.Array [| JsonValue.Number 1M; JsonValue.Number 2M |] + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonArray |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles record values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonRecord = JsonValue.Record [| ("name", JsonValue.String "John"); ("age", JsonValue.Number 30M) |] + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonRecord |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles NoInference mode correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.NoInference + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let jsonNumber = JsonValue.Number 0M // Should not infer Bit0 in NoInference mode + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; jsonNumber |]) + result |> should not' (be null) + +[] +let ``JsonInference.inferType handles large integer values correctly`` () = + let jsonInferenceModule = + typeof.Assembly.GetType("ProviderImplementation.JsonInference") + let inferTypeMethod = + jsonInferenceModule.GetMethod("inferType", BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.NonPublic) + + let unitsOfMeasureProvider = null + let inferenceMode = InferenceMode'.ValuesOnly + let cultureInfo = CultureInfo.InvariantCulture + let parentName = "test" + let largeNumber = JsonValue.Number (decimal Int64.MaxValue) + + let result = inferTypeMethod.Invoke(null, [| unitsOfMeasureProvider; inferenceMode; cultureInfo; parentName; largeNumber |]) + result |> should not' (be null) \ No newline at end of file