From 3c784e869a35db04513af3f91c99bf022b0f4eec Mon Sep 17 00:00:00 2001 From: Victor Piousbox Date: Sat, 9 Apr 2016 19:27:22 +0000 Subject: [PATCH] shared-code-percent --- common/script/libs/percent.js | 8 +-- common/script/libs/splitWhitespace.js | 3 +- common/script/libs/taskClasses.js | 55 +++++++--------- tasks/gulp-eslint.js | 3 - test/common/libs/percent.test.js | 19 ++++++ test/common/libs/splitWhitespace.test.js | 7 ++ test/common/libs/taskClasses.test.js | 82 ++++++++++++++++++++++++ 7 files changed, 136 insertions(+), 41 deletions(-) create mode 100644 test/common/libs/percent.test.js create mode 100644 test/common/libs/splitWhitespace.test.js create mode 100644 test/common/libs/taskClasses.test.js diff --git a/common/script/libs/percent.js b/common/script/libs/percent.js index e59132f582..d7622474dd 100644 --- a/common/script/libs/percent.js +++ b/common/script/libs/percent.js @@ -1,12 +1,12 @@ // TODO move to client -module.exports = function(x, y, dir) { - var roundFn; +module.exports = function percent (x, y, dir) { + let roundFn; switch (dir) { - case "up": + case 'up': roundFn = Math.ceil; break; - case "down": + case 'down': roundFn = Math.floor; break; default: diff --git a/common/script/libs/splitWhitespace.js b/common/script/libs/splitWhitespace.js index 1ef3d513aa..2f8276bcb3 100644 --- a/common/script/libs/splitWhitespace.js +++ b/common/script/libs/splitWhitespace.js @@ -1,3 +1,4 @@ -module.exports = function(s) { + +module.exports = function splitWhitespace (s) { return s.split(' '); }; diff --git a/common/script/libs/taskClasses.js b/common/script/libs/taskClasses.js index 21bed1ad63..0939c8b837 100644 --- a/common/script/libs/taskClasses.js +++ b/common/script/libs/taskClasses.js @@ -1,51 +1,40 @@ import { - shouldDo + shouldDo, } from '../cron'; + /* Task classes given everything about the class */ -module.exports = function(task, filters, dayStart, lastCron, showCompleted, main) { - var classes, completed, enabled, filter, priority, ref, repeat, type, value; - if (filters == null) { - filters = []; - } - if (dayStart == null) { - dayStart = 0; - } - if (lastCron == null) { - lastCron = +(new Date); - } - if (showCompleted == null) { - showCompleted = false; - } - if (main == null) { - main = false; - } +module.exports = function taskClasses (task, filters = [], dayStart = 0, lastCron = Number(new Date()), showCompleted = false, main = false) { if (!task) { - return; + return ''; } - type = task.type, completed = task.completed, value = task.value, repeat = task.repeat, priority = task.priority; - if (main) { - if (!task._editing) { - for (filter in filters) { - enabled = filters[filter]; - if (enabled && !((ref = task.tags) != null ? ref[filter] : void 0)) { - return 'hidden'; - } + let type = task.type; + let classes = task.type; + let completed = task.completed; + let value = task.value; + let priority = task.priority; + + if (main && !task._editing) { + for (let filter in filters) { + let enabled = filters[filter]; + if (!task.tags) task.tags = {}; + if (enabled && !task.tags[filter]) { + return 'hidden'; } } } - classes = type; + classes = task.type; if (task._editing) { - classes += " beingEdited"; + classes += ' beingEdited'; } if (type === 'todo' || type === 'daily') { - if (completed || (type === 'daily' && !shouldDo(+(new Date), task, { - dayStart: dayStart + if (completed || (type === 'daily' && !shouldDo(Number(new Date()), task, { // eslint-disable-line no-extra-parens + dayStart, }))) { - classes += " completed"; + classes += ' completed'; } else { - classes += " uncompleted"; + classes += ' uncompleted'; } } else if (type === 'habit') { if (task.down && task.up) { diff --git a/tasks/gulp-eslint.js b/tasks/gulp-eslint.js index cad0d88e9c..fcf9422182 100644 --- a/tasks/gulp-eslint.js +++ b/tasks/gulp-eslint.js @@ -24,11 +24,8 @@ const COMMON_FILES = [ '!./common/script/libs/gold.js', '!./common/script/libs/newChatMessages.js', '!./common/script/libs/noTags.js', - '!./common/script/libs/percent.js', '!./common/script/libs/planGemLimits.js', '!./common/script/libs/silver.js', - '!./common/script/libs/splitWhitespace.js', - '!./common/script/libs/taskClasses.js', '!./common/script/public/**/*.js', ]; const TEST_FILES = [ diff --git a/test/common/libs/percent.test.js b/test/common/libs/percent.test.js new file mode 100644 index 0000000000..9d1ba31024 --- /dev/null +++ b/test/common/libs/percent.test.js @@ -0,0 +1,19 @@ +import percent from '../../../common/script/libs/percent'; + +describe('percent', () => { + it('with direction "up"', () => { + expect(percent(1, 10, 'up')).to.eql(10); + expect(percent(1, 20, 'up')).to.eql(5); + expect(percent(1.22, 10.99, 'up')).to.eql(12); + }); + + it('with direction "down"', () => { + expect(percent(1, 10, 'down')).to.eql(10); + expect(percent(1, 20, 'down')).to.eql(5); + expect(percent(1.22, 10.99, 'down')).to.eql(11); + }); + + it('with no direction', () => { + expect(percent(1.22, 10.99)).to.eql(11); + }); +}); diff --git a/test/common/libs/splitWhitespace.test.js b/test/common/libs/splitWhitespace.test.js new file mode 100644 index 0000000000..0b445d5a38 --- /dev/null +++ b/test/common/libs/splitWhitespace.test.js @@ -0,0 +1,7 @@ +import splitWhitespace from '../../../common/script/libs/splitWhitespace'; + +describe('splitWhitespace', () => { + it('returns an array', () => { + expect(splitWhitespace('a b')).to.eql(['a', 'b']); + }); +}); diff --git a/test/common/libs/taskClasses.test.js b/test/common/libs/taskClasses.test.js new file mode 100644 index 0000000000..338b861f02 --- /dev/null +++ b/test/common/libs/taskClasses.test.js @@ -0,0 +1,82 @@ +import taskClasses from '../../../common/script/libs/taskClasses'; + +describe('taskClasses', () => { + let task = {}; + let filters = {}; + let result; + + describe('a todo task', () => { + beforeEach(() => { + task = { type: 'todo', _editing: false, tags: { a: false } }; + }); + + it('is hidden', () => { + filters = { a: true }; + result = taskClasses(task, filters, 0, Number(new Date()), false, true); + expect(result).to.eql('hidden'); + }); + it('is beingEdited', () => { + task._editing = true; + result = taskClasses(task, filters); + expect(result.split(' ').indexOf('beingEdited')).to.not.eql(-1); + }); + it('is completed', () => { + task.completed = true; + result = taskClasses(task, filters); + expect(result.split(' ').indexOf('completed')).to.not.eql(-1); + task.completed = false; + result = taskClasses(task, filters); + expect(result.split(' ').indexOf('completed')).to.eql(-1); + expect(result.split(' ').indexOf('uncompleted')).to.not.eql(-1); + }); + }); + + describe('a daily task', () => { + it('is completed', () => { + task = { type: 'daily' }; + result = taskClasses(task); + expect(result.split(' ').indexOf('completed')).to.not.eql(-1); + }); + + it('is uncompleted'); // this requires stubbing the internal dependency shouldDo in taskClasses + }); + + describe('a habit', () => { + it('that is wide', () => { + task = { type: 'habit', up: true, down: true }; + result = taskClasses(task); + expect(result.split(' ').indexOf('habit-wide')).to.not.eql(-1); + }); + it('that is narrow', () => { + task = { type: 'habit' }; + result = taskClasses(task); + expect(result.split(' ').indexOf('habit-narrow')).to.not.eql(-1); + }); + }); + + describe('varies based on priority', () => { + it('trivial', () => { + task.priority = 0.1; + result = taskClasses(task); + expect(result.split(' ').indexOf('difficulty-trivial')).to.not.eql(-1); + }); + it('hard', () => { + task.priority = 2; + result = taskClasses(task); + expect(result.split(' ').indexOf('difficulty-hard')).to.not.eql(-1); + }); + }); + + describe('varies based on value', () => { + it('color-worst', () => { + task.value = -30; + result = taskClasses(task); + expect(result.split(' ').indexOf('color-worst')).to.not.eql(-1); + }); + it('color-neutral', () => { + task.value = 0; + result = taskClasses(task); + expect(result.split(' ').indexOf('color-neutral')).to.not.eql(-1); + }); + }); +});