@Test
public void testForwardedNestedTuples() {

	String[] forwardedFields = { "f0->f0.f0; f1->f0.f1; f2->f0.f2" };
	SingleInputSemanticProperties sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, threeIntTupleType, nestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 0).contains(0));
	assertTrue(sp.getForwardingTargetFields(0, 1).contains(1));
	assertTrue(sp.getForwardingTargetFields(0, 2).contains(2));
	forwardedFields[0] = "f0.f0->f1.f0.f2; f0.f1->f2; f2->f1.f2; f1->f0";
	sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, nestedTupleType, deepNestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 0).contains(3));
	assertTrue(sp.getForwardingTargetFields(0, 1).contains(6));
	assertTrue(sp.getForwardingTargetFields(0, 4).contains(5));
	assertTrue(sp.getForwardingTargetFields(0, 3).contains(0));
	forwardedFields[0] = "0.0->1.0.2; 0.1->2; 2->1.2; 1->0";
	sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, nestedTupleType, deepNestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 0).contains(3));
	assertTrue(sp.getForwardingTargetFields(0, 1).contains(6));
	assertTrue(sp.getForwardingTargetFields(0, 4).contains(5));
	assertTrue(sp.getForwardingTargetFields(0, 3).contains(0));
	forwardedFields[0] = "f1.f0.*->f0.*; f0->f2";
	sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, deepNestedTupleType, nestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 1).contains(0));
	assertTrue(sp.getForwardingTargetFields(0, 2).contains(1));
	assertTrue(sp.getForwardingTargetFields(0, 3).contains(2));
	assertTrue(sp.getForwardingTargetFields(0, 0).contains(4));
	forwardedFields[0] = "1.0.*->0.*; 0->2";
	sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, deepNestedTupleType, nestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 1).contains(0));
	assertTrue(sp.getForwardingTargetFields(0, 2).contains(1));
	assertTrue(sp.getForwardingTargetFields(0, 3).contains(2));
	assertTrue(sp.getForwardingTargetFields(0, 0).contains(4));
	forwardedFields[0] = "f1.f0->f0; f0->f2";
	sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, deepNestedTupleType, nestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 1).contains(0));
	assertTrue(sp.getForwardingTargetFields(0, 2).contains(1));
	assertTrue(sp.getForwardingTargetFields(0, 3).contains(2));
	assertTrue(sp.getForwardingTargetFields(0, 0).contains(4));
	forwardedFields[0] = "1.0->0; 0->2";
	sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, deepNestedTupleType, nestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 1).contains(0));
	assertTrue(sp.getForwardingTargetFields(0, 2).contains(1));
	assertTrue(sp.getForwardingTargetFields(0, 3).contains(2));
	assertTrue(sp.getForwardingTargetFields(0, 0).contains(4));
	forwardedFields[0] = "f1.f0.f1; f1.f1; f2";
	sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, deepNestedTupleType, deepNestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 2).contains(2));
	assertTrue(sp.getForwardingTargetFields(0, 4).contains(4));
	assertTrue(sp.getForwardingTargetFields(0, 6).contains(6));
	assertTrue(sp.getForwardingTargetFields(0, 0).size() == 0);
	assertTrue(sp.getForwardingTargetFields(0, 1).size() == 0);
	assertTrue(sp.getForwardingTargetFields(0, 3).size() == 0);
	assertTrue(sp.getForwardingTargetFields(0, 5).size() == 0);
	forwardedFields[0] = "f1.f0.*; f1.f2";
	sp = new SingleInputSemanticProperties();
	SemanticPropUtil.getSemanticPropsSingleFromString(sp, forwardedFields, null, null, deepNestedTupleType, deepNestedTupleType);
	assertTrue(sp.getForwardingTargetFields(0, 1).contains(1));
	assertTrue(sp.getForwardingTargetFields(0, 2).contains(2));
	assertTrue(sp.getForwardingTargetFields(0, 3).contains(3));
	assertTrue(sp.getForwardingTargetFields(0, 5).contains(5));
	assertTrue(sp.getForwardingTargetFields(0, 0).size() == 0);
	assertTrue(sp.getForwardingTargetFields(0, 4).size() == 0);
	assertTrue(sp.getForwardingTargetFields(0, 6).size() == 0);
}