2016-04-21 13:44:56 +00:00
require . config ( { paths : { 'json.sortify' : '/bower_components/json.sortify/dist/JSON.sortify' } } ) ;
2016-04-12 12:12:44 +00:00
define ( [
'/bower_components/jquery/dist/jquery.min.js' ,
2016-06-20 16:38:56 +00:00
'/bower_components/hyperjson/hyperjson.js' ,
2016-05-13 15:32:56 +00:00
'/bower_components/textpatcher/TextPatcher.amd.js' ,
2016-04-21 13:05:41 +00:00
'json.sortify' ,
2016-10-24 09:51:16 +00:00
'/common/cryptpad-common.js' ,
] , function ( jQuery , Hyperjson , TextPatcher , Sortify , Cryptpad ) {
2016-04-12 12:12:44 +00:00
var $ = window . jQuery ;
window . Hyperjson = Hyperjson ;
window . TextPatcher = TextPatcher ;
2016-04-21 13:05:41 +00:00
window . Sortify = Sortify ;
2016-04-12 12:12:44 +00:00
var assertions = 0 ;
2016-04-13 14:10:38 +00:00
var failed = false ;
var failedOn ;
2016-04-14 10:16:10 +00:00
var failMessages = [ ] ;
var ASSERTS = [ ] ;
var runASSERTS = function ( ) {
ASSERTS . forEach ( function ( f , index ) {
f ( index ) ;
} ) ;
} ;
2016-04-12 12:12:44 +00:00
var assert = function ( test , msg ) {
2016-04-14 10:16:10 +00:00
ASSERTS . push ( function ( i ) {
2016-04-21 13:05:41 +00:00
var returned = test ( ) ;
if ( returned === true ) {
2016-04-14 10:16:10 +00:00
assertions ++ ;
} else {
failed = true ;
failedOn = assertions ;
failMessages . push ( {
test : i ,
2016-04-21 13:05:41 +00:00
message : msg ,
output : returned ,
2016-04-14 10:16:10 +00:00
} ) ;
}
} ) ;
2016-04-12 12:12:44 +00:00
} ;
var $body = $ ( 'body' ) ;
2016-04-21 13:05:41 +00:00
var HJSON _list = [
2016-06-20 16:38:56 +00:00
'["DIV",{"id":"target"},[["P",{"class":" alice bob charlie has.dot","id":"bang"},["pewpewpew"]]]]' ,
2016-04-21 13:05:41 +00:00
2016-06-20 16:38:56 +00:00
'["DIV",{"id":"quot"},[["P",{},["\\"pewpewpew\\""]]]]' ,
2016-04-21 13:05:41 +00:00
2016-06-20 16:38:56 +00:00
'["DIV",{"id":"widget"},[["DIV",{"class":"cke_widget_wrapper cke_widget_block","contenteditable":"false","data-cke-display-name":"macro:velocity","data-cke-filter":"off","data-cke-widget-id":"0","data-cke-widget-wrapper":"1","tabindex":"-1"},[["DIV",{"class":"macro cke_widget_element","data-cke-widget-data":"%7B%22classes%22%3A%7B%22macro%22%3A1%7D%7D","data-cke-widget-keep-attr":"0","data-cke-widget-upcasted":"1","data-macro":"startmacro:velocity|-||-|Here is a macro","data-widget":"xwiki-macro"},[["P",{},["Here is a macro"]]]],["SPAN",{"class":"cke_reset cke_widget_drag_handler_container","style":"background: rgba(220, 220, 220, 0.5) url(\\"/customize/cryptofist_small.png\\") repeat scroll 0% 0%; top: -15px; left: 0px; display: block;"},[["IMG",{"class":"cke_reset cke_widget_drag_handler","data-cke-widget-drag-handler":"1","height":"15","src":"data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==","title":"Click and drag to move","width":"15"},[]]]]]]]]' ,
2016-04-21 13:05:41 +00:00
] ;
var elementFilter = function ( ) {
// pass everything
return true ;
} ;
var attributeFilter = function ( h ) {
// don't filter anything
return h ;
} ;
var HJSON _equal = function ( shjson ) {
assert ( function ( ) {
// parse your stringified Hyperjson
var hjson ;
try {
hjson = JSON . parse ( shjson ) ;
} catch ( e ) {
console . log ( e ) ;
return false ;
}
// turn it into a DOM
2016-06-20 16:38:56 +00:00
var DOM = Hyperjson . toDOM ( hjson ) ;
2016-04-21 13:05:41 +00:00
// turn it back into stringified Hyperjson, but apply filters
var shjson2 = Sortify ( Hyperjson . fromDOM ( DOM , elementFilter , attributeFilter ) ) ;
var success = shjson === shjson2 ;
var op = TextPatcher . diff ( shjson , shjson2 ) ;
var diff = TextPatcher . format ( shjson , op ) ;
if ( success ) {
return true ;
} else {
return '<br><br>insert: ' + diff . insert + '<br><br>' +
'remove: ' + diff . remove + '<br><br>' ;
}
} , "expected hyperjson equality" ) ;
} ;
HJSON _list . map ( HJSON _equal ) ;
var roundTrip = function ( sel ) {
var target = $ ( sel ) [ 0 ] ;
2016-04-12 12:12:44 +00:00
assert ( function ( ) {
var hjson = Hyperjson . fromDOM ( target ) ;
2016-06-20 16:38:56 +00:00
var cloned = Hyperjson . toDOM ( hjson ) ;
2016-04-12 12:12:44 +00:00
var success = cloned . outerHTML === target . outerHTML ;
if ( ! success ) {
2016-04-20 08:10:26 +00:00
var op = TextPatcher . diff ( target . outerHTML , cloned . outerHTML ) ;
2016-04-12 12:12:44 +00:00
window . DEBUG = {
error : "Expected equality between A and B" ,
A : target . outerHTML ,
B : cloned . outerHTML ,
2016-04-20 08:10:26 +00:00
diff : op
2016-04-12 12:12:44 +00:00
} ;
2016-04-21 13:05:41 +00:00
console . log ( "DIFF:" ) ;
TextPatcher . log ( target . outerHTML , op ) ;
2016-04-12 12:12:44 +00:00
}
return success ;
} , "Round trip serialization introduced artifacts." ) ;
} ;
2016-04-21 13:05:41 +00:00
var HTML _list = [
'#target' ,
2016-06-20 16:38:56 +00:00
'#widget' ,
2016-04-20 08:10:26 +00:00
'#quot' ,
2016-04-21 13:05:41 +00:00
] ;
HTML _list . forEach ( roundTrip ) ;
2016-04-12 12:12:44 +00:00
2016-04-13 14:10:38 +00:00
var strungJSON = function ( orig ) {
var result ;
assert ( function ( ) {
result = JSON . stringify ( JSON . parse ( orig ) ) ;
return result === orig ;
} , "expected result (" + result + ") to equal original (" + orig + ")" ) ;
} ;
[ '{"border":"1","style":{"width":"500px"}}' ,
2016-04-21 13:05:41 +00:00
'{"style":"width: 500px;","border":"1"}' ,
2016-04-13 14:10:38 +00:00
] . forEach ( function ( orig ) {
strungJSON ( orig ) ;
} ) ;
2016-10-24 09:51:16 +00:00
assert ( function ( ) {
var missing = Cryptpad . Messages . _checkTranslationState ( ) ;
if ( missing . length !== 0 ) {
missing . forEach ( function ( msg ) {
console . log ( '* ' + msg ) ;
} ) ;
2017-01-12 11:06:44 +00:00
// No, this is crappy, it's going to cause tests to fail basically all of the time.
//return false;
2016-10-24 09:51:16 +00:00
}
return true ;
} , "expected all translation keys in default language to be present in all translations. See console for details." ) ;
2016-04-13 14:10:38 +00:00
var swap = function ( str , dict ) {
return str . replace ( /\{\{(.*?)\}\}/g , function ( all , key ) {
2016-04-14 10:16:10 +00:00
return typeof dict [ key ] !== 'undefined' ? dict [ key ] : all ;
2016-04-13 14:10:38 +00:00
} ) ;
} ;
var multiline = function ( f ) {
var str ;
2016-04-14 10:16:10 +00:00
f . toString ( ) . replace ( /\/\*([\s\S]*)\*\//g , function ( all , out ) {
2016-04-13 14:10:38 +00:00
str = out ;
} ) ;
2016-04-14 10:16:10 +00:00
return str || '' ;
2016-04-21 13:05:41 +00:00
} ;
2016-04-13 14:10:38 +00:00
2016-04-14 10:16:10 +00:00
var formatFailures = function ( ) {
var template = multiline ( function ( ) { / *
2016-04-21 13:05:41 +00:00
< p class = "error" >
Failed on test number { { test } } with error message :
2016-04-21 13:44:56 +00:00
"{{message}}"
2016-04-21 13:05:41 +00:00
< / p >
< p >
The test returned :
{ { output } }
< / p >
2016-04-14 10:16:10 +00:00
< br >
* / } ) ;
return failMessages . map ( function ( obj ) {
console . log ( obj ) ;
return swap ( template , obj ) ;
} ) . join ( "\n" ) ;
} ;
runASSERTS ( ) ;
2016-04-13 14:10:38 +00:00
$ ( "body" ) . html ( function ( i , val ) {
var dict = {
previous : val ,
2016-04-14 10:16:10 +00:00
totalAssertions : ASSERTS . length ,
2016-04-13 14:10:38 +00:00
passedAssertions : assertions ,
plural : ( assertions === 1 ? '' : 's' ) ,
2016-04-14 10:16:10 +00:00
failMessages : formatFailures ( )
2016-04-13 14:10:38 +00:00
} ;
var SUCCESS = swap ( multiline ( function ( ) { / *
2016-04-14 10:16:10 +00:00
< div class = "report" > { { passedAssertions } } / { { totalAssertions } } test { { plural } } passed .
{ { failMessages } }
< / d i v >
2016-04-13 14:10:38 +00:00
{ { previous } }
* / } ) , d i c t ) ;
2016-04-14 10:16:10 +00:00
var report = SUCCESS ;
2016-04-13 14:10:38 +00:00
return report ;
} ) ;
2016-04-14 10:16:10 +00:00
var $report = $ ( '.report' ) ;
$report . addClass ( failed ? 'failure' : 'success' ) ;
2016-04-12 12:12:44 +00:00
} ) ;