TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_Kortvarig_Overbygning_Obligatorisk) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kKortTAE_Daekning, "Obligatorisk");

	auto r = re.validate(ta, false);
//	if (!r.isAllOk())
		cout << r;
	EXPECT_FALSE(r.isAllOk()); // should be missing both KortTAE_Min_obl_faktor and KortTAE_Daekningsperiode
	EXPECT_EQ(2, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kKortTAE_Min_obl_faktor, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kKortTAE_Daekningsperiode, kProductElementRequired));

	ta.setValue(kKortTAE_Min_obl_faktor, "2");
	r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kKortTAE_Daekningsperiode, kProductElementRequired));

	ta.setValue(kKortTAE_Daekningsperiode, "6");
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());

	ta.setValue(kKortTAE_Min_obl_faktor, "4");
	re.printConstantsInParser();
	r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kKortTAE_Min_obl_faktor, kValueNotAllowed));

}
TEST_F(Behandlingsforsikring_KI_OSV_25_49, Behandlingsforsikring_POSITIVE) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040"}; // KonceptOid 4 - OSV
	ta.setValue(kHospitalsdaekning_MK, false);

	auto r = re.validate(ta, {kHospitalsdaekning_MK, kHospitalsdaekningFrivillig_MK, kHospitalsdaekningLeverandoer});
	EXPECT_TRUE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;

	ta.setValue(kHospitalsdaekning_MK, true);
	r = re.validate(ta, false);//{kHospitalsdaekning_MK, kHospitalsdaekningFrivillig_MK, kHospitalsdaekningLeverandoer});
	EXPECT_FALSE(r.isAllOk());
	//	if (!r.isAllOk())
		cout << r;
	EXPECT_EQ(2, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kHospitalsdaekningFrivillig_MK, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kHospitalsdaekningLeverandoer, kProductElementRequired));

	ta.setValue(kHospitalsdaekningFrivillig_MK, true);
	r = re.validate(ta, false); //{kHospitalsdaekning_MK, kHospitalsdaekningFrivillig_MK, kHospitalsdaekningLeverandoer});
	EXPECT_FALSE(r.isAllOk());
	//	if (!r.isAllOk())
		cout << r;
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kHospitalsdaekningLeverandoer, kProductElementRequired));

	ta.setValue(kHospitalsdaekningLeverandoer, re.getDefaultValue(kHospitalsdaekningLeverandoer)->stringValue());
	r = re.validate(ta, false); //{kHospitalsdaekning_MK, kHospitalsdaekningFrivillig_MK, kHospitalsdaekningLeverandoer});
	EXPECT_TRUE(r.isAllOk());
	//	if (!r.isAllOk())
		cout << r;
}
// Test kIndmeldelsesalder and getting options prior to that
TEST_F(ContributionLadder_Ingen_CONTEXT_KI_OSV_25_50, Bidragsstigningsform_Ingen_No_Hospitalsdaekning)
{
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040"}; // KonceptOid 4 - OSV
	ta.setValue(kPrivate_Taxed_MK, false);
	ta.setValue(kBidragsstigningsform, "Ingen");
//	ta.setValue(kUnionAgreementRelationship, kOUTSIDE);
	ta.setValue(kHospitalsdaekning_MK, false);

	// expecting complains about missing step
	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (r.isAllOk())
	cout << r;
	EXPECT_EQ(1, r.getValidationResults(kBidragstrappe).size());
	EXPECT_TRUE(r.hasMessages(kBidragstrappe, kProductElementRequired));

	r = re.validate(ta, (unsigned short) kBidragsstigningsform);
	EXPECT_TRUE(r.isAllOk());
//	if (r.isAllOk())
	cout << r;

	r = re.validate(ta, { kBidragsstigningsform, kBidragstrappe });
	EXPECT_TRUE(r.isAllOk());
//	if (r.isAllOk())
	cout << r;
	EXPECT_EQ(2, r.getWarnings(kBidragstrappe).size());
	EXPECT_TRUE(r.hasWarnings(kBidragstrappe, kProductElementRequired));

	//  now add one step, but let it start from 3 (!=0), and it should fail
	ta.addContributionStep( { 3, 3.4, 5.3 });
	r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (r.isAllOk())
	cout << r;
	EXPECT_TRUE(r.hasMessages(kBidragstrappe, kValueNotAllowed));

	//  now remove that step, and add one that starts from 0 and no complains
	ta.removeContributionStep( { 3, 0, 0 });
	ta.addContributionStep( { 0, 3.4, 5.3 });
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
//	if (!r.isAllOk())
	cout << r;

	//  then add one more and it should complain again, that only 1 step is allowed, when "Ingen" is selected in Bidragsstigningsform
	ta.addContributionStep( { 1, 4, 6 });
	r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (r.isAllOk())
	cout << r;
	EXPECT_TRUE(r.hasMessages(kBidragstrappe, kValueNotAllowed));

	//  now remove the last step (index!=0), and everything should be fine again
	ta.removeContributionStep( { 1, 0, 0 });
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
//	if (!r.isAllOk())
	cout << r;
}
TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_I_PCT_Gage) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAEReguleringskode, "Gage");

	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;
	EXPECT_EQ(4, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEPctGrMin, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kTAEPctOblMax, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kTAEBlGrMin, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kTAESpaendPct, kProductElementRequired));

	ta.setValue(kTAEPctGrMin, 40);
	ta.setValue(kTAEPctOblMax, 50); // now set pct and it should be only complain about missing amount
	r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk()); //
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEBlGrMin, kProductElementRequired));

	ta.setValue(kTAEBlGrMin, 500000); // now set the min amount and execpt it to be ok
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk()); // expect to find TAEBlGrMin
}
TEST_F(ContributionLadder_Anciennitet_CONTEXT_KI_OSV_25_50, Bidragsstigningsform_Anciennitet_3_Steps_Inkl_POSITIVE) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040"}; // KonceptOid 4 - OSV
//	ta.setValue(kUnionAgreementRelationship, kOUTSIDE);
	ta.setValue(kPrivate_Taxed_MK, false);
	ta.setValue(kBidragsstigningsform, "Anciennitet" );
	ta.setValue(kHospitalsdaekning_MK, true);
	ta.setValue(kHospitalsdaekningLeverandoer, "Codan");
	ta.setValue(kHospitalsdaekningFrivillig_MK, false);

	ta.addContributionStep( {0, 2.6, 3} );
	auto r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
	cout << r;

	ta.addContributionStep( {2, 3, 4} );
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
	cout << r;

	ta.addContributionStep( {5, 4, 3.2} );
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
	cout << r;
}
TEST_F(ContributionLadder_Anciennitet_CONTEXT_KI_OSV_25_50, Bidragsstigningsform_Anciennitet_1_Step_POSITIVE) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040"}; // KonceptOid 4 - OSV
//	ta.setValue(kUnionAgreementRelationship, kOUTSIDE);
	ta.setValue(kPrivate_Taxed_MK, false);
	ta.setValue(kBidragsstigningsform, "Anciennitet" );
	ta.setValue(kHospitalsdaekning_MK, false);


	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (r.isAllOk())
		cout << r;
	EXPECT_EQ(1, r.getValidationResults(kBidragstrappe).size());
	EXPECT_TRUE(r.hasMessages(kBidragstrappe, kProductElementRequired));

	ta.addContributionStep( {0, 1, 1} );
	r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (r.isAllOk())
		cout << r;
	EXPECT_EQ(1, r.getValidationResults(kBidragstrappe).size());
	EXPECT_TRUE(r.hasMessages(kBidragstrappe, kValueUnderLimit));

	ta.removeContributionStep( {0, 1, 1} );
	ta.addContributionStep( {0, 3, 3} );
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
//	if (r.isAllOk())
		cout << r;
}
TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_TAEUdloebsalder_POSITIVE) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAE_Udlobsforskellig_MK, false);

	auto r = re.validate(ta, false);
