@jeremyckahn/farmhand
Version:
A farming game
270 lines (244 loc) • 7.41 kB
JavaScript
import { testState } from '../../test-utils/index.js'
import { LOAN_PAYOFF } from '../../templates.js'
import { carrot, carrotSeed } from '../../data/crops/index.js'
import { bronzeOre, coal, milk1, saltRock } from '../../data/items.js'
import { carrotSoup } from '../../data/recipes.js'
import { sellItem } from './sellItem.js'
describe('sellItem', () => {
test('sells item', () => {
const state = sellItem(
testState({
inventory: [{ id: carrot.id, quantity: 1 }],
itemsSold: {},
loanBalance: 0,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
valueAdjustments: { [carrotSeed.id]: 1 },
}),
carrot
)
expect(state.inventory).toEqual([])
expect(state.money).toEqual(125)
expect(state.revenue).toEqual(25)
expect(state.todaysRevenue).toEqual(25)
expect(state.itemsSold).toEqual({ carrot: 1 })
})
test('does not change revenue for seed sales', () => {
const state = sellItem(
testState({
inventory: [{ id: carrotSeed.id, quantity: 1 }],
itemsSold: {},
loanBalance: 0,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
valueAdjustments: { [carrotSeed.id]: 1 },
}),
carrotSeed
)
expect(state.inventory).toEqual([])
expect(state.money).toEqual(107.5)
expect(state.revenue).toEqual(0)
expect(state.todaysRevenue).toEqual(0)
expect(state.itemsSold).toEqual({ [carrotSeed.id]: 1 })
})
test('applies achievement bonus to farm products', () => {
const state = sellItem(
testState({
inventory: [{ id: carrot.id, quantity: 1 }],
itemsSold: {},
loanBalance: 0,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
valueAdjustments: { [carrot.id]: 1 },
completedAchievements: {
'i-am-rich-3': true,
},
}),
carrot
)
expect(state.inventory).toEqual([])
expect(state.money).toEqual(131.25)
expect(state.revenue).toEqual(31.25)
expect(state.todaysRevenue).toEqual(31.25)
expect(state.itemsSold).toEqual({ [carrot.id]: 1 })
})
test('does not apply achievement bonus to seeds', () => {
const state = sellItem(
testState({
inventory: [{ id: carrotSeed.id, quantity: 1 }],
itemsSold: {},
loanBalance: 0,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
valueAdjustments: { [carrotSeed.id]: 1 },
completedAchievements: {
'i-am-rich-3': true,
},
}),
carrotSeed
)
expect(state.inventory).toEqual([])
expect(state.money).toEqual(107.5)
expect(state.revenue).toEqual(0)
expect(state.todaysRevenue).toEqual(0)
expect(state.itemsSold).toEqual({ [carrotSeed.id]: 1 })
})
test('updates learnedRecipes', () => {
const { learnedRecipes } = sellItem(
testState({
inventory: [{ id: carrot.id, quantity: 2 }],
itemsSold: {},
loanBalance: 0,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
valueAdjustments: { [carrot.id]: 1 },
}),
carrot,
15
)
expect(learnedRecipes[carrotSoup.id]).toBeTruthy()
})
describe('there is an outstanding loan', () => {
let state
describe('item is not a farm product', () => {
beforeEach(() => {
state = sellItem(
testState({
experience: 0,
inventory: [{ id: carrotSeed.id, quantity: 3 }],
itemsSold: {},
loanBalance: 100,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
valueAdjustments: { [carrotSeed.id]: 1 },
}),
carrotSeed,
3
)
})
test('sale is not garnished', () => {
expect(state.loanBalance).toEqual(100)
expect(state.money).toEqual(122.5)
expect(state.revenue).toEqual(0)
expect(state.todaysRevenue).toEqual(0)
})
test('experience is not gained', () => {
expect(state.experience).toEqual(0)
})
})
describe('item is a farm product', () => {
describe('loan is greater than garnishment', () => {
test('sale is garnished', () => {
state = sellItem(
testState({
inventory: [{ id: carrot.id, quantity: 3 }],
itemsSold: {},
loanBalance: 100,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
valueAdjustments: { [carrot.id]: 1 },
}),
carrot,
3
)
expect(state.loanBalance).toEqual(96.25)
expect(state.money).toEqual(171.25)
expect(state.revenue).toEqual(71.25)
expect(state.todaysRevenue).toEqual(71.25)
})
})
describe('loan is less than garnishment', () => {
beforeEach(() => {
state = sellItem(
testState({
experience: 0,
inventory: [{ id: carrot.id, quantity: 3 }],
itemsSold: {},
loanBalance: 1.5,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
valueAdjustments: { [carrot.id]: 1 },
}),
carrot,
3
)
})
test('loan is payed off', () => {
expect(state.loanBalance).toEqual(0)
})
test('sale is reduced based on remaining loan balance', () => {
expect(state.money).toEqual(173.5)
expect(state.todaysRevenue).toEqual(73.5)
})
test('payoff notification is shown', () => {
expect(state.todaysNotifications).toEqual([
// @ts-expect-error
{ message: LOAN_PAYOFF``, severity: 'success' },
])
})
test('experience is gained', () => {
expect(state.experience).toEqual(3)
})
})
})
})
const experienceTestArgs = [
carrot,
milk1,
coal,
carrotSoup,
bronzeOre,
saltRock,
].map(item => [item.type, item])
test.each(experienceTestArgs)(
'selling item of type %s gives experience',
(_, item) => {
// Cast item to ensure TypeScript recognizes it as an item object
const itemObj = item
const state = sellItem(
testState({
experience: 0,
// @ts-expect-error
inventory: [{ id: itemObj.id, quantity: 1 }],
itemsSold: {},
loanBalance: 0,
money: 100,
pendingPeerMessages: [],
todaysNotifications: [],
revenue: 0,
todaysRevenue: 0,
// @ts-expect-error
valueAdjustments: { [itemObj.id]: 1 },
}),
// @ts-expect-error
itemObj,
1
)
expect(state.experience).toEqual(1)
}
)
})