From f5b7968132ed896d161e7478103ec285d5086ff7 Mon Sep 17 00:00:00 2001 From: Tyler Renelle Date: Sat, 25 May 2013 15:03:03 +0100 Subject: [PATCH] tests: all the simple scoring test, getting ready for the complex cron stuff. --- script/algos.coffee | 3 +- tests/algos.mocha.coffee | 149 +++++++++++++++++++++++---------------- 2 files changed, 90 insertions(+), 62 deletions(-) diff --git a/script/algos.coffee b/script/algos.coffee index 44824f43fc..47cf962e1c 100644 --- a/script/algos.coffee +++ b/script/algos.coffee @@ -386,8 +386,7 @@ obj.cron = (user, options={}) -> ((user.history ?= {}).todos ?= []).push { date: now, value: todoTally } # tally experience expTally = user.stats.exp - lvl = 0 - #iterator + lvl = 0 #iterator while lvl < (user.stats.lvl - 1) lvl++ expTally += obj.tnl(lvl) diff --git a/tests/algos.mocha.coffee b/tests/algos.mocha.coffee index f60122ba02..4739e2a687 100644 --- a/tests/algos.mocha.coffee +++ b/tests/algos.mocha.coffee @@ -7,21 +7,85 @@ algos = require '../script/algos' helpers = require '../script/helpers' items = require '../script/items' +### Helper Functions #### + +expectStrings = (obj, paths) -> + _.each paths, (path) -> expect(obj[path]).to.be.ok() + +beforeAfter = (options={}) -> + user = helpers.newUser() + [before, after] = [_.cloneDeep(user), _.cloneDeep(user)] + lastCron = +moment(options.now || +new Date).subtract('days', options.daysAgo) if options.daysAgo + _.each [before,after], (obj) -> + obj.lastCron = lastCron if options.daysAgo + {before:before, after:after} +#TODO calculate actual poins + +expectLostPoints = (before, after, taskType) -> + if taskType in ['daily','habit'] + expect(after.stats.hp).to.be.lessThan before.stats.hp + expect(_.size(after["#{taskType}s"][0].history)).to.be(1) + else expect(_.size(after.history.todos)).to.be(1) + expect(after.stats.exp).to.be 0 + expect(after.stats.gp).to.be 0 + expect(after["#{taskType}s"][0].value).to.be.lessThan before["#{taskType}s"][0].value + +expectGainedPoints = (before, after, taskType) -> + expect(after.stats.hp).to.be 50 + expect(after.stats.exp).to.be.greaterThan before.stats.exp + expect(after.stats.gp).to.be.greaterThan before.stats.gp + expect(after["#{taskType}s"][0].value).to.be.greaterThan before["#{taskType}s"][0].value + if taskType in ['daily','habit'] + expect(_.size(after["#{taskType}s"][0].history)).to.be(1) + # expect(after["#{taskType}s"].completed).to.be true if taskType in ['daily','todo'] + ###### Specs ###### +describe 'User', -> + it 'sets correct user defaults', -> + user = helpers.newUser() + expect(user.stats).to.eql { gp: 0, exp: 0, lvl: 1, hp: 50 } + expect(user.party).to.eql { invitation: null } + expect(user.items).to.eql { weapon: 0, armor: 0, head: 0, shield: 0 } + expect(user.preferences).to.eql { gender: 'm', skin: 'white', hair: 'blond', armorSet: 'v1', dayStart:0, showHelm: true } + expect(user.balance).to.eql 0 + expect(user.lastCron).to.eql 'new' + expect(user.flags).to.eql {partyEnabled: false, itemsEnabled: false, ads: 'show'} + expectStrings(user, ['apiToken']) + expectStrings(user.habits[0], ['text','id']) + expectStrings(user.dailys[0], ['text','id']) + expectStrings(user.todos[0], ['text','id']) + expectStrings(user.rewards[0], ['text','id']) + expectStrings(user.tags[0], ['name','id']) + expectStrings(user.tags[1], ['name','id']) + expectStrings(user.tags[2], ['name','id']) + +describe 'Simple Scoring', -> + + it 'Habits : Up', -> + {before,after} = beforeAfter() + algos.score(after, after.habits[0], 'down', {times:5}) + expectLostPoints(before,after,'habit') + + it 'Habits : Down', -> + {before,after} = beforeAfter() + algos.score(after, after.habits[0], 'up', {times:5}) + expectGainedPoints(before,after,'habit') + + it 'Dailys : Up', -> + {before,after} = beforeAfter() + algos.score(after, after.dailys[0], 'up') + expectGainedPoints(before,after,'daily') + + it 'Todos : Up', -> + {before,after} = beforeAfter() + algos.score(after, after.todos[0], 'up') + expectGainedPoints(before,after,'todo') + describe 'Cron', -> - user = undefined - beforeEach -> user = helpers.newUser() - - beforeAfter = (options={}) -> - [before, after] = [_.cloneDeep(user), _.cloneDeep(user)] - lastCron = +moment().subtract('days',options.daysAgo) if options.daysAgo - _.each [before,after], (obj) -> - obj.lastCron = lastCron if options.daysAgo - - {before:before, after:after} it 'computes shouldCron', -> + user = helpers.newUser() expect(algos.shouldCron(user)).to.be true # handlomg lastCron='new' user.lastCron = moment().subtract('days',1) expect(algos.shouldCron(user)).to.be true @@ -60,16 +124,27 @@ describe 'Cron', -> {before,after} = beforeAfter({daysAgo:1}) [before.dailys, after.dailys] = [ [before.dailys[0]], [after.dailys[0]] ] algos.cron(after) + expectLostPoints(before,after,'daily') - # todos don't effect stats - expect(after.stats.hp).to.be.within(47,49) - expect(after.stats.exp).to.be 0 - expect(after.stats.gp).to.be 0 + + it 'due yesterday, custom day not started', -> + now = moment().startOf('week') + [before.dailys, after.dailys] = [ [before.dailys[0]], [after.dailys[0]] ] + + # due yesterday, but not today + before.dailys[0].repeat = after.dailys[0].repeat = {su:0,m:1,t:1,w:1,th:1,f:1,s:1} + {before,after} = beforeAfter({now, daysAgo:1}) + + expectLostPoints(before,after,'daily') # todos don't effect stats # but they devalue expect(after.dailys[0].value).to.be.lessThan before.dailys[0].value expect(_.size(after.dailys[0].history)).to.be 1 + it 'due today, custom day not started' + it 'checked yesterday, custom day not started' + it 'checked yesterday, custom day started' + it '1 day missed, not due' it '1 day missed, not day start yet' it '3 day missed, only 1 due' @@ -86,49 +161,3 @@ describe 'Cron', -> now = moment().startOf('day').add('h', dayStart) console.log {now: now.format('MM/DD HH:00')} expect(helpers.daysBetween(yesterday, now, dayStart)).to.eql 1 - -describe 'User', -> - user = undefined - beforeEach -> user = helpers.newUser() - - expectStrings = (obj, paths) -> - _.each paths, (path) -> expect(obj[path]).to.be.ok() - - it 'sets correct user defaults', -> - expect(user.stats).to.eql { gp: 0, exp: 0, lvl: 1, hp: 50 } - expect(user.party).to.eql { invitation: null } - expect(user.items).to.eql { weapon: 0, armor: 0, head: 0, shield: 0 } - expect(user.preferences).to.eql { gender: 'm', skin: 'white', hair: 'blond', armorSet: 'v1', dayStart:0, showHelm: true } - expect(user.balance).to.eql 0 - expect(user.lastCron).to.eql 'new' - expect(user.flags).to.eql {partyEnabled: false, itemsEnabled: false, ads: 'show'} - expectStrings(user, ['apiToken']) - expectStrings(user.habits[0], ['text','id']) - expectStrings(user.dailys[0], ['text','id']) - expectStrings(user.todos[0], ['text','id']) - expectStrings(user.rewards[0], ['text','id']) - expectStrings(user.tags[0], ['name','id']) - expectStrings(user.tags[1], ['name','id']) - expectStrings(user.tags[2], ['name','id']) - - ##### Habits ##### - describe 'Tasks', -> - - describe 'Habits', -> - - #TODO test actual math - - it 'test a few scoring numbers', -> - [before, after] = [helpers.newUser(), helpers.newUser()] - algos.score(after, after.habits[0], 'down', {times:5}) - expect(after.stats.hp).to.be.lessThan before.stats.hp - expect(after.stats.exp).to.be before.stats.exp - expect(after.stats.gp).to.be before.stats.gp - expect(after.habits[0].value).to.be.lessThan before.habits[0].value - - [before, after] = [helpers.newUser(), helpers.newUser()] - algos.score(after, after.habits[0], 'up', {times:5}) - expect(after.stats.hp).to.be before.stats.hp - expect(after.stats.exp).to.be.greaterThan before.stats.exp - expect(after.stats.gp).to.be.greaterThan before.stats.gp - expect(after.habits[0].value).to.be.greaterThan before.habits[0].value \ No newline at end of file