public static bool ContainsKey <T>(this ListTreeNode <T> self, String key) where T : IListTreeItem, IValue <T> { var ukey = Utf8String.From(key); return(self.ContainsKey(ukey)); }
public void MinusInfinityTest() { { var v = new JsonValue(Utf8String.From("-Infinity"), ValueNodeType.MinusInfinity, -1); Assert.AreEqual("-Infinity", v.ToString()); Assert.AreEqual(Double.NegativeInfinity, v.GetValue <double>()); } }
public void SplitIntegerTest() { Assert.AreEqual("1", Utf8String.From("1 ").SplitInteger().ToString()); Assert.AreEqual("123", Utf8String.From("123").SplitInteger().ToString()); Assert.Catch(() => Utf8String.From(" 1").SplitInteger()); Assert.AreEqual("+12", Utf8String.From("+12\n").SplitInteger().ToString()); Assert.AreEqual("-123", Utf8String.From("-123\n").SplitInteger().ToString()); }
public void NaNTest() { { var v = new JsonValue(Utf8String.From("NaN"), ValueNodeType.NaN, -1); Assert.AreEqual("NaN", v.ToString()); Assert.AreEqual(Double.NaN, v.GetValue <double>()); } }
public static void Deserialize(ListTreeNode <S> src, ref T dst, Dictionary <string, JsonSchema> props) { if (s_d == null) { var target = typeof(T); var fields = target.GetFields(BindingFlags.Instance | BindingFlags.Public); var fieldDeserializers = fields.ToDictionary(x => Utf8String.From(x.Name), x => { /* * var mi = typeof(GenericDeserializer<T>).GetMethod("GetFieldDeserializer", * BindingFlags.Static | BindingFlags.NonPublic); * var g = mi.MakeGenericMethod(x.FieldType); * return (FieldSetter)g.Invoke(null, new object[] { x }); */ JsonSchema prop; if (!props.TryGetValue(x.Name, out prop)) { return(null); } var mi = typeof(GenericDeserializer <S, T>).GetMethod("DeserializeField", BindingFlags.Static | BindingFlags.Public); var g = mi.MakeGenericMethod(x.FieldType); return((FieldSetter)((s, o) => { var f = g.Invoke(null, new object[] { prop, s }); x.SetValue(o, f); })); }); s_d = (ListTreeNode <S> s) => { // boxing var t = (object)Activator.CreateInstance <T>(); if (s.IsMap()) { foreach (var kv in s.ObjectItems()) { FieldSetter setter; if (fieldDeserializers.TryGetValue(kv.Key.GetUtf8String(), out setter)) { if (setter != null) { setter(kv.Value, t); } } } } return((T)t); }; } dst = s_d(src); }
public void QuoteTest() { { var value = Utf8String.From("ho5日本語ge"); var quoted = Utf8String.From("\"ho5日本語ge\""); Assert.AreEqual(quoted, JsonString.Quote(value)); Assert.AreEqual(value, JsonString.Unquote(quoted)); } { var value = Utf8String.From("fuga\n ho5日本語ge"); var quoted = Utf8String.From("\"fuga\\n ho5日本語ge\""); Assert.AreEqual(quoted, JsonString.Quote(value)); Assert.AreEqual(value, JsonString.Unquote(quoted)); } }
private static Utf8String GetKeyFromParent <T>(ListTreeNode <T> json) where T : IListTreeItem, IValue <T> { var parent = json.Parent; if (parent.IsArray()) { var index = parent.IndexOf(json); return(Utf8String.From(index)); } else if (parent.IsMap()) { return(parent.KeyOf(json)); } else { throw new NotImplementedException(); } }
public void SplitTest() { { var value = Utf8String.From("a/5/c"); var splited = value.Split((byte)'/').ToArray(); Assert.AreEqual(3, splited.Length); Assert.AreEqual(splited[0], Utf8String.From("a")); Assert.AreEqual(splited[1], Utf8String.From("5")); Assert.AreEqual(splited[2], Utf8String.From("c")); } { var value = Utf8String.From("/a/5/c/"); var splited = value.Split((byte)'/').ToArray(); Assert.AreEqual(4, splited.Length); Assert.AreEqual(splited[0], Utf8String.From("")); Assert.AreEqual(splited[1], Utf8String.From("a")); Assert.AreEqual(splited[2], Utf8String.From("5")); Assert.AreEqual(splited[3], Utf8String.From("c")); } }
public void PathTest() { var json = @" { ""a"": [ { ""aa"": 1 } ] } "; var root = JsonParser.Parse(json); { var it = root.Traverse().GetEnumerator(); it.MoveNext(); Assert.AreEqual("/", it.Current.Pointer().ToString()); it.MoveNext(); Assert.AreEqual("/a", it.Current.Pointer().ToString()); it.MoveNext(); Assert.AreEqual("/a/0", it.Current.Pointer().ToString()); it.MoveNext(); Assert.AreEqual("/a/0/aa", it.Current.Pointer().ToString()); Assert.False(it.MoveNext()); } { var it = root.Traverse().GetEnumerator(); var f = new JsonFormatter(); f.Serialize("JsonPath"); root.SetValue(Utf8String.From("/a"), f.GetStoreBytes()); it.MoveNext(); Assert.AreEqual("/", it.Current.Pointer().ToString()); it.MoveNext(); Assert.AreEqual("/a", it.Current.Pointer().ToString()); Assert.False(it.MoveNext()); } }
public void ToCharTest() { { // 1byte var c = 'A'; Assert.AreEqual(1, Utf8String.From(c.ToString()).GetFirst().CurrentByteLength); Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Unicode); Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Char); } { // 2byte var c = '¢'; Assert.AreEqual(2, Utf8String.From(c.ToString()).GetFirst().CurrentByteLength); Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Unicode); Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Char); } { // 3byte var c = '5'; Assert.AreEqual(3, Utf8String.From(c.ToString()).GetFirst().CurrentByteLength); Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Unicode); Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Char); } { var c = '仡'; Assert.AreEqual(3, Utf8String.From(c.ToString()).GetFirst().CurrentByteLength); Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Unicode); Assert.AreEqual(c, Utf8String.From(c.ToString()).GetFirst().Char); } { // emoji var s = "😃"; Assert.AreEqual(4, Utf8String.From(s).GetFirst().CurrentByteLength); Assert.AreEqual(0x1F603, Utf8String.From(s).GetFirst().Unicode); Assert.Catch(() => { var a = Utf8String.From(s).GetFirst().Char; }); } }
public void FromStringTest() { var buffer = new byte[12]; { var src = "abc"; var utf8 = Utf8String.From(src, buffer); Assert.AreEqual(3, utf8.ByteLength); Assert.AreEqual(src, utf8.ToString()); } { var src = "¢"; var utf8 = Utf8String.From(src, buffer); Assert.AreEqual(2, utf8.ByteLength); Assert.AreEqual(src, utf8.ToString()); } { var src = "5"; var utf8 = Utf8String.From(src, buffer); Assert.AreEqual(3, utf8.ByteLength); Assert.AreEqual(src, utf8.ToString()); } }
public void Utf8StringTest() { var abc = Utf8String.From("abc"); var ab = Utf8String.From("ab"); var bc = Utf8String.From("bc"); Assert.True(abc.StartsWith(ab)); Assert.False(ab.StartsWith(abc)); Assert.True(abc.EndsWith(bc)); Assert.False(bc.EndsWith(abc)); Assert.AreEqual(Utf8String.From("abbc"), ab.Concat(bc)); Assert.AreEqual(2, abc.IndexOf((byte)'c')); int pos; abc.TrySearchAscii((byte)'c', 0, out pos); Assert.AreEqual(2, pos); abc.TrySearchAscii((byte)'c', 1, out pos); Assert.AreEqual(2, pos); }
public static ListTreeNode <TomlValue> Parse(String Toml) { return(Parse(Utf8String.From(Toml))); }
public void Value(string x) { Value(Utf8String.From(x)); }
private static Func <ListTreeNode <T>, U> GetDeserializer() { // primitive { var mi = typeof(ListTreeNode <T>).GetMethods().FirstOrDefault(x => { if (!x.Name.StartsWith("Get")) { return(false); } if (!x.Name.EndsWith(typeof(U).Name)) { return(false); } var parameters = x.GetParameters(); if (parameters.Length != 0) { return(false); } if (x.ReturnType != typeof(U)) { return(false); } return(true); }); if (mi != null) { return(GenericInvokeCallFactory.StaticFunc <ListTreeNode <T>, U>(mi)); } } var target = typeof(U); if (target.IsArray) { var mi = typeof(GenericDeserializer <T, U>).GetMethod("GenericArrayDeserializer", BindingFlags.Static | BindingFlags.Public); var g = mi.MakeGenericMethod(target.GetElementType()); return(GenericInvokeCallFactory.StaticFunc <ListTreeNode <T>, U>(g)); } if (target.IsGenericType) { if (target.GetGenericTypeDefinition() == typeof(List <>)) { var mi = typeof(GenericDeserializer <T, U>).GetMethod("GenericListDeserializer", BindingFlags.Static | BindingFlags.Public); var g = mi.MakeGenericMethod(target.GetGenericArguments()); return(GenericInvokeCallFactory.StaticFunc <ListTreeNode <T>, U>(g)); } if (target == typeof(Dictionary <string, object>)) { var mi = typeof(GenericDeserializer <T, U>).GetMethod("DefaultDictionaryDeserializer", BindingFlags.Static | BindingFlags.Public); var func = GenericInvokeCallFactory.StaticFunc <ListTreeNode <T>, object>(mi); // object to Dictionary<string, object> return(x => (U)func(x)); } else if (target.GetGenericTypeDefinition() == typeof(Dictionary <,>) && target.GetGenericArguments()[0] == typeof(string)) { var mi = typeof(GenericDeserializer <T, U>).GetMethod("DictionaryDeserializer", BindingFlags.Static | BindingFlags.Public); var g = mi.MakeGenericMethod(target.GetGenericArguments()[1]); return(GenericInvokeCallFactory.StaticFunc <ListTreeNode <T>, U>(g)); } } { var schema = JsonSchema.FromType <U>(); return(s => { var t = default(U); schema.Validator.Deserialize(s, ref t); return t; }); } #if false if (target.IsEnum) { var value = Expression.Parameter(typeof(int), "value"); var cast = Expression.Convert(value, target); var func = Expression.Lambda(cast, value); var compiled = (Func <int, T>)func.Compile(); return(s => { return compiled(s.GetInt32()); }); } { var fields = target.GetFields(BindingFlags.Instance | BindingFlags.Public); var fieldDeserializers = fields.ToDictionary(x => Utf8String.From(x.Name), x => { var mi = typeof(GenericDeserializer <S, T>).GetMethod("GetFieldDeserializer", BindingFlags.Static | BindingFlags.NonPublic); var g = mi.MakeGenericMethod(x.FieldType); return((FieldSetter)g.Invoke(null, new object[] { x })); }); return((S s) => { if (!s.IsMap()) { throw new ArgumentException(s.ValueType.ToString()); } var t = (object)default(GenericCreator <S, T>).Create(s); foreach (var kv in s.ObjectItems()) { FieldSetter setter; if (fieldDeserializers.TryGetValue(kv.Key, out setter)) { setter(kv.Value, t); } } return (T)t; }); } #endif }
public static void Key(this IFormatter f, string x) { f.Key(Utf8String.From(x)); }
public static ListTreeNode <T> GetObjectItem <T>(this ListTreeNode <T> self, String key) where T : IListTreeItem, IValue <T> { return(self.GetObjectItem(Utf8String.From(key))); }
public void AtoiTest() { Assert.AreEqual(1234, Utf8String.From("1234").ToInt32()); }
public static ListTreeNode <JsonValue> Parse(String json) { return(Parse(Utf8String.From(json))); }
public void Value(String s) { Value(Utf8String.From(s)); }
public ListTreeNode <T> this[String key] => this[Utf8String.From(key)];