using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Xunit; namespace Microsoft.AspNetCore.Blazor.Browser.Interop { public class JavaScriptInvokeTests { public static TheoryData ResolveMethodPropertyData { get { var result = new TheoryData(); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidParameterless))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithOneParameter))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithTwoParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithThreeParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithFourParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithFiveParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithSixParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithSevenParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithEightParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.ReturnArray))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoOneParameter))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoTwoParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoThreeParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoFourParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoFiveParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoSixParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoSevenParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoEightParameters))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidParameterlessAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithOneParameterAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithTwoParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithThreeParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithFourParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithFiveParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithSixParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithSevenParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.VoidWithEightParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.ReturnArrayAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoOneParameterAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoTwoParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoThreeParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoFourParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoFiveParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoSixParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoSevenParametersAsync))); result.Add(CreateMethodOptions(nameof(JavaScriptInterop.EchoEightParametersAsync))); return result; MethodInvocationOptions CreateMethodOptions(string methodName) => new MethodInvocationOptions { Type = new TypeIdentifier { Assembly = typeof(JavaScriptInterop).Assembly.GetName().Name, Name = typeof(JavaScriptInterop).FullName }, Method = new MethodIdentifier { Name = methodName } }; } } [Theory] [MemberData(nameof(ResolveMethodPropertyData))] public void ResolveMethod(object optionsObject) { var options = optionsObject as MethodInvocationOptions; var resolvedMethod = options.GetMethodOrThrow(); Assert.NotNull(resolvedMethod); Assert.Equal(options.Method.Name, resolvedMethod.Name); } } internal class JavaScriptInterop { public static IDictionary Invocations = new Dictionary(); public static void VoidParameterless() { Invocations[nameof(VoidParameterless)] = new object[0]; } public static void VoidWithOneParameter(ComplexParameter parameter1) { Invocations[nameof(VoidWithOneParameter)] = new object[] { parameter1 }; } public static void VoidWithTwoParameters( ComplexParameter parameter1, byte parameter2) { Invocations[nameof(VoidWithTwoParameters)] = new object[] { parameter1, parameter2 }; } public static void VoidWithThreeParameters( ComplexParameter parameter1, byte parameter2, short parameter3) { Invocations[nameof(VoidWithThreeParameters)] = new object[] { parameter1, parameter2, parameter3 }; } public static void VoidWithFourParameters( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4) { Invocations[nameof(VoidWithFourParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4 }; } public static void VoidWithFiveParameters( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5) { Invocations[nameof(VoidWithFiveParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4, parameter5 }; } public static void VoidWithSixParameters( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6) { Invocations[nameof(VoidWithSixParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6 }; } public static void VoidWithSevenParameters( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6, List parameter7) { Invocations[nameof(VoidWithSevenParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7 }; } public static void VoidWithEightParameters( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6, List parameter7, Segment parameter8) { Invocations[nameof(VoidWithEightParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8 }; } public static decimal[] ReturnArray() { return new decimal[] { 0.1M, 0.2M }; } public static object[] EchoOneParameter(ComplexParameter parameter1) { return new object[] { parameter1 }; } public static object[] EchoTwoParameters( ComplexParameter parameter1, byte parameter2) { return new object[] { parameter1, parameter2 }; } public static object[] EchoThreeParameters( ComplexParameter parameter1, byte parameter2, short parameter3) { return new object[] { parameter1, parameter2, parameter3 }; } public static object[] EchoFourParameters( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4) { return new object[] { parameter1, parameter2, parameter3, parameter4 }; } public static object[] EchoFiveParameters( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5) { return new object[] { parameter1, parameter2, parameter3, parameter4, parameter5 }; } public static object[] EchoSixParameters(ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6) { return new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6 }; } public static object[] EchoSevenParameters(ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6, List parameter7) { return new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7 }; } public static object[] EchoEightParameters( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6, List parameter7, Segment parameter8) { return new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8 }; } public static Task VoidParameterlessAsync() { Invocations[nameof(VoidParameterlessAsync)] = new object[0]; return Task.CompletedTask; } public static Task VoidWithOneParameterAsync(ComplexParameter parameter1) { Invocations[nameof(VoidParameterless)] = new object[] { parameter1 }; return Task.CompletedTask; } public static Task VoidWithTwoParametersAsync( ComplexParameter parameter1, byte parameter2) { Invocations[nameof(VoidParameterless)] = new object[] { parameter1, parameter2 }; return Task.CompletedTask; } public static Task VoidWithThreeParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3) { Invocations[nameof(VoidWithThreeParameters)] = new object[] { parameter1, parameter2, parameter3 }; return Task.CompletedTask; } public static Task VoidWithFourParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4) { Invocations[nameof(VoidWithFourParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4 }; return Task.CompletedTask; } public static Task VoidWithFiveParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5) { Invocations[nameof(VoidWithFiveParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4, parameter5 }; return Task.CompletedTask; } public static Task VoidWithSixParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6) { Invocations[nameof(VoidWithSixParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6 }; return Task.CompletedTask; } public static Task VoidWithSevenParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6, List parameter7) { Invocations[nameof(VoidWithSevenParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7 }; return Task.CompletedTask; } public static Task VoidWithEightParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6, List parameter7, Segment parameter8) { Invocations[nameof(VoidWithEightParameters)] = new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8 }; return Task.CompletedTask; } public static Task ReturnArrayAsync() { return Task.FromResult(new decimal[] { 0.1M, 0.2M }); } public static Task EchoOneParameterAsync(ComplexParameter parameter1) { return Task.FromResult(new object[] { parameter1 }); } public static Task EchoTwoParametersAsync( ComplexParameter parameter1, byte parameter2) { return Task.FromResult(new object[] { parameter1, parameter2 }); } public static Task EchoThreeParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3) { return Task.FromResult(new object[] { parameter1, parameter2, parameter3 }); } public static Task EchoFourParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4) { return Task.FromResult(new object[] { parameter1, parameter2, parameter3, parameter4 }); } public static Task EchoFiveParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5) { return Task.FromResult(new object[] { parameter1, parameter2, parameter3, parameter4, parameter5 }); } public static Task EchoSixParametersAsync(ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6) { return Task.FromResult(new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6 }); } public static Task EchoSevenParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6, List parameter7) { return Task.FromResult(new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7 }); } public static Task EchoEightParametersAsync( ComplexParameter parameter1, byte parameter2, short parameter3, int parameter4, long parameter5, float parameter6, List parameter7, Segment parameter8) { return Task.FromResult(new object[] { parameter1, parameter2, parameter3, parameter4, parameter5, parameter6, parameter7, parameter8 }); } } public struct Segment { public string Source { get; set; } public int Start { get; set; } public int Length { get; set; } } public class ComplexParameter { public int Id { get; set; } public bool IsValid { get; set; } public Segment Data { get; set; } } }