tests: all the simple scoring test, getting ready for the complex cron

stuff.
This commit is contained in:
Tyler Renelle 2013-05-25 15:03:03 +01:00
parent 6e4f1a40f8
commit f5b7968132
2 changed files with 90 additions and 62 deletions

View file

@ -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)

View file

@ -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