public void testFromJsonHierarchy() { TestTreeNode rootNode = new TestTreeNode(); rootNode.Name = "top"; rootNode.branches = new List <TestTreeNode>(); TestTreeNode child = new TestTreeNode(); child.Name = "child"; child.branches = null; rootNode.branches.Add(child); NodeExpander nodeExpander = new FieldReflectionNodeExpander(); Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; o2J.TypeAliaser = (t) => { return(t.FullName); }; Json2Object j2O = new Json2Object(); o2J.TypeAliasProperty = j2O.TypeSpecifier; String json = o2J.toJson(rootNode); System.Console.Out.WriteLine("testToJsonLeafTypesViaFields json:" + json); TestTreeNode result = (TestTreeNode)j2O.toObject(json, typeof(TestTreeNode)); Func <TestTreeNode, String> extractValue = (tn) => { return(tn.Branches[0].Name); }; Assert.AreEqual(extractValue(rootNode), extractValue(result), "check nested values"); }
public void demoDefaultingForUserguide() { // create the test data ManyDefaultsTestData md = new ManyDefaultsTestData(); // create an aliaser to create identifiers for types // must emit valid js property name distinct for each class // typically a number is used to reduce size TypeAliaser aliaser = TypeAliaserUtils.createNumericTypeNameAliaser(); //focus on serializing fields NodeExpander nodeExpander = new FieldReflectionNodeExpander(); // find the defaults - this is a one off // only necessary once per schemachange DefaultFinder df = new DefaultFinder(); // this method just searches through the type structure LeafDefaultSet lds = df.getDefaultsForAllLinkedObjects(md, nodeExpander); // create a dictionary of default values - this is a one off per schemachange Dictionary <string, Defaults4Class> defaultValues = lds.getAlias2Defaults(aliaser); Object2Json o2J = new Object2Json(); o2J.TypeAliaser = aliaser; o2J.NodeExpander = nodeExpander; // make the format prettier o2J.IndentSize = 2; // create javascript representing the dictionary of defaults String defaultValuesJson = o2J.toJson(defaultValues); System.Console.WriteLine("defaultValuesJson=" + defaultValuesJson); // serialise without defaults o2J.OmitDefaultLeafValuesInJs = true; o2J.LeafDefaultSet = lds; o2J.OmitMarkAsArrayFunction = false; String withoutDefaultsLeafValuesJS = o2J.toJson(md); System.Console.WriteLine("withoutDefaultsLeafValuesJS=" + withoutDefaultsLeafValuesJS); // serialise with defaults o2J.OmitDefaultLeafValuesInJs = false; o2J.LeafDefaultSet = lds; o2J.TypeAliaser = aliaser; String withDefaultLeafValuesJS = o2J.toJson(md); System.Console.WriteLine("withDefaultLeafValuesJS=" + withDefaultLeafValuesJS); JSExcuteUtil.JsonValueSet valueSet = new JSExcuteUtil.JsonValueSet(); valueSet.json = o2J.LeafDefaultResolverFunctionName + "(" + withoutDefaultsLeafValuesJS + ")"; valueSet.varname = "defaulted"; valueSet.extraFunctions.Add(o2J.getLeafDefaultResolverJS(aliaser)); valueSet.extraFunctions.Add(o2J.getMarkAsArrayJSFunction()); valueSet.significance = "serialised without default values and restore with standard restore js function"; valueSet.expressions2ExpectedValue["stringValuesArr[1].str2"] = md.stringValuesArr[1].str2; valueSet.expressions2ExpectedValue["stringValuesArr[2].aReallyReallyReallyLongName"] = md.stringValuesArr[2].aReallyReallyReallyLongName; Dictionary <string, object> values = util.extractValuesFromJson(valueSet, GetType().Name + "." + "demoDefaultingForUserguide"); }
public void demoDefaultingForUserguide() { // create the test data ManyDefaultsTestData md = new ManyDefaultsTestData(); // create an aliaser to create identifiers for types // must emit valid js property name distinct for each class // typically a number is used to reduce size TypeAliaser aliaser = TypeAliaserUtils.createNumericTypeNameAliaser(); //focus on serializing fields NodeExpander nodeExpander = new FieldReflectionNodeExpander(); // find the defaults - this is a one off // only necessary once per schemachange DefaultFinder df = new DefaultFinder(); // this method just searches through the type structure LeafDefaultSet lds = df.getDefaultsForAllLinkedObjects(md, nodeExpander); // create a dictionary of default values - this is a one off per schemachange Dictionary<string, Defaults4Class> defaultValues = lds.getAlias2Defaults(aliaser); Object2Json o2J = new Object2Json(); o2J.TypeAliaser = aliaser; o2J.NodeExpander = nodeExpander; // make the format prettier o2J.IndentSize = 2; // create javascript representing the dictionary of defaults String defaultValuesJson = o2J.toJson(defaultValues); System.Console.WriteLine("defaultValuesJson=" + defaultValuesJson); // serialise without defaults o2J.OmitDefaultLeafValuesInJs = true; o2J.LeafDefaultSet = lds; o2J.OmitMarkAsArrayFunction = false; String withoutDefaultsLeafValuesJS = o2J.toJson(md); System.Console.WriteLine("withoutDefaultsLeafValuesJS=" + withoutDefaultsLeafValuesJS); // serialise with defaults o2J.OmitDefaultLeafValuesInJs = false; o2J.LeafDefaultSet = lds; o2J.TypeAliaser = aliaser; String withDefaultLeafValuesJS = o2J.toJson(md); System.Console.WriteLine("withDefaultLeafValuesJS=" + withDefaultLeafValuesJS); JSExcuteUtil.JsonValueSet valueSet = new JSExcuteUtil.JsonValueSet(); valueSet.json = o2J.LeafDefaultResolverFunctionName + "(" + withoutDefaultsLeafValuesJS + ")"; valueSet.varname = "defaulted"; valueSet.extraFunctions.Add(o2J.getLeafDefaultResolverJS(aliaser)); valueSet.extraFunctions.Add(o2J.getMarkAsArrayJSFunction()); valueSet.significance = "serialised without default values and restore with standard restore js function"; valueSet.expressions2ExpectedValue["stringValuesArr[1].str2"] = md.stringValuesArr[1].str2; valueSet.expressions2ExpectedValue["stringValuesArr[2].aReallyReallyReallyLongName"] = md.stringValuesArr[2].aReallyReallyReallyLongName; Dictionary<string, object> values = util.extractValuesFromJson(valueSet, GetType().Name + "." + "demoDefaultingForUserguide"); }
public void testToJsonFields() { NodeExpander nodeExpander = new FieldReflectionNodeExpander(); TestData testData = new TestData(); String[] expressions = { "theDate." + NodeExpanderConstants.unixEpochTimeMillisFieldName, "sub.subSub.greeting", "sub.subSub.ageYears", "sub.subSub.heightMetres" }; Object[] expectedValues = { NodeExpanderConstants.extractEpochTimeMillis(testData.TheDate), testData.TheSub.TheSubSub.Greeting, testData.TheSub.TheSubSub.AgeYears, testData.TheSub.TheSubSub.HeightMetres }; Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(testData); validateJSON(json, expressions, expectedValues, "testToJsonFields"); }
public void testToJsonMany2Ones() { NodeExpander nodeExpander = new FieldReflectionNodeExpander(); TestData testData = new TestData(); String[] expressions = { "sub.subSub.seasons" }; Object[] expectedValues = { testData.TheSub.TheSubSub.Seasons }; Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(testData); validateJSON(json, expressions, expectedValues, "testToJsonMany2Ones"); }
public void testToJsonLeafTypesViaFields() { // todo - this fails with FieldReflectionNodeExpander NodeExpander nodeExpander = new FieldReflectionNodeExpander(); AllPrimitiveLeafTypes testData = new AllPrimitiveLeafTypes(); String[] expressions = AllPrimitiveLeafTypes.testFieldExpressions; Object[] expectedValues = AllPrimitiveLeafTypes.testExpectedFieldValues(testData); Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(testData); validateJSON(json, expressions, expectedValues, "testToJsonLeafTypesViaFields"); }
public void testToJsonHierarchy() { int requiredDepth = 4; int branchesPerParent = 2; TestTreeNode rootNode = TestTreeNode.createTestHierarchy(requiredDepth, branchesPerParent); String[] expressions = { "branches[0].branches[0].branches[0].name" }; Object[] expectedValues = { rootNode.Branches[0].Branches[0].Branches[0].Name }; NodeExpander nodeExpander = new FieldReflectionNodeExpander(); Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(rootNode); validateJSON(json, expressions, expectedValues, "testToJsonHierarchy"); }
public void testSimpleMap() { Dictionary <string, string> map = new Dictionary <string, string>(); String[] expressions = { "abc", "xyz", "cba", "ooo" }; string[] expectedValues = { "hello", "goodday", "goodnight", null }; for (int done = 0; done < expressions.Length; done++) { map[expressions[done]] = expectedValues[done]; } NodeExpander nodeExpander = new FieldReflectionNodeExpander(); Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(map); validateJSON(json, expressions, expectedValues, "testSimpleMap"); }
public void testDefaultingWritingDefaultsBit() { //todo autoreject invalid js aliases e.g. numberot dot contained Object2Json o2j = new Object2Json(); DefaultFinder df = new DefaultFinder(); ManyDefaultsTestData md = new ManyDefaultsTestData(); TypeAliaser aliaser = delegate(Type type) { return(type.FullName.Replace('.', '_').Replace('+', '_')); }; // need to pass in class name aliasing scheme // this will fail if aliases are not valid js propert names Dictionary <string, Defaults4Class> defaultsJS; String[] expressions; object[] expectedValues; NodeExpander nodeExpander = new FieldReflectionNodeExpander(); LeafDefaultSet lds = df.getDefaultsForAllLinkedObjects(md, new FieldReflectionNodeExpander()); defaultsJS = lds.getAlias2Defaults(aliaser); expressions = new string[] { aliaser(md.GetType()) + ".propertyName2DefaultValue" + ".i1", aliaser(typeof(ManyDefaultsTestData.StringValues)) + ".propertyName2DefaultValue" + ".str3" }; expectedValues = new object[] { md.i1, md.stringValues.str3 }; //check that the defaults serialise OK first Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(defaultsJS); validateJSON(json, expressions, expectedValues, "testDefaultingWritingDefaultsBit.simplealias", "using a verbose class aliaser"); // try a numeric aliaser aliaser = TypeAliaserUtils.createNumericTypeNameAliaser(); lds = df.getDefaultsForAllLinkedObjects(md, new FieldReflectionNodeExpander()); defaultsJS = lds.getAlias2Defaults(aliaser); expressions = new string[] { aliaser(md.GetType()) + ".propertyName2DefaultValue" + ".i1", aliaser(typeof(ManyDefaultsTestData.StringValues)) + ".propertyName2DefaultValue" + ".str3" }; o2J.IndentSize = 2; json = o2J.toJson(defaultsJS); validateJSON(json, expressions, expectedValues, "testDefaultingWritingDefaultsBit.numericliaser", "using a compact numeric aliaser"); }
public void testFromJsonHierarchy() { TestTreeNode rootNode = new TestTreeNode(); rootNode.Name = "top"; rootNode.branches = new List<TestTreeNode>(); TestTreeNode child = new TestTreeNode(); child.Name = "child"; child.branches = null; rootNode.branches.Add(child); NodeExpander nodeExpander = new FieldReflectionNodeExpander(); Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; o2J.TypeAliaser = (t) => { return t.FullName; }; Json2Object j2O = new Json2Object(); o2J.TypeAliasProperty = j2O.TypeSpecifier; String json = o2J.toJson(rootNode); System.Console.Out.WriteLine("testToJsonLeafTypesViaFields json:" + json); TestTreeNode result = (TestTreeNode) j2O.toObject(json, typeof(TestTreeNode)); Func<TestTreeNode, String> extractValue = (tn) => {return tn.Branches[0].Name;}; Assert.AreEqual(extractValue(rootNode), extractValue(result), "check nested values" ); }
public void testDefaulting() { //todo autoreject invalid js aliases e.g. numberot dot contained //Object2Json o2j = new Object2Json(); DefaultFinder df = new DefaultFinder(); ManyDefaultsTestData md = new ManyDefaultsTestData(); TypeAliaser aliaser = delegate(Type type) { return type.FullName.Replace('.', '_').Replace('+', '_'); }; // need to pass in class name aliasing scheme // this will fail if aliases are not valid js propert names Dictionary<string, Defaults4Class> defaultsJS; String[] expressions; object[] expectedValues; NodeExpander nodeExpander = new FieldReflectionNodeExpander(); LeafDefaultSet lds = df.getDefaultsForAllLinkedObjects(md, new FieldReflectionNodeExpander()); defaultsJS = lds.getAlias2Defaults(aliaser); expressions = new string[] { aliaser(md.GetType()) + ".propertyName2DefaultValue" +".i1", aliaser(typeof(ManyDefaultsTestData.StringValues)) + ".propertyName2DefaultValue" + ".str3"}; expectedValues = new object[] { md.i1, md.stringValues.str3 }; //check that the defaults serialise OK first Object2Json o2J = new Object2Json(); // should test with this as false o2J.UseReferences = true; o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(defaultsJS); validateJSON(json, expressions, expectedValues, "testDefaulting.defaultMap", " check access to serialised defaults, class names are aliased replacing '.' with '_'"); aliaser = TypeAliaserUtils.createNumericTypeNameAliaser(); lds = df.getDefaultsForAllLinkedObjects(md, new FieldReflectionNodeExpander() ); defaultsJS = lds.getAlias2Defaults(aliaser); expressions = new string[] { aliaser(md.GetType()) + ".propertyName2DefaultValue" +".i1", aliaser(typeof(ManyDefaultsTestData.StringValues)) + ".propertyName2DefaultValue" + ".str3"}; o2J.IndentSize = 2; json = o2J.toJson(defaultsJS); validateJSON(json, expressions, expectedValues, "testDefaulting", "check access to serialised defaults, classnames are aliases with numbers"); // serialise with defaults o2J.OmitDefaultLeafValuesInJs = false; String withDefaultLeafValuesJS = o2J.toJson(md); // serialise without defaults o2J.OmitDefaultLeafValuesInJs = true; o2J.LeafDefaultSet = lds; o2J.OmitMarkAsArrayFunction = false; o2J.TypeAliaser = aliaser; String withoutDefaultsLeafValuesJS = o2J.toJson(md); float minimumDefaultingCompression = 2.0F; // check sizes is much smaller with defaults int maximumCompressedLength= (int) (((float) withDefaultLeafValuesJS.Length) / minimumDefaultingCompression ); object []vals = {withDefaultLeafValuesJS.Length}; Assert.IsTrue(withoutDefaultsLeafValuesJS.Length < maximumCompressedLength, "without default compression length=" + withDefaultLeafValuesJS.Length + " without default leaf values length=" + withoutDefaultsLeafValuesJS.Length + " but expected less than " + maximumCompressedLength + " (compression better than " +minimumDefaultingCompression +")"); // check defaulted values are undefined if undefault is not called expressions = new string[] { "i2", "stringValues.str3", "stringValues.str2", "stringValues.str1", "i1", "i4", "stringValuesArr[0].str1" }; expectedValues = new object[expressions.Length]; // assume initialised to null !! md.i2 = 6789; expectedValues[0] = md.i2; withoutDefaultsLeafValuesJS = o2J.toJson(md); string[] extraFunctions = { o2J.getAttachId2ArrayJSFunction() }; validateJSON(withoutDefaultsLeafValuesJS, extraFunctions, expressions, expectedValues, "testDefaulting.unrestoredvalues", "serialise ommitting defaults and in js test do not restore defaults"); expectedValues = new object[] {md.i2, md.stringValues.str3, md.stringValues.str2, md.stringValues.str1, md.i1, md.i4, md.stringValuesArr[0].str1 }; //Object value; JSExcuteUtil.JsonValueSet valueSet = new JSExcuteUtil.JsonValueSet(); valueSet.json = o2J.LeafDefaultResolverFunctionName + "(" + withoutDefaultsLeafValuesJS + ")"; valueSet.varname = "defaulted"; for (int done = 0; done < expressions.Length; done++) { valueSet.expressions2ExpectedValue[expressions[done]] = expectedValues[done]; } valueSet.extraFunctions.Add(o2J.getLeafDefaultResolverJS(aliaser)); valueSet.extraFunctions.Add(o2J.getMarkAsArrayJSFunction()); valueSet.extraFunctions.Add(o2J.getAttachId2ArrayJSFunction()); valueSet.significance = "serialised without default values and restore with standard restore js function"; Dictionary<string, object> values = util.extractValuesFromJson(valueSet, GetType().Name + "." + "testDefaulting.resolveLeaves"); for (int done = 0; done < expressions.Length; done++) { string expression = expressions[done]; object expectedValue = expectedValues[done]; object actualValue = valueSet.expressions2ExpectedValue[expression] = values[expression]; //"expression=" + expression + " with reference json= " + withoutDefaultsLeafValuesJS Assert.AreEqual(expectedValue, actualValue, "valueSet==" + valueSet.ToString()); } }
public void testSimpleMap() { Dictionary<string, string> map = new Dictionary<string, string>(); String[] expressions = { "abc", "xyz", "cba", "ooo" }; string[] expectedValues = {"hello", "goodday", "goodnight", null }; for (int done = 0; done < expressions.Length; done++ ) { map[expressions[done]]=expectedValues[done]; } NodeExpander nodeExpander = new FieldReflectionNodeExpander(); Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(map); validateJSON(json, expressions, expectedValues, "testSimpleMap"); }
public void testDefaulting() { //todo autoreject invalid js aliases e.g. numberot dot contained //Object2Json o2j = new Object2Json(); DefaultFinder df = new DefaultFinder(); ManyDefaultsTestData md = new ManyDefaultsTestData(); TypeAliaser aliaser = delegate(Type type) { return(type.FullName.Replace('.', '_').Replace('+', '_')); }; // need to pass in class name aliasing scheme // this will fail if aliases are not valid js propert names Dictionary <string, Defaults4Class> defaultsJS; String[] expressions; object[] expectedValues; NodeExpander nodeExpander = new FieldReflectionNodeExpander(); LeafDefaultSet lds = df.getDefaultsForAllLinkedObjects(md, new FieldReflectionNodeExpander()); defaultsJS = lds.getAlias2Defaults(aliaser); expressions = new string[] { aliaser(md.GetType()) + ".propertyName2DefaultValue" + ".i1", aliaser(typeof(ManyDefaultsTestData.StringValues)) + ".propertyName2DefaultValue" + ".str3" }; expectedValues = new object[] { md.i1, md.stringValues.str3 }; //check that the defaults serialise OK first Object2Json o2J = new Object2Json(); // should test with this as false o2J.UseReferences = true; o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(defaultsJS); validateJSON(json, expressions, expectedValues, "testDefaulting.defaultMap", " check access to serialised defaults, class names are aliased replacing '.' with '_'"); aliaser = TypeAliaserUtils.createNumericTypeNameAliaser(); lds = df.getDefaultsForAllLinkedObjects(md, new FieldReflectionNodeExpander()); defaultsJS = lds.getAlias2Defaults(aliaser); expressions = new string[] { aliaser(md.GetType()) + ".propertyName2DefaultValue" + ".i1", aliaser(typeof(ManyDefaultsTestData.StringValues)) + ".propertyName2DefaultValue" + ".str3" }; o2J.IndentSize = 2; json = o2J.toJson(defaultsJS); validateJSON(json, expressions, expectedValues, "testDefaulting", "check access to serialised defaults, classnames are aliases with numbers"); // serialise with defaults o2J.OmitDefaultLeafValuesInJs = false; String withDefaultLeafValuesJS = o2J.toJson(md); // serialise without defaults o2J.OmitDefaultLeafValuesInJs = true; o2J.LeafDefaultSet = lds; o2J.OmitMarkAsArrayFunction = false; o2J.TypeAliaser = aliaser; String withoutDefaultsLeafValuesJS = o2J.toJson(md); float minimumDefaultingCompression = 2.0F; // check sizes is much smaller with defaults int maximumCompressedLength = (int)(((float)withDefaultLeafValuesJS.Length) / minimumDefaultingCompression); object [] vals = { withDefaultLeafValuesJS.Length }; Assert.IsTrue(withoutDefaultsLeafValuesJS.Length < maximumCompressedLength, "without default compression length=" + withDefaultLeafValuesJS.Length + " without default leaf values length=" + withoutDefaultsLeafValuesJS.Length + " but expected less than " + maximumCompressedLength + " (compression better than " + minimumDefaultingCompression + ")"); // check defaulted values are undefined if undefault is not called expressions = new string[] { "i2", "stringValues.str3", "stringValues.str2", "stringValues.str1", "i1", "i4", "stringValuesArr[0].str1" }; expectedValues = new object[expressions.Length]; // assume initialised to null !! md.i2 = 6789; expectedValues[0] = md.i2; withoutDefaultsLeafValuesJS = o2J.toJson(md); string[] extraFunctions = { o2J.getAttachId2ArrayJSFunction() }; validateJSON(withoutDefaultsLeafValuesJS, extraFunctions, expressions, expectedValues, "testDefaulting.unrestoredvalues", "serialise ommitting defaults and in js test do not restore defaults"); expectedValues = new object[] { md.i2, md.stringValues.str3, md.stringValues.str2, md.stringValues.str1, md.i1, md.i4, md.stringValuesArr[0].str1 }; //Object value; JSExcuteUtil.JsonValueSet valueSet = new JSExcuteUtil.JsonValueSet(); valueSet.json = o2J.LeafDefaultResolverFunctionName + "(" + withoutDefaultsLeafValuesJS + ")"; valueSet.varname = "defaulted"; for (int done = 0; done < expressions.Length; done++) { valueSet.expressions2ExpectedValue[expressions[done]] = expectedValues[done]; } valueSet.extraFunctions.Add(o2J.getLeafDefaultResolverJS(aliaser)); valueSet.extraFunctions.Add(o2J.getMarkAsArrayJSFunction()); valueSet.extraFunctions.Add(o2J.getAttachId2ArrayJSFunction()); valueSet.significance = "serialised without default values and restore with standard restore js function"; Dictionary <string, object> values = util.extractValuesFromJson(valueSet, GetType().Name + "." + "testDefaulting.resolveLeaves"); for (int done = 0; done < expressions.Length; done++) { string expression = expressions[done]; object expectedValue = expectedValues[done]; object actualValue = valueSet.expressions2ExpectedValue[expression] = values[expression]; //"expression=" + expression + " with reference json= " + withoutDefaultsLeafValuesJS Assert.AreEqual(expectedValue, actualValue, "valueSet==" + valueSet.ToString()); } }
public void testToJsonFields() { NodeExpander nodeExpander = new FieldReflectionNodeExpander(); TestData testData = new TestData(); String[] expressions = { "theDate." + NodeExpanderConstants.unixEpochTimeMillisFieldName, "sub.subSub.greeting", "sub.subSub.ageYears", "sub.subSub.heightMetres" }; Object[] expectedValues = { NodeExpanderConstants.extractEpochTimeMillis( testData.TheDate) , testData.TheSub.TheSubSub.Greeting, testData.TheSub.TheSubSub.AgeYears, testData.TheSub.TheSubSub.HeightMetres }; Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(testData); validateJSON(json, expressions, expectedValues, "testToJsonFields"); }
public void testToJsonHierarchy() { int requiredDepth = 4; int branchesPerParent = 2; TestTreeNode rootNode = TestTreeNode.createTestHierarchy(requiredDepth, branchesPerParent); String[] expressions = { "branches[0].branches[0].branches[0].name" }; Object[] expectedValues = { rootNode.Branches[0].Branches[0].Branches[0].Name }; NodeExpander nodeExpander = new FieldReflectionNodeExpander(); Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(rootNode); validateJSON(json, expressions, expectedValues, "testToJsonHierarchy"); }
public void testDefaultingWritingDefaultsBit() { //todo autoreject invalid js aliases e.g. numberot dot contained Object2Json o2j = new Object2Json(); DefaultFinder df = new DefaultFinder(); ManyDefaultsTestData md = new ManyDefaultsTestData(); TypeAliaser aliaser = delegate(Type type) { return type.FullName.Replace('.', '_').Replace('+', '_'); }; // need to pass in class name aliasing scheme // this will fail if aliases are not valid js propert names Dictionary<string, Defaults4Class> defaultsJS; String[] expressions; object[] expectedValues; NodeExpander nodeExpander = new FieldReflectionNodeExpander(); LeafDefaultSet lds = df.getDefaultsForAllLinkedObjects(md, new FieldReflectionNodeExpander()); defaultsJS = lds.getAlias2Defaults(aliaser); expressions = new string[] { aliaser(md.GetType()) + ".propertyName2DefaultValue" +".i1", aliaser(typeof(ManyDefaultsTestData.StringValues)) + ".propertyName2DefaultValue" + ".str3"}; expectedValues= new object[] { md.i1, md.stringValues.str3 }; //check that the defaults serialise OK first Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(defaultsJS); validateJSON(json, expressions, expectedValues, "testDefaultingWritingDefaultsBit.simplealias","using a verbose class aliaser"); // try a numeric aliaser aliaser = TypeAliaserUtils.createNumericTypeNameAliaser(); lds = df.getDefaultsForAllLinkedObjects(md, new FieldReflectionNodeExpander()); defaultsJS = lds.getAlias2Defaults(aliaser); expressions = new string[] { aliaser(md.GetType()) + ".propertyName2DefaultValue" +".i1", aliaser(typeof(ManyDefaultsTestData.StringValues)) + ".propertyName2DefaultValue" + ".str3"}; o2J.IndentSize = 2; json = o2J.toJson(defaultsJS); validateJSON(json, expressions, expectedValues, "testDefaultingWritingDefaultsBit.numericliaser", "using a compact numeric aliaser"); }
public void testToJsonLeafTypesViaFields() { // todo - this fails with FieldReflectionNodeExpander NodeExpander nodeExpander = new FieldReflectionNodeExpander(); AllPrimitiveLeafTypes testData = new AllPrimitiveLeafTypes(); String[] expressions = AllPrimitiveLeafTypes.testFieldExpressions; Object[] expectedValues = AllPrimitiveLeafTypes.testExpectedFieldValues(testData); Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(testData); validateJSON(json, expressions, expectedValues, "testToJsonLeafTypesViaFields"); }
public void testToJsonMany2Ones() { NodeExpander nodeExpander = new FieldReflectionNodeExpander(); TestData testData = new TestData(); String[] expressions = { "sub.subSub.seasons" }; Object[] expectedValues = { testData.TheSub.TheSubSub.Seasons }; Object2Json o2J = new Object2Json(); o2J.NodeExpander = nodeExpander; o2J.IndentSize = 2; String json = o2J.toJson(testData); validateJSON(json, expressions, expectedValues, "testToJsonMany2Ones"); }