//	if (!r.isAllOk())
		cout << r;
	EXPECT_TRUE(r.isAllOk()); // should be missing both KortTAE_Min_obl_faktor and KortTAE_Daekningsperiode

	ta.setValue(kTAE_Udlobsforskellig_MK, true);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAE_Udlobsalder, kProductElementRequired));

	ta.setValue(kTAE_Udlobsalder, 46);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAE_Udlobsalder, kValueNotAllowed));

	ta.setValue(kTAE_Udlobsalder, 65);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());
}
TEST_F(UnionAgreementParsing, UAIncluded_MaxAndelLinkBidragPCT) {
	KonceptInfo ki {OSV, 50, 0,
	        	{ {11, "true"}, // Parameter-Basis
	        	  {1, "true"}, // Solidarisk faellestarif
				  {15, "true"}, // FG span
				  {6, "true"} // SEB Firmapensionspulje
	        	} };
	re.initContext(ki, INCLUDED, 4);
	RuleEngine::_printDebug = true;
	RuleEngine::_printDebugAtValidation = true;

	re.getContainer().printKoncepts();
	re.getContainer().printSubkonceptConstants(18);
	re.getContainer().printUnionAgreementConstants(4);

	TA ta {"20247940"};
	ta.setValue(kMaxAndelLinkBidragPCT, 35);
	ta.setValue(kAftaleIkraftdato, 20150701);
	ta.setValue(kBidragEjFoesteTrin_MK, false);

	auto r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_TRUE(r.hasMessages(kMaxAndelLinkBidragPCT, kValueOverLimit));

	ta.setValue(kMaxAndelLinkBidragPCT, 30);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());
}
TEST_F(UnionAgreementParsing, UAIncluded_Udbetalingsperiode) {
	KonceptInfo ki {PROSA, 5, 0,
	        	{ {11, "true"}, // Parameter-Basis
	        	  {1, "true"}, // Solidarisk faellestarif
				  {15, "true"}, // FG span
				  {6, "true"} // SEB Firmapensionspulje
	        	} };
	re.initContext(ki, OUTSIDE);
	RuleEngine::_printDebug = true;
	RuleEngine::_printDebugAtValidation = true;

	re.getContainer().printConstantsFromContext(kUdbetalingsperiode);

	TA ta {"20247940"};
	ta.setValue(kUdbetalingsperiode, 13);
	ta.setValue(kAftaleIkraftdato, 20150701);
	ta.setValue(kBidragEjFoesteTrin_MK, false);

	auto r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());

	re.initContext(ki, INCLUDED, 6);

	r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_TRUE(r.hasMessages(kUdbetalingsperiode, kValueNotAllowed));

	ta.setValue(kUdbetalingsperiode, 25);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());
}
示例#10
0
TEST_F(TAE_RFY_KI_OSV_25_49, InsuranceCondition_2) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kInsuranceConditionVersion, "2");
	ta.setValue(kTAE_RFY, re.getDefaultValue(kTAE_RFY)->stringValue());

	auto r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk()); // Ingen is allowed for insurance condition version 1
}
TEST_F(Invaliditetsdaekning_ITPension_50, Invaliditetsdaekning_TAEBlGrMin_NotRequired) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAEReguleringskode, "Gage");
	ta.setValue(kTAEPctGrMin, 40);
	ta.setValue(kTAEPctOblMax, 50);

	cout << "is taeblgrmin allowed : " << boolalpha << re.isProductElementAllowed(kTAEBlGrMin) << endl;
	auto r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.hasMessages(kTAEBlGrMin));

	r = re.validate(ta, true);
	cout << r;
	EXPECT_FALSE(r.hasMessages(kTAEBlGrMin));
}
示例#12
0
TEST_F(TAE_RFY_KI_OSV_25_49, InsuranceCondition_1) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kInsuranceConditionVersion, "1");
	ta.setValue(kTAE_RFY, re.getDefaultValue(kTAE_RFY)->stringValue());

	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
	cout << r;

	r.hasMessages(kTAE_RFY, ValidationCode::kValueNotAllowed);

	ta.setValue(kTAE_RFY, "Ingen");
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk()); // Ingen is allowed for insurance condition version 1
	cout << r;
}
TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_TAEBlGrMin_OverLimit) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAEReguleringskode, "Pristal");
	ta.setValue(kTAEBlGrMin, 800001);
	ta.setValue(kTAEBlOblMax, 800001);

	auto r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_TRUE(r.hasMessages(kTAEBlGrMin, kValueOverLimit));
	EXPECT_TRUE(r.hasMessages(kTAEBlOblMax, kValueOverLimit));

	ta.setValue(kTAEBlGrMin, 800000);
	ta.setValue(kTAEBlOblMax, 800000);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());

	ta.setValue(kTAEBlGrMin, 799999);
	ta.setValue(kTAEBlOblMax, 799999);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());
}
TEST_F(Invaliditetsdaekning_ITPension_50, Invaliditetsdaekning_TAEPctGrMin_OverLimit) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAEReguleringskode, "Gage");
	ta.setValue(kTAEPctGrMin, 61);
	ta.setValue(kTAEPctOblMax, 61);

	auto r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_TRUE(r.hasMessages(kTAEPctGrMin, kValueOverLimit));
	EXPECT_TRUE(r.hasMessages(kTAEPctOblMax, kValueOverLimit));

	ta.setValue(kTAEPctGrMin, 60);
	ta.setValue(kTAEPctOblMax, 60);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());

	ta.setValue(kTAEPctGrMin, 59);
	ta.setValue(kTAEPctOblMax, 59);
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());
}
// Test missing value on TA, DoedBlOblMax
// Allowed values:
// Expected:
//    Warnings should contain a warning say that the product element being validated is missing on the TA
TEST_F(Doedsfaldsdaekning_I_Procent_KI_OSV_25_49, DoedBlGrMin_ValidateNonExistingToken_NOT_OK) {
	TA ta { "15124040" };
	ta.setValue(kDoedReguleringskode, "Pristal");

	// set MIN value, DoedBlGrMin
	ta.setValue(kDoedBlGrMin, (long) 100000);
	RuleEngine::_printDebugAtValidation = true;

	// ... but validate MAX, DoedBlOblMax
	auto r = re.validate(ta, (unsigned short) kDoedBlOblMax);

	EXPECT_TRUE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;

	ASSERT_EQ(1, r.getWarnings(kDoedBlOblMax).size());
	EXPECT_EQ(sbx::ValidationCode::kProductElementRequired, r.getWarnings(kDoedBlOblMax).at(0).getValidationCode());
}
TEST_F(ContributionLadder_Ingen_CONTEXT_KI_OSV_25_50, PrivateTaxedMK_TAETilfirmaMK_NEGATIVE)
{
    RuleEngine::_printDebugAtValidation = true;
    TA ta { "15124040"}; // KonceptOid 4 - OSV
    ta.setValue(kAftaleIkraftdato, 20150701);
    ta.setValue(kPrivate_Taxed_MK, true);
    ta.setValue(kTAETilfirma_MK, true);
    
    auto r = re.validate(ta, false);
    cout << r;
    EXPECT_FALSE(r.isAllOk());
    EXPECT_TRUE(r.hasMessages(kTAETilfirma_MK, kValueNotAllowed));
    
    ta.setValue(kTAETilfirma_MK, false);
    r = re.validate(ta, false);
    cout << r;
    EXPECT_FALSE(r.hasMessages(kPrivate_Taxed_MK, kValueNotAllowed));
    EXPECT_FALSE(r.hasMessages(kTAETilfirma_MK, kValueNotAllowed));
}
TEST_F(Doedsfaldsdaekning_I_Procent_KI_OSV_25_49, DoedSpaendPct) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kDoedReguleringskode, "Gage");

	ta.setValue(kDoedBlGrMin, (long) 100000);
	ta.setValue(kDoedPctGrMin, (long) 200);
	ta.setValue(kDoedPctOblMax, (long) 600);

	auto r = re.validate(ta, true);

	EXPECT_FALSE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;

	EXPECT_TRUE(r.hasMessages(kDoedSpaendPct, kValueOverLimit));

