2014-05-06 17:10:27 +00:00
/ * \
title : test - utils . js
type : application / javascript
tags : [ [ $ : / t a g s / t e s t - s p e c ] ]
Tests various utility functions .
\ * /
( function ( ) {
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict" ;
describe ( "Utility tests" , function ( ) {
it ( "should handle parsing a string array" , function ( ) {
2014-11-21 17:05:20 +00:00
var psa = $tw . utils . parseStringArray ;
expect ( psa ( "Tiddler8" ) ) . toEqual ( [ "Tiddler8" ] ) ;
expect ( psa ( " Tiddler8" ) ) . toEqual ( [ "Tiddler8" ] ) ;
expect ( psa ( "Tiddler8 " ) ) . toEqual ( [ "Tiddler8" ] ) ;
expect ( psa ( "Tiddler8 two" ) ) . toEqual ( [ "Tiddler8" , "two" ] ) ;
2022-05-05 07:16:20 +00:00
expect ( psa ( "Tiddler8 two [[]]" ) ) . toEqual ( [ "Tiddler8" , "two" , "" ] ) ;
2014-11-21 17:05:20 +00:00
expect ( psa ( " Tiddler8 two " ) ) . toEqual ( [ "Tiddler8" , "two" ] ) ;
2022-05-10 09:22:35 +00:00
expect ( psa ( " [[Tidd\tler8]] [[spl\nit]]" ) ) . toEqual ( [ "Tidd\tler8" , "spl\nit" ] ) ;
2014-11-21 17:05:20 +00:00
expect ( psa ( " Tidd\u00a0ler8 two " ) ) . toEqual ( [ "Tidd\u00a0ler8" , "two" ] ) ;
expect ( psa ( " [[Tidd\u00a0ler8]] two " ) ) . toEqual ( [ "Tidd\u00a0ler8" , "two" ] ) ;
} ) ;
2020-12-01 10:39:27 +00:00
it ( "should handle parsing a date" , function ( ) {
var pd = function ( v ) {
2020-12-01 10:52:24 +00:00
return $tw . utils . parseDate ( v ) . toUTCString ( ) ;
2020-12-01 10:39:27 +00:00
} ;
2020-12-01 10:52:24 +00:00
expect ( pd ( "20150428204930183" ) ) . toEqual ( "Tue, 28 Apr 2015 20:49:30 GMT" ) ;
expect ( pd ( "-20150428204930183" ) ) . toEqual ( "Sun, 28 Apr -2015 20:49:30 GMT" ) ;
expect ( pd ( "00730428204930183" ) ) . toEqual ( "Fri, 28 Apr 0073 20:49:30 GMT" ) ;
expect ( pd ( "-00730428204930183" ) ) . toEqual ( "Thu, 28 Apr -0073 20:49:30 GMT" ) ;
2020-12-01 10:39:27 +00:00
} ) ;
2020-08-17 16:33:46 +00:00
it ( "should handle base64 encoding emojis" , function ( ) {
var booksEmoji = "📚" ;
expect ( booksEmoji ) . toBe ( booksEmoji ) ;
// 📚 is U+1F4DA BOOKS, which is represented by surrogate pair 0xD83D 0xDCDA in Javascript
expect ( booksEmoji . length ) . toBe ( 2 ) ;
expect ( booksEmoji . charCodeAt ( 0 ) ) . toBe ( 55357 ) ; // 0xD83D
expect ( booksEmoji . charCodeAt ( 1 ) ) . toBe ( 56538 ) ; // 0xDCDA
expect ( $tw . utils . base64Encode ( booksEmoji ) ) . not . toBe ( "7aC97bOa" , "if base64 is 7aC97bOa then surrogate pairs were incorrectly treated as codepoints" ) ;
expect ( $tw . utils . base64Encode ( booksEmoji ) ) . toBe ( "8J+Tmg==" , "if surrogate pairs are correctly treated as a single code unit then base64 should be 8J+Tmg==" ) ;
expect ( $tw . utils . base64Decode ( "8J+Tmg==" ) ) . toBe ( booksEmoji ) ;
expect ( $tw . utils . base64Decode ( $tw . utils . base64Encode ( booksEmoji ) ) ) . toBe ( booksEmoji , "should round-trip correctly" ) ;
} ) ;
2019-08-24 10:35:03 +00:00
it ( "should handle stringifying a string array" , function ( ) {
var str = $tw . utils . stringifyList ;
expect ( str ( [ ] ) ) . toEqual ( "" ) ;
2022-05-05 07:16:20 +00:00
expect ( str ( [ "" ] ) ) . toEqual ( "[[]]" ) ;
2019-08-24 10:35:03 +00:00
expect ( str ( [ "Tiddler8" ] ) ) . toEqual ( "Tiddler8" ) ;
expect ( str ( [ "Tiddler8 " ] ) ) . toEqual ( "[[Tiddler8 ]]" ) ;
expect ( str ( [ "A+B" , "A-B" , "A=B" ] ) ) . toEqual ( "A+B A-B A=B" ) ;
2022-05-10 09:22:35 +00:00
expect ( str ( [ "A\nB" , "A\tB" ] ) ) . toEqual ( "[[A\nB]] [[A\tB]]" ) ;
2019-08-24 10:35:03 +00:00
expect ( str ( [ "A B" ] ) ) . toEqual ( "[[A B]]" ) ;
2019-09-09 13:56:40 +00:00
// Starting special characters aren't treated specially,
// even though this makes a list incompatible with a filter parser.
expect ( str ( [ "+T" , "-T" , "~T" , "=T" , "$T" ] ) ) . toEqual ( "+T -T ~T =T $T" ) ;
2022-05-05 07:16:20 +00:00
expect ( str ( [ "A" , "" , "B" ] ) ) . toEqual ( "A [[]] B" ) ;
2019-08-24 10:35:03 +00:00
} ) ;
2019-09-09 13:56:40 +00:00
it ( "stringifyList shouldn't interfere with setting variables to negative numbers" , function ( ) {
var wiki = new $tw . Wiki ( ) ;
wiki . addTiddler ( { title : "test" , text : "<$set name=X filter='\"-7\"'>{{{ [<X>add[2]] }}}</$set>" } ) ;
// X shouldn't be wrapped in brackets. If it is, math filters will treat it as zero.
expect ( wiki . renderTiddler ( "text/plain" , "test" ) ) . toBe ( "-5" ) ;
} ) ;
2014-12-15 17:50:24 +00:00
it ( "should handle formatting a date string" , function ( ) {
var fds = $tw . utils . formatDateString ,
2016-11-13 23:56:18 +00:00
// nov is month: 10!
2014-12-15 17:50:24 +00:00
d = new Date ( 2014 , 10 , 9 , 17 , 41 , 28 , 542 ) ;
2020-12-01 10:39:27 +00:00
expect ( fds ( d , "{era:bce||ce}" ) ) . toBe ( "ce" ) ;
expect ( fds ( d , "YYYY" ) ) . toBe ( "2014" ) ;
2014-12-15 17:50:24 +00:00
expect ( fds ( d , "DDD DD MMM YYYY" ) ) . toBe ( "Sunday 9 November 2014" ) ;
expect ( fds ( d , "ddd hh mm ssss" ) ) . toBe ( "Sun 17 41 2828" ) ;
expect ( fds ( d , "MM0DD" ) ) . toBe ( "1109" ) ;
expect ( fds ( d , "MM0\\D\\D" ) ) . toBe ( "110DD" ) ;
2022-05-24 08:47:02 +00:00
const day = d . getUTCDate ( ) ;
const dayStr = ( "" + day ) . padStart ( 2 , '0' ) ;
const hours = d . getUTCHours ( ) ;
2022-05-24 09:02:45 +00:00
const hoursStr = ( "" + hours ) . padStart ( 2 , '0' ) ;
const expectedUtcStr = ` 201411 ${ dayStr } ${ hoursStr } 4128542 ` ;
2022-05-24 08:47:02 +00:00
expect ( fds ( d , "[UTC]YYYY0MM0DD0hh0mm0ssXXX" ) ) . toBe ( expectedUtcStr ) ;
2016-11-13 23:56:18 +00:00
// test some edge cases found at: https://en.wikipedia.org/wiki/ISO_week_date
// 2016-11-13 is Week 45 and it's a Sunday (month nr: 10)
d = new Date ( 2016 , 10 , 12 , 23 , 59 , 59 ) ;
expect ( fds ( d , "WW" ) ) . toBe ( "45" ) ;
d = new Date ( 2016 , 10 , 13 , 23 , 59 , 59 , 999 ) ;
expect ( fds ( d , "WW" ) ) . toBe ( "45" ) ;
d = new Date ( 2016 , 10 , 13 , 23 , 59 , 60 ) ; // see 60 seconds. so it's week 46
expect ( fds ( d , "WW" ) ) . toBe ( "46" ) ;
// 2006 Dez. 31 is end of week 52 (month nr: 11)
d = new Date ( 2006 , 11 , 31 , 23 , 59 , 59 ) ;
expect ( fds ( d , "WW" ) ) . toBe ( "52" ) ;
d = new Date ( 2006 , 11 , 31 , 23 , 59 , 60 ) ;
expect ( fds ( d , "WW" ) ) . toBe ( "1" ) ;
// 2010 Jan 03 is in week 53 (month nr: 0)
d = new Date ( 2010 , 0 , 3 , 23 , 59 , 59 ) ;
expect ( fds ( d , "WW" ) ) . toBe ( "53" ) ;
d = new Date ( 2010 , 0 , 3 , 23 , 59 , 60 ) ;
expect ( fds ( d , "WW" ) ) . toBe ( "1" ) ;
// 2014 12 29 is in week 1 of 2015 (month nr. 11)
d = new Date ( 2014 , 11 , 29 , 23 , 59 , 59 ) ;
expect ( fds ( d , "WW" ) ) . toBe ( "1" ) ;
expect ( fds ( d , "wYYYY" ) ) . toBe ( "2015" ) ;
2020-12-01 10:39:27 +00:00
// Negative years
d = new Date ( - 2014 , 10 , 9 , 17 , 41 , 28 , 542 ) ;
expect ( fds ( d , "YYYY" ) ) . toBe ( "-2014" ) ;
expect ( fds ( d , "aYYYY" ) ) . toBe ( "2014" ) ;
expect ( fds ( d , "{era:bce||ce}" ) ) . toBe ( "bce" ) ;
// Zero years
d = new Date ( 0 , 10 , 9 , 17 , 41 , 28 , 542 ) ;
d . setUTCFullYear ( 0 ) ; // See https://stackoverflow.com/a/5870822
expect ( fds ( d , "YYYY" ) ) . toBe ( "0000" ) ;
expect ( fds ( d , "aYYYY" ) ) . toBe ( "0000" ) ;
expect ( fds ( d , "{era:bce|z|ce}" ) ) . toBe ( "z" ) ;
2014-12-15 17:50:24 +00:00
} ) ;
2014-11-21 17:05:20 +00:00
it ( "should parse text references" , function ( ) {
var ptr = $tw . utils . parseTextReference ;
expect ( ptr ( "title" ) ) . toEqual (
{ title : 'title' }
) ;
expect ( ptr ( "ti#tle" ) ) . toEqual (
{ title : 'ti#tle' }
) ;
expect ( ptr ( "ti!tle" ) ) . toEqual (
{ title : 'ti!tle' }
) ;
expect ( ptr ( "ti#tle##index" ) ) . toEqual (
{ title : 'ti#tle' , index : 'index' }
) ;
2014-11-21 18:16:22 +00:00
expect ( ptr ( "ti!tle!!field" ) ) . toEqual (
{ title : 'ti!tle' , field : 'field' }
) ;
2014-11-21 17:05:20 +00:00
expect ( ptr ( "title##index!!field" ) ) . toEqual (
2014-11-21 18:16:22 +00:00
{ title : 'title##index' , field : 'field' }
2014-11-21 17:05:20 +00:00
) ;
expect ( ptr ( "title!!field##index" ) ) . toEqual (
{ title : 'title' , field : 'field##index' }
) ;
2014-05-06 17:10:27 +00:00
} ) ;
2020-04-13 09:03:01 +00:00
it ( "should compare versions" , function ( ) {
var cv = $tw . utils . compareVersions ;
expect ( cv ( "v0.0.0" , "v0.0.0" ) ) . toEqual ( 0 ) ;
expect ( cv ( "0.0.0" , "v0.0.0" ) ) . toEqual ( 0 ) ;
expect ( cv ( "v0.0.0" , "0.0.0" ) ) . toEqual ( 0 ) ;
expect ( cv ( "v0.0.0" , "not a version" ) ) . toEqual ( 0 ) ;
expect ( cv ( "v0.0.0" , undefined ) ) . toEqual ( 0 ) ;
expect ( cv ( "not a version" , "v0.0.0" ) ) . toEqual ( 0 ) ;
expect ( cv ( undefined , "v0.0.0" ) ) . toEqual ( 0 ) ;
expect ( cv ( "v1.0.0" , "v1.0.0" ) ) . toEqual ( 0 ) ;
expect ( cv ( "v1.0.0" , "1.0.0" ) ) . toEqual ( 0 ) ;
expect ( cv ( "v1.0.1" , undefined ) ) . toEqual ( + 1 ) ;
expect ( cv ( "v1.0.1" , "v1.0.0" ) ) . toEqual ( + 1 ) ;
expect ( cv ( "v1.1.1" , "v1.1.0" ) ) . toEqual ( + 1 ) ;
expect ( cv ( "v1.1.2" , "v1.1.1" ) ) . toEqual ( + 1 ) ;
expect ( cv ( "1.1.2" , "v1.1.1" ) ) . toEqual ( + 1 ) ;
expect ( cv ( "v1.0.0" , "v1.0.1" ) ) . toEqual ( - 1 ) ;
expect ( cv ( "v1.1.0" , "v1.1.1" ) ) . toEqual ( - 1 ) ;
expect ( cv ( "v1.1.1" , "v1.1.2" ) ) . toEqual ( - 1 ) ;
expect ( cv ( "1.1.1" , "1.1.2" ) ) . toEqual ( - 1 ) ;
} ) ;
2022-02-21 15:34:05 +00:00
it ( "should insert strings into sorted arrays" , function ( ) {
expect ( $tw . utils . insertSortedArray ( [ ] , "a" ) . join ( "," ) ) . toEqual ( "a" ) ;
expect ( $tw . utils . insertSortedArray ( [ "b" , "c" , "d" ] , "a" ) . join ( "," ) ) . toEqual ( "a,b,c,d" ) ;
expect ( $tw . utils . insertSortedArray ( [ "b" , "c" , "d" ] , "d" ) . join ( "," ) ) . toEqual ( "b,c,d" ) ;
expect ( $tw . utils . insertSortedArray ( [ "b" , "c" , "d" ] , "f" ) . join ( "," ) ) . toEqual ( "b,c,d,f" ) ;
expect ( $tw . utils . insertSortedArray ( [ "b" , "c" , "d" , "e" ] , "f" ) . join ( "," ) ) . toEqual ( "b,c,d,e,f" ) ;
expect ( $tw . utils . insertSortedArray ( [ "b" , "c" , "g" ] , "f" ) . join ( "," ) ) . toEqual ( "b,c,f,g" ) ;
expect ( $tw . utils . insertSortedArray ( [ "b" , "c" , "d" ] , "ccc" ) . join ( "," ) ) . toEqual ( "b,c,ccc,d" ) ;
} ) ;
2014-05-06 17:10:27 +00:00
} ) ;
} ) ( ) ;