File: /var/www/tana/frontend/node_modules/twig/test-ext/test.original.js
/*jshint node: true */
( function( ) {
"use strict";
var fs = require( "fs" ),
path = require("path"),
twigPhpDir = "test-ext/twig.php",
runTest = function( ) {
describe( "Twig original test ->", function( ) {
var
Twig = Twig || require("../twig"),
twig = twig || Twig.twig,
walk = function( dir, done ) {
var results = [],
list = fs.readdirSync( dir ),
i = 0;
( function next( ) {
var file = list[i++],
stat;
if ( !file ) {
return done( null, results );
}
file = dir + '/' + file;
stat = fs.statSync( file );
if ( stat && stat.isDirectory( ) ) {
walk( file, function( err, res ) {
results = results.concat( res );
next( );
} );
} else {
results.push( file );
next( );
}
} )( );
},
testFile = function( filepath ) {
var tmp = fs.readFileSync( filepath, "utf8" ),
tmp2 = tmp.split( /^--/gm ),
res = {};
tmp2.forEach( function( data ) {
if ( !data ) {
return;
}
var name = ( "" + data.match( /^[A-Z]+--/ ) || "" ).replace( /--$/, '' );
if ( name ) {
res[ name ] = data.substring( name.length + 3 ).trim( );
}
} );
res.filepath = filepath;
return res;
};
walk( twigPhpDir + "/test", function( err, files ) {
var testFiles = [];
files.forEach( function( filepath ) {
if ( filepath.substring( filepath.length - 5 ) === ".test" ) {
testFiles.push( testFile( filepath ) );
}
} );
testFiles.forEach( function( data, idx ) {
var Tokenizer = require( "tokenizer" ),
t = new Tokenizer( ),
res,
str = data.DATA,
currentObject
;
if ( !data.DATA || data.DATA.match( /^class|\$|^date_default_timezone_set|new Twig|new SimpleXMLElement|new ArrayObject|new ArrayIterator/ ) ) {
if ( data.EXCEPTION ) {
it( data.filepath + " -> " + data.TEST.trim( ), function( ) {
try {
twig( {
"data" : data.TEMPLATE.trim( )
} )
.render( res )
.trim( );
} catch( exp ) {
return;
}
throw "Should have thrown an exception: " + data.EXCEPTION;
} );
} else {
it( data.filepath + " -> " + data.TEST.trim( ), function( ) {
throw "Unsupported";
} );
}
delete testFiles[ idx ];
return;
}
t.on( "token", function( token, type ) {
// console.log( token, type, res, currentObject );
var tmpObject,
match,
tmpLength,
tmpString,
parentObject,
i
;
if ( type === 'symbol' ) {
if ( token === "return" ) {
return;
}
}
if ( type === "whitespace" ) {
return;
}
if ( type === "semicolon" ) {
return;
}
if ( type === 'array' ) {
if ( !currentObject ) {
currentObject = {
"type" : "array",
"keys" : [],
"values" : []
};
} else {
tmpObject = currentObject;
currentObject = {
"type" : "array",
"keys" : [],
"values" : [],
"parent" : tmpObject
};
}
return;
}
if ( type === "string" ) {
match = token.match( /^'(([^']*| \\')*)'$/ );
if ( match && match[1] ) {
tmpString = match[1];
} else {
match = token.match( /^"(([^"]*| \\")*)"$/ );
if ( match && match[1] ) {
tmpString = match[1];
}
}
if ( tmpString ) {
currentObject.last_value = tmpString.replace( /\\n/g, "\n" ).replace( /\\r/g, "\r" );
return;
}
}
if ( type === "number" ) {
currentObject.last_value = parseFloat( token, 10 );
return;
}
if ( type === "comma" ) {
if ( currentObject.last_value ) {
if ( currentObject.type === "array" ) {
tmpLength = currentObject.values.length;
currentObject.keys.push( tmpLength );
currentObject.values.push( currentObject.last_value );
delete currentObject.last_value;
return;
} else if ( currentObject.type === "object" ) {
currentObject.keys.push( currentObject.last_key );
currentObject.values.push( currentObject.last_value );
delete currentObject.last_key;
delete currentObject.last_value;
return;
}
}
}
if ( type === "key-label" ) {
currentObject.type = "object";
currentObject.last_key = currentObject.last_value;
delete currentObject.last_value;
return;
}
if ( type === "end-object" ) {
if ( currentObject.type === "array" ) {
if ( currentObject.last_value ) {
tmpLength = currentObject.values.length;
currentObject.keys.push( tmpLength );
currentObject.values.push( currentObject.last_value );
delete currentObject.last_value;
}
} else if ( currentObject.type === "object" ) {
if ( currentObject.last_key && currentObject.last_value ) {
currentObject.keys.push( currentObject.last_key );
currentObject.values.push( currentObject.last_value );
delete currentObject.last_key;
delete currentObject.last_value;
}
}
if ( currentObject.type === "array" ) {
tmpObject = [];
} else if ( currentObject.type === "object" ) {
tmpObject = {};
}
for ( i = 0; i < currentObject.values.length; i+=1 ) {
tmpObject[ currentObject.keys[i] ] = currentObject.values[i];
}
if ( currentObject.parent ) {
parentObject = currentObject.parent;
delete currentObject.parent;
delete currentObject.last_key;
delete currentObject.last_value;
currentObject = parentObject;
currentObject.last_value = tmpObject;
} else {
res = tmpObject;
currentObject = undefined;
}
return;
}
} );
t.on( "end", function( ) {
/*
if ( data.TEST.trim( ) === 'Twig supports the in operator' ) {
console.log( data.TEST.trim( ), res, data.DATA );
console.log( "data.TEMPLATE" );
console.log( data.TEMPLATE );
console.log( data.TEMPLATE.substr( -1 ) );
console.log( "data.EXPECT" );
console.log( data.EXPECT );
console.log( "data.RESULT" );
console.log(
twig( {
"data" : data.TEMPLATE
} )
.render( res )
);
}
*/
it( data.filepath + " -> " + data.TEST.trim( ), function( ) {
twig( {
"data" : data.TEMPLATE.trim( )
} )
.render( res )
.trim( )
.should
.equal( data.EXPECT );
} );
} );
t.on( "error", function( err ) {
// console.log( err );
} );
t.addRule( /^'([^']|\\')*'$/, 'string' );
t.addRule( /^"([^"]|\\")*"$/, 'string' );
t.addRule( /^'([^']|\\')*$/, 'maybe-string' );
t.addRule( /^"([^"]|\\")*$/, 'maybe-string' );
t.addRule( /^=$/, 'equal' );
t.addRule( /^=>$/, 'key-label' );
t.addRule( /^-\?\d+(\.\d+)?$/, 'number' );
t.addRule( /^\d+$/, 'number' );
t.addRule( /^\d+\.$/, 'maybe-float' );
t.addRule( /^(true|false)$/, 'bool' );
t.addRule( /^null$/, 'null' );
t.addRule( /^array\s*\($/, 'array' );
t.addRule( /^\($/, 'begin-object' );
t.addRule( /^\)$/, 'end-object' );
t.addRule( /^\[$/, 'begin-array' );
t.addRule( /^\]$/, 'end-array' );
t.addRule( /^,$/, 'comma' );
t.addRule( /^'$/, 'ping' );
t.addRule( /^;$/, 'semicolon' );
t.addRule( /^"$/, 'double-ping' );
t.addRule( /^\w+$/, "symbol" );
t.addRule( /^(\s)+$/, 'whitespace' );
t.write( str + " " );
t.end( );
} );
} );
} );
},
setup = function( ) {
var existsSync = fs.existsSync || path.existsSync;
if ( existsSync( twigPhpDir ) ) {
runTest( );
return;
}
};
setup( );
} )( );