//	re.getContainer().printConstants(17);
}
/**
 * Short description:
 *   Testing the DodReguleringstype = Gage
 *
 * Product Elements being tested:
 *   DoedReguleringskode = Gage
 *   DoedPctGrMin, DoedPctOblMax, DoedSpaendPct
 *   DoedBlGrMin
 *
 * Expected results:
 *   isAllOk() == true, i.e. no validation messages
 *
 * Expected warnings:
 *  no warnings expected
 *
 */
TEST_F(Doedsfaldsdaekning_I_Procent_KI_OSV_25_49, DoedReguleringstype_GAGE_POSITIVE) {
	TA ta { "15124040" };
	ta.setValue(kDoedReguleringskode, "Gage");
	ta.setValue(kDoedPctGrMin, (long) 200);
	ta.setValue(kDoedPctOblMax, (long) 300);
	ta.setValue(kDoedBlGrMin, (long) 200000);

	RuleEngine::_printDebugAtValidation = true;

	auto r = re.validate(ta,
			{
			kDoedReguleringskode,
			kDoedPctGrMin,
			kDoedPctOblMax,
			kDoedSpaendPct,
			kDoedBlGrMin
	});

	cout << r;
	EXPECT_TRUE(r.isAllOk());
}
TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_I_Kr_Pristal) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAEReguleringskode, "Pristal");

	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;
	EXPECT_EQ(3, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEBlGrMin, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kTAEBlOblMax, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kTAESpaendBl, kProductElementRequired));

	ta.setValue(kTAEBlGrMin, 100000);
	ta.setValue(kTAEBlOblMax, 200000); // now set amounts and it should be happy
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk()); //

}
TEST_F(ContributionLadder_Anciennitet_CONTEXT_KI_OSV_25_50, Bidragsstigningsform_Anciennitet_Over100_NEGATIVE) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040"}; // KonceptOid 4 - OSV
//	ta.setValue(kUnionAgreementRelationship, kOUTSIDE);
	ta.setValue(kPrivate_Taxed_MK, false);
	ta.setValue(kBidragsstigningsform, "Anciennitet" );
	ta.setValue(kHospitalsdaekning_MK, true);
	ta.setValue(kHospitalsdaekningLeverandoer, "Codan");
	ta.setValue(kHospitalsdaekningFrivillig_MK, false);

	ta.addContributionStep( {0, 2, 3} );
	auto r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
	cout << r;

	ta.addContributionStep( {2, 99, 2} ); // add a step where the total is not increasing 1+1 < 2+3
	r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
	cout << r;
	EXPECT_TRUE(r.hasMessages(kBidragstrappe, kValueOverLimit));
}
TEST_F(ContributionLadder_Anciennitet_CONTEXT_KI_OSV_25_50, Bidragsstigningsform_Anciennitet_1_Step_Ekskl_NEGATIVE) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040"}; // KonceptOid 4 - OSV
//	ta.setValue(kUnionAgreementRelationship, kOUTSIDE);
	ta.setValue(kPrivate_Taxed_MK, false);
	ta.setValue(kBidragsstigningsform, "Anciennitet" );
	ta.setValue(kHospitalsdaekning_MK, false);

	ta.addContributionStep( {0, 2, 1} ); // == 3 which is below BidragEksklHispdaekningPctMin == 3
	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
	cout << r;
	EXPECT_EQ(1, r.getValidationResults(kBidragstrappe).size());
	EXPECT_TRUE(r.hasMessages(kBidragstrappe, kValueUnderLimit));
	EXPECT_EQ("33.1.2.1", r.getValidationResults(kBidragstrappe).at(0).getRuleId());

	ta.removeContributionStep( {0, 2, 1} ); // remove and set new step that equals to 6
	ta.addContributionStep( {0, 2, 4} );
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
	cout << r;
}
TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_I_PCT_Ingen_NEGATIVE_Partial) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAEReguleringskode, "Ingen");
	ta.setValue(kTAEBlGrMin, -1); // 20 is min
	ta.setValue(kTAEBlOblMax, 800001); // 80 is max

	auto r = re.validate(ta, false);
