Example #1
0
        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");
 }