From 43791ffba2fb73e8d344d8e10ff499eaf41d7329 Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Tue, 4 Mar 2014 16:56:16 +0100 Subject: [PATCH] SONAR-5112 Support of RATING, add tests --- sonar-server/karma.conf.js | 1 + .../webapp/javascripts/common/inputs.coffee | 111 ++++++----- .../main/webapp/javascripts/common/inputs.js | 174 ++++++++++-------- .../tests/common/inputsSpec.coffee | 81 ++++++++ .../javascripts/tests/common/inputsSpec.js | 78 ++++++++ 5 files changed, 322 insertions(+), 123 deletions(-) create mode 100644 sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.coffee create mode 100644 sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.js diff --git a/sonar-server/karma.conf.js b/sonar-server/karma.conf.js index bc9e4686b67..958fd256728 100644 --- a/sonar-server/karma.conf.js +++ b/sonar-server/karma.conf.js @@ -27,6 +27,7 @@ module.exports = function(config) { 'third-party/jquery.js', 'third-party/underscore.js', 'third-party/require.js', + 'common/inputs.js', // libs { pattern: 'third-party/**/*.js', included: false }, diff --git a/sonar-server/src/main/webapp/javascripts/common/inputs.coffee b/sonar-server/src/main/webapp/javascripts/common/inputs.coffee index 9431dcdc591..bc65fd504dc 100644 --- a/sonar-server/src/main/webapp/javascripts/common/inputs.coffee +++ b/sonar-server/src/main/webapp/javascripts/common/inputs.coffee @@ -1,71 +1,84 @@ $ = jQuery -$ -> +transformPattern = (pattern) -> + return pattern.replace /\{0\}/g, '(\\d+)' - transformPattern = (pattern) -> - return pattern.replace /\{0\}/g, '(\\d+)' +convertWorkDuration = (value) -> + daysPattern = transformPattern window.SS.workDuration.days + hoursPattern = transformPattern window.SS.workDuration.hours + minutesPattern = transformPattern window.SS.workDuration.minutes - convertWorkDuration = (value) -> - daysPattern = transformPattern window.SS.workDuration.days - hoursPattern = transformPattern window.SS.workDuration.hours - minutesPattern = transformPattern window.SS.workDuration.minutes + days = value.match daysPattern + hours = value.match hoursPattern + minutes = value.match minutesPattern - days = value.match daysPattern - hours = value.match hoursPattern - minutes = value.match minutesPattern + days = if days then +days[1] else 0 + hours = if hours then +hours[1] else 0 + minutes = if minutes then +minutes[1] else 0 - days = if days then +days[1] else 0 - hours = if hours then +hours[1] else 0 - minutes = if minutes then +minutes[1] else 0 + if !value || (value.length > 0 && days == 0 && hours == 0 && minutes == 0) + value + else + (days * 8 + hours) * 60 + minutes - if value && value.length > 0 && days == 0 && hours == 0 && minutes == 0 - value - else - (days * 8 + hours) * 60 + minutes +restoreWorkDuration = (value) -> + return value unless typeof value == 'number' + days = Math.floor(value / (8 * 60)) + hours = Math.floor((value - days * 8 * 60) / 60) + minutes = value % 60 + result = [] + result.push window.SS.workDuration.days.replace('{0}', days) if days > 0 + result.push window.SS.workDuration.hours.replace('{0}', hours) if hours > 0 + result.push window.SS.workDuration.minutes.replace('{0}', minutes) if minutes > 0 + result.join ' ' - restoreWorkDuration = (value) -> - days = Math.floor(value / (8 * 60)) - hours = Math.floor((value - days * 8 * 60) / 60) - minutes = value % 60 - result = [] - result.push window.SS.workDuration.days.replace('{0}', days) if days > 0 - result.push window.SS.workDuration.hours.replace('{0}', hours) if hours > 0 - result.push window.SS.workDuration.minutes.replace('{0}', minutes) if minutes > 0 - result.join ' ' +convertRating = (value) -> + if /^[ABCDE]$/.test(value) + value.charCodeAt(0) - 'A'.charCodeAt(0) + 1 + else + value - convertValue = (value, input) -> - type = input.data 'type' - # No convertation if input doesn't have data-type - return value unless type? +convertValue = (value, input) -> + type = input.data 'type' - # Do necessary convertion depeneds on input data-type - switch type - when 'WORK_DUR' then convertWorkDuration value - else value + # No convertation if input doesn't have data-type + return value unless type? + # Do necessary convertion depeneds on input data-type + switch type + when 'WORK_DUR' then convertWorkDuration value + when 'RATING' then convertRating value + else value - restoreValue = (value, input) -> - type = input.data 'type' - # No convertation if input doesn't have data-type - return value unless type? +restoreRating = (value) -> + return value unless typeof value == 'number' + String.fromCharCode(value - 1 + 'A'.charCodeAt(0)) - # Do necessary convertion depeneds on input data-type - switch type - when 'WORK_DUR' then restoreWorkDuration value - else value +restoreValue = (value, input) -> + type = input.data 'type' - originalVal = $.fn.val - $.fn.val = (value) -> - if arguments.length - originalVal.call @, (restoreValue value, @) - else - convertValue originalVal.call(@), @ + # No convertation if input doesn't have data-type + return value unless type? - $.fn.originalVal = originalVal + # Do necessary convertion depeneds on input data-type + switch type + when 'WORK_DUR' then restoreWorkDuration value + when 'RATING' then restoreRating value + else value + + +originalVal = $.fn.val +$.fn.val = (value) -> + if arguments.length + originalVal.call @, (restoreValue value, @) + else + convertValue originalVal.call(@), @ + +$.fn.originalVal = originalVal diff --git a/sonar-server/src/main/webapp/javascripts/common/inputs.js b/sonar-server/src/main/webapp/javascripts/common/inputs.js index 53b0c9a0413..2c22bd7310f 100644 --- a/sonar-server/src/main/webapp/javascripts/common/inputs.js +++ b/sonar-server/src/main/webapp/javascripts/common/inputs.js @@ -1,83 +1,109 @@ // Generated by CoffeeScript 1.6.3 (function() { - var $; + var $, convertRating, convertValue, convertWorkDuration, originalVal, restoreRating, restoreValue, restoreWorkDuration, transformPattern; $ = jQuery; - $(function() { - var convertValue, convertWorkDuration, originalVal, restoreValue, restoreWorkDuration, transformPattern; - transformPattern = function(pattern) { - return pattern.replace(/\{0\}/g, '(\\d+)'); - }; - convertWorkDuration = function(value) { - var days, daysPattern, hours, hoursPattern, minutes, minutesPattern; - daysPattern = transformPattern(window.SS.workDuration.days); - hoursPattern = transformPattern(window.SS.workDuration.hours); - minutesPattern = transformPattern(window.SS.workDuration.minutes); - days = value.match(daysPattern); - hours = value.match(hoursPattern); - minutes = value.match(minutesPattern); - days = days ? +days[1] : 0; - hours = hours ? +hours[1] : 0; - minutes = minutes ? +minutes[1] : 0; - if (value && value.length > 0 && days === 0 && hours === 0 && minutes === 0) { - return value; - } else { - return (days * 8 + hours) * 60 + minutes; - } - }; - restoreWorkDuration = function(value) { - var days, hours, minutes, result; - days = Math.floor(value / (8 * 60)); - hours = Math.floor((value - days * 8 * 60) / 60); - minutes = value % 60; - result = []; - if (days > 0) { - result.push(window.SS.workDuration.days.replace('{0}', days)); - } - if (hours > 0) { - result.push(window.SS.workDuration.hours.replace('{0}', hours)); - } - if (minutes > 0) { - result.push(window.SS.workDuration.minutes.replace('{0}', minutes)); - } - return result.join(' '); - }; - convertValue = function(value, input) { - var type; - type = input.data('type'); - if (type == null) { + transformPattern = function(pattern) { + return pattern.replace(/\{0\}/g, '(\\d+)'); + }; + + convertWorkDuration = function(value) { + var days, daysPattern, hours, hoursPattern, minutes, minutesPattern; + daysPattern = transformPattern(window.SS.workDuration.days); + hoursPattern = transformPattern(window.SS.workDuration.hours); + minutesPattern = transformPattern(window.SS.workDuration.minutes); + days = value.match(daysPattern); + hours = value.match(hoursPattern); + minutes = value.match(minutesPattern); + days = days ? +days[1] : 0; + hours = hours ? +hours[1] : 0; + minutes = minutes ? +minutes[1] : 0; + if (!value || (value.length > 0 && days === 0 && hours === 0 && minutes === 0)) { + return value; + } else { + return (days * 8 + hours) * 60 + minutes; + } + }; + + restoreWorkDuration = function(value) { + var days, hours, minutes, result; + if (typeof value !== 'number') { + return value; + } + days = Math.floor(value / (8 * 60)); + hours = Math.floor((value - days * 8 * 60) / 60); + minutes = value % 60; + result = []; + if (days > 0) { + result.push(window.SS.workDuration.days.replace('{0}', days)); + } + if (hours > 0) { + result.push(window.SS.workDuration.hours.replace('{0}', hours)); + } + if (minutes > 0) { + result.push(window.SS.workDuration.minutes.replace('{0}', minutes)); + } + return result.join(' '); + }; + + convertRating = function(value) { + if (/^[ABCDE]$/.test(value)) { + return value.charCodeAt(0) - 'A'.charCodeAt(0) + 1; + } else { + return value; + } + }; + + convertValue = function(value, input) { + var type; + type = input.data('type'); + if (type == null) { + return value; + } + switch (type) { + case 'WORK_DUR': + return convertWorkDuration(value); + case 'RATING': + return convertRating(value); + default: return value; - } - switch (type) { - case 'WORK_DUR': - return convertWorkDuration(value); - default: - return value; - } - }; - restoreValue = function(value, input) { - var type; - type = input.data('type'); - if (type == null) { + } + }; + + restoreRating = function(value) { + if (typeof value !== 'number') { + return value; + } + return String.fromCharCode(value - 1 + 'A'.charCodeAt(0)); + }; + + restoreValue = function(value, input) { + var type; + type = input.data('type'); + if (type == null) { + return value; + } + switch (type) { + case 'WORK_DUR': + return restoreWorkDuration(value); + case 'RATING': + return restoreRating(value); + default: return value; - } - switch (type) { - case 'WORK_DUR': - return restoreWorkDuration(value); - default: - return value; - } - }; - originalVal = $.fn.val; - $.fn.val = function(value) { - if (arguments.length) { - return originalVal.call(this, restoreValue(value, this)); - } else { - return convertValue(originalVal.call(this), this); - } - }; - return $.fn.originalVal = originalVal; - }); + } + }; + + originalVal = $.fn.val; + + $.fn.val = function(value) { + if (arguments.length) { + return originalVal.call(this, restoreValue(value, this)); + } else { + return convertValue(originalVal.call(this), this); + } + }; + + $.fn.originalVal = originalVal; }).call(this); diff --git a/sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.coffee b/sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.coffee new file mode 100644 index 00000000000..335d26b190b --- /dev/null +++ b/sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.coffee @@ -0,0 +1,81 @@ +$ = jQuery + +describe 'WORK_DUR suite', -> + + beforeEach -> + window.SS = + workDuration: + days: '{0}d', hours: '{0}h', minutes: '{0}min' + + @input = $('') + @input.appendTo $('body') + @input.data 'type', 'WORK_DUR' + + + it 'converts', -> + @input.originalVal '2d 7h 13min' + expect(@input.val()).toBe 1393 + + + it 'converts only days', -> + @input.originalVal '1d' + expect(@input.val()).toBe 480 + + + it 'converts hours with minutes', -> + @input.originalVal '2h 30min' + expect(@input.val()).toBe 150 + + + it 'restores', -> + @input.val 1393 + expect(@input.originalVal()).toBe '2d 7h 13min' + + + it 'returns initially incorrect value', -> + @input.val 'something' + expect(@input.val()).toBe 'something' + + + +describe 'RATING suite', -> + + beforeEach -> + @input = $('') + @input.appendTo $('body') + @input.data 'type', 'RATING' + + + it 'converts A', -> + @input.originalVal 'A' + expect(@input.val()).toBe 1 + + + it 'converts B', -> + @input.originalVal 'B' + expect(@input.val()).toBe 2 + + + it 'converts E', -> + @input.originalVal 'E' + expect(@input.val()).toBe 5 + + + it 'does not convert F', -> + @input.originalVal 'F' + expect(@input.val()).toBe 'F' + + + it 'restores A', -> + @input.val 1 + expect(@input.originalVal()).toBe 'A' + + + it 'restores E', -> + @input.val 5 + expect(@input.originalVal()).toBe 'E' + + + it 'returns initially incorrect value', -> + @input.val 'something' + expect(@input.val()).toBe 'something' diff --git a/sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.js b/sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.js new file mode 100644 index 00000000000..8d83eb5bfc8 --- /dev/null +++ b/sonar-server/src/main/webapp/javascripts/tests/common/inputsSpec.js @@ -0,0 +1,78 @@ +// Generated by CoffeeScript 1.6.3 +(function() { + var $; + + $ = jQuery; + + describe('WORK_DUR suite', function() { + beforeEach(function() { + window.SS = { + workDuration: { + days: '{0}d', + hours: '{0}h', + minutes: '{0}min' + } + }; + this.input = $(''); + this.input.appendTo($('body')); + return this.input.data('type', 'WORK_DUR'); + }); + it('converts', function() { + this.input.originalVal('2d 7h 13min'); + return expect(this.input.val()).toBe(1393); + }); + it('converts only days', function() { + this.input.originalVal('1d'); + return expect(this.input.val()).toBe(480); + }); + it('converts hours with minutes', function() { + this.input.originalVal('2h 30min'); + return expect(this.input.val()).toBe(150); + }); + it('restores', function() { + this.input.val(1393); + return expect(this.input.originalVal()).toBe('2d 7h 13min'); + }); + return it('returns initially incorrect value', function() { + this.input.val('something'); + return expect(this.input.val()).toBe('something'); + }); + }); + + describe('RATING suite', function() { + beforeEach(function() { + this.input = $(''); + this.input.appendTo($('body')); + return this.input.data('type', 'RATING'); + }); + it('converts A', function() { + this.input.originalVal('A'); + return expect(this.input.val()).toBe(1); + }); + it('converts B', function() { + this.input.originalVal('B'); + return expect(this.input.val()).toBe(2); + }); + it('converts E', function() { + this.input.originalVal('E'); + return expect(this.input.val()).toBe(5); + }); + it('does not convert F', function() { + this.input.originalVal('F'); + return expect(this.input.val()).toBe('F'); + }); + it('restores A', function() { + this.input.val(1); + return expect(this.input.originalVal()).toBe('A'); + }); + it('restores E', function() { + this.input.val(5); + return expect(this.input.originalVal()).toBe('E'); + }); + return it('returns initially incorrect value', function() { + this.input.val('something'); + return expect(this.input.val()).toBe('something'); + }); + }); + +}).call(this); -- 2.39.5