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));

}
示例#2
0
arma_hot
inline
eT
op_dot::dot_and_copy_row(eT* out, const TA& A, const uword row, const eT* B_mem, const uword N)
{
    eT acc1 = eT(0);
    eT acc2 = eT(0);

    uword i,j;
    for(i=0, j=1; j < N; i+=2, j+=2)
    {
        const eT val_i = A.at(row, i);
        const eT val_j = A.at(row, j);

        out[i] = val_i;
        out[j] = val_j;

        acc1 += val_i * B_mem[i];
        acc2 += val_j * B_mem[j];
    }

    if(i < N)
    {
        const eT val_i = A.at(row, i);

        out[i] = val_i;

        acc1 += val_i * B_mem[i];
    }

    return acc1 + acc2;
}
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(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());
}
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());
}
示例#6
0
 static bool intersects(TA const & a, B const & b)
 {
   if (a.hasTransform())
     return IntersectionTester::intersects<N, T>(Transformer::transform<N, T>(a.getObject(), a.getTransform()), b);
   else
     return IntersectionTester::intersects<N, T>(a.getObject(), b);
 }
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(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;
}
示例#9
0
 explicit kernel_matrix(const expansion_type& e,
                        const TA& targets,
                        const SA& sources)
     : e_(e),
       targets_(targets.begin(), targets.end()),
       sources_(sources.begin(), sources.end()),
       plan(nullptr) {
 }
示例#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
}
示例#11
0
void VIXTrader::run(void) throw(TraderException)
{
    TA ta;
    _invested_days = days(0);
    
    Series::EODSeries::const_iterator vix_iter(_vix_db.begin());
    advance(vix_iter, 100); // Skip first 100 bars to give enough room too BBANDS calculation
    for( ; vix_iter != _vix_db.end(); ++vix_iter ) {
        
        try {
            
            // Calculate current invested days
            if( ! _miPositions.open().empty() )
                _invested_days = _invested_days + days(1);
            
            // Calculate VIX BBANDS
            TA::BBRes resBBANDS3 = ta.BBANDS(_vix_db.close(vix_iter, 100), 100, 3, 3);
            TA::BBRes resBBANDS1 = ta.BBANDS(_vix_db.close(vix_iter, 100), 100, 1, 1);
            
            // Check buy signal
            if( _miPositions.open().empty() && vix_iter->second.close > resBBANDS3.upper_band[0] ) {
                // Buy tomorrow's close
                Series::EODSeries::const_iterator iter_entry = _spx_db.after(vix_iter->first);
                if( iter_entry == _spx_db.end() ) {
                    cerr << "Can't open position after " << vix_iter->first << endl;
                    continue;
                }
                
                buy(_spx_db.name(), iter_entry->first, Price(iter_entry->second.open));
            }
            
            // Check sell signal
            if( ! _miPositions.open().empty() && vix_iter->second.close < resBBANDS1.upper_band[0] ) {
                // Get next bar
                Series::EODSeries::const_iterator iter_exit = _spx_db.after(vix_iter->first);
                if( iter_exit == _spx_db.end() ) {
                    cerr << "Can't close position after " << vix_iter->first << endl;
                    continue;
                }
                
                // Close all open positions at tomorrow's close
                PositionSet ps = _miPositions.open();
                for( PositionSet::const_iterator pos_iter = ps.begin(); pos_iter != ps.end(); ++pos_iter ) {
                    PositionPtr pPos = (*pos_iter);
                    close(pPos->id(), iter_exit->first, Price(iter_exit->second.open));
                } // end of all open positions
            }
            
        } catch( std::exception& e ) {
            
            cerr << e.what() << endl;
            continue;
        }
        
    } // for each bar
}
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 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 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_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 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_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));
}
示例#19
0
arma_hot
inline
void
op_strans::apply_noalias(Mat<eT>& out, const TA& A)
  {
  arma_extra_debug_sigprint();
  
  const uword A_n_cols = A.n_cols;
  const uword A_n_rows = A.n_rows;
  
  out.set_size(A_n_cols, A_n_rows);
  
  if( (TA::is_row) || (TA::is_col) || (A_n_cols == 1) || (A_n_rows == 1) )
    {
    arrayops::copy( out.memptr(), A.memptr(), A.n_elem );
    }
  else
    {
    if( (A_n_rows <= 4) && (A_n_rows == A_n_cols) )
      {
      op_strans::apply_noalias_tinysq(out, A);
      }
    else
      {
      for(uword k=0; k < A_n_cols; ++k)
        {
        uword i, j;
        
        const eT* colptr = A.colptr(k);
        
        for(i=0, j=1; j < A_n_rows; i+=2, j+=2)
          {
          const eT tmp_i = colptr[i];
          const eT tmp_j = colptr[j];
          
          out.at(k, i) = tmp_i;
          out.at(k, j) = tmp_j;
          }
        
        if(i < A_n_rows)
          {
          out.at(k, i) = colptr[i];
          }
        }
      }
    }
  }
示例#20
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(ContributionLadder_Anciennitet_CONTEXT_KI_OSV_25_50, Bidragsstigningsform_Anciennitet_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( {18,2.5, 5} );
}
// 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 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(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);
}
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));
}
/**
 * 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_1_Step_Inkl_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, 2} ); // == 4 which is below BidragInklHispdaekningPctMin == 5
	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.1.1", r.getValidationResults(kBidragstrappe).at(0).getRuleId());

	ta.removeContributionStep( {0, 2, 2} ); // remove and set new step that equals to 5
	ta.addContributionStep( {0, 2, 3} );
	r = re.validate(ta, false);
	EXPECT_TRUE(r.isAllOk());
	cout << r;
}
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_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;
}