// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using System;
using System.Collections.Generic;
using System.Globalization;
namespace Microsoft.ClearScript.Test
{
public sealed class TestObject : BaseTestObject, ITestInterface, IExplicitTestInterface
{
public int[] Field;
public short ScalarField;
public TestEnum EnumField;
public TimeSpan StructField;
public int[] Property { get; set; }
public short ScalarProperty { get; set; }
public TestEnum EnumProperty { get; set; }
public TimeSpan StructProperty { get; set; }
public byte ReadOnlyProperty => 123;
public event EventHandler Event;
public void FireEvent(short arg)
{
Event?.Invoke(this, new TestEventArgs { Arg = arg });
}
public double Method(string arg1, int arg2)
{
return TestUtil.CalcTestValue(new Guid("f5b75d68-253b-4597-9464-8574f74750f5"), this, arg1.Length, arg2);
}
public double Method(string arg1, int arg2, T arg3) where T : struct
{
return TestUtil.CalcTestValue(new Guid("823eeeea-48b3-4650-ba3c-077e47622b57"), this, arg1.Length, arg2, arg3.ToString().Length);
}
public double Method(int arg) where T : struct
{
return TestUtil.CalcTestValue(new Guid("ef3fafb5-680b-40ba-b9be-a0bb5ea0cba4"), this, typeof(T).Name.Length, arg);
}
public double BindTestMethod(T arg)
{
return TestUtil.CalcTestValue(new Guid("06407870-c4dc-40f8-95ec-8d743c77c8b2"), this, typeof(T), arg);
}
private readonly Dictionary dict = new Dictionary();
public object this[string key]
{
get => dict[key];
set => dict[key] = value;
}
public object this[int index]
{
get => dict[index.ToString(CultureInfo.InvariantCulture)];
set => dict[index.ToString(CultureInfo.InvariantCulture)] = value;
}
public object this[object i1, object i2, object i3, object i4]
{
get => dict[string.Join(":", i1, i2, i3, i4)];
set => dict[string.Join(":", i1, i2, i3, i4)] = value;
}
#region Implementation of ITestInterface
public int[] InterfaceProperty { get; set; }
public short InterfaceScalarProperty { get; set; }
public TestEnum InterfaceEnumProperty { get; set; }
public TimeSpan InterfaceStructProperty { get; set; }
public byte InterfaceReadOnlyProperty => 17;
public event EventHandler InterfaceEvent;
public void InterfaceFireEvent(short arg)
{
InterfaceEvent?.Invoke(this, new TestEventArgs { Arg = arg });
}
public double InterfaceMethod(string arg1, int arg2)
{
return TestUtil.CalcTestValue(new Guid("a545f94c-a791-47de-a292-b687fe6d0fc3"), this, arg1.Length, arg2);
}
public double InterfaceMethod(string arg1, int arg2, T arg3) where T : struct
{
return TestUtil.CalcTestValue(new Guid("216ef56a-aa88-46e2-93d9-bc5153ad2c9e"), this, arg1.Length, arg2, arg3.ToString().Length);
}
public double InterfaceMethod(int arg) where T : struct
{
return TestUtil.CalcTestValue(new Guid("62a17d8c-2c9e-4dcd-b14f-c027c773c593"), this, typeof(T).Name.Length, arg);
}
public double InterfaceBindTestMethod(T arg)
{
return TestUtil.CalcTestValue(new Guid("43ce378d-5319-419c-bd62-908cd56dfd85"), this, typeof(T), arg);
}
#endregion
#region Implementation of IExplicitTestInterface
int[] IExplicitTestInterface.ExplicitInterfaceProperty { get; set; }
short IExplicitTestInterface.ExplicitInterfaceScalarProperty { get; set; }
TestEnum IExplicitTestInterface.ExplicitInterfaceEnumProperty { get; set; }
TimeSpan IExplicitTestInterface.ExplicitInterfaceStructProperty { get; set; }
byte IExplicitTestInterface.ExplicitInterfaceReadOnlyProperty => 17;
private event EventHandler ExplicitInterfaceEventImpl;
event EventHandler IExplicitTestInterface.ExplicitInterfaceEvent
{
add => ExplicitInterfaceEventImpl += value;
remove => ExplicitInterfaceEventImpl -= value;
}
void IExplicitTestInterface.ExplicitInterfaceFireEvent(short arg)
{
ExplicitInterfaceEventImpl?.Invoke(this, new TestEventArgs { Arg = arg });
}
double IExplicitTestInterface.ExplicitInterfaceMethod(string arg1, int arg2)
{
return TestUtil.CalcTestValue(new Guid("3f9634ff-d044-4ad5-96d7-bb2a42aa6aa5"), this, arg1.Length, arg2);
}
double IExplicitTestInterface.ExplicitInterfaceMethod(string arg1, int arg2, T arg3)
{
return TestUtil.CalcTestValue(new Guid("7b46c24f-8bfa-4fc6-ae57-fcb136f9332e"), this, arg1.Length, arg2, arg3.ToString().Length);
}
double IExplicitTestInterface.ExplicitInterfaceMethod(int arg)
{
return TestUtil.CalcTestValue(new Guid("d6aaecfe-952f-459b-9355-14a17cc66010"), this, typeof(T).Name.Length, arg);
}
double IExplicitTestInterface.ExplicitInterfaceBindTestMethod(T arg)
{
return TestUtil.CalcTestValue(new Guid("353d275f-aead-4f92-8035-1fd620a4a12e"), this, typeof(T), arg);
}
#endregion
}
public static class TestObjectExtensions
{
public static double ExtensionMethod(this TestObject self, string arg1, int arg2)
{
return TestUtil.CalcTestValue(new Guid("d78a86ce-310f-4d9e-bc3a-9f07dfa1d8e1"), self, arg1.Length, arg2);
}
public static double ExtensionMethod(this TestObject self, string arg1, int arg2, T arg3) where T : struct
{
return TestUtil.CalcTestValue(new Guid("b3fad7c5-69fa-49d6-829f-16beb738352d"), self, arg1.Length, arg2, arg3.ToString().Length);
}
public static double ExtensionMethod(this TestObject self, int arg) where T : struct
{
return TestUtil.CalcTestValue(new Guid("f1d7d8ec-998e-413c-9b65-06c396676a4b"), self, typeof(T).Name.Length, arg);
}
public static double ExtensionBindTestMethod(this TestObject self, T arg)
{
return TestUtil.CalcTestValue(new Guid("613ce819-bc84-41c3-a3d6-4efa9a2a3b65"), self, typeof(T), arg);
}
}
}