TEST_F(ContributionLadder_Ingen_CONTEXT_KI_OSV_25_50, Bidragsstigningsform_Ingen_PrivateTaxedMK_Gage_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(kTAEReguleringskode, "Gage");
	ta.setValue(kDoedReguleringskode, "Gage");
	ta.setValue(kPrivate_Taxed_MK, true);
	ta.setValue(kPrivate_Taxed_Reguleringskode, "Gage");
	ta.setValue(kPrivate_Taxed_SA_Administrated_MK, true);
	ta.setValue(kPrivate_Premium_pct, 3);
	ta.setValue(kPrivate_Premium_BL, 40000);

	auto r = re.validate(ta, false);
	EXPECT_FALSE(r.isAllOk());
	EXPECT_TRUE(r.hasMessages(kPrivate_Premium_pct, kValueUnderLimit));
	EXPECT_TRUE(r.hasMessages(kPrivate_Premium_BL, kProductElementNotAllowed));
	cout << r;

	ta.setValue(kPrivate_Premium_pct, 5);
	ta.remove(kPrivate_Premium_BL);
	r = re.validate(ta, true);
	EXPECT_FALSE(r.hasMessages(kPrivate_Premium_pct, kValueUnderLimit));
	EXPECT_FALSE(r.hasMessages(kPrivate_Premium_BL, kProductElementNotAllowed));
	cout << r;
}
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_F(Incremental_TA_CONTEXT_KI_OSV_25_50, Incremental_TA_POSITIVE) {
	RuleEngine::_printDebugAtValidation = true;
	TA ta { "15124040"}; // KonceptOid 4 - OSV
//	ta.setValue(kUnionAgreementRelationship, kOUTSIDE);

	bool full {false};
	auto r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk())
		cout << r;

	//************************************************************
	// GENERAL PAGE
	//************************************************************
	//

	//
	// ***** Date
	//
	// need to calculate Ikraftdato minus rc_Ikraftdato_min number of months and see if todays date is before that.
	// same with rc_Ikraftdato_max
	ta.setValue(kIkraftDato, (long) 11);
//	r = re.validate(ta, full);
//	EXPECT_FALSE(r.isAllOk());
//	if (r.isAllOk()) cout << r;
//	ASSERT_EQ(1, r.getValidationResults(kIkraftDato).size());
//	EXPECT_EQ(sbx::ValidationCode::kProductElementRequired, r.getValidationResults(kIkraftDato).at(0).getValidationCode());


	//
	// ***** Indmeldelseskriterier, age, anciennitet
	//
	ta.setValue(kIndmeldelsesAlder, (long) 5);
	r = re.validate(ta, full);
	EXPECT_FALSE(r.isAllOk());
	if (!r.isAllOk()) cout << r;
	ASSERT_EQ(1, r.getValidationResults(kIndmeldelsesAlder).size());
	EXPECT_EQ(sbx::ValidationCode::kValueUnderLimit, r.getValidationResults(kIndmeldelsesAlder).at(0).getValidationCode());

	ta.setValue(kIndmeldelsesAlder, (long) 31);
	r = re.validate(ta, full);

	EXPECT_FALSE(r.isAllOk());
	if (r.isAllOk()) cout << r;
	ASSERT_EQ(1, r.getValidationResults(kIndmeldelsesAlder).size());
	EXPECT_EQ(sbx::ValidationCode::kValueOverLimit, r.getValidationResults(kIndmeldelsesAlder).at(0).getValidationCode());

	ta.setValue(kIndmeldelsesAlder, (long) 20);
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;


	ta.setValue(kAnciennitet, (long) 30);
	r = re.validate(ta, full);
	ASSERT_EQ(1, r.getValidationResults(kAnciennitet).size());
	EXPECT_EQ(sbx::ValidationCode::kValueOverLimit, r.getValidationResults(kAnciennitet).at(0).getValidationCode());
	ta.setValue(kAnciennitet, (long) 12);
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;


	ta.setValue(kAnciennitetTidlArbejdsplads, true);
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;

	//
	// ***** Fravalg grupper
	//
	ta.setValue(kGrpElever, true);
	ta.setValue(kGrpLaerlinge, true);
	ta.setValue(kGrpStuderende, true);
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;


	//
	//************************************************************
	// PRODUKT PAGE
	//************************************************************
	//
	//
	// ****** Udlobsalder
	//
	ta.setValue(kUdlobsalder_Pension, (long) 67);
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk())
		cout << r;


	//
	// ******* Fravalg af risikodaekning
	//
	ta.setValue(kFravalgRisiko_MK, true);
	r = re.validate(ta, full);
	cout << r;

	EXPECT_FALSE(r.isAllOk());
	EXPECT_EQ(1, r.getValidationResults(kFravalgRisikoAlder).size());
	EXPECT_EQ(1, r.getValidationResults(kFravalgRisiko_MK).size());
	EXPECT_EQ(sbx::ValidationCode::kProductElementRequired, r.getValidationResults(kFravalgRisikoAlder).at(0).getValidationCode());
	EXPECT_EQ(sbx::ValidationCode::kValueNotAllowed, r.getValidationResults(kFravalgRisiko_MK).at(0).getValidationCode());
	ta.setValue(kFravalgRisikoAlder, (long) 45);

	// now age is set, so all should be ok
	r = re.validate(ta, full);
	EXPECT_FALSE(r.isAllOk());
	cout << r;
	EXPECT_EQ(1, r.getValidationResults(kFravalgRisiko_MK).size());
	EXPECT_EQ(sbx::ValidationCode::kValueNotAllowed, r.getValidationResults(kFravalgRisiko_MK).at(0).getValidationCode());

	ta.setValue(kFravalgRisiko_MK, false);
	ta.remove(kFravalgRisikoAlder);
	r = re.validate(ta, full);
	cout << r;
	EXPECT_TRUE(r.isAllOk());

	//
	// ****** Opsparingsprodukter
	//
	ta.setValue(kStandardProduct, "Traditionel_MK");
	ta.setValue(kTraditionel_MK, false);
	//    expecting to fail as the standardprodukt hasn't been set on the ta
	r = re.validate(ta, full);
	EXPECT_FALSE(r.isAllOk());
	if (r.isAllOk()) cout << r;

	ta.setValue(kTraditionel_MK, true);
	ta.setValue(kLink_MK, true);
	ta.setValue(kMarkedspension_MK, true);
	ta.setValue(kTidspensionMedGaranti_MK, true);
	ta.setValue(kTidspensionUdenGaranti_MK, true);

	//    now savings products has been set, so everything should be fine
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;

	ta.setValue(kUdbetalingsform, re.getDefaultValue(kUdbetalingsform)->stringValue());
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;

	ta.setValue(kUdbetalingsperiode, re.getDefaultValue(kUdbetalingsperiode)->longValue());
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;

	ta.setValue(kMaxAndelLinkBidragPCT, (double) 5.5);
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;

	ta.setValue(kMaxAndelMarkedspensionBidragPct, (double) 6.1);
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;

	ta.setValue(kLinkKunForEgetBidrag_MK, true);
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	if (!r.isAllOk()) cout << r;

	//
	// Invaliditetsdaekning
	//
