Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

223 lines
7.6 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Dynamic;
using System.Linq.Expressions;
using System.Reflection;
namespace System.Json
{
public static class AnyInstance
{
public const bool AnyBool = true;
public const string AnyString = "hello";
public const string AnyString2 = "world";
public const char AnyChar = 'c';
public const int AnyInt = 123456789;
[CLSCompliant(false)]
public const uint AnyUInt = 3123456789;
public const long AnyLong = 123456789012345L;
[CLSCompliant(false)]
public const ulong AnyULong = UInt64.MaxValue;
public const short AnyShort = -12345;
[CLSCompliant(false)]
public const ushort AnyUShort = 40000;
public const byte AnyByte = 0xDC;
[CLSCompliant(false)]
public const sbyte AnySByte = -34;
public const double AnyDouble = 123.45;
public const float AnyFloat = 23.4f;
public const decimal AnyDecimal = 1234.5678m;
public static readonly Guid AnyGuid = new Guid(0x11223344, 0x5566, 0x7788, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00);
public static readonly DateTime AnyDateTime = new DateTime(2010, 02, 15, 22, 45, 20, DateTimeKind.Utc);
public static readonly DateTimeOffset AnyDateTimeOffset = new DateTimeOffset(2010, 2, 5, 15, 45, 20, TimeSpan.FromHours(-3));
public static readonly Uri AnyUri = new Uri("http://tempuri.org/");
public static readonly JsonArray AnyJsonArray;
public static readonly JsonObject AnyJsonObject;
public static readonly JsonPrimitive AnyJsonPrimitive = new JsonPrimitive("hello");
public static readonly JsonValue AnyJsonValue1 = AnyJsonPrimitive;
public static readonly JsonValue AnyJsonValue2;
public static readonly JsonValue AnyJsonValue3 = null;
public static readonly JsonValue DefaultJsonValue = GetDefaultJsonValue();
public static readonly Person AnyPerson = Person.CreateSample();
public static readonly Address AnyAddress = Address.CreateSample();
public static readonly dynamic AnyDynamic = TestDynamicObject.CreatePersonAsDynamic(AnyPerson);
public static JsonValue[] AnyJsonValueArray
{
get
{
return new JsonValue[]
{
AnyInstance.AnyJsonArray,
AnyInstance.AnyJsonObject,
AnyInstance.AnyJsonPrimitive,
AnyInstance.DefaultJsonValue
};
}
}
static AnyInstance()
{
AnyJsonArray = new JsonArray { 1, 2, 3 };
AnyJsonObject = new JsonObject { { "one", 1 }, { "two", 2 } };
AnyJsonArray.Changing += new EventHandler<JsonValueChangeEventArgs>(PreventChanging);
AnyJsonObject.Changing += new EventHandler<JsonValueChangeEventArgs>(PreventChanging);
AnyJsonValue2 = AnyJsonArray;
}
private static void PreventChanging(object sender, JsonValueChangeEventArgs e)
{
throw new InvalidOperationException("AnyInstance.AnyJsonArray or AnyJsonObject cannot be modified; please clone the instance if the test needs to change it.");
}
private static JsonValue GetDefaultJsonValue()
{
PropertyInfo propInfo = typeof(JsonValue).GetProperty("DefaultInstance", BindingFlags.Static | BindingFlags.NonPublic);
return propInfo.GetValue(null, null) as JsonValue;
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Address Address { get; set; }
public List<Person> Friends { get; set; }
public static Person CreateSample()
{
Person anyObject = new Person
{
Name = AnyInstance.AnyString,
Age = AnyInstance.AnyInt,
Address = Address.CreateSample(),
Friends = new List<Person> { new Person { Name = "Bill Gates", Age = 23, Address = Address.CreateSample() }, new Person { Name = "Steve Ballmer", Age = 19, Address = Address.CreateSample() } }
};
return anyObject;
}
public string FriendsToString()
{
string s = "";
if (this.Friends != null)
{
foreach (Person p in this.Friends)
{
s += p + ",";
}
}
return s;
}
public override string ToString()
{
return String.Format("{0}, {1}, [{2}], Friends=[{3}]", this.Name, this.Age, this.Address, this.FriendsToString());
}
}
public class Address
{
public const string AnyStreet = "123 1st Ave";
public const string AnyCity = "Springfield";
public const string AnyState = "ZZ";
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public static Address CreateSample()
{
Address address = new Address
{
Street = AnyStreet,
City = AnyCity,
State = AnyState,
};
return address;
}
public override string ToString()
{
return String.Format("{0}, {1}, {2}", this.Street, this.City, this.State);
}
}
public class TestDynamicObject : DynamicObject
{
private IDictionary<string, object> _values = new Dictionary<string, object>();
public bool UseFallbackMethod { get; set; }
public bool UseErrorSuggestion { get; set; }
public string TestProperty { get; set; }
public override IEnumerable<string> GetDynamicMemberNames()
{
return _values.Keys;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_values[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
if (this.UseFallbackMethod)
{
DynamicMetaObject target = new DynamicMetaObject(Expression.Parameter(this.GetType()), BindingRestrictions.Empty);
DynamicMetaObject errorSuggestion = null;
if (this.UseErrorSuggestion)
{
errorSuggestion = new DynamicMetaObject(Expression.Throw(Expression.Constant(new TestDynamicObjectException())), BindingRestrictions.Empty);
}
DynamicMetaObject metaObj = binder.FallbackGetMember(target, errorSuggestion);
Expression<Action> lambda = Expression.Lambda<Action>(metaObj.Expression, new ParameterExpression[] { });
lambda.Compile().Invoke();
}
return _values.TryGetValue(binder.Name, out result);
}
public static dynamic CreatePersonAsDynamic(Person person)
{
dynamic dynObj = new TestDynamicObject();
dynObj.Name = person.Name;
dynObj.Age = person.Age;
dynObj.Address = new Address();
dynObj.Address.City = person.Address.City;
dynObj.Address.Street = person.Address.Street;
dynObj.Address.State = person.Address.State;
dynObj.Friends = person.Friends;
return dynObj;
}
public class TestDynamicObjectException : Exception
{
}
}
}