f01d492d95
With this commit two calculation errors are fixed * the score in the case partyPosition = 'negative' while userPosition = 'neutral' shouldn't be MIN_POINTS but rather BASE_POINTS. * the totalScoredPoints (now "totalMaxPoints") should be independent of any party-positions which it wasn't. To minimize errors in this area in the future tests are added which are based on the official Rechenmodel of the bpb. To that end the score calculation logic was refactored and moved from results.vue to scoring.js, too. (cherry picked from commit 2d246fefbc4730ca5f7a4224325084a98f1c41f0)
110 lines
3.7 KiB
JavaScript
110 lines
3.7 KiB
JavaScript
import { evalPointsPerThesisPerParty, getPartiesWithScores, getTotalMaxPoints } from '@/app/euromat/scoring'
|
|
|
|
const positionDef = ['positive', 'neutral', 'negative', 'skipped']
|
|
// See offficial Rechenmodell of bpb from 2019
|
|
const rechenmodellGrid = [
|
|
[0, 0, 0, 0, 0, false],
|
|
[0, 0, 2, 0, 1, false],
|
|
[0, 2, 2, 0, 0, false],
|
|
[0, 0, 0, 0, 2, false],
|
|
[1, 1, 0, 2, 2, true],
|
|
[0, 0, 2, 0, 0, false],
|
|
[0, 2, 2, 1, 0, false],
|
|
[0, 0, 0, 2, 2, false],
|
|
[2, 0, 2, 2, 1, false],
|
|
[1, 2, 2, 2, 1, false],
|
|
[2, 2, 0, 0, 2, false],
|
|
[0, 2, 2, 2, 2, false],
|
|
[0, 2, 0, 0, 3, false],
|
|
[0, 2, 1, 2, 2, false],
|
|
[2, 0, 0, 1, 2, false],
|
|
[2, 0, 0, 0, 2, true],
|
|
[2, 0, 0, 2, 3, false],
|
|
[0, 0, 0, 0, 2, false],
|
|
[2, 0, 0, 0, 1, false],
|
|
[2, 0, 0, 0, 1, false],
|
|
[0, 0, 2, 2, 2, true],
|
|
[2, 2, 1, 2, 2, false],
|
|
[2, 2, 0, 2, 2, false],
|
|
[2, 2, 2, 0, 2, false],
|
|
[0, 2, 0, 2, 1, false],
|
|
[1, 2, 2, 0, 0, false],
|
|
[2, 0, 2, 0, 0, false],
|
|
[2, 0, 0, 2, 2, false],
|
|
[0, 2, 0, 2, 1, false],
|
|
[1, 2, 0, 2, 2, false],
|
|
[0, 1, 2, 0, 0, false],
|
|
[1, 2, 2, 0, 1, false],
|
|
[2, 0, 2, 2, 1, false],
|
|
[0, 2, 2, 2, 2, false],
|
|
[0, 2, 0, 0, 0, false],
|
|
[0, 2, 0, 0, 1, false],
|
|
[2, 2, 2, 2, 0, false],
|
|
[2, 0, 0, 2, 0, false]
|
|
]
|
|
|
|
const rechenmodellExpectedTotalScorePerParty = [44, 37, 28, 50]
|
|
const rechenmodellExpectedMaxScore = 78
|
|
|
|
const testParties = [1, 2, 3, 4].map(partyId => ({
|
|
id: partyId,
|
|
token: 'idontcare',
|
|
positions: rechenmodellGrid.map((thesis, index) => ({
|
|
thesis: index,
|
|
position: positionDef[thesis[partyId - 1]]
|
|
}))
|
|
}))
|
|
|
|
const testAnswers = rechenmodellGrid.map((thesis, index) => ({
|
|
position: positionDef[thesis[4]],
|
|
thesis: index
|
|
}))
|
|
|
|
const testEmphasis = rechenmodellGrid
|
|
.map((thesis, index) => ({
|
|
...thesis,
|
|
thesis: index
|
|
}))
|
|
.filter((thesis, index) => thesis[5])
|
|
.map(thesis => ({ thesis: thesis.thesis }))
|
|
|
|
describe('The getPartiesWithScores function', () => {
|
|
it('returns the correct total scores according to the Rechenmodell example of bpb', () => {
|
|
const resultPartiesWithScores = getPartiesWithScores(testAnswers, testEmphasis, testParties)
|
|
|
|
expect(resultPartiesWithScores.map(party => party.score)).toEqual(rechenmodellExpectedTotalScorePerParty)
|
|
})
|
|
})
|
|
|
|
describe('The getTotalMaxPoints function', () => {
|
|
it('returns the correct maximum score points according to the Rechenmodell example of bpb', () => {
|
|
const resultTotalMaxPoints = getTotalMaxPoints(testAnswers, testEmphasis)
|
|
|
|
expect(resultTotalMaxPoints).toEqual(rechenmodellExpectedMaxScore)
|
|
})
|
|
})
|
|
|
|
describe('The evalPointsPerThesisPerParty fucntion', () => {
|
|
test.each`
|
|
partyPosition | userPosition | expectedScore | expectedScoreWithEmphasis
|
|
${'negative'} | ${'negative'} | ${2} | ${4}
|
|
${'negative'} | ${'neutral'} | ${1} | ${2}
|
|
${'negative'} | ${'positive'} | ${0} | ${0}
|
|
${'neutral'} | ${'negative'} | ${1} | ${2}
|
|
${'neutral'} | ${'neutral'} | ${2} | ${4}
|
|
${'neutral'} | ${'positive'} | ${1} | ${2}
|
|
${'positive'} | ${'negative'} | ${0} | ${0}
|
|
${'positive'} | ${'neutral'} | ${1} | ${2}
|
|
${'positive'} | ${'positive'} | ${2} | ${4}
|
|
${'positive'} | ${'skipped'} | ${0} | ${0}
|
|
`('returns the correct score (according to the Rechenmodell of the bpb' +
|
|
' if the party position is $partyPosition and the user\'s position is $userPosition',
|
|
({ partyPosition, userPosition, expectedScore, expectedScoreWithEmphasis }) => {
|
|
const resultScore = evalPointsPerThesisPerParty(partyPosition, userPosition, false)
|
|
const resultScoreWithEmphasis = evalPointsPerThesisPerParty(partyPosition, userPosition, true)
|
|
|
|
expect(resultScore).toEqual(expectedScore)
|
|
expect(resultScoreWithEmphasis).toEqual(expectedScoreWithEmphasis)
|
|
})
|
|
})
|