#include "../bdm/stat/exp_family.h"
#include "mat_checks.h"
#include "UnitTest++.h"

using namespace bdm;

TEST ( test_datalink ) {
	// RV names are global, and a, b and c are already taken by a
	// different test...
	RV a = RV ( "{dla }", "2" );
	RV b = RV ( "{dlb }" );
	RV c = RV ( "{dlc }" );

	RV ab = a;
	ab.add ( b );

	RV abc = ab;
	abc.add ( c );

	datalink dl ( ab, abc );
	vec total ( "0 37 42 66" );
	vec filtered = dl.pushdown ( total );
	int exp_f[] = { 0, 37, 42 };
	int exp_sz = sizeof ( exp_f ) / sizeof ( exp_f[0] );
	CHECK_EQUAL ( exp_sz, filtered.size() );
	for ( int i = 0; i < exp_sz; ++i ) {
		CHECK_EQUAL ( exp_f[i], filtered ( i ) );
	}

	datalink unnamed;
	unnamed.set_connection ( 1, 2, ivec ( "0" ) );
	filtered = unnamed.pushdown ( vec ( "37 42" ) );
	CHECK_EQUAL ( vec ( "37" ), filtered );
}

TEST ( test_datalink_m2e ) {
	RV a = RV ( "{dla }", "2" );
	RV b = RV ( "{dlb }" );
	RV c = RV ( "{dlc }" );

	RV ab = a;
	ab.add ( b );

	RV ba = a;
	ba.add ( b );

	RV abc = ab;
	abc.add ( c );

	datalink_m2e dl;
	dl.set_connection ( ba, c, abc );
	vec total ( "0 37 42 66" );
	vec cond = dl.get_cond ( total );
	CHECK_EQUAL ( 1, cond.size() );
	CHECK_EQUAL ( 66, cond ( 0 ) );

	vec big ( 4 );
	dl.pushup_cond ( big, vec ( "2 3 5" ), vec ( "7" ) );
	CHECK_EQUAL ( vec ( "2 3 5 7" ), big );
}

TEST ( test_datalink_m2m ) {
	RV a = RV ( "{dla }", "2" );
	RV b = RV ( "{dlb }" );
	RV c = RV ( "{dlc }" );

	datalink_m2m dl;
	dl.set_connection ( a, concat ( b, c ), concat ( a, b ), c );

	vec val ( "1 1.5 2" );
	vec cond ( "3" );

	vec p = dl.pushdown ( val );
	double exp_p[] = { 1.0, 1.5 };
	int exp_sz = sizeof ( exp_p ) / sizeof ( exp_p[0] );
	CHECK_EQUAL ( exp_sz, p.size() );
	for ( int i = 0; i < exp_sz; ++i ) {
		CHECK_EQUAL ( exp_p[i], p ( i ) );
	}

	vec dlcond = dl.get_cond ( val, cond );
	int exp_c[] = { 2, 3 };
	exp_sz = sizeof ( exp_c ) / sizeof ( exp_c[0] );
	CHECK_EQUAL ( exp_sz, dlcond.size() );
	for ( int i = 0; i < exp_sz; ++i ) {
		CHECK_EQUAL ( exp_c[i], dlcond ( i ) );
	}
}

TEST ( test_datalink_buffered ) {
	RV a = RV ( "{dl_a }" );
	RV b = RV ( "{dlb }" );
	RV ab=concat(a,b);
	RV aa = a;
	a.t_plus(-1);
	aa.add(a); 

	
	datalink_buffered dl;
	dl.set_connection ( concat(aa,b), ab);

	vec val_up ( "1 2" );
	dl.step(val_up);
	val_up="3 4";
	
	
	vec p = dl.pushdown ( val_up );
	vec exp_p = " 3, 1, 4 ";
	CHECK_EQUAL ( exp_p, p );

}
