Author: jbeard Date: Tue Jun 22 00:26:16 2010 New Revision: 956751 URL: http://svn.apache.org/viewvc?rev=956751&view=rev Log: Added code to build.js to make in-browser unit testing work in selenium. Everything works now.
Modified: commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/build.js Modified: commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/build.js URL: http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/build.js?rev=956751&r1=956750&r2=956751&view=diff ============================================================================== --- commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/build.js (original) +++ commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/build.js Tue Jun 22 00:26:16 2010 @@ -134,6 +134,17 @@ require.def("build", */ ] + var htmlInBrowserUnitTestsGenerated = [ + /* + { + code : String, + path : String, + test : performance/usability test, + ie : boolean + } + */ + ] + var performanceResults = [ /* { @@ -300,7 +311,8 @@ require.def("build", scriptsGenerated. filter(function(s){return scxmlTests[s.scxmlTest] == testScript.scxmlTest}). forEach(function(generatedScript){ - + + //FIXME: this may need to be refactored var testHtml = htmlGenFn(generatedScript.name,testScriptRelativePath); //write testHtml @@ -326,6 +338,64 @@ require.def("build", }, + _genInBrowserHtml : function(fileDescriptor,testsGeneratedCollection){ + + //for each type of browser (IE and non-IE) [though we can make this part dynamic + //for each unit test script + //and its corresponding html test + //for each backend + + print("Generating in-browser html test files..."); + + + var compileTargets = [{scxmlTest:scxmlTest, backend:backend, isIE:isIE} + for (scxmlTest in scxmlTests) + for (backend in backends) + for each (isIE in [true,false])]; + + compileTargets.forEach(function(target){ + //run the build script on the test + var scxmlTestName = target.scxmlTest; + var backendName = target.backend; + var isIE = target.isIE; + + var pathToSCXMLTest = scxmlTests[scxmlTestName]; + + var correspondingUnitTests = unitTestScripts.filter(function(t){return t.scxmlTest == pathToSCXMLTest}); + + correspondingUnitTests.forEach(function(unitTest){ + + var pathToUnitTest = unitTest.path; + + var relativePathToUnitTest = "../" + pathToUnitTest; + + var testHtml = inBrowserUnitTestHtmlTemplate(pathToSCXMLTest,relativePathToUnitTest,backendName,isIE); + + //write testHtml + var fpath = buildDir + "/" + fileDescriptor + "_" + scxmlTestName + "_" + backendName + + (isIE ? "IE" : "") + ".html"; + + print("Writing in-browser html test file " + fpath); + + utilFile.writeFile(testHtml,fpath); + + //save the path to the html for running in selenium later + testsGeneratedCollection.push({ + path : fpath, + scxmlTest : scxmlTestName, + testCasePath : pathToUnitTest, + backend : backendName, + ie : isIE + }); + + }); + + + }); + + }, + + genPerformanceTestHtml : function(callback){ print("Generating html performance test files..."); this._genHtml( performanceTestScripts, @@ -437,6 +507,7 @@ require.def("build", }, runUnitTestsWithSelenium : function(){ + this.genUnitTestHtml(function(){ print("Running Selenium unit tests..."); @@ -508,6 +579,84 @@ require.def("build", }); }, + genInBrowserUnitTestHtml : function(){ + print("Generating html performance test files..."); + this._genInBrowserHtml("in-browser-unit",htmlInBrowserUnitTestsGenerated); + }, + + runInBrowserUnitTestsWithSelenium : function(){ + this.genInBrowserUnitTestHtml(); + + print("Running Selenium unit tests..."); + + for(var browserName in browsers){ + + print("Running test for " + browserName + "..."); + + var bSpec = browsers[browserName]; + var bSel = new DefaultSelenium(bSpec.host, bSpec.port, bSpec.browser, seleniumConf.rootUrl); + bSel.start(); + + htmlInBrowserUnitTestsGenerated.forEach(function(htmlTest){ + //ensure we are not testing an ie html test + //on a non-ie browser + if(htmlTest.ie == bSpec.ie){ + + var unitTestResult = unitTestWithSelenium(bSel,htmlTest.path); + + var unitTestResultObj = { + data : unitTestResult, + browser : browserName, + scxmlTest : htmlTest.scxmlTest, + backend : htmlTest.backend, + }; + + unitTestResults.push(unitTestResultObj); + + //report errors and failures that may occur + if(unitTestResult.failCount || unitTestResult.errorCount){ + print("UNIT TEST ERROR"); + print(JSON.stringify(unitTestResultObj)); + } + } + }); + + bSel.stop(); + } + + //make one big, self-describing data structure + //this is what analyze uses to do its analyses + allUnitTestResults = { + //FIXME: maybe make this an obj, so that we can add more info to it (for reports, etc.) + data : unitTestResults, + browsers : browsers, + backends : backends, + scxmlTests : scxmlTests + }; + + //stringify it, and serialize it for posterity + var allUnitTestResultsString = + JSON.stringify(allUnitTestResults) + + + //print report that says whether all tests passed + var totalTests = unitTestResults.reduce(function(a,b){return a + b.data.testCount},0); + var totalTestsFailed = unitTestResults.reduce(function(a,b){return a + b.data.errorCount},0); + var totalTestsErrored = unitTestResults.reduce(function(a,b){return a + b.data.failCount},0); + var totalTestsPassed = unitTestResults.reduce(function(a,b){return a + b.data.testsPassed},0); + + print("Test Results:"); + print("Total Tests: " + totalTests); + print("Total Tests Failed: " + totalTestsFailed); + print("Total Tests Errored: " + totalTestsErrored); + print("Total Tests Passed: " + totalTestsPassed); + + var unitTestResultsPath = "build/allUnitTestResults.json"; + print("writing a summary of performance results to " + unitTestResultsPath); + utilFile.writeFile(allUnitTestResultsString, unitTestResultsPath); + }, + + runUnitTestsWithRhino : function(){ @@ -638,6 +787,60 @@ require.def("build", </html> } + function inBrowserUnitTestHtmlTemplate(modulePathToXMLTest,testScriptRelativePath,backendName,isIE){ + default xml namespace = ""; + return <html> + <head> + <script src="../lib/js/requirejs/require.js" type="text/javascript">true;</script> + <script src="../lib/js/requirejs/require/xml.js" type="text/javascript">true;</script> + <script djConfig="isDebug:true" src="../lib/test-js/dojo-release-1.4.2-src/dojo/dojo.js" type="text/javascript">true;</script> + <script type="text/javascript"> + dojo.require("doh.runner"); + window.dohIsComplete = false; + window.oldDohOnEnd = window.doh._onEnd; + window.doh._onEnd = function() { window.dohIsComplete = true; window.oldDohOnEnd.apply(window.doh); }; + </script> + <script src="../test/testHelpers.js" type="text/javascript">true;</script> + <script src={testScriptRelativePath} type="text/javascript">true;</script> + <script> + var resultText; + + require( + { + "baseUrl":"/" + }, + [ "src/javascript/scxml/cgf/SCXMLCompiler", + "xml!{modulePathToXMLTest}"], + function(compiler,KitchenSink_executableContent){ + var compileLog = true; + + compiler.compile({ + inFiles:[KitchenSink_executableContent], + backend:"{backendName}", + beautify:true, + verbose:false, + log:compileLog, + ie:{isIE} + }, function(scArr){ + var transformedJs = scArr[0]; + + console.log(transformedJs); + + //eval + eval(transformedJs); + window.StatechartExecutionContext = StatechartExecutionContext; + dojo.require("doh.runner"); + doh.run(); + }); + } + ); + + </script> + </head> + <body> + </body> + </html> + }