diff --git a/Makefile b/Makefile index 6ac3c81..82467fc 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ PATH_BUILD=./build PATH_TOOLS=./tools PATH_COMBINE_OUTPUT=${PATH_BUILD}/ease.js +PATH_COMBINE_OUTPUT_FULL=${PATH_BUILD}/ease-full.js COMBINE=${PATH_TOOLS}/combine @@ -19,6 +20,7 @@ mkbuild: # browser) combine: mkbuild ${COMBINE} > ${PATH_COMBINE_OUTPUT} + INC_TEST=1 ${COMBINE} > ${PATH_COMBINE_OUTPUT_FULL} # run tests test: default diff --git a/test/test-combine.js b/test/test-combine.js index 2cd9541..2526b28 100644 --- a/test/test-combine.js +++ b/test/test-combine.js @@ -28,45 +28,68 @@ var common = require( './common' ), Script = process.binding( 'evals' ).Script, sandbox = {}; -// attempt to read the combined file -try + +var files = [ 'ease.js', 'ease-full.js' ], + file = '', + i = files.length; + +while ( i-- ) { - var data = require( 'fs' ) - .readFileSync( ( __dirname + '/../build/ease.js' ), 'ascii' ); -} -catch ( e ) -{ - // if the file doesn't exit, just skip the test - console.log( - "Combined file not found. Test skipped. Please run `make combined`." + file = files[ i ]; + + // attempt to read the combined file + try + { + var data = require( 'fs' ) + .readFileSync( ( __dirname + '/../build/' + file ), 'ascii' ); + } + catch ( e ) + { + // if the file doesn't exit, just skip the test + console.log( + "Combined file not found. Test skipped. Please run `make combined`." + ); + process.exit( 0 ); + } + + // run the script (if this fails to compile, the generated code is invalid) + var cmb_script = new Script( data ); + cmb_script.runInNewContext( sandbox ); + + assert.equal( + sandbox.require, + undefined, + "require() function is not in the global scope" ); - process.exit( 0 ); + + assert.equal( + sandbox.exports, + undefined, + "exports are not in the global scope" + ); + + + assert.ok( + ( sandbox.easejs !== undefined ), + "'easejs' namespace is defined within combined file" + ); + + assert.ok( + ( sandbox.easejs.Class !== undefined ), + "easejs namespace contains class exports" + ); + + + // the full file has tests included to be run client-side + if ( file === 'ease-full.js' ) + { + assert.ok( + ( typeof sandbox.easejs.runTests === 'function' ), + "Full ease.js file contains test runner" + ); + + // cross your fingers + sandbox.easejs.runTests(); + } } -// run the script (if this fails to compile, the generated code is invalid) -var cmb_script = new Script( data ); -cmb_script.runInNewContext( sandbox ); - -assert.equal( - sandbox.require, - undefined, - "require() function is not in the global scope" -); - -assert.equal( - sandbox.exports, - undefined, - "exports are not in the global scope" -); - - -assert.ok( - ( sandbox.easejs !== undefined ), - "'easejs' namespace is defined within combined file" -); - -assert.ok( - ( sandbox.easejs.Class !== undefined ), - "easejs namespace contains class exports" -); - diff --git a/tools/combine b/tools/combine index 1a0e6ff..d8b01a0 100755 --- a/tools/combine +++ b/tools/combine @@ -20,8 +20,10 @@ PATH_TOOLS=$( dirname "$0" ) PATH_LIB="$PATH_TOOLS/../lib" +PATH_TEST="$PATH_TOOLS/../test" MODULE_EXT='js' TPL_PATH="$PATH_TOOLS/combine.tpl" +TPL_TEST_PATH="$PATH_TOOLS/combine-test.tpl" TPL_VAR='/**{CONTENT}**/' RMTRAIL="$PATH_TOOLS/rmtrail" @@ -91,6 +93,41 @@ for module in $CAT_MODULES; do echo "} )( exports['$module'] = {} );" done +# include tests? +if [ "$INC_TEST" ]; then + # note that not all tests are included + TEST_CASES=$( find $PATH_TEST \ + \( -name 'test-*.js' \ + ! -name 'test-combine.js' \ + ! -name 'test-index.js' \ + \) \ + -exec basename {} \; \ + ) + + # include test combine template + cat "$TPL_TEST_PATH" | grep -v '^#' + + echo "/** TEST CASES **/" + echo "ns_exports.runTests = function ()" + echo "{" + + for testcase in $TEST_CASES; do + filename="$PATH_TEST/$testcase" + + # each module must be enclosed in a closure to emulate a module + echo "/** TEST CASE: $testcase **/" + echo "( function()" + echo "{" + + # add the module, removing trailing commas + cat $filename | $RMTRAIL + + echo "} )();" + done + + echo "};" +fi + # output combined file footer tpl_footer diff --git a/tools/combine-test.tpl b/tools/combine-test.tpl new file mode 100644 index 0000000..6652286 --- /dev/null +++ b/tools/combine-test.tpl @@ -0,0 +1,99 @@ +# Included in full combined file for test cases +# +# Copyright (C) 2010 Mike Gerwitz +# +# This file is part of ease.js. +# +# ease.js is free software: you can redistribute it and/or modify it under the +# terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License +# for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# # + +exports.common = { + require: function ( id ) + { + return require( id ); + } +}; + + +/** + * Bare-bones implementation of node.js assert module + * + * This contains only the used assertions + */ +exports.assert = { + equal: function ( val, cmp, err ) + { + if ( val !== cmp ) + { + throw Error( err ); + } + }, + + + notEqual: function ( val, cmp, err ) + { + if ( val === cmp ) + { + throw Error( err ); + } + }, + + + deepEqual: function ( val, cmp, err ) + { + // todo: not yet implemented + }, + + + ok: function ( result, err ) + { + if ( !result ) + { + throw Error( err ); + } + }, + + + throws: function ( test, expected, err ) + { + try + { + test(); + } + catch ( e ) + { + if ( !( e instanceof expected ) ) + { + throw Error( err ); + } + } + }, + + + doesNotThrow: function ( test, not_expected, err ) + { + try + { + test(); + } + catch ( e ) + { + if ( e instanceof not_expected ) + { + throw Error( err ); + } + } + }, +}; + diff --git a/tools/combine.tpl b/tools/combine.tpl index a52e105..2330313 100644 --- a/tools/combine.tpl +++ b/tools/combine.tpl @@ -67,7 +67,7 @@ var easejs = {}; { // remove the './' directory prefix (every module is currently included // via a relative path) - var id_clean = module_id.substring( 2 ); + var id_clean = module_id.replace( /^.\//, '' ); // attempt to retrieve the module var module = exports[ id_clean ];