added test for sprintf function, removing dead code and optimizing test cases

This commit is contained in:
El RIDO 2017-02-11 19:34:51 +01:00
parent b00bcd1352
commit b9c05b06d0
No known key found for this signature in database
GPG Key ID: 0F5C940A6BD81F92
4 changed files with 111 additions and 33 deletions

View File

@ -179,6 +179,9 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/** /**
* minimal sprintf emulation for %s and %d formats * minimal sprintf emulation for %s and %d formats
* *
* Note that this function needs the parameters in the same order as the
* format strings appear in the string, contrary to the original.
*
* @see {@link https://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format#4795914} * @see {@link https://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format#4795914}
* @name helper.sprintf * @name helper.sprintf
* @function * @function
@ -195,27 +198,22 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
} }
var format = args[0], var format = args[0],
i = 1; i = 1;
return format.replace(/%((%)|s|d)/g, function (m) { return format.replace(/%(s|d)/g, function (m) {
// m is the matched format, e.g. %s, %d // m is the matched format, e.g. %s, %d
var val; var val = args[i];
if (m[2]) { // A switch statement so that the formatter can be extended.
val = m[2]; switch (m)
} else { {
val = args[i]; case '%d':
// A switch statement so that the formatter can be extended. val = parseFloat(val);
switch (m) if (isNaN(val)) {
{ val = 0;
case '%d': }
val = parseFloat(val); break;
if (isNaN(val)) { default:
val = 0; // Default is %s
}
break;
default:
// Default is %s
}
++i;
} }
++i;
return val; return val;
}); });
}, },

View File

@ -93,6 +93,10 @@ describe('helper', function () {
}); });
describe('setElementText', function () { describe('setElementText', function () {
after(function () {
cleanup();
});
jsc.property( jsc.property(
'replaces the content of an element', 'replaces the content of an element',
jsc.nearray(jsc.nearray(jsc.elements(alnumString))), jsc.nearray(jsc.nearray(jsc.elements(alnumString))),
@ -104,20 +108,23 @@ describe('helper', function () {
ids.forEach(function(item, i) { ids.forEach(function(item, i) {
html += '<div id="' + item.join('') + '">' + $.PrivateBin.helper.htmlEntities(contents[i] || contents[0]) + '</div>'; html += '<div id="' + item.join('') + '">' + $.PrivateBin.helper.htmlEntities(contents[i] || contents[0]) + '</div>';
}); });
var clean = jsdom(html); var elements = $('<body />').html(html);
ids.forEach(function(item, i) { ids.forEach(function(item, i) {
var id = item.join(''), var id = item.join(''),
element = $(document.getElementById(id)); element = elements.find('#' + id).first();
$.PrivateBin.helper.setElementText(element, replacingContent); $.PrivateBin.helper.setElementText(element, replacingContent);
result *= replacingContent === $(document.getElementById(id)).text(); result *= replacingContent === element.text();
}); });
clean();
return Boolean(result); return Boolean(result);
} }
); );
}); });
describe('setMessage', function () { describe('setMessage', function () {
after(function () {
cleanup();
});
jsc.property( jsc.property(
'replaces the content of an empty element, analog to setElementText', 'replaces the content of an empty element, analog to setElementText',
jsc.nearray(jsc.nearray(jsc.elements(alnumString))), jsc.nearray(jsc.nearray(jsc.elements(alnumString))),
@ -129,14 +136,13 @@ describe('helper', function () {
ids.forEach(function(item, i) { ids.forEach(function(item, i) {
html += '<div id="' + item.join('') + '">' + $.PrivateBin.helper.htmlEntities(contents[i] || contents[0]) + '</div>'; html += '<div id="' + item.join('') + '">' + $.PrivateBin.helper.htmlEntities(contents[i] || contents[0]) + '</div>';
}); });
var clean = jsdom(html); var elements = $('<body />').html(html);
ids.forEach(function(item, i) { ids.forEach(function(item, i) {
var id = item.join(''), var id = item.join(''),
element = $(document.getElementById(id)); element = elements.find('#' + id).first();
$.PrivateBin.helper.setMessage(element, replacingContent); $.PrivateBin.helper.setMessage(element, replacingContent);
result *= replacingContent === $(document.getElementById(id)).text(); result *= replacingContent === element.text();
}); });
clean();
return Boolean(result); return Boolean(result);
} }
); );
@ -152,20 +158,23 @@ describe('helper', function () {
ids.forEach(function(item, i) { ids.forEach(function(item, i) {
html += '<div id="' + item.join('') + '"><span class="' + (classes[i] || classes[0]) + '"></span> ' + $.PrivateBin.helper.htmlEntities(contents[i] || contents[0]) + '</div>'; html += '<div id="' + item.join('') + '"><span class="' + (classes[i] || classes[0]) + '"></span> ' + $.PrivateBin.helper.htmlEntities(contents[i] || contents[0]) + '</div>';
}); });
var clean = jsdom(html); var elements = $('<body />').html(html);
ids.forEach(function(item, i) { ids.forEach(function(item, i) {
var id = item.join(''), var id = item.join(''),
element = $(document.getElementById(id)); element = elements.find('#' + id).first();
$.PrivateBin.helper.setMessage(element, replacingContent); $.PrivateBin.helper.setMessage(element, replacingContent);
result *= ' ' + replacingContent === $(document.getElementById(id)).contents()[1].nodeValue; result *= ' ' + replacingContent === element.contents()[1].nodeValue;
}); });
clean();
return Boolean(result); return Boolean(result);
} }
); );
}); });
describe('urls2links', function () { describe('urls2links', function () {
after(function () {
cleanup();
});
jsc.property( jsc.property(
'ignores non-URL content', 'ignores non-URL content',
'string', 'string',
@ -223,6 +232,77 @@ describe('helper', function () {
); );
}); });
describe('sprintf', function () {
after(function () {
cleanup();
});
jsc.property(
'replaces %s in strings with first given parameter',
'string',
'(small nearray) string',
'string',
function (prefix, params, postfix) {
params.unshift(prefix + '%s' + postfix);
var result = prefix + params[1] + postfix;
return result === $.PrivateBin.helper.sprintf.apply(this, params) &&
result === $.PrivateBin.helper.sprintf(params);
}
);
jsc.property(
'replaces %d in strings with first given parameter',
'string',
'(small nearray) nat',
'string',
function (prefix, params, postfix) {
params.unshift(prefix + '%d' + postfix);
var result = prefix + params[1] + postfix;
return result === $.PrivateBin.helper.sprintf.apply(this, params) &&
result === $.PrivateBin.helper.sprintf(params);
}
);
jsc.property(
'replaces %d in strings with 0 if first parameter is not a number',
'string',
'(small nearray) falsy',
'string',
function (prefix, params, postfix) {
params.unshift(prefix + '%d' + postfix);
var result = prefix + '0' + postfix;
return result === $.PrivateBin.helper.sprintf.apply(this, params) &&
result === $.PrivateBin.helper.sprintf(params);
}
);
jsc.property(
'replaces %d and %s in strings in order',
'string',
'nat',
'string',
'string',
'string',
function (prefix, uint, middle, string, postfix) {
var params = [prefix + '%d' + middle + '%s' + postfix, uint, string],
result = prefix + uint + middle + string + postfix;
return result === $.PrivateBin.helper.sprintf.apply(this, params) &&
result === $.PrivateBin.helper.sprintf(params);
}
);
jsc.property(
'replaces %d and %s in strings in reverse order',
'string',
'nat',
'string',
'string',
'string',
function (prefix, uint, middle, string, postfix) {
var params = [prefix + '%s' + middle + '%d' + postfix, string, uint],
result = prefix + string + middle + uint + postfix;
return result === $.PrivateBin.helper.sprintf.apply(this, params) &&
result === $.PrivateBin.helper.sprintf(params);
}
);
});
describe('scriptLocation', function () { describe('scriptLocation', function () {
jsc.property( jsc.property(
'returns the URL without query & fragment', 'returns the URL without query & fragment',

View File

@ -69,7 +69,7 @@ if ($MARKDOWN):
<?php <?php
endif; endif;
?> ?>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-2xPbJySqwLEOH/wTiKWSsMT1qZnHkELGrRwKNGeNxfFnssFH7u3GtNKeccu5SB4+2Lctpd1Bt6vphTRWGi5+cw==" crossorigin="anonymous"></script> <script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-bNqQCYlXhhJaoCspMQq5mmRFDsV5bXN1b+jr0N7zcG7Yd4hKXDYrSyxHrp1bavnpk1iG62o9rY4yTXHqarEZjw==" crossorigin="anonymous"></script>
<!--[if lt IE 10]> <!--[if lt IE 10]>
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style> <style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
<![endif]--> <![endif]-->

View File

@ -47,7 +47,7 @@ if ($MARKDOWN):
<?php <?php
endif; endif;
?> ?>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-2xPbJySqwLEOH/wTiKWSsMT1qZnHkELGrRwKNGeNxfFnssFH7u3GtNKeccu5SB4+2Lctpd1Bt6vphTRWGi5+cw==" crossorigin="anonymous"></script> <script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-bNqQCYlXhhJaoCspMQq5mmRFDsV5bXN1b+jr0N7zcG7Yd4hKXDYrSyxHrp1bavnpk1iG62o9rY4yTXHqarEZjw==" crossorigin="anonymous"></script>
<!--[if lt IE 10]> <!--[if lt IE 10]>
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style> <style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
<![endif]--> <![endif]-->