//	if (!r.isAllOk())
		cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_EQ(3, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEBlGrMin, kValueUnderLimit));
	EXPECT_TRUE(r.hasMessages(kTAEBlOblMax, kValueOverLimit));
	EXPECT_TRUE(r.hasMessages(kTAESpaendBl, kValueOverLimit));

	ta.setValue(kTAEBlGrMin, 600000);
	ta.setValue(kTAEBlOblMax, 700000); // now set allowed amount and it should be happy
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk()); //
}
TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_SoliMax_TAEDaekningstype) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAESoliMax, "Tegningsmaks");

	auto r = re.validate(ta, false);
//	if (!r.isAllOk())
		cout << r;
	EXPECT_TRUE(r.isAllOk()); //

	ta.setValue(kTAESoliMax, "Obligatorisk maks");
	r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk());
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEDaekningstype, kProductElementRequired));

	ta.setValue(kTAEDaekningstype, re.getDefaultValue(kTAEDaekningstype)->stringValue());
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk());

	ta.setValue(kTAESoliMax, "Tegningsmaks");
	r = re.validate(ta, false);
	cout << r;
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEDaekningstype, kProductElementNotAllowed));

	r = re.validate(ta, false);
	cout << r;

	ta.remove(kTAEDaekningstype);
	ta.setValue(kTAESoliMax, "Ingen");
	r = re.validate(ta, false);
	cout << r;
	EXPECT_EQ(1, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEDaekningstype, kProductElementRequired));
}
// Test DoedBlGrMin
// Allowed values: [0 - 5,000,000]
// Expected result:
//   Validation of value for DoedBlGrMin should be ok
//   But a warning should be set that says the DoedReguleringskode is not set in the parser
TEST_F(Doedsfaldsdaekning_I_Procent_KI_OSV_25_49, DoedBlGrMin_Single_Value_OK_With_Warning2) {
	TA ta { "15124040" };
	ta.setValue(kDoedBlGrMin, (long) 100000);
	RuleEngine::_printDebugAtValidation = true;

	auto r = re.validate(ta, {kDoedBlGrMin, kDoedReguleringskode});
	EXPECT_TRUE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;

	auto v = r.getWarnings(kDoedReguleringskode);

	EXPECT_EQ(kTokenNotDefined, v.at(0).getValidationCode());
}
// Test DoedBlGrMin
// Allowed values: [0 - 5,000,000]
// Expected result:
//   Validation of value should be ok
//   But a warning should be set that says the DoedReguleringskode is not set in the parser
TEST_F(Doedsfaldsdaekning_I_Procent_KI_OSV_25_49, DoedBlGrMin_Single_Value_OK_With_Warning) {
	TA ta { "15124040" };
	ta.setValue(kDoedBlGrMin, (long) 100000);
	RuleEngine::_printDebugAtValidation = true;

	auto r = re.validate(ta, (unsigned short) kDoedBlGrMin);
	EXPECT_TRUE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;

	// expecting 2 warnings, because the kDoedReguleringskode has two rules, and its missing in both expressions
	//   and if both cases it should be kTokenNotDefined
//	EXPECT_EQ(1, r.getWarnings().size());
//	EXPECT_TRUE(r.hasWarnings(kDoedReguleringskode, kTokenNotDefined));
}
TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_I_Kr_Ingen_NEGATIVE) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAEReguleringskode, "Ingen");

	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;
	EXPECT_EQ(3, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEBlGrMin, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kTAEBlOblMax, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kTAESpaendBl, kProductElementRequired));

	ta.setValue(kTAEBlGrMin, 200000); // the span is too big, so should complain
	ta.setValue(kTAEBlOblMax, 900000); // now set max amounts to more than allowed
	r = re.validate(ta, false);
	cout << r;
	EXPECT_FALSE(r.isAllOk()); //

	EXPECT_EQ(2, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEBlOblMax, kValueOverLimit));
	EXPECT_TRUE(r.hasMessages(kTAESpaendBl, kValueOverLimit));
}
// Test Gage with max amount, which should fail
// Expected:
//    No value allowed for DoedBlOblMax as DoedReguleringskode == Gage
TEST_F(Doedsfaldsdaekning_I_Procent_KI_OSV_25_49, DoedBlOblMax_Single_Value_NOT_OK) {
	TA ta { "15124040" };
	ta.setValue(kDoedReguleringskode, "Gage");
	ta.setValue(kDoedBlOblMax, (long) 700000);
	RuleEngine::_printDebugAtValidation = true;

	auto r = re.validate(ta, (unsigned short) kDoedBlOblMax);
	cout << r;
	EXPECT_FALSE(r.isAllOk());

	std::vector<sbx::ValidationResult> v = r.getValidationResults(kDoedBlOblMax);
	ASSERT_EQ(1, v.size());
	EXPECT_EQ(sbx::ValidationCode::kProductElementNotAllowed, v.at(0).getValidationCode());

	if (sbx::ValidationCode::kProductElementNotAllowed != v.at(0).getValidationCode())
		cout << r;
}
TEST_F(Doedsfaldsdaekning_I_Procent_KI_OSV_25_49, DoedBlGrMin_Ingen_NEGATIVE_Overlimit) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kDoedReguleringskode, "Gage");
	ta.setValue(kDoedBlGrMin, (long) 800001);
	ta.setValue(kDoedPctGrMin, (long) 200);
	ta.setValue(kDoedPctOblMax, (long) 300);

	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
	cout << r;
	EXPECT_TRUE(r.hasMessages(kDoedBlGrMin, kValueOverLimit));

	ta.setValue(kDoedBlGrMin, (long) 800000);
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
	cout << r;

	ta.setValue(kDoedBlGrMin, (long) 799999);
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
	cout << r;
}
TEST_F(ContributionLadder_Ingen_CONTEXT_KI_OSV_25_50, Bidragsstigningsform_Ingen_Over100_NEGATIVE)
{
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040"}; // KonceptOid 4 - OSV
	ta.setValue(kAftaleIkraftdato, 20150701);
//	ta.setValue(kUnionAgreementRelationship, kOUTSIDE);
	ta.setValue(kBidragEjFoesteTrin_MK, false);
	ta.setValue(kBidragsstigningsform, "Ingen");
	ta.setValue(kHospitalsdaekning_MK, false);
	ta.setValue(kHospitalsdaekningFrivillig_MK, false);
	ta.setValue(kPrivate_Taxed_MK, false);

	ta.addContributionStep( {0, 90, 11} );

	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
	cout << r;
	EXPECT_TRUE(r.hasMessages(kBidragstrappe, kValueOverLimit));

	ta.addContributionStep( {0, 90, 9} );
	r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
	cout << r;
}
TEST_F(Invaliditetsdaekning_KI_OSV_25_49, Invaliditetsdaekning_I_PCT_Gage_NEGATIVE_Partial) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040" };
	ta.setValue(kTAEReguleringskode, "Gage");
	ta.setValue(kTAEPctGrMin, 10); // 20 is min
	ta.setValue(kTAEPctOblMax, 90); // 80 is max

	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
//	if (!r.isAllOk())
		cout << r;
	EXPECT_EQ(4, r.getValidationResults().size());
	EXPECT_TRUE(r.hasMessages(kTAEPctGrMin, kValueUnderLimit));
	EXPECT_TRUE(r.hasMessages(kTAEPctOblMax, kValueOverLimit));
	EXPECT_TRUE(r.hasMessages(kTAESpaendPct, kValueOverLimit));
	EXPECT_TRUE(r.hasMessages(kTAEBlGrMin, kProductElementRequired));

	ta.setValue(kTAEPctGrMin, 60);
	ta.setValue(kTAEPctOblMax, 70); // now set vallowed pct and it should be happy
	ta.setValue(kTAEBlGrMin, 200000); // now set vallowed pct and it should be happy
	r = re.validate(ta, false);
	cout << r;
	EXPECT_TRUE(r.isAllOk()); //
}