public static void getSemanticPropsSingleFromString(
            SingleInputSemanticProperties result,
            String[] forwarded,
            String[] nonForwarded,
            String[] readSet,
            TypeInformation<?> inType,
            TypeInformation<?> outType) {
        getSemanticPropsSingleFromString(
                result, forwarded, nonForwarded, readSet, inType, outType, false);
    }
@Test
    void testForwardedPojo() {

        String[] forwardedFields = {"int1->int2; int3->int1; string1 "};
        SingleInputSemanticProperties sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, pojoType, pojoType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(0);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(3);

        forwardedFields[0] = "f1->int1; f0->int3 ";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, threeIntTupleType, pojoType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(0);

        forwardedFields[0] = "int1->f2; int2->f0; int3->f1";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, pojoType, threeIntTupleType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(0);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(1);

        forwardedFields[0] = "*->pojo1.*";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, pojoType, nestedPojoType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(3);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(4);

        forwardedFields[0] = "*->pojo1";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, pojoType, nestedPojoType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(3);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(4);

        forwardedFields[0] = "int1; string1; int2->pojo1.int3";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, pojoType, nestedPojoType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(0);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(3);
        assertThat(sp.getForwardingTargetFields(0, 2)).isEmpty();
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(5);

        forwardedFields[0] = "pojo1.*->f2.*; int1->f1";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, nestedPojoType, pojoInTupleType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(3);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(4);
        assertThat(sp.getForwardingTargetFields(0, 4)).contains(5);

        forwardedFields[0] = "f2.*->*";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, pojoInTupleType, pojoType);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(0);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 4)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 5)).contains(3);

        forwardedFields[0] = "pojo1->f2; int1->f1";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, nestedPojoType, pojoInTupleType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(3);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(4);
        assertThat(sp.getForwardingTargetFields(0, 4)).contains(5);

        forwardedFields[0] = "f2->*";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, pojoInTupleType, pojoType);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(0);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 4)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 5)).contains(3);

        forwardedFields[0] = "int2; string1";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, pojoType, pojoType);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(3);
        assertThat(sp.getForwardingTargetFields(0, 0)).isEmpty();
        assertThat(sp.getForwardingTargetFields(0, 2)).isEmpty();

        forwardedFields[0] = "pojo1.int1; string1";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, nestedPojoType, nestedPojoType);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 5)).contains(5);
        assertThat(sp.getForwardingTargetFields(0, 0)).isEmpty();
        assertThat(sp.getForwardingTargetFields(0, 2)).isEmpty();
        assertThat(sp.getForwardingTargetFields(0, 3)).isEmpty();
        assertThat(sp.getForwardingTargetFields(0, 4)).isEmpty();

        forwardedFields[0] = "pojo1.*; int1";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, nestedPojoType, nestedPojoType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(0);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(3);
        assertThat(sp.getForwardingTargetFields(0, 4)).contains(4);
        assertThat(sp.getForwardingTargetFields(0, 5)).isEmpty();

        forwardedFields[0] = "pojo1; int1";
        sp = new SingleInputSemanticProperties();
        SemanticPropUtil.getSemanticPropsSingleFromString(
                sp, forwardedFields, null, null, nestedPojoType, nestedPojoType);
        assertThat(sp.getForwardingTargetFields(0, 0)).contains(0);
        assertThat(sp.getForwardingTargetFields(0, 1)).contains(1);
        assertThat(sp.getForwardingTargetFields(0, 2)).contains(2);
        assertThat(sp.getForwardingTargetFields(0, 3)).contains(3);
        assertThat(sp.getForwardingTargetFields(0, 4)).contains(4);
        assertThat(sp.getForwardingTargetFields(0, 5)).isEmpty();
    }