2016-04-12 12:12:44 +00:00
define ( [
2017-04-18 10:14:32 +00:00
'jquery' ,
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' ,
2017-04-18 10:14:32 +00:00
] , function ( $ , Hyperjson , TextPatcher , Sortify , Cryptpad ) {
2016-04-12 12:12:44 +00:00
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
} ;
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 ) ;
} ) ;
2017-04-25 14:11:19 +00:00
// check that old hashes parse correctly
assert ( function ( ) {
var secret = Cryptpad . parseHash ( '67b8385b07352be53e40746d2be6ccd7XAYSuJYYqa9NfmInyHci7LNy' ) ;
return secret . channel === "67b8385b07352be53e40746d2be6ccd7" &&
secret . key === "XAYSuJYYqa9NfmInyHci7LNy" &&
secret . version === 0 ;
} , "Old hash failed to parse" ) ;
// make sure version 1 hashes parse correctly
assert ( function ( ) {
var secret = Cryptpad . parseHash ( '/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI' ) ;
return secret . version === 1 &&
secret . mode === "edit" &&
secret . channel === "3Ujt4F2Sjnjbis6CoYWpoQ" &&
secret . key === "usn4+9CqVja8Q7RZOGTfRgqI" &&
! secret . present ;
} , "version 1 hash failed to parse" ) ;
// test support for present mode in hashes
assert ( function ( ) {
var secret = Cryptpad . parseHash ( '/1/edit/CmN5+YJkrHFS3NSBg-P7Sg/DNZ2wcG683GscU4fyOyqA87G/present' ) ;
return secret . version === 1
&& secret . mode === "edit"
&& secret . channel === "CmN5+YJkrHFS3NSBg-P7Sg"
&& secret . key === "DNZ2wcG683GscU4fyOyqA87G"
&& secret . present ;
} , "version 1 hash failed to parse" ) ;
// test support for trailing slash
assert ( function ( ) {
var secret = Cryptpad . parseHash ( '/1/edit/3Ujt4F2Sjnjbis6CoYWpoQ/usn4+9CqVja8Q7RZOGTfRgqI/' ) ;
return secret . version === 1 &&
secret . mode === "edit" &&
secret . channel === "3Ujt4F2Sjnjbis6CoYWpoQ" &&
secret . key === "usn4+9CqVja8Q7RZOGTfRgqI" &&
! secret . present ;
} , "test support for trailing slashes in version 1 hash failed to parse" ) ;
assert ( function ( ) {
// TODO
return true ;
} , "version 2 hash failed to parse correctly" ) ;
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
} ) ;