@Test
  public void testConstantWildCard() {
    // no spaces
    {
      String[] constantFields = {"*"};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple3<Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(constantFields, null, null, type, type);

      FieldSet fs = sp.getForwardedField(1);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(1));

      fs = sp.getForwardedField(2);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(2));

      fs = sp.getForwardedField(0);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(0));
    }

    //		// with spaces
    //		{
    //			String[] constantFields = { "   *   " };
    //
    //			TypeInformation<?> type = new TupleTypeInfo<Tuple3<Integer, Integer,
    // Integer>>(BasicTypeInfo.INT_TYPE_INFO,
    //					BasicTypeInfo.INT_TYPE_INFO, BasicTypeInfo.INT_TYPE_INFO);
    //			SingleInputSemanticProperties sp =
    // SemanticPropUtil.getSemanticPropsSingleFromString(constantFields, null, null, type, type);
    //
    //			FieldSet fs = sp.getForwardedField(1);
    //			Assert.assertTrue(fs.size() == 1);
    //			Assert.assertTrue(fs.contains(1));
    //
    //			fs = sp.getForwardedField(2);
    //			Assert.assertTrue(fs.size() == 1);
    //			Assert.assertTrue(fs.contains(2));
    //
    //			fs = sp.getForwardedField(0);
    //			Assert.assertTrue(fs.size() == 1);
    //			Assert.assertTrue(fs.contains(0));
    //		}
  }
  @Test
  public void testConstantExceptOneString() {
    // no spaces
    {
      String[] constantFieldsExcept = {"1"};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple3<Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(
              null, constantFieldsExcept, null, type, type);

      FieldSet fs = sp.getForwardedField(0);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(0));

      Assert.assertNull(sp.getForwardedField(1));

      fs = sp.getForwardedField(2);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(2));
    }

    // with spaces
    {
      String[] constantFieldsExcept = {" 1  "};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple3<Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(
              null, constantFieldsExcept, null, type, type);

      FieldSet fs = sp.getForwardedField(0);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(0));

      Assert.assertNull(sp.getForwardedField(1));

      fs = sp.getForwardedField(2);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(2));
    }
  }
  @Test
  public void testConstantWithArrowIndividualStringsSpaces() {
    String[] constantFields = {"  1-> 1 , 2", "2 ->3"};

    TypeInformation<?> type =
        new TupleTypeInfo<Tuple4<Integer, Integer, Integer, Integer>>(
            BasicTypeInfo.INT_TYPE_INFO,
            BasicTypeInfo.INT_TYPE_INFO,
            BasicTypeInfo.INT_TYPE_INFO,
            BasicTypeInfo.INT_TYPE_INFO);
    SingleInputSemanticProperties sp =
        SemanticPropUtil.getSemanticPropsSingleFromString(constantFields, null, null, type, type);

    FieldSet fs = sp.getForwardedField(1);
    Assert.assertTrue(fs.size() == 2);
    Assert.assertTrue(fs.contains(1));
    Assert.assertTrue(fs.contains(2));

    fs = sp.getForwardedField(2);
    Assert.assertTrue(fs.size() == 1);
    Assert.assertTrue(fs.contains(3));
  }
  @Test
  public void testReadFieldsOneString() {
    // no spaces
    {
      String[] readFields = {"1,2"};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple3<Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(null, null, readFields, type, type);

      FieldSet fs = sp.getReadFields();
      Assert.assertTrue(fs.size() == 2);
      Assert.assertTrue(fs.contains(2));
      Assert.assertTrue(fs.contains(1));
    }

    // with spaces
    {
      String[] readFields = {"  1  , 2   "};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple3<Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(null, null, readFields, type, type);

      FieldSet fs = sp.getReadFields();
      Assert.assertTrue(fs.size() == 2);
      Assert.assertTrue(fs.contains(2));
      Assert.assertTrue(fs.contains(1));
    }
  }
  @Test
  public void testConstantWithArrowOneString() {
    // narrow (no spaces)
    {
      String[] constantFields = {"0->0,1;1->2"};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple3<Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(constantFields, null, null, type, type);

      FieldSet fs = sp.getForwardedField(0);
      Assert.assertTrue(fs.size() == 2);
      Assert.assertTrue(fs.contains(0));
      Assert.assertTrue(fs.contains(1));

      fs = sp.getForwardedField(1);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(2));
    }

    // wide (with spaces)
    {
      String[] constantFields = {"  0 ->  0  ,  1  ;   1  -> 2 "};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple3<Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(constantFields, null, null, type, type);

      FieldSet fs = sp.getForwardedField(0);
      Assert.assertTrue(fs.size() == 2);
      Assert.assertTrue(fs.contains(0));
      Assert.assertTrue(fs.contains(1));

      fs = sp.getForwardedField(1);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(2));
    }
  }
  @Test
  public void testConstantMixedOneString() {
    // no spaces
    {
      String[] constantFields = {"2,3;0->1,4;4->0"};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple5<Integer, Integer, Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(constantFields, null, null, type, type);

      FieldSet fs = sp.getForwardedField(0);
      Assert.assertTrue(fs.size() == 2);
      Assert.assertTrue(fs.contains(1));
      Assert.assertTrue(fs.contains(4));

      fs = sp.getForwardedField(2);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(2));

      fs = sp.getForwardedField(3);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(3));

      fs = sp.getForwardedField(4);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(0));
    }

    // with spaces
    {
      String[] constantFields = {" 2  ,  3   ;  0 -> 1  , 4 ; 4 ->  0"};

      TypeInformation<?> type =
          new TupleTypeInfo<Tuple5<Integer, Integer, Integer, Integer, Integer>>(
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO,
              BasicTypeInfo.INT_TYPE_INFO);
      SingleInputSemanticProperties sp =
          SemanticPropUtil.getSemanticPropsSingleFromString(constantFields, null, null, type, type);

      FieldSet fs = sp.getForwardedField(0);
      Assert.assertTrue(fs.size() == 2);
      Assert.assertTrue(fs.contains(1));
      Assert.assertTrue(fs.contains(4));

      fs = sp.getForwardedField(2);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(2));

      fs = sp.getForwardedField(3);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(3));

      fs = sp.getForwardedField(4);
      Assert.assertTrue(fs.size() == 1);
      Assert.assertTrue(fs.contains(0));
    }
  }