test.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. var assert = require('assert');
  2. var jsCalendar = require('../index');
  3. var assets = require('../assets/specs/total-weeks');
  4. describe('jsCalendar', function(){
  5. describe('basic functionality', function(){
  6. function isLeapYear(year){ // double verification if is a leap year
  7. var algorithm = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
  8. var javascript = new Date(year, 1, 29).getMonth() == 1;
  9. assert.equal(algorithm, javascript); // just to be sure
  10. return javascript;
  11. }
  12. var monthLengths = [31, false, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  13. var jsCal = new jsCalendar.Generator();
  14. it('should do basic functionality', function(){
  15. var january = jsCal(2019, 0);
  16. assert.equal(january.cells.length, 56);
  17. assert.equal(january.month, 0);
  18. assert.equal(january.year, 2019);
  19. assert.equal(january.daysInMonth, 31);
  20. });
  21. it('should read "onlyDays" parameter', function(){
  22. var onlyDaysCal = new jsCalendar.Generator({onlyDays: true});
  23. var defaultCal = new jsCalendar.Generator();
  24. var alsoLabelsCal = new jsCalendar.Generator({onlyDays: false});
  25. assert.equal(onlyDaysCal(2017, 0).cells.length, 42);
  26. assert.equal(defaultCal(2017, 0).cells.length, 56);
  27. assert.equal(alsoLabelsCal(2017, 0).cells.length, 56);
  28. });
  29. it('should set correct year that the week belongs to', function(){
  30. ['iso', 'US format'].forEach(function(standard){
  31. var iso = standard == 'iso';
  32. var jsCal = new jsCalendar.Generator({onlyDays: true, weekStart: iso ? 1 : 0});
  33. var january = jsCal(2010, 0);
  34. var december = jsCal(2010, 11);
  35. assert.equal(january.year, 2010);
  36. assert.equal(december.year, 2010);
  37. assert.equal(january.cells[0].year, iso ? 2009 : 2010); // 28 dec, week 53 iso, week 1 US
  38. assert.equal(january.cells[6].year, iso ? 2009 : 2010); // 3 jan, week 53/week 1
  39. assert.equal(january.cells[7].year, 2010); // 4 jan, week 1
  40. assert.equal(december.cells[34].year, iso ? 2010 : 2011); // 2 jan, week 52 iso/week 1 US
  41. assert.equal(december.cells[35].year, 2011); // 3 jan, week 1
  42. // #2 - should not start a month with a full week from past month,
  43. // the first 7 days must contain at least 1 day from the current month
  44. for (var y = 1978; y < 2079; y++){ // check dates between 1800 and 2300
  45. for (var m = 0; m < 12; m++){
  46. var cells = jsCal(y, m).cells;
  47. var firstWeek = cells.slice(0, 7);
  48. var lastDayInWeek = firstWeek.pop();
  49. assert.equal(lastDayInWeek.date.getTime() >= new Date(y, m, 1).getTime(), true);
  50. }
  51. }
  52. });
  53. });
  54. it('should set correct week in US standard', function(){
  55. var jsCal_default = new jsCalendar.Generator({onlyDays: true});
  56. var jsCal_US = new jsCalendar.Generator({onlyDays: true, weekStart: 0});
  57. var jsCal_EU = new jsCalendar.Generator({onlyDays: true, weekStart: 1});
  58. var weekUS = assets.i18n;
  59. var testYears = Object.keys(assets.i18n);
  60. // US DATES TEST
  61. testYears.forEach(function(year){
  62. for (var m = 0; m < 12; m++){
  63. var month = jsCal_US(year, m);
  64. var firstDayOfMonth = month.cells.filter(function(cell){
  65. return cell.type == 'monthDay';
  66. })[0];
  67. assert.equal(firstDayOfMonth.week, weekUS[year][m]);
  68. }
  69. });
  70. // isolated buggy dates:
  71. // #1 - last week of cells is set wrong when it belongs to 2nd week of next year
  72. var dec2015 = jsCal_US(2015, 11);
  73. var lastWeek = dec2015.cells.slice(-7);
  74. lastWeek.forEach(function(entry, i){
  75. // should match the correct days in 2nd week of jan2016
  76. assert.equal(entry.date.getDay(), i);
  77. assert.equal(entry.week, 2);
  78. });
  79. });
  80. it('should return correct month length', function(){
  81. for (var y = 1800; y < 2300; y++){ // check dates between 1800 and 2300
  82. for (var m = 0; m < 12; m++){
  83. var monthInYear = jsCal(y, m);
  84. var monthLength = monthLengths[m];
  85. if (!monthLength) monthLength = isLeapYear(y) ? 29 : 28;
  86. assert.equal(monthInYear.daysInMonth, monthLength);
  87. // check last day in each month is the right one
  88. var days = monthInYear.cells.filter(function(cell){
  89. return cell.type == 'monthDay';
  90. });
  91. var lastDay = days.pop().desc;
  92. assert.equal(monthInYear.daysInMonth, lastDay);
  93. }
  94. }
  95. });
  96. it('should return correct week numbers', function(){
  97. for (var y = 1800; y < 2300; y++){ // check dates between 1800 and 2300
  98. var monthInYear = jsCal(y, 0);
  99. var weekNr = monthInYear.cells[0].week;
  100. var dayInWeek = new Date(y, 0).getDay() || 7;
  101. if (dayInWeek > 4) assert.equal(weekNr > 50, true);
  102. else assert.equal(weekNr, 1);
  103. var afterThreeWeeks = monthInYear.cells[28].week;
  104. if (dayInWeek <= 4) assert.equal(afterThreeWeeks, 3);
  105. }
  106. });
  107. it('should return calculate correct week number when changing year - january', function(){
  108. var assetsIndex = 0;
  109. var jsCal = new jsCalendar.Generator({onlyDays: true, weekStart: 1});
  110. for (var y = 1971; y < 2051; y++){ // check dates between 1800 and 2300
  111. var january = jsCal(y, 0);
  112. // check the first and second thurdays in year
  113. var thursday = january.cells[3];
  114. var thursdayInYear = thursday.date.getFullYear();
  115. if (thursdayInYear == y -1){
  116. assert.equal(thursday.week, assets.totalWeeks[assetsIndex]);
  117. assert.equal(january.cells[10].week, 1);
  118. }
  119. else if (thursdayInYear == y){
  120. assert.equal(thursday.week, 1);
  121. assert.equal(january.cells[10].week, 2);
  122. }
  123. else {
  124. assert.equal(true, false); // this should never happen
  125. }
  126. assetsIndex++;
  127. }
  128. });
  129. it('should return calculate correct week number when changing year - december', function(){
  130. var assetsIndex = 0;
  131. var jsCal = new jsCalendar.Generator({onlyDays: true, weekStart: 1});
  132. for (var y = 1970; y < 2050; y++){ // check january dates between 1971 and 2051
  133. var december = jsCal(y, 11);
  134. var expected = assets.januaryWeekStart[assetsIndex];
  135. // get only next january days
  136. var extraDays = december.cells.filter(function(day){
  137. return day.type == 'nextMonth';
  138. });
  139. assert.equal(extraDays.length > 0, true); // there is always some day there
  140. assert.equal(extraDays[0].week, expected);
  141. if (extraDays.length > 7) assert.equal(extraDays[7].week, expected == 1 ? 2 : 1);
  142. assetsIndex++;
  143. }
  144. });
  145. });
  146. describe('addLabels should add classes correctly', function(){
  147. var jsCalWithWeeks = new jsCalendar.Generator({onlyDays: true});
  148. it('when custom fn is last', function(){
  149. var monthInYear = jsCalWithWeeks(2016, 0, [jsCalendar.addLabels, function(dayData){
  150. dayData.class.push('test-class');
  151. return dayData;
  152. }]);
  153. assert.equal(monthInYear.cells[0].class.indexOf('test-class') != -1, true);
  154. });
  155. it('when custom function return class as string', function(){
  156. var monthInYear = jsCalWithWeeks(2016, 1, [function(dayData){
  157. dayData.class = 'test-class';
  158. return dayData;
  159. }, jsCalendar.addLabels]);
  160. assert.equal(monthInYear.cells[0].class.indexOf('test-class') != -1, true);
  161. });
  162. it('when custom function return class as array', function(){
  163. var monthInYear = jsCalWithWeeks(2016, 2, [function(dayData){
  164. dayData.class = ['test-class'];
  165. return dayData;
  166. }, jsCalendar.addLabels]);
  167. assert.equal(monthInYear.cells[0].class.indexOf('test-class') != -1, true);
  168. });
  169. });
  170. describe('addLabels ', function(){
  171. var jsCalWithWeeks = new jsCalendar.Generator();
  172. it('should set the correct default month name in each day', function(){
  173. var monthInYear = jsCalWithWeeks(2016, 2, [jsCalendar.addLabels]);
  174. monthInYear.cells.forEach(function(day){
  175. if (day.type == 'prevMonth') assert.equal(day.monthName, 'February');
  176. else if (day.type == 'nextMonth') assert.equal(day.monthName, 'April');
  177. else if (day.type == 'monthDay') assert.equal(day.monthName, 'March');
  178. });
  179. });
  180. it('should set the correct default month name in month object', function(){
  181. var monthInYear = jsCalWithWeeks(2016, 2, [jsCalendar.addLabels]);
  182. assert.equal(monthInYear.monthName, 'March');
  183. });
  184. it('should merge new options', function(){
  185. var columnNames = {
  186. 0: '_w',
  187. 1: '_segunda',
  188. 2: '_terça',
  189. 3: '_quarta',
  190. 4: '_quinta',
  191. 5: '_sexta',
  192. 6: '_sabado',
  193. 7: '_domingo'
  194. };
  195. var monthNames = [
  196. "_Janeiro",
  197. "_Fevereiro",
  198. "_Março",
  199. "_Abril",
  200. "_Maio",
  201. "_Junho",
  202. "_Julho",
  203. "_Agosto",
  204. "_Setembro",
  205. "_Outubro",
  206. "_Novembro",
  207. "_Dezembro"
  208. ];
  209. var marsian = {monthNames: {marsian: monthNames}, columnNames: {marsian: columnNames}};
  210. jsCalendar.addLabels.setLabels(marsian);
  211. var jsCal = new jsCalendar.Generator({lang: 'marsian'});
  212. var monthInYear = jsCal(2016, 2, [jsCalendar.addLabels]);
  213. var month = monthInYear.cells.pop().monthName;
  214. assert.equal(month, '_Abril');
  215. });
  216. it('should set correct days when using "onlyDays == true" parameter', function(){
  217. var onlyDaysCal = new jsCalendar.Generator({onlyDays: true});
  218. var cells = onlyDaysCal(2017, 0, [jsCalendar.addLabels]).cells;
  219. var NumericCells = cells.map(day => {
  220. return Number(day.desc);
  221. }).filter(Boolean);
  222. assert.equal(cells.length, 42);
  223. assert.equal(NumericCells.length, 42);
  224. });
  225. it('should set correct monthName when single function instead of array in iterators callback', function(){
  226. var onlyDaysCal = new jsCalendar.Generator();
  227. var cal = onlyDaysCal(2017, 0, jsCalendar.addLabels);
  228. assert.equal(cal.monthName, 'January');
  229. });
  230. it('should set export the labels to the calendar object (not only each dayObject)', function(){
  231. var jsCal = new jsCalendar.Generator();
  232. var cal = jsCal(2017, 0, jsCalendar.addLabels);
  233. assert.equal('labels' in cal && !!cal.labels, true);
  234. assert.equal(Object.keys(cal.labels).includes('monthNames'), true);
  235. assert.equal(cal.labels.monthNames[1], 'February');
  236. });
  237. });
  238. describe('should generate correct index', function(){
  239. var jsCal = new jsCalendar.Generator();
  240. it('should not be a monthDay in index < 8', function(){
  241. var monthInYear = jsCal(2016, 0, [jsCalendar.addLabels]);
  242. for (var i = 0; i < 8; i++){
  243. assert.equal(monthInYear.cells[i].type != 'monthDay', true);
  244. assert.equal(monthInYear.cells[i].index, i);
  245. }
  246. });
  247. it('first index is 0', function(){
  248. var monthInYear = jsCal(2016, 1, [jsCalendar.addLabels]);
  249. assert.equal(monthInYear.cells[0].index == 0, true);
  250. });
  251. it('last index is 55 for full calendar', function(){
  252. var monthInYear = jsCal(2016, 2, [jsCalendar.addLabels]);
  253. assert.equal(monthInYear.cells.pop().index == 55, true);
  254. });
  255. it('last index is same as month length for only days calendar', function(){
  256. var jsCalOnlyDays = new jsCalendar.Generator({onlyDays: true});
  257. var monthInYear = jsCalOnlyDays(2016, 2, [jsCalendar.addLabels]);
  258. assert.equal(monthInYear.cells.pop().index, 41);
  259. assert.equal(monthInYear.cells.length, 41);
  260. });
  261. it('set the correct day type', function(){
  262. var february = 2;
  263. var jsCalOnlyDays = new jsCalendar.Generator({onlyDays: true});
  264. var monthInYear = jsCalOnlyDays(2016, february, []);
  265. var dayInFebruary = monthInYear.cells.shift();
  266. var dayInApril = monthInYear.cells.pop();
  267. assert.equal(dayInFebruary.type, 'prevMonth');
  268. assert.equal(dayInApril.type, 'nextMonth');
  269. assert.equal(dayInFebruary.date.getMonth(), february - 1);
  270. assert.equal(dayInApril.date.getMonth(), february + 1);
  271. });
  272. });
  273. });