public void rewardPenalize(boolean constraintMatchEnabled) {
HardMediumSoftLongScoreHolder scoreHolder = new HardMediumSoftLongScoreHolder(constraintMatchEnabled);
Rule hard1 = mockRule("hard1");
scoreHolder.configureConstraintWeight(hard1, HardMediumSoftLongScore.ofHard(10L));
Rule hard2 = mockRule("hard2");
scoreHolder.configureConstraintWeight(hard2, HardMediumSoftLongScore.ofHard(100L));
Rule medium1 = mockRule("medium1");
scoreHolder.configureConstraintWeight(medium1, HardMediumSoftLongScore.ofMedium(10L));
Rule soft1 = mockRule("soft1");
scoreHolder.configureConstraintWeight(soft1, HardMediumSoftLongScore.ofSoft(10L));
Rule soft2 = mockRule("soft2");
scoreHolder.configureConstraintWeight(soft2, HardMediumSoftLongScore.ofSoft(100L));
scoreHolder.penalize(mockRuleContext(hard1));
assertEquals(HardMediumSoftLongScore.of(-10L, 0L, 0L), scoreHolder.extractScore(0));
scoreHolder.penalize(mockRuleContext(hard2), 2L);
assertEquals(HardMediumSoftLongScore.of(-210L, 0L, 0L), scoreHolder.extractScore(0));
scoreHolder.penalize(mockRuleContext(medium1), 9L);
assertEquals(HardMediumSoftLongScore.of(-210L, -90L, 0L), scoreHolder.extractScore(0));
scoreHolder.reward(mockRuleContext(soft1));
assertEquals(HardMediumSoftLongScore.of(-210L, -90L, 10L), scoreHolder.extractScore(0));
scoreHolder.reward(mockRuleContext(soft2), 3L);
assertEquals(HardMediumSoftLongScore.of(-210L, -90L, 310L), scoreHolder.extractScore(0));
}