PageRenderTime 57ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/test/System.Json.Test.Unit/JsonPrimitiveTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 410 lines | 357 code | 50 blank | 3 comment | 1 complexity | 85caba7387d2a1048ae8692781fb051e MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Runtime.Serialization.Json;
  5. using System.Text;
  6. using Xunit;
  7. namespace System.Json
  8. {
  9. public class JsonPrimitiveTest
  10. {
  11. const string DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffK";
  12. [Fact]
  13. public void JsonPrimitiveConstructorTest()
  14. {
  15. Assert.Equal(AnyInstance.AnyString, (string)(new JsonPrimitive(AnyInstance.AnyString)));
  16. Assert.Equal(AnyInstance.AnyChar, (char)(new JsonPrimitive(AnyInstance.AnyChar)));
  17. Assert.Equal(AnyInstance.AnyUri, (Uri)(new JsonPrimitive(AnyInstance.AnyUri)));
  18. Assert.Equal(AnyInstance.AnyGuid, (Guid)(new JsonPrimitive(AnyInstance.AnyGuid)));
  19. Assert.Equal(AnyInstance.AnyDateTime, (DateTime)(new JsonPrimitive(AnyInstance.AnyDateTime)));
  20. Assert.Equal(AnyInstance.AnyDateTimeOffset, (DateTimeOffset)(new JsonPrimitive(AnyInstance.AnyDateTimeOffset)));
  21. Assert.Equal(AnyInstance.AnyBool, (bool)(new JsonPrimitive(AnyInstance.AnyBool)));
  22. Assert.Equal(AnyInstance.AnyByte, (byte)(new JsonPrimitive(AnyInstance.AnyByte)));
  23. Assert.Equal(AnyInstance.AnyShort, (short)(new JsonPrimitive(AnyInstance.AnyShort)));
  24. Assert.Equal(AnyInstance.AnyInt, (int)(new JsonPrimitive(AnyInstance.AnyInt)));
  25. Assert.Equal(AnyInstance.AnyLong, (long)(new JsonPrimitive(AnyInstance.AnyLong)));
  26. Assert.Equal(AnyInstance.AnySByte, (sbyte)(new JsonPrimitive(AnyInstance.AnySByte)));
  27. Assert.Equal(AnyInstance.AnyUShort, (ushort)(new JsonPrimitive(AnyInstance.AnyUShort)));
  28. Assert.Equal(AnyInstance.AnyUInt, (uint)(new JsonPrimitive(AnyInstance.AnyUInt)));
  29. Assert.Equal(AnyInstance.AnyULong, (ulong)(new JsonPrimitive(AnyInstance.AnyULong)));
  30. Assert.Equal(AnyInstance.AnyDecimal, (decimal)(new JsonPrimitive(AnyInstance.AnyDecimal)));
  31. Assert.Equal(AnyInstance.AnyFloat, (float)(new JsonPrimitive(AnyInstance.AnyFloat)));
  32. Assert.Equal(AnyInstance.AnyDouble, (double)(new JsonPrimitive(AnyInstance.AnyDouble)));
  33. }
  34. [Fact]
  35. public void ValueTest()
  36. {
  37. object[] values =
  38. {
  39. AnyInstance.AnyInt, AnyInstance.AnyString, AnyInstance.AnyGuid, AnyInstance.AnyDecimal, AnyInstance.AnyBool, AnyInstance.AnyDateTime
  40. };
  41. foreach (object value in values)
  42. {
  43. JsonPrimitive jp;
  44. bool success = JsonPrimitive.TryCreate(value, out jp);
  45. Assert.True(success);
  46. Assert.Equal(value, jp.Value);
  47. }
  48. }
  49. [Fact]
  50. public void TryCreateTest()
  51. {
  52. object[] numberValues =
  53. {
  54. AnyInstance.AnyByte, AnyInstance.AnySByte, AnyInstance.AnyShort, AnyInstance.AnyDecimal,
  55. AnyInstance.AnyDouble, AnyInstance.AnyShort, AnyInstance.AnyInt, AnyInstance.AnyLong,
  56. AnyInstance.AnyUShort, AnyInstance.AnyUInt, AnyInstance.AnyULong, AnyInstance.AnyFloat
  57. };
  58. object[] booleanValues =
  59. {
  60. true, false
  61. };
  62. object[] stringValues =
  63. {
  64. AnyInstance.AnyString, AnyInstance.AnyChar,
  65. AnyInstance.AnyDateTime, AnyInstance.AnyDateTimeOffset,
  66. AnyInstance.AnyGuid, AnyInstance.AnyUri
  67. };
  68. CheckValues(numberValues, JsonType.Number);
  69. CheckValues(booleanValues, JsonType.Boolean);
  70. CheckValues(stringValues, JsonType.String);
  71. }
  72. [Fact]
  73. public void TryCreateInvalidTest()
  74. {
  75. bool success;
  76. JsonPrimitive target;
  77. object[] values =
  78. {
  79. AnyInstance.AnyJsonArray, AnyInstance.AnyJsonObject, AnyInstance.AnyJsonPrimitive,
  80. null, AnyInstance.DefaultJsonValue, AnyInstance.AnyDynamic, AnyInstance.AnyAddress,
  81. AnyInstance.AnyPerson
  82. };
  83. foreach (object value in values)
  84. {
  85. success = JsonPrimitive.TryCreate(value, out target);
  86. Assert.False(success);
  87. Assert.Null(target);
  88. }
  89. }
  90. [Fact]
  91. public void NumberToNumberConversionTest()
  92. {
  93. long longValue;
  94. Assert.Equal((long)AnyInstance.AnyInt, (long)(new JsonPrimitive(AnyInstance.AnyInt)));
  95. Assert.Equal((long)AnyInstance.AnyUInt, (long)(new JsonPrimitive(AnyInstance.AnyUInt)));
  96. Assert.True(new JsonPrimitive(AnyInstance.AnyInt).TryReadAs<long>(out longValue));
  97. Assert.Equal((long)AnyInstance.AnyInt, longValue);
  98. int intValue;
  99. Assert.Equal((int)AnyInstance.AnyShort, (int)(new JsonPrimitive(AnyInstance.AnyShort)));
  100. Assert.Equal((int)AnyInstance.AnyUShort, (int)(new JsonPrimitive(AnyInstance.AnyUShort)));
  101. Assert.True(new JsonPrimitive(AnyInstance.AnyUShort).TryReadAs<int>(out intValue));
  102. Assert.Equal((int)AnyInstance.AnyUShort, intValue);
  103. short shortValue;
  104. Assert.Equal((short)AnyInstance.AnyByte, (short)(new JsonPrimitive(AnyInstance.AnyByte)));
  105. Assert.Equal((short)AnyInstance.AnySByte, (short)(new JsonPrimitive(AnyInstance.AnySByte)));
  106. Assert.True(new JsonPrimitive(AnyInstance.AnyByte).TryReadAs<short>(out shortValue));
  107. Assert.Equal((short)AnyInstance.AnyByte, shortValue);
  108. double dblValue;
  109. Assert.Equal((double)AnyInstance.AnyFloat, (double)(new JsonPrimitive(AnyInstance.AnyFloat)));
  110. Assert.Equal((double)AnyInstance.AnyDecimal, (double)(new JsonPrimitive(AnyInstance.AnyDecimal)));
  111. Assert.True(new JsonPrimitive(AnyInstance.AnyFloat).TryReadAs<double>(out dblValue));
  112. Assert.Equal((double)AnyInstance.AnyFloat, dblValue);
  113. ExceptionHelper.Throws<OverflowException>(delegate { int i = (int)(new JsonPrimitive(1L << 32)); });
  114. Assert.False(new JsonPrimitive(1L << 32).TryReadAs<int>(out intValue));
  115. Assert.Equal(default(int), intValue);
  116. byte byteValue;
  117. ExceptionHelper.Throws<OverflowException>(delegate { byte b = (byte)(new JsonPrimitive(1L << 32)); });
  118. ExceptionHelper.Throws<OverflowException>(delegate { byte b = (byte)(new JsonPrimitive(SByte.MinValue)); });
  119. Assert.False(new JsonPrimitive(SByte.MinValue).TryReadAs<byte>(out byteValue));
  120. Assert.Equal(default(byte), byteValue);
  121. }
  122. [Fact]
  123. public void NumberToStringConverstionTest()
  124. {
  125. Dictionary<string, JsonPrimitive> allNumbers = new Dictionary<string, JsonPrimitive>
  126. {
  127. { AnyInstance.AnyByte.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyByte) },
  128. { AnyInstance.AnySByte.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnySByte) },
  129. { AnyInstance.AnyShort.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyShort) },
  130. { AnyInstance.AnyUShort.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyUShort) },
  131. { AnyInstance.AnyInt.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyInt) },
  132. { AnyInstance.AnyUInt.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyUInt) },
  133. { AnyInstance.AnyLong.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyLong) },
  134. { AnyInstance.AnyULong.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyULong) },
  135. { AnyInstance.AnyDecimal.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyDecimal) },
  136. { AnyInstance.AnyDouble.ToString("R", CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyDouble) },
  137. { AnyInstance.AnyFloat.ToString("R", CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyFloat) },
  138. };
  139. foreach (string stringRepresentation in allNumbers.Keys)
  140. {
  141. JsonPrimitive jp = allNumbers[stringRepresentation];
  142. Assert.Equal(stringRepresentation, (string)jp);
  143. Assert.Equal(stringRepresentation, jp.ReadAs<string>());
  144. }
  145. }
  146. [Fact]
  147. public void NonNumberToStringConversionTest()
  148. {
  149. Dictionary<string, JsonPrimitive> allValues = new Dictionary<string, JsonPrimitive>
  150. {
  151. { new string(AnyInstance.AnyChar, 1), new JsonPrimitive(AnyInstance.AnyChar) },
  152. { AnyInstance.AnyBool.ToString(CultureInfo.InvariantCulture).ToLowerInvariant(), new JsonPrimitive(AnyInstance.AnyBool) },
  153. { AnyInstance.AnyGuid.ToString("D", CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyGuid) },
  154. { AnyInstance.AnyDateTime.ToString(DateTimeFormat, CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyDateTime) },
  155. { AnyInstance.AnyDateTimeOffset.ToString(DateTimeFormat, CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyDateTimeOffset) },
  156. };
  157. foreach (char escapedChar in "\r\n\t\u0000\uffff\u001f\\\"")
  158. {
  159. allValues.Add(new string(escapedChar, 1), new JsonPrimitive(escapedChar));
  160. }
  161. foreach (string stringRepresentation in allValues.Keys)
  162. {
  163. JsonPrimitive jp = allValues[stringRepresentation];
  164. Assert.Equal(stringRepresentation, (string)jp);
  165. Assert.Equal(stringRepresentation, jp.ReadAs<string>());
  166. }
  167. }
  168. [Fact]
  169. public void NonNumberToNumberConversionTest()
  170. {
  171. Assert.Equal(1, new JsonPrimitive('1').ReadAs<int>());
  172. Assert.Equal<byte>(AnyInstance.AnyByte, new JsonPrimitive(AnyInstance.AnyByte.ToString(CultureInfo.InvariantCulture)).ReadAs<byte>());
  173. Assert.Equal<sbyte>(AnyInstance.AnySByte, (sbyte)(new JsonPrimitive(AnyInstance.AnySByte.ToString(CultureInfo.InvariantCulture))));
  174. Assert.Equal<short>(AnyInstance.AnyShort, (short)(new JsonPrimitive(AnyInstance.AnyShort.ToString(CultureInfo.InvariantCulture))));
  175. Assert.Equal<ushort>(AnyInstance.AnyUShort, new JsonPrimitive(AnyInstance.AnyUShort.ToString(CultureInfo.InvariantCulture)).ReadAs<ushort>());
  176. Assert.Equal<int>(AnyInstance.AnyInt, new JsonPrimitive(AnyInstance.AnyInt.ToString(CultureInfo.InvariantCulture)).ReadAs<int>());
  177. Assert.Equal<uint>(AnyInstance.AnyUInt, (uint)(new JsonPrimitive(AnyInstance.AnyUInt.ToString(CultureInfo.InvariantCulture))));
  178. Assert.Equal<long>(AnyInstance.AnyLong, (long)(new JsonPrimitive(AnyInstance.AnyLong.ToString(CultureInfo.InvariantCulture))));
  179. Assert.Equal<ulong>(AnyInstance.AnyULong, new JsonPrimitive(AnyInstance.AnyULong.ToString(CultureInfo.InvariantCulture)).ReadAs<ulong>());
  180. Assert.Equal<decimal>(AnyInstance.AnyDecimal, (decimal)(new JsonPrimitive(AnyInstance.AnyDecimal.ToString(CultureInfo.InvariantCulture))));
  181. Assert.Equal<float>(AnyInstance.AnyFloat, new JsonPrimitive(AnyInstance.AnyFloat.ToString(CultureInfo.InvariantCulture)).ReadAs<float>());
  182. Assert.Equal<double>(AnyInstance.AnyDouble, (double)(new JsonPrimitive(AnyInstance.AnyDouble.ToString(CultureInfo.InvariantCulture))));
  183. Assert.Equal<byte>(Convert.ToByte(1.23, CultureInfo.InvariantCulture), new JsonPrimitive("1.23").ReadAs<byte>());
  184. Assert.Equal<int>(Convert.ToInt32(12345.6789, CultureInfo.InvariantCulture), new JsonPrimitive("12345.6789").ReadAs<int>());
  185. Assert.Equal<short>(Convert.ToInt16(1.23e2), (short)new JsonPrimitive("1.23e2"));
  186. Assert.Equal<float>(Convert.ToSingle(1.23e40), (float)new JsonPrimitive("1.23e40"));
  187. Assert.Equal<float>(Convert.ToSingle(1.23e-38), (float)new JsonPrimitive("1.23e-38"));
  188. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyBool).ReadAs<sbyte>(); });
  189. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyBool).ReadAs<short>(); });
  190. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyBool).ReadAs<uint>(); });
  191. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyBool).ReadAs<long>(); });
  192. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyBool).ReadAs<double>(); });
  193. ExceptionHelper.Throws<FormatException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyUri).ReadAs<int>(); });
  194. ExceptionHelper.Throws<FormatException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyDateTime).ReadAs<float>(); });
  195. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = (decimal)(new JsonPrimitive('c')); });
  196. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = (byte)(new JsonPrimitive("0xFF")); });
  197. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = (sbyte)(new JsonPrimitive(AnyInstance.AnyDateTimeOffset)); });
  198. ExceptionHelper.Throws<FormatException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyUri).ReadAs<uint>(); });
  199. ExceptionHelper.Throws<FormatException>(delegate { var n = new JsonPrimitive(AnyInstance.AnyDateTime).ReadAs<double>(); });
  200. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = (long)(new JsonPrimitive('c')); });
  201. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = (ulong)(new JsonPrimitive("0xFF")); });
  202. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = (short)(new JsonPrimitive(AnyInstance.AnyDateTimeOffset)); });
  203. ExceptionHelper.Throws<InvalidCastException>(delegate { var n = (ushort)(new JsonPrimitive('c')); });
  204. ExceptionHelper.Throws<OverflowException>(delegate { int i = (int)new JsonPrimitive((1L << 32).ToString(CultureInfo.InvariantCulture)); });
  205. ExceptionHelper.Throws<OverflowException>(delegate { byte b = (byte)new JsonPrimitive("-1"); });
  206. }
  207. [Fact]
  208. public void StringToNonNumberConversionTest()
  209. {
  210. const string DateTimeWithOffsetFormat = "yyyy-MM-ddTHH:mm:sszzz";
  211. const string DateTimeWithOffsetFormat2 = "yyy-MM-ddTHH:mm:ss.fffK";
  212. const string DateTimeWithoutOffsetWithoutTimeFormat = "yyy-MM-dd";
  213. const string DateTimeWithoutOffsetFormat = "yyy-MM-ddTHH:mm:ss";
  214. const string DateTimeWithoutOffsetFormat2 = "yyy-MM-ddTHH:mm:ss.fff";
  215. const string TimeWithoutOffsetFormat = "HH:mm:ss";
  216. const string TimeWithoutOffsetFormat2 = "HH:mm";
  217. Assert.Equal(false, new JsonPrimitive("false").ReadAs<bool>());
  218. Assert.Equal(false, (bool)(new JsonPrimitive("False")));
  219. Assert.Equal(true, (bool)(new JsonPrimitive("true")));
  220. Assert.Equal(true, new JsonPrimitive("True").ReadAs<bool>());
  221. Assert.Equal<Uri>(AnyInstance.AnyUri, new JsonPrimitive(AnyInstance.AnyUri.ToString()).ReadAs<Uri>());
  222. Assert.Equal<char>(AnyInstance.AnyChar, (char)(new JsonPrimitive(new string(AnyInstance.AnyChar, 1))));
  223. Assert.Equal<Guid>(AnyInstance.AnyGuid, (Guid)(new JsonPrimitive(AnyInstance.AnyGuid.ToString("D", CultureInfo.InvariantCulture))));
  224. DateTime anyLocalDateTime = AnyInstance.AnyDateTime.ToLocalTime();
  225. DateTime anyUtcDateTime = AnyInstance.AnyDateTime.ToUniversalTime();
  226. Assert.Equal<DateTime>(anyUtcDateTime, (DateTime)(new JsonPrimitive(anyUtcDateTime.ToString(DateTimeFormat, CultureInfo.InvariantCulture))));
  227. Assert.Equal<DateTime>(anyLocalDateTime, new JsonPrimitive(anyLocalDateTime.ToString(DateTimeWithOffsetFormat2, CultureInfo.InvariantCulture)).ReadAs<DateTime>());
  228. Assert.Equal<DateTime>(anyUtcDateTime, new JsonPrimitive(anyUtcDateTime.ToString(DateTimeWithOffsetFormat2, CultureInfo.InvariantCulture)).ReadAs<DateTime>());
  229. Assert.Equal<DateTime>(anyLocalDateTime.Date, (DateTime)(new JsonPrimitive(anyLocalDateTime.ToString(DateTimeWithoutOffsetWithoutTimeFormat, CultureInfo.InvariantCulture))));
  230. Assert.Equal<DateTime>(anyLocalDateTime, new JsonPrimitive(anyLocalDateTime.ToString(DateTimeWithoutOffsetFormat, CultureInfo.InvariantCulture)).ReadAs<DateTime>());
  231. Assert.Equal<DateTime>(anyLocalDateTime, new JsonPrimitive(anyLocalDateTime.ToString(DateTimeWithoutOffsetFormat2, CultureInfo.InvariantCulture)).ReadAs<DateTime>());
  232. DateTime dt = new JsonPrimitive(anyLocalDateTime.ToString(TimeWithoutOffsetFormat, CultureInfo.InvariantCulture)).ReadAs<DateTime>();
  233. Assert.Equal(anyLocalDateTime.Hour, dt.Hour);
  234. Assert.Equal(anyLocalDateTime.Minute, dt.Minute);
  235. Assert.Equal(anyLocalDateTime.Second, dt.Second);
  236. dt = new JsonPrimitive(anyLocalDateTime.ToString(TimeWithoutOffsetFormat2, CultureInfo.InvariantCulture)).ReadAs<DateTime>();
  237. Assert.Equal(anyLocalDateTime.Hour, dt.Hour);
  238. Assert.Equal(anyLocalDateTime.Minute, dt.Minute);
  239. Assert.Equal(0, dt.Second);
  240. Assert.Equal<DateTimeOffset>(AnyInstance.AnyDateTimeOffset, new JsonPrimitive(AnyInstance.AnyDateTimeOffset.ToString(DateTimeFormat, CultureInfo.InvariantCulture)).ReadAs<DateTimeOffset>());
  241. Assert.Equal<DateTimeOffset>(AnyInstance.AnyDateTimeOffset, new JsonPrimitive(AnyInstance.AnyDateTimeOffset.ToString(DateTimeWithOffsetFormat, CultureInfo.InvariantCulture)).ReadAs<DateTimeOffset>());
  242. Assert.Equal<DateTimeOffset>(AnyInstance.AnyDateTimeOffset, new JsonPrimitive(AnyInstance.AnyDateTimeOffset.ToString(DateTimeWithOffsetFormat2, CultureInfo.InvariantCulture)).ReadAs<DateTimeOffset>());
  243. Assert.Equal<DateTimeOffset>(AnyInstance.AnyDateTimeOffset.ToLocalTime(), (DateTimeOffset)(new JsonPrimitive(AnyInstance.AnyDateTimeOffset.ToLocalTime().ToString(DateTimeWithoutOffsetFormat, CultureInfo.InvariantCulture))));
  244. Assert.Equal<DateTimeOffset>(AnyInstance.AnyDateTimeOffset.ToLocalTime(), (DateTimeOffset)(new JsonPrimitive(AnyInstance.AnyDateTimeOffset.ToLocalTime().ToString(DateTimeWithoutOffsetFormat2, CultureInfo.InvariantCulture))));
  245. DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(DateTime));
  246. MemoryStream ms = new MemoryStream();
  247. dcjs.WriteObject(ms, AnyInstance.AnyDateTime);
  248. string dcjsSerializedDateTime = Encoding.UTF8.GetString(ms.ToArray());
  249. Assert.Equal(AnyInstance.AnyDateTime, JsonValue.Parse(dcjsSerializedDateTime).ReadAs<DateTime>());
  250. ExceptionHelper.Throws<InvalidCastException>(delegate { var b = (bool)(new JsonPrimitive("notBool")); });
  251. ExceptionHelper.Throws<UriFormatException>(delegate { var u = new JsonPrimitive("not an uri - " + new string('r', 100000)).ReadAs<Uri>(); });
  252. ExceptionHelper.Throws<FormatException>(delegate { var date = new JsonPrimitive("not a date time").ReadAs<DateTime>(); });
  253. ExceptionHelper.Throws<InvalidCastException>(delegate { var dto = (DateTimeOffset)(new JsonPrimitive("not a date time offset")); });
  254. ExceptionHelper.Throws<InvalidCastException>(delegate { var c = (char)new JsonPrimitive(""); });
  255. ExceptionHelper.Throws<InvalidCastException>(delegate { var c = (char)new JsonPrimitive("cc"); });
  256. ExceptionHelper.Throws<FormatException>(delegate { var g = new JsonPrimitive("not a guid").ReadAs<Guid>(); });
  257. }
  258. [Fact]
  259. public void AspNetDateTimeFormatConversionTest()
  260. {
  261. DateTime unixEpochUtc = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
  262. DateTime unixEpochLocal = unixEpochUtc.ToLocalTime();
  263. Assert.Equal(unixEpochUtc, new JsonPrimitive("/Date(0)/").ReadAs<DateTime>());
  264. Assert.Equal(unixEpochLocal, new JsonPrimitive("/Date(0-0900)/").ReadAs<DateTime>());
  265. Assert.Equal(unixEpochLocal, new JsonPrimitive("/Date(0+1000)/").ReadAs<DateTime>());
  266. }
  267. [Fact]
  268. public void ToStringTest()
  269. {
  270. char anyUnescapedChar = 'c';
  271. string anyUnescapedString = "hello";
  272. Dictionary<string, JsonPrimitive> toStringResults = new Dictionary<string, JsonPrimitive>
  273. {
  274. // Boolean types
  275. { AnyInstance.AnyBool.ToString(CultureInfo.InvariantCulture).ToLowerInvariant(), new JsonPrimitive(AnyInstance.AnyBool) },
  276. // Numeric types
  277. { AnyInstance.AnyByte.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyByte) },
  278. { AnyInstance.AnySByte.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnySByte) },
  279. { AnyInstance.AnyShort.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyShort) },
  280. { AnyInstance.AnyUShort.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyUShort) },
  281. { AnyInstance.AnyInt.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyInt) },
  282. { AnyInstance.AnyUInt.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyUInt) },
  283. { AnyInstance.AnyLong.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyLong) },
  284. { AnyInstance.AnyULong.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyULong) },
  285. { AnyInstance.AnyFloat.ToString("R", CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyFloat) },
  286. { AnyInstance.AnyDouble.ToString("R", CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyDouble) },
  287. { AnyInstance.AnyDecimal.ToString(CultureInfo.InvariantCulture), new JsonPrimitive(AnyInstance.AnyDecimal) },
  288. // String types
  289. { "\"" + new string(anyUnescapedChar, 1) + "\"", new JsonPrimitive(anyUnescapedChar) },
  290. { "\"" + anyUnescapedString + "\"", new JsonPrimitive(anyUnescapedString) },
  291. { "\"" + AnyInstance.AnyDateTime.ToString(DateTimeFormat, CultureInfo.InvariantCulture) + "\"", new JsonPrimitive(AnyInstance.AnyDateTime) },
  292. { "\"" + AnyInstance.AnyDateTimeOffset.ToString(DateTimeFormat, CultureInfo.InvariantCulture) + "\"", new JsonPrimitive(AnyInstance.AnyDateTimeOffset) },
  293. { "\"" + AnyInstance.AnyUri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped).Replace("/", "\\/") + "\"", new JsonPrimitive(AnyInstance.AnyUri) },
  294. { "\"" + AnyInstance.AnyGuid.ToString("D", CultureInfo.InvariantCulture) + "\"", new JsonPrimitive(AnyInstance.AnyGuid) },
  295. };
  296. foreach (string stringRepresentation in toStringResults.Keys)
  297. {
  298. string actualResult = toStringResults[stringRepresentation].ToString();
  299. Assert.Equal(stringRepresentation, actualResult);
  300. }
  301. Dictionary<string, JsonPrimitive> escapedValues = new Dictionary<string, JsonPrimitive>
  302. {
  303. { "\"\\u000d\"", new JsonPrimitive('\r') },
  304. { "\"\\u000a\"", new JsonPrimitive('\n') },
  305. { "\"\\\\\"", new JsonPrimitive('\\') },
  306. { "\"\\/\"", new JsonPrimitive('/') },
  307. { "\"\\u000b\"", new JsonPrimitive('\u000b') },
  308. { "\"\\\"\"", new JsonPrimitive('\"') },
  309. { "\"slash-r-\\u000d-fffe-\\ufffe-ffff-\\uffff-tab-\\u0009\"", new JsonPrimitive("slash-r-\r-fffe-\ufffe-ffff-\uffff-tab-\t") },
  310. };
  311. foreach (string stringRepresentation in escapedValues.Keys)
  312. {
  313. string actualResult = escapedValues[stringRepresentation].ToString();
  314. Assert.Equal(stringRepresentation, actualResult);
  315. }
  316. }
  317. [Fact]
  318. public void JsonTypeTest()
  319. {
  320. Assert.Equal(JsonType.Boolean, new JsonPrimitive(AnyInstance.AnyBool).JsonType);
  321. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyByte).JsonType);
  322. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnySByte).JsonType);
  323. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyShort).JsonType);
  324. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyUShort).JsonType);
  325. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyInt).JsonType);
  326. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyUInt).JsonType);
  327. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyLong).JsonType);
  328. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyULong).JsonType);
  329. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyDecimal).JsonType);
  330. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyDouble).JsonType);
  331. Assert.Equal(JsonType.Number, new JsonPrimitive(AnyInstance.AnyFloat).JsonType);
  332. Assert.Equal(JsonType.String, new JsonPrimitive(AnyInstance.AnyChar).JsonType);
  333. Assert.Equal(JsonType.String, new JsonPrimitive(AnyInstance.AnyString).JsonType);
  334. Assert.Equal(JsonType.String, new JsonPrimitive(AnyInstance.AnyUri).JsonType);
  335. Assert.Equal(JsonType.String, new JsonPrimitive(AnyInstance.AnyGuid).JsonType);
  336. Assert.Equal(JsonType.String, new JsonPrimitive(AnyInstance.AnyDateTime).JsonType);
  337. Assert.Equal(JsonType.String, new JsonPrimitive(AnyInstance.AnyDateTimeOffset).JsonType);
  338. }
  339. [Fact]
  340. public void InvalidPropertyTest()
  341. {
  342. JsonValue target = AnyInstance.AnyJsonPrimitive;
  343. Assert.True(target.Count == 0);
  344. Assert.False(target.ContainsKey(String.Empty));
  345. Assert.False(target.ContainsKey(AnyInstance.AnyString));
  346. }
  347. private void CheckValues(object[] values, JsonType expectedType)
  348. {
  349. JsonPrimitive target;
  350. bool success;
  351. foreach (object value in values)
  352. {
  353. success = JsonPrimitive.TryCreate(value, out target);
  354. Assert.True(success);
  355. Assert.NotNull(target);
  356. Assert.Equal(expectedType, target.JsonType);
  357. }
  358. }
  359. }
  360. }