//	ta.setValue(kInvalidesum);



	//
	//************************************************************
	// SALARY PAGE
	//************************************************************
	//
	//
	// ***** Lon og betaling
	//
	ta.setValue(kLoenDefinition, "garbage");
	r = re.validate(ta, full);
	EXPECT_FALSE(r.isAllOk());
	if (r.isAllOk()) cout << r;
	ASSERT_EQ(1, r.getValidationResults(kLoenDefinition).size());
	EXPECT_EQ(sbx::ValidationCode::kValueNotAllowed, r.getValidationResults(kLoenDefinition).at(0).getValidationCode());
	ta.setValue(kLoenDefinition, re.getDefaultValue(kLoenDefinition)->stringValue());

	ta.setValue(kLoenRegulering, "garbage");
	r = re.validate(ta, full);
	EXPECT_FALSE(r.isAllOk());
	if (r.isAllOk()) cout << r;
	ASSERT_EQ(1, r.getValidationResults(kLoenRegulering).size());
	EXPECT_EQ(sbx::ValidationCode::kValueNotAllowed, r.getValidationResults(kLoenRegulering).at(0).getValidationCode());
	ta.setValue(kLoenRegulering, "januar");

	ta.setValue(kLoenreguleringsfrekvens, "garbage");
	r = re.validate(ta, full);
	EXPECT_FALSE(r.isAllOk());
	if (r.isAllOk()) cout << r;
	ASSERT_EQ(1, r.getValidationResults(kLoenreguleringsfrekvens).size());
	EXPECT_EQ(sbx::ValidationCode::kValueNotAllowed, r.getValidationResults(kLoenreguleringsfrekvens).at(0).getValidationCode());
	ta.setValue(kLoenreguleringsfrekvens, re.getDefaultValue(kLoenreguleringsfrekvens)->stringValue());

	ta.setValue(kBidragsstigningsform, "garbage");
	r = re.validate(ta, full);
	EXPECT_FALSE(r.isAllOk());
	if (r.isAllOk()) cout << r;
	ASSERT_EQ(1, r.getValidationResults(kBidragsstigningsform).size());
	EXPECT_EQ(sbx::ValidationCode::kValueNotAllowed, r.getValidationResults(kBidragsstigningsform).at(0).getValidationCode());
	ta.setValue(kBidragsstigningsform, "Ingen");
	ta.addContributionStep({0, 2, 2});

	ta.setValue(kPrivate_Taxed_MK, true); // set privately taxed but no value for premium
	ta.setValue(kPrivate_Taxed_Reguleringskode, "Pristal");
	ta.setValue(kTAEReguleringskode, "Pristal");
	ta.setValue(kTAEBlGrMin, 100000);
	ta.setValue(kTAEBlOblMax, 200000);
	ta.setValue(kDoedReguleringskode, "Pristal");
	ta.setValue(kDoedBlGrMin, 400000);
	ta.setValue(kDoedBlOblMax, 600000);
	r = re.validate(ta, full); // ...and expect to fail
	EXPECT_FALSE(r.isAllOk());
	if (r.isAllOk()) cout << r;
	EXPECT_TRUE(r.hasMessages(kPrivate_Premium_BL, kProductElementRequired));
	EXPECT_TRUE(r.hasMessages(kPrivate_Taxed_SA_Administrated_MK, kProductElementRequired));

	ta.setValue(kPrivate_Taxed_SA_Administrated_MK, true);
	ta.setValue(kPrivate_Premium_BL, (double) 150234.5); // set a premium ...
	ta.setValue(kHospitalsdaekning_MK, false);
	r = re.validate(ta, full); // ... and expect not to fail
	EXPECT_TRUE(r.isAllOk());
	cout << r;

	ta.setValue(kBidragEjFoesteTrin_MK, false); // set the
	r = re.validate(ta, full);
	EXPECT_TRUE(r.isAllOk());
	cout << r;

}