public void writeTestFunction(StreamWriter sw, JsonValueSet valueSet)
 {
     sw.WriteLine("function " + testId2FunctionName(valueSet.testId) + @"()
              {");
     sw.WriteLine("var " + valueSet.varname + "=" + valueSet.json + ";");
     valueSet.expressions2ExpectedValue.Keys.ToList().ForEach(
         (expr) =>
     {
         Object expected = valueSet.expressions2ExpectedValue[expr];
         if (expected == null)
         {
             expected = "null";
         }
         else if (expected.GetType() == typeof(string) || expected.GetType() == typeof(Char))
         {
             expected = ("'" + expected + "'");
         }
         string fullexpression = valueSet.varname + "." + expr;
         sw.WriteLine("assertEqual(" + expected + "," + fullexpression +
                      ", '" + fullexpression.Replace("'", "\\'") + "');");
     }
         );
     sw.WriteLine(
         @"
         } ");
 }
        public Dictionary <string, object> extractValuesFromJson(JsonValueSet valueSet, string testId)
        {
            // try to look up JunitAttribute in stack here !

            TestAttribute ta = getCurrentNunitTest();

            valueSet.stackFrame    = getCurrentNunitStackFrame();
            valueSet.testAttribute = ta;

            history.Add(valueSet);

            valueSet.testId = testId;

            writeTestHtml(valueSet);

            Dictionary <string, object> expressions2ActualValue = new Dictionary <string, object>();

            valueSet.expressions2ExpectedValue.Keys.ToList().ForEach(
                (expression) =>
            {
                string js;
                if (valueSet.extraFunctions.Count() > 0)
                {
                    js = "(function() {";
                    foreach (string f in valueSet.extraFunctions)
                    {
                        js = js + "\r\n" + f;
                    }
                    js = js + "\r\n return (" + valueSet.json + ");";
                    js = js + " })()." + expression;
                }
                else
                {
                    js = "(" + valueSet.json + ")." + expression;
                }
                Object result = execute(js);
                //todo maybe System.DBNull actually means undefined !
                if (result != null && result.GetType() == (typeof(System.DBNull)))
                {
                    result = null;
                }
                expressions2ActualValue[expression] = (result);
            }
                );
            return(expressions2ActualValue);
        }
        public void writeTestHtml(JsonValueSet valueSet)
        {
            valueSet.filename = testdir + '\\' + valueSet.testId + ".html";
            System.Console.WriteLine("writing test to " + valueSet.filename);
            DirectoryInfo di = System.IO.Directory.CreateDirectory(testdir);

            System.Console.WriteLine("wrote test to " + di.FullName);
            System.IO.FileInfo fi = new System.IO.FileInfo(valueSet.filename);
            fi.Directory.Create();
            StreamWriter sw = new StreamWriter(valueSet.filename);

            sw.WriteLine(
                @"<html>
<script>
");
            foreach (string f in valueSet.extraFunctions)
            {
                sw.WriteLine(f);
                sw.WriteLine();
            }

            sw.WriteLine("var " + valueSet.varname + "=" + valueSet.json + ";");
            sw.WriteLine();
            //writeTestFunction(sw, valueSet);


            sw.WriteLine(@"</script>
<body>
<pre>");

            sw.WriteLine(valueSet.varname + "=>" + valueSet.json);
            valueSet.expressions2ExpectedValue.Keys.ToList().ForEach(
                (expression) =>
            {
                string strFullExpression = valueSet.varname + "." + expression;
                sw.WriteLine(strFullExpression + "==<script>document.write(" + strFullExpression + ")</script>");
            }
                );
            sw.WriteLine();
            sw.WriteLine("</pre>");
            sw.Flush();
            sw.Close();
        }
        public Dictionary<string, object> extractValuesFromJson(JsonValueSet valueSet, string testId)
        {
            // try to look up JunitAttribute in stack here !

            TestAttribute ta = getCurrentNunitTest();
            valueSet.stackFrame = getCurrentNunitStackFrame();
            valueSet.testAttribute = ta;

            history.Add(valueSet);

             valueSet.testId = testId;

            writeTestHtml(valueSet);

              Dictionary<string, object> expressions2ActualValue = new Dictionary<string, object>();

              valueSet.expressions2ExpectedValue.Keys.ToList().ForEach(
              (expression) =>
              {
                  string js;
                  if (valueSet.extraFunctions.Count() > 0)
                  {
                      js = "(function() {";
                      foreach (string f in valueSet.extraFunctions)
                      {
                          js = js + "\r\n" + f;
                      }
                      js = js + "\r\n return (" + valueSet.json + ");";
                      js = js + " })()." + expression;
                  }
                  else
                  {
                      js = "(" + valueSet.json + ")." + expression;
                  }
                  Object result = execute(js);
                  //todo maybe System.DBNull actually means undefined !
                  if (result != null && result.GetType()==(typeof(System.DBNull)) ) result = null;
                  expressions2ActualValue[expression]= (result);
              }
              );
             return expressions2ActualValue;
        }
        public void writeTestTablePage(StreamWriter sw, List <JsonValueSet> tests)
        {
            sw.WriteLine(
                @"<html>
<script>
");
            Dictionary <string, string> extraFunctionsPrinted = new Dictionary <string, string>();

            sw.WriteLine(JSExecuteUtilJavascript.AssertEqualFunction);

            foreach (JsonValueSet valueSet in tests)
            {
                foreach (string f in valueSet.extraFunctions)
                {
                    if (!extraFunctionsPrinted.ContainsKey(f))
                    {
                        extraFunctionsPrinted[f] = f;
                        sw.WriteLine(f);
                        sw.WriteLine();
                    }
                }
                writeTestFunction(sw, valueSet);
                sw.WriteLine();
            }

            sw.WriteLine();
            sw.WriteLine(JSExecuteUtilJavascript.getRunTest4TableRowFunction(TablePageRunTestFunctionName, crossimagesrc, tickimagesrc, questionmarkimagesrc));
            sw.WriteLine("</script>");
            string runAllTestsFunctionName = "runAllTests";

            sw.WriteLine(@"<body onload=" + "\"" + runAllTestsFunctionName + "(false)\"" + @">
<h1>
Serializer Browser Compatibility Tests - created by " + GetType().FullName + " at " + (DateTime.Now) + @"
</h1>");
            string[] headers           = { "pass<br>fail", "name", "description", ".net source", "java script<br> test source" };
            List <List <string> > rows = new List <List <string> >();

            sw.WriteLine(@"<script>
function " + runAllTestsFunctionName + "(clear) {");
            for (int index = 0; index < tests.Count; index++)
            {
                JsonValueSet  test             = tests[index];
                List <string> row              = new List <string>();
                string        imageid          = "row" + index + ".pass.image";
                string        testfunctionname = testId2FunctionName(test.testId);
                string        runtestcall      = TablePageRunTestFunctionName + "('" + imageid + "', " + testfunctionname + ", clear)";
                sw.WriteLine(runtestcall + ";");
                string runrow = "<img id='" + imageid + "' width='20' height='24'/>" +
                                "<a href=\"javascript:" + runtestcall + "\">run</a>";
                row.Add(runrow);
                row.Add(test.testId);
                row.Add(test.getDescription());
                row.Add(test.getSourceDescription());

                row.Add("<a href=\"javascript:" + JSExecuteUtilJavascript.ShowSourceFunctionName + "(" + testfunctionname + ")\">show</a>");
                rows.Add(row);
            }
            sw.WriteLine(@"}
var clear=false;"
                         + JSExecuteUtilJavascript.ShowSourceFunction + @"  
</script>");
            sw.WriteLine("<a href=\"javascript:" + runAllTestsFunctionName + "()\">run all tests</a>");
            sw.WriteLine("<br>");
            sw.WriteLine("<a href=\"javascript:" + runAllTestsFunctionName + "(true)\">clear all tests</a>");
            sw.WriteLine("<br>");
            writeHTMLtable(sw, headers, rows);
            sw.WriteLine();
//page default is to show result
//sw.WriteLine("<script> debugger; " + runAllTestsFunctionName + "(false);</script>");
            sw.WriteLine(@"</body>");
            sw.WriteLine("</html>");
        }
        public void writeTestHtml(JsonValueSet valueSet)
        {
            valueSet.filename = testdir + '\\' + valueSet.testId + ".html";
            System.Console.WriteLine("writing test to " + valueSet.filename);
            DirectoryInfo di = System.IO.Directory.CreateDirectory(testdir);
            System.Console.WriteLine("wrote test to " + di.FullName);
            System.IO.FileInfo fi = new System.IO.FileInfo(valueSet.filename);
            fi.Directory.Create();
            StreamWriter sw = new StreamWriter(valueSet.filename);
            sw.WriteLine(
            @"<html>
            <script>
            ");
            foreach (string f in valueSet.extraFunctions)
            {
                sw.WriteLine(f);
                sw.WriteLine();
            }

            sw.WriteLine("var " + valueSet.varname + "=" + valueSet.json + ";");
            sw.WriteLine();
            //writeTestFunction(sw, valueSet);

            sw.WriteLine(@"</script>
            <body>
            <pre>");

            sw.WriteLine(valueSet.varname + "=>" + valueSet.json);
            valueSet.expressions2ExpectedValue.Keys.ToList().ForEach(
                (expression) =>
                {
                    string strFullExpression = valueSet.varname + "." + expression;
                    sw.WriteLine(strFullExpression + "==<script>document.write(" + strFullExpression + ")</script>");
                }
                );
            sw.WriteLine();
            sw.WriteLine("</pre>");
            sw.Flush();
            sw.Close();
        }
 public void writeTestFunction(StreamWriter sw, JsonValueSet valueSet)
 {
     sw.WriteLine("function " + testId2FunctionName(valueSet.testId) + @"()
              {");
     sw.WriteLine("var " + valueSet.varname + "=" + valueSet.json + ";");
     valueSet.expressions2ExpectedValue.Keys.ToList().ForEach(
         (expr) =>
         {
             Object expected = valueSet.expressions2ExpectedValue[expr];
             if (expected == null) expected = "null";
             else if (expected.GetType() == typeof(string) || expected.GetType()==typeof(Char)) expected = ("'" + expected + "'");
             string fullexpression = valueSet.varname + "." + expr;
             sw.WriteLine("assertEqual(" + expected + "," + fullexpression +
                  ", '" + fullexpression.Replace("'", "\\'") + "');");
         }
         );
     sw.WriteLine(
     @"
         } ");
 }