Change the directory of Tablesorter from '_assets' to static 'assets'.
This commit is contained in:
2
assets/vendor/tablesorter/testing/jquery-1.8.3.min.js
vendored
Normal file
2
assets/vendor/tablesorter/testing/jquery-1.8.3.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4832
assets/vendor/tablesorter/testing/jshint-r12.js
vendored
Normal file
4832
assets/vendor/tablesorter/testing/jshint-r12.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
244
assets/vendor/tablesorter/testing/qunit-1.11.0.css
vendored
Normal file
244
assets/vendor/tablesorter/testing/qunit-1.11.0.css
vendored
Normal file
@@ -0,0 +1,244 @@
|
||||
/**
|
||||
* QUnit v1.11.0 - A JavaScript Unit Testing Framework
|
||||
*
|
||||
* http://qunitjs.com
|
||||
*
|
||||
* Copyright 2012 jQuery Foundation and other contributors
|
||||
* Released under the MIT license.
|
||||
* http://jquery.org/license
|
||||
*/
|
||||
|
||||
/** Font Family and Sizes */
|
||||
|
||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {
|
||||
font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
|
||||
#qunit-tests { font-size: smaller; }
|
||||
|
||||
|
||||
/** Resets */
|
||||
|
||||
#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/** Header */
|
||||
|
||||
#qunit-header {
|
||||
padding: 0.5em 0 0.5em 1em;
|
||||
|
||||
color: #8699a4;
|
||||
background-color: #0d3349;
|
||||
|
||||
font-size: 1.5em;
|
||||
line-height: 1em;
|
||||
font-weight: normal;
|
||||
|
||||
border-radius: 5px 5px 0 0;
|
||||
-moz-border-radius: 5px 5px 0 0;
|
||||
-webkit-border-top-right-radius: 5px;
|
||||
-webkit-border-top-left-radius: 5px;
|
||||
}
|
||||
|
||||
#qunit-header a {
|
||||
text-decoration: none;
|
||||
color: #c2ccd1;
|
||||
}
|
||||
|
||||
#qunit-header a:hover,
|
||||
#qunit-header a:focus {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar label {
|
||||
display: inline-block;
|
||||
padding: 0 .5em 0 .1em;
|
||||
}
|
||||
|
||||
#qunit-banner {
|
||||
height: 5px;
|
||||
}
|
||||
|
||||
#qunit-testrunner-toolbar {
|
||||
padding: 0.5em 0 0.5em 2em;
|
||||
color: #5E740B;
|
||||
background-color: #eee;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#qunit-userAgent {
|
||||
padding: 0.5em 0 0.5em 2.5em;
|
||||
background-color: #2b81af;
|
||||
color: #fff;
|
||||
text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
|
||||
}
|
||||
|
||||
#qunit-modulefilter-container {
|
||||
float: right;
|
||||
}
|
||||
|
||||
/** Tests: Pass/Fail */
|
||||
|
||||
#qunit-tests {
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
#qunit-tests li {
|
||||
padding: 0.4em 0.5em 0.4em 2.5em;
|
||||
border-bottom: 1px solid #fff;
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#qunit-tests li strong {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#qunit-tests li a {
|
||||
padding: 0.5em;
|
||||
color: #c2ccd1;
|
||||
text-decoration: none;
|
||||
}
|
||||
#qunit-tests li a:hover,
|
||||
#qunit-tests li a:focus {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
#qunit-tests li .runtime {
|
||||
float: right;
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
.qunit-assert-list {
|
||||
margin-top: 0.5em;
|
||||
padding: 0.5em;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
}
|
||||
|
||||
.qunit-collapsed {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#qunit-tests table {
|
||||
border-collapse: collapse;
|
||||
margin-top: .2em;
|
||||
}
|
||||
|
||||
#qunit-tests th {
|
||||
text-align: right;
|
||||
vertical-align: top;
|
||||
padding: 0 .5em 0 0;
|
||||
}
|
||||
|
||||
#qunit-tests td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
#qunit-tests pre {
|
||||
margin: 0;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
#qunit-tests del {
|
||||
background-color: #e0f2be;
|
||||
color: #374e0c;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#qunit-tests ins {
|
||||
background-color: #ffcaca;
|
||||
color: #500;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/*** Test Counts */
|
||||
|
||||
#qunit-tests b.counts { color: black; }
|
||||
#qunit-tests b.passed { color: #5E740B; }
|
||||
#qunit-tests b.failed { color: #710909; }
|
||||
|
||||
#qunit-tests li li {
|
||||
padding: 5px;
|
||||
background-color: #fff;
|
||||
border-bottom: none;
|
||||
list-style-position: inside;
|
||||
}
|
||||
|
||||
/*** Passing Styles */
|
||||
|
||||
#qunit-tests li li.pass {
|
||||
color: #3c510c;
|
||||
background-color: #fff;
|
||||
border-left: 10px solid #C6E746;
|
||||
}
|
||||
|
||||
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
|
||||
#qunit-tests .pass .test-name { color: #366097; }
|
||||
|
||||
#qunit-tests .pass .test-actual,
|
||||
#qunit-tests .pass .test-expected { color: #999999; }
|
||||
|
||||
#qunit-banner.qunit-pass { background-color: #C6E746; }
|
||||
|
||||
/*** Failing Styles */
|
||||
|
||||
#qunit-tests li li.fail {
|
||||
color: #710909;
|
||||
background-color: #fff;
|
||||
border-left: 10px solid #EE5757;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
#qunit-tests > li:last-child {
|
||||
border-radius: 0 0 5px 5px;
|
||||
-moz-border-radius: 0 0 5px 5px;
|
||||
-webkit-border-bottom-right-radius: 5px;
|
||||
-webkit-border-bottom-left-radius: 5px;
|
||||
}
|
||||
|
||||
#qunit-tests .fail { color: #000000; background-color: #EE5757; }
|
||||
#qunit-tests .fail .test-name,
|
||||
#qunit-tests .fail .module-name { color: #000000; }
|
||||
|
||||
#qunit-tests .fail .test-actual { color: #EE5757; }
|
||||
#qunit-tests .fail .test-expected { color: green; }
|
||||
|
||||
#qunit-banner.qunit-fail { background-color: #EE5757; }
|
||||
|
||||
|
||||
/** Result */
|
||||
|
||||
#qunit-testresult {
|
||||
padding: 0.5em 0.5em 0.5em 2.5em;
|
||||
|
||||
color: #2b81af;
|
||||
background-color: #D2E0E6;
|
||||
|
||||
border-bottom: 1px solid white;
|
||||
}
|
||||
#qunit-testresult .module-name {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/** Fixture */
|
||||
|
||||
#qunit-fixture {
|
||||
position: absolute;
|
||||
top: -10000px;
|
||||
left: -10000px;
|
||||
width: 1000px;
|
||||
height: 1000px;
|
||||
}
|
2152
assets/vendor/tablesorter/testing/qunit-1.11.0.js
vendored
Normal file
2152
assets/vendor/tablesorter/testing/qunit-1.11.0.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
590
assets/vendor/tablesorter/testing/testing-ipv6.js
vendored
Normal file
590
assets/vendor/tablesorter/testing/testing-ipv6.js
vendored
Normal file
@@ -0,0 +1,590 @@
|
||||
var ipv6parser = $.tablesorter.getParserById('ipv6Address').format,
|
||||
ipv6regex = $.tablesorter.regex.ipv6Validate,
|
||||
ipv6test = function(result, str, expect){
|
||||
if (result) {
|
||||
// ok( $.tablesorter.regex.ipv6Validate.test(str), "valid: " + str );
|
||||
// second parameter = true, so we get the hex format (false or undefined returns decimal)
|
||||
var t = ipv6parser(str, true);
|
||||
equal( t, expect, 'valid: ' + t + ' \u2190 "' + str + '"' );
|
||||
} else {
|
||||
ok( !ipv6regex.test(str), 'invalid: "' + str + '"' );
|
||||
}
|
||||
},
|
||||
ipv6tests = function(){
|
||||
|
||||
test( "ipv6 parser", function() {
|
||||
expect(483);
|
||||
|
||||
// IPV6 tests by Rich Brown copied from http:// download.dartware.com/thirdparty/test-ipv6-regex.pl
|
||||
// modified to compare to canonical ipv6 output using http://www.v6decode.com/ to produce the result
|
||||
ipv6test(!1,""); // empty string
|
||||
ipv6test(1,"::1", "0000:0000:0000:0000:0000:0000:0000:0001"); // loopback, compressed, non-routable
|
||||
ipv6test(1,"::", "0000:0000:0000:0000:0000:0000:0000:0000"); // unspecified, compressed, non-routable
|
||||
ipv6test(1,"0:0:0:0:0:0:0:1", "0000:0000:0000:0000:0000:0000:0000:0001"); // loopback, full
|
||||
ipv6test(1,"0:0:0:0:0:0:0:0", "0000:0000:0000:0000:0000:0000:0000:0000"); // unspecified, full
|
||||
ipv6test(1,"2001:db8:0:0:8:800:200c:417a", "2001:0db8:0000:0000:0008:0800:200c:417a"); // unicast, full
|
||||
ipv6test(1,"ff01:0:0:0:0:0:0:101", "ff01:0000:0000:0000:0000:0000:0000:0101"); // multicast, full
|
||||
ipv6test(1,"2001:db8::8:800:200c:417a", "2001:0db8:0000:0000:0008:0800:200c:417a"); // unicast, compressed
|
||||
ipv6test(1,"ff01::101", "ff01:0000:0000:0000:0000:0000:0000:0101"); // multicast, compressed
|
||||
ipv6test(!1,"2001:db8:0:0:8:800:200c:417a:221"); // unicast, full
|
||||
ipv6test(!1,"ff01::101::2"); // multicast, compressed
|
||||
ipv6test(1,"fe80::217:f2ff:fe07:ed62", "fe80:0000:0000:0000:0217:f2ff:fe07:ed62");
|
||||
|
||||
ipv6test(1,"2001:0000:1234:0000:0000:c1c0:abcd:0876", "2001:0000:1234:0000:0000:c1c0:abcd:0876");
|
||||
ipv6test(1,"3ffe:0b00:0000:0000:0001:0000:0000:000a", "3ffe:0b00:0000:0000:0001:0000:0000:000a");
|
||||
ipv6test(1,"ff02:0000:0000:0000:0000:0000:0000:0001", "ff02:0000:0000:0000:0000:0000:0000:0001");
|
||||
ipv6test(1,"0000:0000:0000:0000:0000:0000:0000:0001", "0000:0000:0000:0000:0000:0000:0000:0001");
|
||||
ipv6test(1,"0000:0000:0000:0000:0000:0000:0000:0000", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(!1,"02001:0000:1234:0000:0000:c1c0:abcd:0876"); // extra 0 not allowed!
|
||||
ipv6test(!1,"2001:0000:1234:0000:00001:c1c0:abcd:0876"); // extra 0 not allowed!
|
||||
// ipv6test(1," 2001:0000:1234:0000:0000:c1c0:abcd:0876"); // leading space
|
||||
// ipv6test(1,"2001:0000:1234:0000:0000:c1c0:abcd:0876"); // trailing space
|
||||
// ipv6test(1," 2001:0000:1234:0000:0000:c1c0:abcd:0876 "); // leading and trailing space
|
||||
ipv6test(!1,"2001:0000:1234:0000:0000:c1c0:abcd:0876 0"); // junk after valid address
|
||||
ipv6test(!1,"2001:0000:1234: 0000:0000:c1c0:abcd:0876"); // internal space
|
||||
|
||||
ipv6test(!1,"3ffe:0b00:0000:0001:0000:0000:000a"); // seven segments
|
||||
ipv6test(!1,"ff02:0000:0000:0000:0000:0000:0000:0000:0001"); // nine segments
|
||||
ipv6test(!1,"3ffe:b00::1::a"); // double "::"
|
||||
ipv6test(!1,"::1111:2222:3333:4444:5555:6666::"); // double "::"
|
||||
ipv6test(1,"2::10", "0002:0000:0000:0000:0000:0000:0000:0010");
|
||||
ipv6test(1,"ff02::1", "ff02:0000:0000:0000:0000:0000:0000:0001");
|
||||
ipv6test(1,"fe80::", "fe80:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"2002::", "2002:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"2001:db8::", "2001:0db8:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"2001:0db8:1234::", "2001:0db8:1234:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"::ffff:0:0", "0000:0000:0000:0000:0000:ffff:0000:0000");
|
||||
ipv6test(1,"1:2:3:4:5:6:7:8", "0001:0002:0003:0004:0005:0006:0007:0008");
|
||||
ipv6test(1,"1:2:3:4:5:6::8", "0001:0002:0003:0004:0005:0006:0000:0008");
|
||||
ipv6test(1,"1:2:3:4:5::8", "0001:0002:0003:0004:0005:0000:0000:0008");
|
||||
ipv6test(1,"1:2:3:4::8", "0001:0002:0003:0004:0000:0000:0000:0008");
|
||||
ipv6test(1,"1:2:3::8", "0001:0002:0003:0000:0000:0000:0000:0008");
|
||||
ipv6test(1,"1:2::8", "0001:0002:0000:0000:0000:0000:0000:0008");
|
||||
ipv6test(1,"1::8", "0001:0000:0000:0000:0000:0000:0000:0008");
|
||||
ipv6test(1,"1::2:3:4:5:6:7", "0001:0000:0002:0003:0004:0005:0006:0007");
|
||||
ipv6test(1,"1::2:3:4:5:6", "0001:0000:0000:0002:0003:0004:0005:0006");
|
||||
ipv6test(1,"1::2:3:4:5", "0001:0000:0000:0000:0002:0003:0004:0005");
|
||||
ipv6test(1,"1::2:3:4", "0001:0000:0000:0000:0000:0002:0003:0004");
|
||||
ipv6test(1,"1::2:3", "0001:0000:0000:0000:0000:0000:0002:0003");
|
||||
ipv6test(1,"1::8", "0001:0000:0000:0000:0000:0000:0000:0008");
|
||||
ipv6test(1,"::2:3:4:5:6:7:8", "0000:0002:0003:0004:0005:0006:0007:0008");
|
||||
ipv6test(1,"::2:3:4:5:6:7", "0000:0000:0002:0003:0004:0005:0006:0007");
|
||||
ipv6test(1,"::2:3:4:5:6", "0000:0000:0000:0002:0003:0004:0005:0006");
|
||||
ipv6test(1,"::2:3:4:5", "0000:0000:0000:0000:0002:0003:0004:0005");
|
||||
ipv6test(1,"::2:3:4", "0000:0000:0000:0000:0000:0002:0003:0004");
|
||||
ipv6test(1,"::2:3", "0000:0000:0000:0000:0000:0000:0002:0003");
|
||||
ipv6test(1,"::8", "0000:0000:0000:0000:0000:0000:0000:0008");
|
||||
ipv6test(1,"1:2:3:4:5:6::", "0001:0002:0003:0004:0005:0006:0000:0000");
|
||||
ipv6test(1,"1:2:3:4:5::", "0001:0002:0003:0004:0005:0000:0000:0000");
|
||||
ipv6test(1,"1:2:3:4::", "0001:0002:0003:0004:0000:0000:0000:0000");
|
||||
ipv6test(1,"1:2:3::", "0001:0002:0003:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"1:2::", "0001:0002:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"1::", "0001:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"1:2:3:4:5::7:8", "0001:0002:0003:0004:0005:0000:0007:0008");
|
||||
ipv6test(!1,"1:2:3::4:5::7:8"); // double "::"
|
||||
ipv6test(!1,"12345::6:7:8");
|
||||
ipv6test(1,"1:2:3:4::7:8", "0001:0002:0003:0004:0000:0000:0007:0008");
|
||||
ipv6test(1,"1:2:3::7:8", "0001:0002:0003:0000:0000:0000:0007:0008");
|
||||
ipv6test(1,"1:2::7:8", "0001:0002:0000:0000:0000:0000:0007:0008");
|
||||
ipv6test(1,"1::7:8", "0001:0000:0000:0000:0000:0000:0007:0008");
|
||||
|
||||
// ipv4 addresses as dotted-quads
|
||||
ipv6test(1,"1:2:3:4:5:6:1.2.3.4", "0001:0002:0003:0004:0005:0006:0102:0304");
|
||||
ipv6test(1,"1:2:3:4:5::1.2.3.4", "0001:0002:0003:0004:0005:0000:0102:0304");
|
||||
ipv6test(1,"1:2:3:4::1.2.3.4", "0001:0002:0003:0004:0000:0000:0102:0304");
|
||||
ipv6test(1,"1:2:3::1.2.3.4", "0001:0002:0003:0000:0000:0000:0102:0304");
|
||||
ipv6test(1,"1:2::1.2.3.4", "0001:0002:0000:0000:0000:0000:0102:0304");
|
||||
ipv6test(1,"1::1.2.3.4", "0001:0000:0000:0000:0000:0000:0102:0304");
|
||||
ipv6test(1,"1:2:3:4::5:1.2.3.4", "0001:0002:0003:0004:0000:0005:0102:0304");
|
||||
ipv6test(1,"1:2:3::5:1.2.3.4", "0001:0002:0003:0000:0000:0005:0102:0304");
|
||||
ipv6test(1,"1:2::5:1.2.3.4", "0001:0002:0000:0000:0000:0005:0102:0304");
|
||||
ipv6test(1,"1::5:1.2.3.4", "0001:0000:0000:0000:0000:0005:0102:0304");
|
||||
ipv6test(1,"1::5:11.22.33.44", "0001:0000:0000:0000:0000:0005:0b16:212c");
|
||||
ipv6test(!1,"1::5:400.2.3.4");
|
||||
ipv6test(!1,"1::5:260.2.3.4");
|
||||
ipv6test(!1,"1::5:256.2.3.4");
|
||||
ipv6test(!1,"1::5:1.256.3.4");
|
||||
ipv6test(!1,"1::5:1.2.256.4");
|
||||
ipv6test(!1,"1::5:1.2.3.256");
|
||||
ipv6test(!1,"1::5:300.2.3.4");
|
||||
ipv6test(!1,"1::5:1.300.3.4");
|
||||
ipv6test(!1,"1::5:1.2.300.4");
|
||||
ipv6test(!1,"1::5:1.2.3.300");
|
||||
ipv6test(!1,"1::5:900.2.3.4");
|
||||
ipv6test(!1,"1::5:1.900.3.4");
|
||||
ipv6test(!1,"1::5:1.2.900.4");
|
||||
ipv6test(!1,"1::5:1.2.3.900");
|
||||
ipv6test(!1,"1::5:300.300.300.300");
|
||||
ipv6test(!1,"1::5:3000.30.30.30");
|
||||
ipv6test(!1,"1::400.2.3.4");
|
||||
ipv6test(!1,"1::260.2.3.4");
|
||||
ipv6test(!1,"1::256.2.3.4");
|
||||
ipv6test(!1,"1::1.256.3.4");
|
||||
ipv6test(!1,"1::1.2.256.4");
|
||||
ipv6test(!1,"1::1.2.3.256");
|
||||
ipv6test(!1,"1::300.2.3.4");
|
||||
ipv6test(!1,"1::1.300.3.4");
|
||||
ipv6test(!1,"1::1.2.300.4");
|
||||
ipv6test(!1,"1::1.2.3.300");
|
||||
ipv6test(!1,"1::900.2.3.4");
|
||||
ipv6test(!1,"1::1.900.3.4");
|
||||
ipv6test(!1,"1::1.2.900.4");
|
||||
ipv6test(!1,"1::1.2.3.900");
|
||||
ipv6test(!1,"1::300.300.300.300");
|
||||
ipv6test(!1,"1::3000.30.30.30");
|
||||
ipv6test(!1,"::400.2.3.4");
|
||||
ipv6test(!1,"::260.2.3.4");
|
||||
ipv6test(!1,"::256.2.3.4");
|
||||
ipv6test(!1,"::1.256.3.4");
|
||||
ipv6test(!1,"::1.2.256.4");
|
||||
ipv6test(!1,"::1.2.3.256");
|
||||
ipv6test(!1,"::300.2.3.4");
|
||||
ipv6test(!1,"::1.300.3.4");
|
||||
ipv6test(!1,"::1.2.300.4");
|
||||
ipv6test(!1,"::1.2.3.300");
|
||||
ipv6test(!1,"::900.2.3.4");
|
||||
ipv6test(!1,"::1.900.3.4");
|
||||
ipv6test(!1,"::1.2.900.4");
|
||||
ipv6test(!1,"::1.2.3.900");
|
||||
ipv6test(!1,"::300.300.300.300");
|
||||
ipv6test(!1,"::3000.30.30.30");
|
||||
ipv6test(1,"fe80::217:f2ff:254.7.237.98", "fe80:0000:0000:0000:0217:f2ff:fe07:ed62");
|
||||
ipv6test(1,"::ffff:192.168.1.26", "0000:0000:0000:0000:0000:ffff:c0a8:011a");
|
||||
ipv6test(!1,"2001:1:1:1:1:1:255z255x255y255"); // garbage instead of "." in ipv4
|
||||
ipv6test(!1,"::ffff:192x168.1.26"); // ditto
|
||||
ipv6test(1,"::ffff:192.168.1.1", "0000:0000:0000:0000:0000:ffff:c0a8:0101");
|
||||
ipv6test(1,"0:0:0:0:0:0:13.1.68.3", "0000:0000:0000:0000:0000:0000:0d01:4403"); // ipv4-compatible ipv6 address, full, deprecated
|
||||
ipv6test(1,"0:0:0:0:0:ffff:129.144.52.38", "0000:0000:0000:0000:0000:ffff:8190:3426"); // ipv4-mapped ipv6 address, full
|
||||
ipv6test(1,"::13.1.68.3", "0000:0000:0000:0000:0000:0000:0d01:4403"); // ipv4-compatible ipv6 address, compressed, deprecated
|
||||
ipv6test(1,"::ffff:129.144.52.38", "0000:0000:0000:0000:0000:ffff:8190:3426"); // ipv4-mapped ipv6 address, compressed
|
||||
ipv6test(1,"fe80:0:0:0:204:61ff:254.157.241.86", "fe80:0000:0000:0000:0204:61ff:fe9d:f156");
|
||||
ipv6test(1,"fe80::204:61ff:254.157.241.86", "fe80:0000:0000:0000:0204:61ff:fe9d:f156");
|
||||
ipv6test(1,"::ffff:12.34.56.78", "0000:0000:0000:0000:0000:ffff:0c22:384e");
|
||||
ipv6test(!1,"::ffff:2.3.4");
|
||||
ipv6test(!1,"::ffff:257.1.2.3");
|
||||
ipv6test(!1,"1.2.3.4");
|
||||
|
||||
ipv6test(!1,"1.2.3.4:1111:2222:3333:4444::5555"); // aeron
|
||||
ipv6test(!1,"1.2.3.4:1111:2222:3333::5555");
|
||||
ipv6test(!1,"1.2.3.4:1111:2222::5555");
|
||||
ipv6test(!1,"1.2.3.4:1111::5555");
|
||||
ipv6test(!1,"1.2.3.4::5555");
|
||||
ipv6test(!1,"1.2.3.4::");
|
||||
|
||||
// testing ipv4 addresses represented as dotted-quads
|
||||
// leading zero's in ipv4 addresses not allowed: some systems treat the leading "0" in ".086" as the start of an octal number
|
||||
// update: the bnf in rfc-3986 explicitly defines the dec-octet (for ipv4 addresses) not to have a leading zero
|
||||
ipv6test(!1,"fe80:0000:0000:0000:0204:61ff:254.157.241.086");
|
||||
ipv6test(1,"::ffff:192.0.2.128", "0000:0000:0000:0000:0000:ffff:c000:0280"); // but this is ok, since there's a single digit
|
||||
ipv6test(!1,"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:00.00.00.00");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:000.000.000.000");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:256.256.256.256");
|
||||
|
||||
// not testing address with subnet mask
|
||||
// ipv6test(1,"2001:0db8:0000:cd30:0000:0000:0000:0000/60"); // full, with prefix
|
||||
// ipv6test(1,"2001:0db8::cd30:0:0:0:0/60"); // compressed, with prefix
|
||||
// ipv6test(1,"2001:0db8:0:cd30::/60"); // compressed, with prefix // 2
|
||||
// ipv6test(1,"::/128"); // compressed, unspecified address type, non-routable
|
||||
// ipv6test(1,"::1/128"); // compressed, loopback address type, non-routable
|
||||
// ipv6test(1,"ff00::/8"); // compressed, multicast address type
|
||||
// ipv6test(1,"fe80::/10"); // compressed, link-local unicast, non-routable
|
||||
// ipv6test(1,"fec0::/10"); // compressed, site-local unicast, deprecated
|
||||
// ipv6test(!1,"124.15.6.89/60"); // standard ipv4, prefix not allowed
|
||||
|
||||
ipv6test(1,"fe80:0000:0000:0000:0204:61ff:fe9d:f156", "fe80:0000:0000:0000:0204:61ff:fe9d:f156");
|
||||
ipv6test(1,"fe80:0:0:0:204:61ff:fe9d:f156", "fe80:0000:0000:0000:0204:61ff:fe9d:f156");
|
||||
ipv6test(1,"fe80::204:61ff:fe9d:f156", "fe80:0000:0000:0000:0204:61ff:fe9d:f156");
|
||||
ipv6test(1,"fe80::", "fe80:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"fe80::1", "fe80:0000:0000:0000:0000:0000:0000:0001");
|
||||
ipv6test(!1,":");
|
||||
ipv6test(1,"::ffff:c000:280", "0000:0000:0000:0000:0000:ffff:c000:0280");
|
||||
|
||||
// aeron supplied these test cases
|
||||
ipv6test(!1,"1111:2222:3333:4444::5555:");
|
||||
ipv6test(!1,"1111:2222:3333::5555:");
|
||||
ipv6test(!1,"1111:2222::5555:");
|
||||
ipv6test(!1,"1111::5555:");
|
||||
ipv6test(!1,"::5555:");
|
||||
ipv6test(!1,":::");
|
||||
ipv6test(!1,"1111:");
|
||||
ipv6test(!1,":");
|
||||
|
||||
ipv6test(!1,":1111:2222:3333:4444::5555");
|
||||
ipv6test(!1,":1111:2222:3333::5555");
|
||||
ipv6test(!1,":1111:2222::5555");
|
||||
ipv6test(!1,":1111::5555");
|
||||
ipv6test(!1,":::5555");
|
||||
ipv6test(!1,":::");
|
||||
|
||||
|
||||
// additional test cases
|
||||
// from http:// rt.cpan.org/public/bug/display.html?id=50693
|
||||
|
||||
ipv6test(1,"2001:0db8:85a3:0000:0000:8a2e:0370:7334", "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
|
||||
ipv6test(1,"2001:db8:85a3:0:0:8a2e:370:7334", "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
|
||||
ipv6test(1,"2001:db8:85a3::8a2e:370:7334", "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
|
||||
ipv6test(1,"2001:0db8:0000:0000:0000:0000:1428:57ab", "2001:0db8:0000:0000:0000:0000:1428:57ab");
|
||||
ipv6test(1,"2001:0db8:0000:0000:0000::1428:57ab", "2001:0db8:0000:0000:0000:0000:1428:57ab");
|
||||
ipv6test(1,"2001:0db8:0:0:0:0:1428:57ab", "2001:0db8:0000:0000:0000:0000:1428:57ab");
|
||||
ipv6test(1,"2001:0db8:0:0::1428:57ab", "2001:0db8:0000:0000:0000:0000:1428:57ab");
|
||||
ipv6test(1,"2001:0db8::1428:57ab", "2001:0db8:0000:0000:0000:0000:1428:57ab");
|
||||
ipv6test(1,"2001:db8::1428:57ab", "2001:0db8:0000:0000:0000:0000:1428:57ab");
|
||||
ipv6test(1,"0000:0000:0000:0000:0000:0000:0000:0001", "0000:0000:0000:0000:0000:0000:0000:0001");
|
||||
ipv6test(1,"::ffff:0c22:384e", "0000:0000:0000:0000:0000:ffff:0c22:384e");
|
||||
ipv6test(1,"2001:0db8:1234:0000:0000:0000:0000:0000", "2001:0db8:1234:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff");
|
||||
ipv6test(1,"2001:db8:a::123", "2001:0db8:000a:0000:0000:0000:0000:0123");
|
||||
ipv6test(1,"fe80::", "fe80:0000:0000:0000:0000:0000:0000:0000");
|
||||
|
||||
ipv6test(!1,"123");
|
||||
ipv6test(!1,"ldkfj");
|
||||
ipv6test(!1,"2001::ffd3::57ab");
|
||||
ipv6test(!1,"2001:db8:85a3::8a2e:37023:7334");
|
||||
ipv6test(!1,"2001:db8:85a3::8a2e:370k:7334");
|
||||
ipv6test(!1,"1:2:3:4:5:6:7:8:9");
|
||||
ipv6test(!1,"1::2::3");
|
||||
ipv6test(!1,"1:::3:4:5");
|
||||
ipv6test(!1,"1:2:3::4:5:6:7:8:9");
|
||||
|
||||
// new from aeron
|
||||
ipv6test(1,"1111:2222:3333:4444:5555:6666:7777:8888", "1111:2222:3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(1,"1111:2222:3333:4444:5555:6666:7777::", "1111:2222:3333:4444:5555:6666:7777:0000");
|
||||
ipv6test(1,"1111:2222:3333:4444:5555:6666::", "1111:2222:3333:4444:5555:6666:0000:0000");
|
||||
ipv6test(1,"1111:2222:3333:4444:5555::", "1111:2222:3333:4444:5555:0000:0000:0000");
|
||||
ipv6test(1,"1111:2222:3333:4444::", "1111:2222:3333:4444:0000:0000:0000:0000");
|
||||
ipv6test(1,"1111:2222:3333::", "1111:2222:3333:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"1111:2222::", "1111:2222:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"1111::", "1111:0000:0000:0000:0000:0000:0000:0000");
|
||||
// ipv6test(1,"::", ""); // duplicate
|
||||
ipv6test(1,"1111:2222:3333:4444:5555:6666::8888", "1111:2222:3333:4444:5555:6666:0000:8888");
|
||||
ipv6test(1,"1111:2222:3333:4444:5555::8888", "1111:2222:3333:4444:5555:0000:0000:8888");
|
||||
ipv6test(1,"1111:2222:3333:4444::8888", "1111:2222:3333:4444:0000:0000:0000:8888");
|
||||
ipv6test(1,"1111:2222:3333::8888", "1111:2222:3333:0000:0000:0000:0000:8888");
|
||||
ipv6test(1,"1111:2222::8888", "1111:2222:0000:0000:0000:0000:0000:8888");
|
||||
ipv6test(1,"1111::8888", "1111:0000:0000:0000:0000:0000:0000:8888");
|
||||
ipv6test(1,"::8888", "0000:0000:0000:0000:0000:0000:0000:8888");
|
||||
ipv6test(1,"1111:2222:3333:4444:5555::7777:8888", "1111:2222:3333:4444:5555:0000:7777:8888");
|
||||
ipv6test(1,"1111:2222:3333:4444::7777:8888", "1111:2222:3333:4444:0000:0000:7777:8888");
|
||||
ipv6test(1,"1111:2222:3333::7777:8888", "1111:2222:3333:0000:0000:0000:7777:8888");
|
||||
ipv6test(1,"1111:2222::7777:8888", "1111:2222:0000:0000:0000:0000:7777:8888");
|
||||
ipv6test(1,"1111::7777:8888", "1111:0000:0000:0000:0000:0000:7777:8888");
|
||||
ipv6test(1,"::7777:8888", "0000:0000:0000:0000:0000:0000:7777:8888");
|
||||
ipv6test(1,"1111:2222:3333:4444::6666:7777:8888", "1111:2222:3333:4444:0000:6666:7777:8888");
|
||||
ipv6test(1,"1111:2222:3333::6666:7777:8888", "1111:2222:3333:0000:0000:6666:7777:8888");
|
||||
ipv6test(1,"1111:2222::6666:7777:8888", "1111:2222:0000:0000:0000:6666:7777:8888");
|
||||
ipv6test(1,"1111::6666:7777:8888", "1111:0000:0000:0000:0000:6666:7777:8888");
|
||||
ipv6test(1,"::6666:7777:8888", "0000:0000:0000:0000:0000:6666:7777:8888");
|
||||
ipv6test(1,"1111:2222:3333::5555:6666:7777:8888", "1111:2222:3333:0000:5555:6666:7777:8888");
|
||||
ipv6test(1,"1111:2222::5555:6666:7777:8888", "1111:2222:0000:0000:5555:6666:7777:8888");
|
||||
ipv6test(1,"1111::5555:6666:7777:8888", "1111:0000:0000:0000:5555:6666:7777:8888");
|
||||
ipv6test(1,"::5555:6666:7777:8888", "0000:0000:0000:0000:5555:6666:7777:8888");
|
||||
ipv6test(1,"1111:2222::4444:5555:6666:7777:8888", "1111:2222:0000:4444:5555:6666:7777:8888");
|
||||
ipv6test(1,"1111::4444:5555:6666:7777:8888", "1111:0000:0000:4444:5555:6666:7777:8888");
|
||||
ipv6test(1,"::4444:5555:6666:7777:8888", "0000:0000:0000:4444:5555:6666:7777:8888");
|
||||
ipv6test(1,"1111::3333:4444:5555:6666:7777:8888", "1111:0000:3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(1,"::3333:4444:5555:6666:7777:8888", "0000:0000:3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(1,"::2222:3333:4444:5555:6666:7777:8888", "0000:2222:3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(1,"1111:2222:3333:4444:5555:6666:123.123.123.123", "1111:2222:3333:4444:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222:3333:4444:5555::123.123.123.123", "1111:2222:3333:4444:5555:0000:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222:3333:4444::123.123.123.123", "1111:2222:3333:4444:0000:0000:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222:3333::123.123.123.123", "1111:2222:3333:0000:0000:0000:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222::123.123.123.123", "1111:2222:0000:0000:0000:0000:7b7b:7b7b");
|
||||
ipv6test(1,"1111::123.123.123.123", "1111:0000:0000:0000:0000:0000:7b7b:7b7b");
|
||||
ipv6test(1,"::123.123.123.123", "0000:0000:0000:0000:0000:0000:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222:3333:4444::6666:123.123.123.123", "1111:2222:3333:4444:0000:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222:3333::6666:123.123.123.123", "1111:2222:3333:0000:0000:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222::6666:123.123.123.123", "1111:2222:0000:0000:0000:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111::6666:123.123.123.123", "1111:0000:0000:0000:0000:6666:7b7b:7b7b");
|
||||
ipv6test(1,"::6666:123.123.123.123", "0000:0000:0000:0000:0000:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222:3333::5555:6666:123.123.123.123", "1111:2222:3333:0000:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222::5555:6666:123.123.123.123", "1111:2222:0000:0000:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111::5555:6666:123.123.123.123", "1111:0000:0000:0000:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"::5555:6666:123.123.123.123", "0000:0000:0000:0000:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111:2222::4444:5555:6666:123.123.123.123", "1111:2222:0000:4444:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111::4444:5555:6666:123.123.123.123", "1111:0000:0000:4444:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"::4444:5555:6666:123.123.123.123", "0000:0000:0000:4444:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"1111::3333:4444:5555:6666:123.123.123.123", "1111:0000:3333:4444:5555:6666:7b7b:7b7b");
|
||||
ipv6test(1,"::2222:3333:4444:5555:6666:123.123.123.123", "0000:2222:3333:4444:5555:6666:7b7b:7b7b");
|
||||
|
||||
// playing with combinations of "0" and "::"
|
||||
// nb: these are all sytactically correct, but are bad form
|
||||
// because "0" adjacent to "::" should be combined into "::"
|
||||
ipv6test(1,"::0:0:0:0:0:0:0", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"::0:0:0:0:0:0", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"::0:0:0:0:0", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"::0:0:0:0", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"::0:0:0", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"::0:0", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"::0", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"0:0:0:0:0:0:0::", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"0:0:0:0:0:0::", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"0:0:0:0:0::", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"0:0:0:0::", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"0:0:0::", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"0:0::", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
ipv6test(1,"0::", "0000:0000:0000:0000:0000:0000:0000:0000");
|
||||
|
||||
// new invalid from aeron
|
||||
// invalid data
|
||||
ipv6test(!1,"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx");
|
||||
|
||||
// too many components
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777:8888:9999");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777:8888::");
|
||||
ipv6test(!1,"::2222:3333:4444:5555:6666:7777:8888:9999");
|
||||
|
||||
// too few components
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555");
|
||||
ipv6test(!1,"1111:2222:3333:4444");
|
||||
ipv6test(!1,"1111:2222:3333");
|
||||
ipv6test(!1,"1111:2222");
|
||||
ipv6test(!1,"1111");
|
||||
|
||||
// missing :
|
||||
ipv6test(!1,"11112222:3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,"1111:22223333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,"1111:2222:33334444:5555:6666:7777:8888");
|
||||
ipv6test(!1,"1111:2222:3333:44445555:6666:7777:8888");
|
||||
ipv6test(!1,"1111:2222:3333:4444:55556666:7777:8888");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:66667777:8888");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:77778888");
|
||||
|
||||
// missing : intended for ::
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777:8888:");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777:");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:");
|
||||
ipv6test(!1,"1111:2222:3333:4444:");
|
||||
ipv6test(!1,"1111:2222:3333:");
|
||||
ipv6test(!1,"1111:2222:");
|
||||
ipv6test(!1,"1111:");
|
||||
ipv6test(!1,":");
|
||||
ipv6test(!1,":8888");
|
||||
ipv6test(!1,":7777:8888");
|
||||
ipv6test(!1,":6666:7777:8888");
|
||||
ipv6test(!1,":5555:6666:7777:8888");
|
||||
ipv6test(!1,":4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":2222:3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555:6666:7777:8888");
|
||||
|
||||
// :::
|
||||
ipv6test(!1,":::2222:3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,"1111:::3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,"1111:2222:::4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,"1111:2222:3333:::5555:6666:7777:8888");
|
||||
ipv6test(!1,"1111:2222:3333:4444:::6666:7777:8888");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:::7777:8888");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:::8888");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777:::");
|
||||
|
||||
// double ::");
|
||||
ipv6test(!1,"::2222::4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,"::2222:3333::5555:6666:7777:8888");
|
||||
ipv6test(!1,"::2222:3333:4444::6666:7777:8888");
|
||||
ipv6test(!1,"::2222:3333:4444:5555::7777:8888");
|
||||
ipv6test(!1,"::2222:3333:4444:5555:7777::8888");
|
||||
ipv6test(!1,"::2222:3333:4444:5555:7777:8888::");
|
||||
|
||||
ipv6test(!1,"1111::3333::5555:6666:7777:8888");
|
||||
ipv6test(!1,"1111::3333:4444::6666:7777:8888");
|
||||
ipv6test(!1,"1111::3333:4444:5555::7777:8888");
|
||||
ipv6test(!1,"1111::3333:4444:5555:6666::8888");
|
||||
ipv6test(!1,"1111::3333:4444:5555:6666:7777::");
|
||||
|
||||
ipv6test(!1,"1111:2222::4444::6666:7777:8888");
|
||||
ipv6test(!1,"1111:2222::4444:5555::7777:8888");
|
||||
ipv6test(!1,"1111:2222::4444:5555:6666::8888");
|
||||
ipv6test(!1,"1111:2222::4444:5555:6666:7777::");
|
||||
|
||||
ipv6test(!1,"1111:2222:3333::5555::7777:8888");
|
||||
ipv6test(!1,"1111:2222:3333::5555:6666::8888");
|
||||
ipv6test(!1,"1111:2222:3333::5555:6666:7777::");
|
||||
|
||||
ipv6test(!1,"1111:2222:3333:4444::6666::8888");
|
||||
ipv6test(!1,"1111:2222:3333:4444::6666:7777::");
|
||||
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555::7777::");
|
||||
|
||||
|
||||
// too many components"
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777:8888:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666::1.2.3.4");
|
||||
ipv6test(!1,"::2222:3333:4444:5555:6666:7777:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:1.2.3.4.5");
|
||||
|
||||
// too few components
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:1.2.3.4");
|
||||
ipv6test(!1,"1111:1.2.3.4");
|
||||
ipv6test(!1,"1.2.3.4");
|
||||
|
||||
// missing :
|
||||
ipv6test(!1,"11112222:3333:4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:22223333:4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:33334444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:44445555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:55556666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:66661.2.3.4");
|
||||
|
||||
// missing .
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:255255.255.255");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:255.255255.255");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:255.255.255255");
|
||||
|
||||
// missing : intended for ::
|
||||
ipv6test(!1,":1.2.3.4");
|
||||
ipv6test(!1,":6666:1.2.3.4");
|
||||
ipv6test(!1,":5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":3333:4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":2222:3333:4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555:6666:1.2.3.4");
|
||||
|
||||
// :::
|
||||
ipv6test(!1,":::2222:3333:4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:::3333:4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:::4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:::5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:::6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:::1.2.3.4");
|
||||
|
||||
// double ::
|
||||
ipv6test(!1,"::2222::4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"::2222:3333::5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"::2222:3333:4444::6666:1.2.3.4");
|
||||
ipv6test(!1,"::2222:3333:4444:5555::1.2.3.4");
|
||||
|
||||
ipv6test(!1,"1111::3333::5555:6666:1.2.3.4");
|
||||
ipv6test(!1,"1111::3333:4444::6666:1.2.3.4");
|
||||
ipv6test(!1,"1111::3333:4444:5555::1.2.3.4");
|
||||
|
||||
ipv6test(!1,"1111:2222::4444::6666:1.2.3.4");
|
||||
ipv6test(!1,"1111:2222::4444:5555::1.2.3.4");
|
||||
|
||||
ipv6test(!1,"1111:2222:3333::5555::1.2.3.4");
|
||||
|
||||
// missing parts
|
||||
ipv6test(!1,"::.");
|
||||
ipv6test(!1,"::..");
|
||||
ipv6test(!1,"::...");
|
||||
ipv6test(!1,"::1...");
|
||||
ipv6test(!1,"::1.2..");
|
||||
ipv6test(!1,"::1.2.3.");
|
||||
ipv6test(!1,"::.2..");
|
||||
ipv6test(!1,"::.2.3.");
|
||||
ipv6test(!1,"::.2.3.4");
|
||||
ipv6test(!1,"::..3.");
|
||||
ipv6test(!1,"::..3.4");
|
||||
ipv6test(!1,"::...4");
|
||||
|
||||
// extra : in front
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555:6666:7777::");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555:6666::");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555::");
|
||||
ipv6test(!1,":1111:2222:3333:4444::");
|
||||
ipv6test(!1,":1111:2222:3333::");
|
||||
ipv6test(!1,":1111:2222::");
|
||||
ipv6test(!1,":1111::");
|
||||
ipv6test(!1,":::");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555:6666::8888");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555::8888");
|
||||
ipv6test(!1,":1111:2222:3333:4444::8888");
|
||||
ipv6test(!1,":1111:2222:3333::8888");
|
||||
ipv6test(!1,":1111:2222::8888");
|
||||
ipv6test(!1,":1111::8888");
|
||||
ipv6test(!1,":::8888");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555::7777:8888");
|
||||
ipv6test(!1,":1111:2222:3333:4444::7777:8888");
|
||||
ipv6test(!1,":1111:2222:3333::7777:8888");
|
||||
ipv6test(!1,":1111:2222::7777:8888");
|
||||
ipv6test(!1,":1111::7777:8888");
|
||||
ipv6test(!1,":::7777:8888");
|
||||
ipv6test(!1,":1111:2222:3333:4444::6666:7777:8888");
|
||||
ipv6test(!1,":1111:2222:3333::6666:7777:8888");
|
||||
ipv6test(!1,":1111:2222::6666:7777:8888");
|
||||
ipv6test(!1,":1111::6666:7777:8888");
|
||||
ipv6test(!1,":::6666:7777:8888");
|
||||
ipv6test(!1,":1111:2222:3333::5555:6666:7777:8888");
|
||||
ipv6test(!1,":1111:2222::5555:6666:7777:8888");
|
||||
ipv6test(!1,":1111::5555:6666:7777:8888");
|
||||
ipv6test(!1,":::5555:6666:7777:8888");
|
||||
ipv6test(!1,":1111:2222::4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":1111::4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":::4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":1111::3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":::3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":::2222:3333:4444:5555:6666:7777:8888");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":1111:2222:3333:4444:5555::1.2.3.4");
|
||||
ipv6test(!1,":1111:2222:3333:4444::1.2.3.4");
|
||||
ipv6test(!1,":1111:2222:3333::1.2.3.4");
|
||||
ipv6test(!1,":1111:2222::1.2.3.4");
|
||||
ipv6test(!1,":1111::1.2.3.4");
|
||||
ipv6test(!1,":::1.2.3.4");
|
||||
ipv6test(!1,":1111:2222:3333:4444::6666:1.2.3.4");
|
||||
ipv6test(!1,":1111:2222:3333::6666:1.2.3.4");
|
||||
ipv6test(!1,":1111:2222::6666:1.2.3.4");
|
||||
ipv6test(!1,":1111::6666:1.2.3.4");
|
||||
ipv6test(!1,":::6666:1.2.3.4");
|
||||
ipv6test(!1,":1111:2222:3333::5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":1111:2222::5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":1111::5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":::5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":1111:2222::4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":1111::4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":::4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":1111::3333:4444:5555:6666:1.2.3.4");
|
||||
ipv6test(!1,":::2222:3333:4444:5555:6666:1.2.3.4");
|
||||
|
||||
// extra : at end
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:7777:::");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666:::");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:::");
|
||||
ipv6test(!1,"1111:2222:3333:4444:::");
|
||||
ipv6test(!1,"1111:2222:3333:::");
|
||||
ipv6test(!1,"1111:2222:::");
|
||||
ipv6test(!1,"1111:::");
|
||||
ipv6test(!1,":::");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555:6666::8888:");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555::8888:");
|
||||
ipv6test(!1,"1111:2222:3333:4444::8888:");
|
||||
ipv6test(!1,"1111:2222:3333::8888:");
|
||||
ipv6test(!1,"1111:2222::8888:");
|
||||
ipv6test(!1,"1111::8888:");
|
||||
ipv6test(!1,"::8888:");
|
||||
ipv6test(!1,"1111:2222:3333:4444:5555::7777:8888:");
|
||||
ipv6test(!1,"1111:2222:3333:4444::7777:8888:");
|
||||
ipv6test(!1,"1111:2222:3333::7777:8888:");
|
||||
ipv6test(!1,"1111:2222::7777:8888:");
|
||||
ipv6test(!1,"1111::7777:8888:");
|
||||
ipv6test(!1,"::7777:8888:");
|
||||
ipv6test(!1,"1111:2222:3333:4444::6666:7777:8888:");
|
||||
ipv6test(!1,"1111:2222:3333::6666:7777:8888:");
|
||||
ipv6test(!1,"1111:2222::6666:7777:8888:");
|
||||
ipv6test(!1,"1111::6666:7777:8888:");
|
||||
ipv6test(!1,"::6666:7777:8888:");
|
||||
ipv6test(!1,"1111:2222:3333::5555:6666:7777:8888:");
|
||||
ipv6test(!1,"1111:2222::5555:6666:7777:8888:");
|
||||
ipv6test(!1,"1111::5555:6666:7777:8888:");
|
||||
ipv6test(!1,"::5555:6666:7777:8888:");
|
||||
ipv6test(!1,"1111:2222::4444:5555:6666:7777:8888:");
|
||||
ipv6test(!1,"1111::4444:5555:6666:7777:8888:");
|
||||
ipv6test(!1,"::4444:5555:6666:7777:8888:");
|
||||
ipv6test(!1,"1111::3333:4444:5555:6666:7777:8888:");
|
||||
ipv6test(!1,"::3333:4444:5555:6666:7777:8888:");
|
||||
ipv6test(!1,"::2222:3333:4444:5555:6666:7777:8888:");
|
||||
|
||||
// additional cases: http:// crisp.tweakblogs.net/blog/2031/ipv6-validation-%28and-caveats%29.html
|
||||
ipv6test(1,"0:a:b:c:d:e:f::", "0000:000a:000b:000c:000d:000e:000f:0000");
|
||||
ipv6test(1,"::0:a:b:c:d:e:f", "0000:0000:000a:000b:000c:000d:000e:000f"); // syntactically correct, but bad form (::0:... could be combined)
|
||||
ipv6test(1,"a:b:c:d:e:f:0::", "000a:000b:000c:000d:000e:000f:0000:0000");
|
||||
ipv6test(!1,"':10.0.0.1");
|
||||
});
|
||||
};
|
10
assets/vendor/tablesorter/testing/testing.css
vendored
Normal file
10
assets/vendor/tablesorter/testing/testing.css
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
/* tables */
|
||||
.tester { /* */
|
||||
position: absolute;
|
||||
top: -999em;
|
||||
}
|
||||
|
||||
/* skipped tests */
|
||||
#qunit-tests li.pass.skipped {
|
||||
background-color: #fffacd;
|
||||
}
|
614
assets/vendor/tablesorter/testing/testing.js
vendored
Normal file
614
assets/vendor/tablesorter/testing/testing.js
vendored
Normal file
@@ -0,0 +1,614 @@
|
||||
/*!
|
||||
* TableSorter QUnit Testing
|
||||
*/
|
||||
/*jshint unused: false */
|
||||
/*global QUnit: false, JSHINT: false, ok: false, start: false, deepEqual: false, asyncTest: false */
|
||||
|
||||
/************************************************
|
||||
QUnit skip testing
|
||||
http://stackoverflow.com/q/13748129/145346
|
||||
************************************************/
|
||||
QUnit.testSkip = function( testName, callback ) {
|
||||
QUnit.test(testName + ' (SKIPPED)', function() {
|
||||
if (typeof callback === "function") {
|
||||
callback();
|
||||
}
|
||||
var $li = $('#' + QUnit.config.current.id);
|
||||
QUnit.done(function() {
|
||||
$li.addClass('skipped');
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
var tester = {
|
||||
|
||||
/************************************************
|
||||
JSHint testing
|
||||
************************************************/
|
||||
jsHintTest : function(name, sourceFile, options) {
|
||||
// Chrome & Opera don't allow ajax loading of script files
|
||||
if (QUnit.isLocal && /Chrome|Opera/.test(navigator.userAgent)) {
|
||||
return QUnit.testSkip(name, function(){
|
||||
ok( true, 'test cannot be done locally' );
|
||||
});
|
||||
}
|
||||
function validateFile(source) {
|
||||
var i, len, err,
|
||||
result = JSHINT(source, options),
|
||||
errors = JSHINT.errors;
|
||||
ok(result);
|
||||
if (result) {
|
||||
return;
|
||||
}
|
||||
for (i = 0, len = errors.length; i < len; i++) {
|
||||
err = errors[i];
|
||||
if (!err) {
|
||||
continue;
|
||||
}
|
||||
ok(false, err.reason + " on line " + err.line +
|
||||
", character " + err.character);
|
||||
}
|
||||
}
|
||||
return asyncTest(name, function() {
|
||||
$.ajax({
|
||||
url: sourceFile,
|
||||
dataType: 'script',
|
||||
success: function(source) {
|
||||
start();
|
||||
validateFile(source);
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/************************************************
|
||||
test table data cache
|
||||
************************************************/
|
||||
cacheCompare : function(table, col, expected, txt){
|
||||
var i, j = 0, k, l,
|
||||
result = [],
|
||||
b = table.tBodies,
|
||||
l2 = table.config.$headers.length;
|
||||
for (k = 0; k < b.length; k++){
|
||||
l = b[k].rows.length;
|
||||
for (j = 0; j < l; j++) {
|
||||
if (col === 'all') {
|
||||
// return all columns
|
||||
for (i = 0; i < l2; i++) {
|
||||
result.push( table.config.cache[k].normalized[j] ? table.config.cache[k].normalized[j][i] : '' );
|
||||
}
|
||||
} else {
|
||||
// return specific column
|
||||
result.push( table.config.cache[k].normalized[j] ? table.config.cache[k].normalized[j][col] : '' );
|
||||
}
|
||||
}
|
||||
}
|
||||
deepEqual( result, expected, 'testing parser cache: ' + txt);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
Core plugin tested
|
||||
========================
|
||||
OPTIONS:
|
||||
cssAsc, cssChildRow, cssDesc, cssHeader, cssHeaderRow, cssInfoBlock, dateFormat, emptyTo, headerList,
|
||||
headers, ignoreCase, initialized, parsers, sortList, sortLocaleCompare, sortReset, stringTo, tableClass,
|
||||
usNumberFormat, widgets (just zebra), sortAppend, sortForce, sortMultiSortKey, sortResetKey, numberSorter
|
||||
|
||||
METHODS:
|
||||
addRows, applyWidgets, destroy, sorton, sortReset, update/updateRow, updateAll, updateCell
|
||||
|
||||
EVENTS:
|
||||
initialized, sortBegin, sortEnd, sortStart, updateComplete
|
||||
|
||||
Not yet tested
|
||||
=========================
|
||||
OPTIONS:
|
||||
cancelSelection, cssIcon, cssProcessing, debug, delayInit, headerTemplate, initWidgets, onRenderHeader,
|
||||
onRenderTemplate, selectorHeaders, selectorRemove, selectorSort, serverSideSorting, showProcessing,
|
||||
sortInitialOrder, sortRestart, strings,
|
||||
textExtraction, textSorter, theme, widthFixed, widgets (also need priority testing)
|
||||
|
||||
METHODS:
|
||||
appendCache, applyWidgetId, sort, refreshWidgets
|
||||
|
||||
EVENTS:
|
||||
-
|
||||
*/
|
||||
|
||||
$(function(){
|
||||
// keep stuff in order; yeah I know every test needs to be atomic - bleh
|
||||
QUnit.config.reorder = false;
|
||||
|
||||
var ts = $.tablesorter,
|
||||
$table1 = $('.tester:eq(0)'),
|
||||
$table2 = $('.tester:eq(1)'),
|
||||
$table3 = $('.tester:eq(2)'),
|
||||
$table4 = $('.tester:eq(3)'),
|
||||
$table5 = $('.tester:eq(4)'), // empty table
|
||||
table1 = $table1[0],
|
||||
table2 = $table2[0],
|
||||
table3 = $table3[0],
|
||||
table4 = $table4[0],
|
||||
th0 = $table1.find('th')[0], // first table header cell
|
||||
init = false,
|
||||
sortIndx = 0,
|
||||
updateIndx = 0,
|
||||
updateCallback = 0,
|
||||
events = ['sortStart', 'sortBegin', 'sortEnd' ],
|
||||
returnTime = function(string){
|
||||
return new Date(string).getTime();
|
||||
},
|
||||
undef, c1, c2, c3, c4, e, i, l, t;
|
||||
|
||||
$table1
|
||||
.bind('tablesorter-initialized', function(){
|
||||
init = true;
|
||||
})
|
||||
.bind( events.join(' '), function(e){
|
||||
if (e.type === events[sortIndx%3]) {
|
||||
sortIndx++;
|
||||
}
|
||||
})
|
||||
.bind('updateComplete', function(){
|
||||
updateIndx++;
|
||||
})
|
||||
.tablesorter();
|
||||
|
||||
$table2.tablesorter({
|
||||
headers: {
|
||||
0: { sorter: 'text' },
|
||||
1: { sorter: 'text' },
|
||||
2: { sorter: false }
|
||||
}
|
||||
});
|
||||
|
||||
$table3.tablesorter({
|
||||
emptyTo: "bottom",
|
||||
stringTo: "max", // non-numeric content is treated as a MAX value
|
||||
headers: {
|
||||
0: { empty : "top" }, // sort empty cells to the top
|
||||
2: { string: "min" }, // non-numeric content is treated as a MIN value
|
||||
3: { sorter: "digit", empty : "zero", string : "top" }
|
||||
}
|
||||
});
|
||||
|
||||
$table4.tablesorter({
|
||||
sortAppend : [[2,0],[3,0]],
|
||||
sortForce : [[0,0],[1,0]],
|
||||
initialized: function(table){
|
||||
var e, c = table.config;
|
||||
// trigger sort on 5th column
|
||||
// this method is used because triggering a "sorton" would ignore sortForce/sortAppend
|
||||
c.$headers.eq(4).trigger('sort');
|
||||
e = $.Event('sort');
|
||||
e.which = 1;
|
||||
e.shiftKey = true;
|
||||
c.$headers.eq(5).trigger(e);
|
||||
},
|
||||
numberSorter: function(a, b, dir){
|
||||
return dir ? a-b : b-a;
|
||||
}
|
||||
});
|
||||
|
||||
$table5
|
||||
.bind( events.join(' '), function(e){
|
||||
if (e.type === events[sortIndx%3]) {
|
||||
sortIndx++;
|
||||
}
|
||||
})
|
||||
.bind('updateComplete', function(){
|
||||
updateIndx++;
|
||||
})
|
||||
.tablesorter();
|
||||
|
||||
// ensure all sort events fire on an empty table
|
||||
$table5.trigger('sorton', [ [[0,0]] ]);
|
||||
|
||||
/************************************************
|
||||
JSHint testing
|
||||
************************************************/
|
||||
// Run JSHint on main js files
|
||||
tester.jsHintTest('JSHint core', 'js/jquery.tablesorter.js');
|
||||
tester.jsHintTest('JSHint pager', 'addons/pager/jquery.tablesorter.pager.js');
|
||||
tester.jsHintTest('JSHint widgets', 'js/jquery.tablesorter.widgets.js');
|
||||
tester.jsHintTest('JSHint group widget', 'js/widgets/widget-grouping.js');
|
||||
tester.jsHintTest('JSHint scroller widget', 'js/widgets/widget-scroller.js');
|
||||
|
||||
/************************************************
|
||||
Initialization
|
||||
************************************************/
|
||||
test( "tablesorter loaded & initialized", function() {
|
||||
expect(3);
|
||||
equal( typeof ts, 'object', "tablesorter loaded");
|
||||
equal( table1.hasInitialized, true, "tablesorter initialized flag");
|
||||
equal( init, true, "tablesorter initialized event");
|
||||
});
|
||||
|
||||
c1 = table1.config;
|
||||
c2 = table2.config;
|
||||
c3 = table3.config;
|
||||
c4 = table4.config;
|
||||
|
||||
/************************************************
|
||||
check isDigit function
|
||||
************************************************/
|
||||
var d = ts.isDigit;
|
||||
test( "isDigit", function() {
|
||||
expect(17);
|
||||
ok( d('-1'), "allow negative (-1)");
|
||||
ok( d('+1'), "allow plus (+1)");
|
||||
ok( d('(1)'), "allow parenthesis (1)");
|
||||
ok( d('123'), "string has numbers ('123')");
|
||||
ok( d(123), "has numbers (123)");
|
||||
ok( d('1.2'), "remove decimal (1.2)");
|
||||
ok( d('1,234'),"remove commas (1,234)");
|
||||
ok( d("11'"), "remove apostrophe's (11')"); // 11 feet
|
||||
ok( d('3\'4"'),"remove quotes (3'4\")"); // 3 foot 4 inches
|
||||
ok( d(' 12 '), "remove spaces ( 12 )");
|
||||
ok( !d('x'), "non-digit alphabet");
|
||||
ok( !d('1x'), "digit + alphabet");
|
||||
ok( !d('x1'), "alphabet + digit");
|
||||
ok( !d('@'), "non-digit symbols");
|
||||
ok( !d('1-'), "negative after (1-) not allowed?");
|
||||
ok( !d('1+'), "plus after (1+) not allowed?");
|
||||
ok( !d('$2'), "no money; the currency parser will catch these");
|
||||
});
|
||||
|
||||
/************************************************
|
||||
check formatFloat function
|
||||
************************************************/
|
||||
var ff = function(str) {
|
||||
return ts.formatFloat(str, table1);
|
||||
};
|
||||
test( "formatFloat", function() {
|
||||
expect(18);
|
||||
strictEqual( ff(''), '', 'returns empty string' );
|
||||
strictEqual( ff(5), 5, 'returns numerical values');
|
||||
|
||||
c1.usNumberFormat = false;
|
||||
strictEqual( ts.formatFloat('1,234,567.89'), 1234567.89, 'use format float without including table - defaults to US number format');
|
||||
|
||||
strictEqual( ff('1 234,56'), 1234.56, 'parse non-U.S. (French) number format');
|
||||
strictEqual( ff('1.234,56'), 1234.56, 'parse non-U.S. (German) number format');
|
||||
strictEqual( ff('-32,32'), -32.32, 'negative non-U.S. signed numbers');
|
||||
strictEqual( ff('-1.234,56'), -1234.56, 'negative non-U.S. signed numbers');
|
||||
strictEqual( ff('(32,32)'), -32.32, 'parenthesis wrapped non-U.S. negative number');
|
||||
strictEqual( ff(' (32,32) '), -32.32, 'space + parenthesis wrapped non-U.S. negative number');
|
||||
|
||||
c1.usNumberFormat = true;
|
||||
strictEqual( ff('1,234.56'), 1234.56, 'parse U.S. number format');
|
||||
strictEqual( ff('-32.32'), -32.32, 'negative U.S. signed numbers');
|
||||
strictEqual( ff('(32.32)'), -32.32, 'parenthesis wrapped U.S. negative number');
|
||||
strictEqual( ff(' (32.32)'), -32.32, 'space + parenthesis wrapped U.S. negative number');
|
||||
|
||||
strictEqual( ff('fred'), 'fred', 'return string if not a number');
|
||||
strictEqual( ff(' fred '), 'fred', 'return trimmed string if not a number');
|
||||
strictEqual( ff('fred 12'), 'fred 12', 'return string if number not at beginning');
|
||||
strictEqual( ff('12fred'), 12, 'parse number + string into number only');
|
||||
strictEqual( ff('(fred)'), '(fred)', 'leave parenthesis intact on strings');
|
||||
|
||||
});
|
||||
|
||||
/************************************************
|
||||
get data function - jQuery data > meta > headers option > header class name
|
||||
************************************************/
|
||||
var gd = function(n){
|
||||
return ts.getData( c2.$headers[n], c2.headers[n], 'sorter' );
|
||||
};
|
||||
|
||||
test( "getData", function() {
|
||||
expect(4);
|
||||
var txt = [ 'jQuery data', 'meta data', 'headers option', 'header class name' ];
|
||||
for (i = 0; i < 4; i++) {
|
||||
equal( gd(i), 'false', txt[i]); // all columns have sorter false set
|
||||
}
|
||||
});
|
||||
|
||||
/************************************************
|
||||
character equivalent replacement
|
||||
************************************************/
|
||||
test( "replace accents", function() {
|
||||
expect(6);
|
||||
strictEqual( ts.replaceAccents('\u00e1\u00e0\u00e2\u00e3\u00e4\u0105\u00e5\u00c1\u00c0\u00c2\u00c3\u00c4\u0104\u00c5'), 'aaaaaaaAAAAAAA', "replaced a's");
|
||||
strictEqual( ts.replaceAccents('\u00e9\u00e8\u00ea\u00eb\u011b\u0119\u00c9\u00c8\u00ca\u00cb\u011a\u0118'), 'eeeeeeEEEEEE', "replaced e's");
|
||||
strictEqual( ts.replaceAccents('\u00ed\u00ec\u0130\u00ee\u00ef\u0131\u00cd\u00cc\u0130\u00ce\u00cf'), 'iiiiiiIIiII', "replaced i's");
|
||||
strictEqual( ts.replaceAccents('\u00f3\u00f2\u00f4\u00f5\u00f6\u00d3\u00d2\u00d4\u00d5\u00d6'), 'oooooOOOOO', "replaced o's");
|
||||
strictEqual( ts.replaceAccents('\u00fa\u00f9\u00fb\u00fc\u016f\u00da\u00d9\u00db\u00dc\u016e'), 'uuuuuUUUUU', "replaced u's");
|
||||
strictEqual( ts.replaceAccents('\u00e7\u0107\u010d\u00c7\u0106\u010c\u00df\u1e9e'), 'cccCCCssSS', "replaced c & s sharp");
|
||||
});
|
||||
|
||||
/************************************************
|
||||
check all default parsers
|
||||
************************************************/
|
||||
var p = ts.parsers,
|
||||
// test by parser
|
||||
parserTests = 85,
|
||||
// skipping metadata parser
|
||||
sample1 = {
|
||||
'text' : { 'test': 'test', 'TesT': 'test', '\u00e1 test': '\u00e1 test' },
|
||||
'currency' : { '\u00a31': 1, '($2.23)': -2.23, '5\u20ac': 5, '(11\u00a4)': -11, '500\u00a5': 500, '25\u00a2': 25, '$1,000.50': 1000.5 },
|
||||
'ipAddress' : { '255.255.255.255': 255255255255, '32.32.32.32': 32032032032, '1.1.1.1': 1001001001 },
|
||||
'url' : { 'http://google.com': 'google.com', 'ftp://fred.com': 'fred.com', 'https://github.com': 'github.com' },
|
||||
'isoDate' : { '2012/12/12': returnTime('2012/12/12'), '2012-12/12': returnTime('2012/12/12'), '2013-1-1': returnTime('2013/1/1'), '2013/1/1 12:34:56 AM': returnTime('2013/1/1 12:34:56 AM') },
|
||||
'percent' : { '100%': 100, '22%': 22, '%2': 2, '2 %': 2, '(4%)': -4, '1,234.56 %': 1234.56 },
|
||||
'usLongDate': { 'Feb 23, 1999': returnTime('Feb 23, 1999'), 'Feb 23, 1999 12:34': returnTime('Feb 23, 1999 12:34'), 'Feb 23, 1999 12:34 AM': returnTime('Feb 23, 1999 12:34 AM'), 'Feb 23, 1999 12:34:56 PM': returnTime('Feb 23, 1999 12:34:56 PM'), '01 Jan 2013': returnTime('01 Jan 2013') },
|
||||
'shortDate' : { '1/2/2001': returnTime('1/2/2001'), '1 2 2001': returnTime('1/2/2001'), '1.2.2001': returnTime('1/2/2001'), '1-2-2001': returnTime('1/2/2001'), '1/2/2001 12:34 PM' : returnTime('1/2/2001 12:34 PM'), '1.2.2001 13:34' : returnTime('1/2/2001 13:34') },
|
||||
'time' : { '12:34 AM': returnTime('2000/01/01 12:34 AM'), '1:00 pm': returnTime('2000/01/01 1:00 pm') },
|
||||
'digit' : { '12': 12, '$23': 23, '&44^': 44, '#(33)': -33, '1,000': 1000, '12.34': 12.34 }
|
||||
},
|
||||
// switch ignoreCase, sortLocalCompare & shortDate "ddmmyyyy"
|
||||
sample2 = {
|
||||
'text' : { 'TesT': 'TesT', '\u00e1 test': 'a test' },
|
||||
'currency' : { '\u20ac 123 456,78': 123456.78, '\u20ac 123.456,78': 123456.78 },
|
||||
'shortDate' : { '2/1/2001': returnTime('1/2/2001'), '2-1-2001': returnTime('1/2/2001'), '2 1,2001': returnTime('1/2/2001') }
|
||||
},
|
||||
// shortdate to "yyyymmdd"
|
||||
sample3 = {
|
||||
'shortDate' : { '2001/1/2': returnTime('1/2/2001'), '2001-1/2': returnTime('1/2/2001'), '2001,1.2': returnTime('1/2/2001') }
|
||||
},
|
||||
report = function(s) {
|
||||
for (i = 0; i < p.length; i++) {
|
||||
t = p[i].id;
|
||||
if (s.hasOwnProperty(t)) {
|
||||
$.each(s[t], function(k,v){
|
||||
// check "is" and "format" functions
|
||||
if (p[i].is(k)) {
|
||||
equal( p[i].format(k, table1, th0, 0), v, t + ' parser: "' + k + '" parsed to ' + v );
|
||||
} else {
|
||||
equal( p[i].format(k, table1, th0, 0), v, t + ' parser **NOT DETECTED**: "' + k + '", but returns ' + v );
|
||||
}
|
||||
});
|
||||
// test for undefined & null - probably overkill
|
||||
strictEqual( p[i].format(undef, table1, th0, 0), undef, t + ' parser: will return undefined values properly' );
|
||||
strictEqual( p[i].format(null, table1, th0, 0), null, t + ' parser: will return null values properly' );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
test( "testing parsers", function() {
|
||||
expect(parserTests);
|
||||
report(sample1);
|
||||
|
||||
c1.sortLocaleCompare = true;
|
||||
c1.ignoreCase = false;
|
||||
c1.usNumberFormat = false;
|
||||
th0.dateFormat = c1.dateFormat = "ddmmyyyy";
|
||||
report(sample2);
|
||||
|
||||
c1.usNumberFormat = true;
|
||||
th0.dateFormat = c1.dateFormat = "yyyymmdd";
|
||||
report(sample3);
|
||||
|
||||
// undocumented sortValue
|
||||
equal( ts.getParserById('metadata').format(null, table1, th0, 0), 'zzz', 'metadata parser found sortValue');
|
||||
c1.parserMetadataName = 'poe';
|
||||
equal( ts.getParserById('metadata').format(null, table1, th0, 0), 'nevermore', 'metadata parser found poe');
|
||||
|
||||
});
|
||||
|
||||
/************************************************
|
||||
test parser cache
|
||||
************************************************/
|
||||
test( "parser cache; sorton methods; empty & string", function() {
|
||||
expect(17);
|
||||
$table1.trigger('sortReset');
|
||||
// lower case because table was parsed before c1.ignoreCase was changed
|
||||
tester.cacheCompare( table1, 'all', [ 'test2', 'x2', 'test1', 'x3', 'test3', 'x1', '', '', 'testb', 'x5', 'testc', 'x4', 'testa', 'x6' ], 'unsorted' );
|
||||
|
||||
$table1.trigger('sorton', [[[ 0,0 ]]]);
|
||||
tester.cacheCompare( table1, 'all', [ 'test1', 'x3', 'test2', 'x2', 'test3', 'x1', '', '', 'testa', 'x6', 'testb', 'x5', 'testc', 'x4' ], 'ascending sort' );
|
||||
|
||||
$table1.trigger('sorton', [[[ 0,1 ]]]);
|
||||
tester.cacheCompare( table1, 'all', [ 'test3', 'x1', 'test2', 'x2', 'test1', 'x3', '', '', 'testc', 'x4', 'testb', 'x5', 'testa', 'x6' ], 'descending sort' );
|
||||
|
||||
// empty cell position
|
||||
$table3.trigger('sorton', [[[ 0,0 ]]]);
|
||||
tester.cacheCompare( table3, 0, [ '', 'a1', 'a02', 'a10', 'a33', 'a43', 'a55', 'a87', 'a102', 'a255' ], 'asc sort; empty to top' );
|
||||
|
||||
$table3.trigger('sorton', [[[ 0,1 ]]]);
|
||||
tester.cacheCompare( table3, 0, [ '', 'a255', 'a102', 'a87', 'a55', 'a43', 'a33', 'a10', 'a02', 'a1' ], 'desc sort; empty to top' );
|
||||
|
||||
// string position within number column
|
||||
$table3.trigger('sorton', [[[ 1,0 ]]]);
|
||||
tester.cacheCompare( table3, 1, [ -35, -5, -1, 1, 2, 4, 33, 44, 'nr', '' ], 'asc sort; empty to bottom; string to max' );
|
||||
|
||||
$table3.trigger('sorton', [[[ 1,1 ]]]);
|
||||
tester.cacheCompare( table3, 1, [ 'nr', 44, 33, 4, 2, 1, -1, -5, -35, '' ], 'desc sort; empty to bottom; string to max' );
|
||||
|
||||
$table3.trigger('sorton', [[[ 2,0 ]]]);
|
||||
tester.cacheCompare( table3, 2, [ 'nr', 'nr', 1, 2, 3, 4, 5, 6, 7, '' ], 'asc sort; empty to bottom; string to min' );
|
||||
|
||||
$table3.trigger('sorton', [[[ 2,1 ]]]);
|
||||
tester.cacheCompare( table3, 2, [ 7, 6, 5, 4, 3, 2, 1, 'nr', 'nr', '' ], 'desc sort; empty to bottom; string to min' );
|
||||
|
||||
$table3.trigger('sorton', [[[ 3,0 ]]]);
|
||||
tester.cacheCompare( table3, 3, [ 'n/a #2', 'n/a #1', -8.4, -2.2, -0.1, '', 5.2, 11.4, 23.6, 97.4 ], 'asc sort; empty to zero; string to top' );
|
||||
|
||||
$table3.trigger('sorton', [[[ 3,1 ]]]);
|
||||
tester.cacheCompare( table3, 3, [ 'n/a #2', 'n/a #1', 97.4, 23.6, 11.4, 5.2, '', -0.1, -2.2, -8.4 ], 'desc sort; empty to zero; string to top' );
|
||||
|
||||
$table3.find('th:eq(3)').data('string', 'bottom');
|
||||
$table3.trigger('update');
|
||||
tester.cacheCompare( table3, 3, [ 97.4, 23.6, 11.4, 5.2, '', -0.1, -2.2, -8.4, 'n/a #1', 'n/a #2' ], 'desc sort; empty to zero; string to bottom' );
|
||||
|
||||
$table3.trigger('sorton', [[[ 3,0 ]]]);
|
||||
tester.cacheCompare( table3, 3, [ -8.4, -2.2, -0.1, '', 5.2, 11.4, 23.6, 97.4, 'n/a #1', 'n/a #2' ], 'asc sort; empty to zero; string to bottom' );
|
||||
|
||||
$table3.find('th:eq(3)').data('string', 'none');
|
||||
c3.headers[3].empty = "bottom";
|
||||
c3.sortList = [[ 3, 1 ]]; // added to test sortList
|
||||
$table3.trigger('update');
|
||||
tester.cacheCompare( table3, 3, [ 97.4, 23.6, 11.4, 5.2, 'n/a #1', 'n/a #2', -0.1, -2.2, -8.4, '' ], 'desc sort; empty to zero; string to none/zero' );
|
||||
|
||||
$table3.trigger('sorton', [[[ 3,0 ]]]);
|
||||
tester.cacheCompare( table3, 3, [ -8.4, -2.2, -0.1, 'n/a #1', 'n/a #2', 5.2, 11.4, 23.6, 97.4, '' ], 'asc sort; empty to zero; string to none/zero' );
|
||||
|
||||
t = [ 'x', 'X', 'y', 'Y', 'z', 'Z', 'a', 'A', 'b', 'B', 'c', 'C' ];
|
||||
deepEqual( t.sort($.tablesorter.sortText), [ 'A', 'B', 'C', 'X', 'Y', 'Z', 'a', 'b', 'c', 'x', 'y', 'z' ], 'test sortText function directly' );
|
||||
|
||||
t = [ 'a02', 'a10', 'a43', 'a255', 'a102', 'a33', '', 'a1', 'a55', 'a87' ];
|
||||
deepEqual( t.sort($.tablesorter.sortNatural), [ '', 'a1', 'a02', 'a10', 'a33', 'a43', 'a55', 'a87', 'a102', 'a255' ], 'test sortNatural function directly' );
|
||||
|
||||
});
|
||||
|
||||
test( "sort Events", function(){
|
||||
expect(1);
|
||||
// table1 sorted twice in the above test; sortIndx = 9 then empty table5 x1 (total = 3 events x 3)
|
||||
equal( sortIndx, 9, 'sortStart, sortBegin & sortEnd fired in order x3; including empty table' );
|
||||
});
|
||||
|
||||
/************************************************
|
||||
test update methods
|
||||
************************************************/
|
||||
test( "parser cache; update methods & callbacks", function() {
|
||||
expect(5);
|
||||
c1.ignoreCase = true;
|
||||
|
||||
// updateAll
|
||||
$table1
|
||||
.find('th:eq(1)').removeAttr('class').html('num').end()
|
||||
.find('td:nth-child(2)').html(function(i,h){
|
||||
return h.substring(1);
|
||||
});
|
||||
$table1.trigger('updateAll', [false, function(){
|
||||
updateCallback++;
|
||||
var nw = $table1.find('th:eq(1)')[0],
|
||||
hc = c1.headerContent[1] === 'num',
|
||||
hd = c1.$headers[1] === nw,
|
||||
hl = c1.headerList[1] === nw,
|
||||
p1 = c1.parsers[1].id === 'digit';
|
||||
equal(hc && hd && hl && p1, true, 'testing header cache: updateAll - thead');
|
||||
tester.cacheCompare( table1, 'all', [ 'test3', 1, 'test2', 2, 'test1', 3, '', '', 'testc', 4, 'testb', 5, 'testa', 6 ], 'updateAll - tbody' );
|
||||
}]);
|
||||
|
||||
// addRows
|
||||
t = $('<tr class="temp"><td>testd</td><td>7</td></tr>');
|
||||
$table1.find('tbody:last').append(t);
|
||||
$table1.trigger('addRows', [t, true, function(){
|
||||
updateCallback++;
|
||||
tester.cacheCompare( table1, 'all', [ 'test3', 1, 'test2', 2, 'test1', 3, '', '', 'testd', 7, 'testc', 4, 'testb', 5, 'testa', 6 ], 'addRows method' );
|
||||
}]);
|
||||
|
||||
// updateCell
|
||||
t = $table1.find('td:contains("testd")');
|
||||
t.html('texte');
|
||||
$table1.trigger('updateCell', [t[0], true, function(){
|
||||
updateCallback++;
|
||||
tester.cacheCompare( table1, 'all', [ 'test3', 1, 'test2', 2, 'test1', 3, '', '', 'texte', 7, 'testc', 4, 'testb', 5, 'testa', 6 ], 'updateCell method' );
|
||||
}]);
|
||||
|
||||
// update
|
||||
$table1.find('tr.temp').remove();
|
||||
$table1.trigger('update', [true, function(){
|
||||
updateCallback++;
|
||||
tester.cacheCompare( table1, 'all', [ 'test3', 1, 'test2', 2, 'test1', 3, '', '', 'testc', 4, 'testb', 5, 'testa', 6 ], 'update method' );
|
||||
}]);
|
||||
|
||||
// update empty table
|
||||
$table5.trigger('update', [false, function(){
|
||||
updateCallback++;
|
||||
}]);
|
||||
|
||||
});
|
||||
|
||||
test( "UpdateComplete Event", function(){
|
||||
expect(1);
|
||||
// table1 updated 4x in the above test
|
||||
// table5 updated 1x
|
||||
equal( updateIndx, updateCallback, 'updatedComplete and update callback functions working properly' );
|
||||
});
|
||||
|
||||
/************************************************
|
||||
test sortForce, sortAppend, sortMultiSortKey and sortResetKey options
|
||||
************************************************/
|
||||
asyncTest( "sortForce, sortAppend, sortMultiSortKey & sortResetKey; and numberSorter option", function(){
|
||||
expect(3);
|
||||
var count = 0;
|
||||
tester.cacheCompare( table4, 3, [ 2, 1, 7, 6, 5, 3, 4, 8, 9, 10 ], 'force x2 + sorted x2 + append x2, ascending' );
|
||||
$table4.on('sortEnd', function(){
|
||||
count++;
|
||||
if (count === 1) {
|
||||
tester.cacheCompare( table4, 3, [ 2, 1, 6, 7, 5, 4, 3, 8, 10, 9 ], 'force x2 + sorted x2 + append x2, descending' );
|
||||
c4.sortResetKey = 'shiftKey';
|
||||
var e = $.Event('sort');
|
||||
e.which = 1;
|
||||
e.shiftKey = true; // testing sortResetKey
|
||||
c4.$headers.eq(0).trigger(e);
|
||||
} else {
|
||||
tester.cacheCompare( table4, 3, [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], 'sortResetKey' );
|
||||
$table4.off('sortEnd');
|
||||
start();
|
||||
}
|
||||
});
|
||||
var e = $.Event('sort');
|
||||
c4.sortMultiSortKey = 'altKey';
|
||||
e.which = 1;
|
||||
e.altKey = true; // testing sortMultiSortKey
|
||||
c4.$headers.eq(5).trigger(e);
|
||||
});
|
||||
|
||||
/************************************************
|
||||
check header css
|
||||
************************************************/
|
||||
test( "testing header css & sortReset method", function(){
|
||||
expect(7);
|
||||
t = $(th0);
|
||||
equal( $table1.hasClass(ts.css.table), true, 'table class applied');
|
||||
equal( t.hasClass(ts.css.header), true, 'Header class present' );
|
||||
equal( t.parent().hasClass(ts.css.headerRow), true, 'Header row class present' );
|
||||
equal( $table1.find('tbody:eq(1)').hasClass(c1.cssInfoBlock), true, 'Tbody info block class present' );
|
||||
$table1.trigger('sorton', [[[ 0,1 ]]] );
|
||||
equal( t.hasClass(ts.css.sortDesc), true, 'Descending class present' );
|
||||
$table1.trigger('sorton', [[[ 0,0 ]]] );
|
||||
equal( t.hasClass(ts.css.sortAsc), true, 'Ascending class present' );
|
||||
$table1.trigger('sortReset');
|
||||
equal( t.hasClass(ts.css.sortAsc) || t.hasClass(ts.css.sortDesc), false, 'Testing sortReset' );
|
||||
});
|
||||
|
||||
/************************************************
|
||||
test apply widgets function using zebra widget
|
||||
************************************************/
|
||||
var zebra = function(){
|
||||
t = true;
|
||||
$table2.find('tbody tr').each(function(){
|
||||
t = t ? $(this).hasClass('odd') || $(this).hasClass('even') : false;
|
||||
});
|
||||
return t;
|
||||
};
|
||||
|
||||
test( "apply zebra widget", function(){
|
||||
expect(2);
|
||||
equal( zebra(), false, 'zebra not applied' );
|
||||
c2.widgets = [ 'zebra' ];
|
||||
$table2.trigger('applyWidgets');
|
||||
equal( zebra(), true, 'zebra is applied' );
|
||||
});
|
||||
|
||||
/************************************************
|
||||
check destroy method
|
||||
************************************************/
|
||||
test("testing destroy method", function(){
|
||||
$table2.trigger('sorton', [[[ 0,1 ]]] );
|
||||
$table2.trigger('destroy');
|
||||
expect(7);
|
||||
t = $table2.find('th:first');
|
||||
e = jQuery._data(table2, 'events'); // get a list of all bound events
|
||||
equal( $.isEmptyObject(e), true, 'no events applied' );
|
||||
equal( $table2.data().hasOwnProperty('tablesorter'), false, 'Data removed' );
|
||||
equal( $table2.attr('class'), 'tester', 'All table classes removed' );
|
||||
equal( $table2.find('tr:first').attr('class'), '', 'Header row class removed' );
|
||||
equal( t.attr('class').match('tablesorter'), null, 'Header classes removed' );
|
||||
equal( t.children().length, 0, 'Inner wrapper removed' );
|
||||
equal( typeof (t.data().column) , 'undefined', 'data-column removed');
|
||||
|
||||
$table2.tablesorter();
|
||||
});
|
||||
|
||||
/************************************************
|
||||
ipv6 parser testing
|
||||
************************************************/
|
||||
ipv6tests();
|
||||
|
||||
});
|
Reference in New Issue
Block a user