mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-07-31 19:20:25 +00:00
tests: all the simple scoring test, getting ready for the complex cron
stuff.
This commit is contained in:
parent
6e4f1a40f8
commit
f5b7968132
2 changed files with 90 additions and 62 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in a new issue