http://git-wip-us.apache.org/repos/asf/flink/blob/21a71586/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/PojoTypeInformationTest.java
----------------------------------------------------------------------
diff --git 
a/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/PojoTypeInformationTest.java
 
b/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/PojoTypeInformationTest.java
deleted file mode 100644
index 7f5ef25..0000000
--- 
a/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/PojoTypeInformationTest.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-package org.apache.flink.api.java.type.extractor;
-
-import static org.junit.Assert.assertTrue;
-
-import org.apache.flink.api.common.typeinfo.TypeInformation;
-import org.apache.flink.api.common.typeutils.CompositeType;
-import org.apache.flink.api.java.typeutils.TypeExtractor;
-import org.junit.Test;
-
-public class PojoTypeInformationTest {
-
-       public static class SimplePojo {
-               public String str;
-               public Boolean Bl;
-               public boolean bl;
-               public Byte Bt;
-               public byte bt;
-               public Short Shrt;
-               public short shrt;
-               public Integer Intgr;
-               public int intgr;
-               public Long Lng;
-               public long lng;
-               public Float Flt;
-               public float flt;
-               public Double Dbl;
-               public double dbl;
-               public Character Ch;
-               public char ch;
-               public int[] primIntArray;
-               public Integer[] intWrapperArray;
-       }
-
-       @Test
-       public void testSimplePojoTypeExtraction() {
-               TypeInformation<SimplePojo> type = 
TypeExtractor.getForClass(SimplePojo.class);
-               assertTrue("Extracted type is not a composite/pojo type but 
should be.", type instanceof CompositeType);
-       }
-
-       public static class NestedPojoInner {
-               public String field;
-       }
-
-       public static class NestedPojoOuter {
-               public Integer intField;
-               public NestedPojoInner inner;
-       }
-
-       @Test
-       public void testNestedPojoTypeExtraction() {
-               TypeInformation<NestedPojoOuter> type = 
TypeExtractor.getForClass(NestedPojoOuter.class);
-               assertTrue("Extracted type is not a Pojo type but should be.", 
type instanceof CompositeType);
-       }
-
-       public static class Recursive1Pojo {
-               public Integer intField;
-               public Recursive2Pojo rec;
-       }
-
-       public static class Recursive2Pojo {
-               public String strField;
-               public Recursive1Pojo rec;
-       }
-
-       @Test
-       public void testRecursivePojoTypeExtraction() {
-               // This one tests whether a recursive pojo is detected using 
the set of visited
-               // types in the type extractor. The recursive field will be 
handled using the generic serializer.
-               TypeInformation<Recursive1Pojo> type = 
TypeExtractor.getForClass(Recursive1Pojo.class);
-               assertTrue("Extracted type is not a Pojo type but should be.", 
type instanceof CompositeType);
-       }
-       
-       @Test
-       public void testRecursivePojoObjectTypeExtraction() {
-               TypeInformation<Recursive1Pojo> type = 
TypeExtractor.getForObject(new Recursive1Pojo());
-               assertTrue("Extracted type is not a Pojo type but should be.", 
type instanceof CompositeType);
-       }
-       
-}

http://git-wip-us.apache.org/repos/asf/flink/blob/21a71586/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/TypeExtractorInputFormatsTest.java
----------------------------------------------------------------------
diff --git 
a/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/TypeExtractorInputFormatsTest.java
 
b/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/TypeExtractorInputFormatsTest.java
deleted file mode 100644
index bbf5148..0000000
--- 
a/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/TypeExtractorInputFormatsTest.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.flink.api.java.type.extractor;
-
-
-import static org.junit.Assert.*;
-
-import java.io.IOException;
-
-import org.apache.flink.api.common.io.DefaultInputSplitAssigner;
-import org.apache.flink.api.common.io.GenericInputFormat;
-import org.apache.flink.api.common.io.InputFormat;
-import org.apache.flink.api.common.io.statistics.BaseStatistics;
-import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
-import org.apache.flink.api.common.typeinfo.TypeInformation;
-import org.apache.flink.api.java.tuple.Tuple3;
-import org.apache.flink.api.java.typeutils.ResultTypeQueryable;
-import org.apache.flink.api.java.typeutils.TupleTypeInfo;
-import org.apache.flink.api.java.typeutils.TypeExtractor;
-import org.apache.flink.configuration.Configuration;
-import org.apache.flink.core.io.InputSplit;
-import org.junit.Test;
-
-@SuppressWarnings("serial")
-public class TypeExtractorInputFormatsTest {
-
-       @Test
-       public void testExtractInputFormatType() {
-               try {
-                       InputFormat<?, ?> format = new DummyFloatInputFormat();
-                       TypeInformation<?> typeInfo = 
TypeExtractor.getInputFormatTypes(format);
-                       assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, typeInfo);
-               }
-               catch (Exception e) {
-                       e.printStackTrace();
-                       fail(e.getMessage());
-               }
-       }
-       
-       @Test
-       public void testExtractDerivedInputFormatType() {
-               try {
-                       // simple type
-                       {
-                               InputFormat<?, ?> format = new 
DerivedInputFormat();
-                               TypeInformation<?> typeInfo = 
TypeExtractor.getInputFormatTypes(format);
-                               assertEquals(BasicTypeInfo.SHORT_TYPE_INFO, 
typeInfo);
-                       }
-                       
-                       // composite type
-                       {
-                               InputFormat<?, ?> format = new 
DerivedTupleInputFormat();
-                               TypeInformation<?> typeInfo = 
TypeExtractor.getInputFormatTypes(format);
-                               
-                               assertTrue(typeInfo.isTupleType());
-                               assertTrue(typeInfo instanceof TupleTypeInfo);
-                               
-                               @SuppressWarnings("unchecked")
-                               TupleTypeInfo<Tuple3<String, Short, Double>> 
tupleInfo = (TupleTypeInfo<Tuple3<String, Short, Double>>) typeInfo;
-                               
-                               assertEquals(3, tupleInfo.getArity());
-                               assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tupleInfo.getTypeAt(0));
-                               assertEquals(BasicTypeInfo.SHORT_TYPE_INFO, 
tupleInfo.getTypeAt(1));
-                               assertEquals(BasicTypeInfo.DOUBLE_TYPE_INFO, 
tupleInfo.getTypeAt(2));
-                       }
-               }
-               catch (Exception e) {
-                       e.printStackTrace();
-                       fail(e.getMessage());
-               }
-       }
-       
-       @Test
-       public void testMultiLevelDerivedInputFormatType() {
-               try {
-
-                       // composite type
-                       {
-                               InputFormat<?, ?> format = new 
FinalRelativeInputFormat();
-                               TypeInformation<?> typeInfo = 
TypeExtractor.getInputFormatTypes(format);
-                               
-                               assertTrue(typeInfo.isTupleType());
-                               assertTrue(typeInfo instanceof TupleTypeInfo);
-                               
-                               @SuppressWarnings("unchecked")
-                               TupleTypeInfo<Tuple3<String, Integer, Double>> 
tupleInfo = (TupleTypeInfo<Tuple3<String, Integer, Double>>) typeInfo;
-                               
-                               assertEquals(3, tupleInfo.getArity());
-                               assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tupleInfo.getTypeAt(0));
-                               assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
tupleInfo.getTypeAt(1));
-                               assertEquals(BasicTypeInfo.DOUBLE_TYPE_INFO, 
tupleInfo.getTypeAt(2));
-                       }
-               }
-               catch (Exception e) {
-                       e.printStackTrace();
-                       fail(e.getMessage());
-               }
-       }
-       
-       @Test
-       public void testQueryableFormatType() {
-               try {
-                       InputFormat<?, ?> format = new QueryableInputFormat();
-                       TypeInformation<?> typeInfo = 
TypeExtractor.getInputFormatTypes(format);
-                       assertEquals(BasicTypeInfo.DOUBLE_TYPE_INFO, typeInfo);
-               }
-               catch (Exception e) {
-                       e.printStackTrace();
-                       fail(e.getMessage());
-               }
-       }
-       
-       // 
--------------------------------------------------------------------------------------------
-       //  Test formats
-       // 
--------------------------------------------------------------------------------------------
-       
-       public static final class DummyFloatInputFormat implements 
InputFormat<Float, InputSplit> {
-
-               @Override
-               public void configure(Configuration parameters) {}
-
-               @Override
-               public BaseStatistics getStatistics(BaseStatistics 
cachedStatistics) { return null; }
-
-               @Override
-               public InputSplit[] createInputSplits(int minNumSplits) { 
return null; }
-
-               @Override
-               public DefaultInputSplitAssigner 
getInputSplitAssigner(InputSplit[] splits) { return null; }
-
-               @Override
-               public void open(InputSplit split) {}
-
-               @Override
-               public boolean reachedEnd() { return false; }
-
-               @Override
-               public Float nextRecord(Float reuse) throws IOException { 
return null; }
-
-               @Override
-               public void close() {}
-       }
-       
-       // 
--------------------------------------------------------------------------------------------
-       
-       public static final class DerivedInputFormat extends 
GenericInputFormat<Short> {
-
-               @Override
-               public boolean reachedEnd() { return false; }
-
-               @Override
-               public Short nextRecord(Short reuse) { return null; }
-       }
-       
-       // 
--------------------------------------------------------------------------------------------
-       
-       public static final class DerivedTupleInputFormat extends 
GenericInputFormat<Tuple3<String, Short, Double>> {
-
-               @Override
-               public boolean reachedEnd() { return false; }
-
-               @Override
-               public Tuple3<String, Short, Double> nextRecord(Tuple3<String, 
Short, Double> reuse) { return null; }
-       }
-       
-       // 
--------------------------------------------------------------------------------------------
-       
-       public static class RelativeInputFormat<T> extends 
GenericInputFormat<Tuple3<String, T, Double>> {
-
-               @Override
-               public boolean reachedEnd() { return false; }
-
-               @Override
-               public Tuple3<String, T, Double> nextRecord(Tuple3<String, T, 
Double> reuse) { return null; }
-       }
-       
-       // 
--------------------------------------------------------------------------------------------
-       
-       public static final class FinalRelativeInputFormat extends 
RelativeInputFormat<Integer> {
-
-               @Override
-               public Tuple3<String, Integer, Double> 
nextRecord(Tuple3<String, Integer, Double> reuse) { return null; }
-       }
-       
-       // 
--------------------------------------------------------------------------------------------
-       
-       public static final class QueryableInputFormat implements 
InputFormat<Float, InputSplit>, ResultTypeQueryable<Double> {
-
-               @Override
-               public void configure(Configuration parameters) {}
-
-               @Override
-               public BaseStatistics getStatistics(BaseStatistics 
cachedStatistics) { return null; }
-
-               @Override
-               public InputSplit[] createInputSplits(int minNumSplits) { 
return null; }
-
-               @Override
-               public DefaultInputSplitAssigner 
getInputSplitAssigner(InputSplit[] splits) { return null; }
-
-               @Override
-               public void open(InputSplit split) {}
-
-               @Override
-               public boolean reachedEnd() { return false; }
-
-               @Override
-               public Float nextRecord(Float reuse) throws IOException { 
return null; }
-
-               @Override
-               public void close() {}
-
-               @Override
-               public TypeInformation<Double> getProducedType() {
-                       return BasicTypeInfo.DOUBLE_TYPE_INFO;
-               }
-       }
-}

http://git-wip-us.apache.org/repos/asf/flink/blob/21a71586/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/TypeExtractorTest.java
----------------------------------------------------------------------
diff --git 
a/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/TypeExtractorTest.java
 
b/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/TypeExtractorTest.java
deleted file mode 100644
index 57b32b1..0000000
--- 
a/flink-java/src/test/java/org/apache/flink/api/java/type/extractor/TypeExtractorTest.java
+++ /dev/null
@@ -1,1931 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.flink.api.java.type.extractor;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.flink.api.common.functions.InvalidTypesException;
-import org.apache.flink.api.common.functions.MapFunction;
-import org.apache.flink.api.common.functions.RichCoGroupFunction;
-import org.apache.flink.api.common.functions.RichCrossFunction;
-import org.apache.flink.api.common.functions.RichFlatJoinFunction;
-import org.apache.flink.api.common.functions.RichFlatMapFunction;
-import org.apache.flink.api.common.functions.RichGroupReduceFunction;
-import org.apache.flink.api.common.functions.RichMapFunction;
-import org.apache.flink.api.common.functions.RuntimeContext;
-import org.apache.flink.api.common.typeinfo.BasicArrayTypeInfo;
-import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
-import org.apache.flink.api.common.typeinfo.PrimitiveArrayTypeInfo;
-import org.apache.flink.api.common.typeinfo.TypeInformation;
-import org.apache.flink.api.common.typeutils.CompositeType.FlatFieldDescriptor;
-import org.apache.flink.api.java.ExecutionEnvironment;
-import org.apache.flink.api.java.functions.KeySelector;
-import org.apache.flink.api.java.tuple.Tuple;
-import org.apache.flink.api.java.tuple.Tuple0;
-import org.apache.flink.api.java.tuple.Tuple1;
-import org.apache.flink.api.java.tuple.Tuple2;
-import org.apache.flink.api.java.tuple.Tuple3;
-import org.apache.flink.api.java.tuple.Tuple9;
-import org.apache.flink.api.java.typeutils.Either;
-import org.apache.flink.api.java.typeutils.EitherTypeInfo;
-import org.apache.flink.api.java.typeutils.EnumTypeInfo;
-import org.apache.flink.api.java.typeutils.GenericTypeInfo;
-import org.apache.flink.api.java.typeutils.MissingTypeInfo;
-import org.apache.flink.api.java.typeutils.ObjectArrayTypeInfo;
-import org.apache.flink.api.java.typeutils.PojoTypeInfo;
-import org.apache.flink.api.java.typeutils.ResultTypeQueryable;
-import org.apache.flink.api.java.typeutils.TupleTypeInfo;
-import org.apache.flink.api.java.typeutils.TypeExtractor;
-import org.apache.flink.api.java.typeutils.TypeInfoParser;
-import org.apache.flink.api.java.typeutils.ValueTypeInfo;
-import org.apache.flink.api.java.typeutils.WritableTypeInfo;
-import org.apache.flink.configuration.Configuration;
-import org.apache.flink.types.DoubleValue;
-import org.apache.flink.types.IntValue;
-import org.apache.flink.types.StringValue;
-import org.apache.flink.types.Value;
-import org.apache.flink.util.Collector;
-import org.apache.hadoop.io.Writable;
-import org.junit.Assert;
-import org.junit.Test;
-
-
-public class TypeExtractorTest {
-
-       
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testBasicType() {
-               // use getGroupReduceReturnTypes()
-               RichGroupReduceFunction<?, ?> function = new 
RichGroupReduceFunction<Boolean, Boolean>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public void reduce(Iterable<Boolean> values, 
Collector<Boolean> out) throws Exception {
-                               // nothing to do
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getGroupReduceReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Boolean"));
-
-               Assert.assertTrue(ti.isBasicType());
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, ti);
-               Assert.assertEquals(Boolean.class, ti.getTypeClass());
-
-               // use getForClass()
-               
Assert.assertTrue(TypeExtractor.getForClass(Boolean.class).isBasicType());
-               Assert.assertEquals(ti, 
TypeExtractor.getForClass(Boolean.class));
-
-               // use getForObject()
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
TypeExtractor.getForObject(Boolean.valueOf(true)));
-       }
-       
-       public static class MyWritable implements Writable {
-               
-               @Override
-               public void write(DataOutput out) throws IOException {
-                       
-               }
-               
-               @Override
-               public void readFields(DataInput in) throws IOException {
-               }
-               
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testWritableType() {
-               RichMapFunction<?, ?> function = new 
RichMapFunction<MyWritable, MyWritable>() {
-                       private static final long serialVersionUID = 1L;
-                       
-                       @Override
-                       public MyWritable map(MyWritable value) throws 
Exception {
-                               return null;
-                       }
-                       
-               };
-               
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) new 
WritableTypeInfo<MyWritable>(MyWritable.class));
-               
-               Assert.assertTrue(ti instanceof WritableTypeInfo<?>);
-               Assert.assertEquals(MyWritable.class, ((WritableTypeInfo<?>) 
ti).getTypeClass());
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testTupleWithBasicTypes() throws Exception {
-               // use getMapReturnTypes()
-               RichMapFunction<?, ?> function = new 
RichMapFunction<Tuple9<Integer, Long, Double, Float, Boolean, String, 
Character, Short, Byte>, Tuple9<Integer, Long, Double, Float, Boolean, String, 
Character, Short, Byte>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Tuple9<Integer, Long, Double, Float, Boolean, 
String, Character, Short, Byte> map(
-                                       Tuple9<Integer, Long, Double, Float, 
Boolean, String, Character, Short, Byte> value) throws Exception {
-                               return null;
-                       }
-
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple9<Integer, Long, Double, Float, Boolean, String, 
Character, Short, Byte>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(9, ti.getArity());
-               Assert.assertTrue(ti instanceof TupleTypeInfo);
-               List<FlatFieldDescriptor> ffd = new 
ArrayList<FlatFieldDescriptor>();
-               ((TupleTypeInfo) ti).getFlatFields("f3", 0, ffd);
-               Assert.assertTrue(ffd.size() == 1);
-               Assert.assertEquals(3, ffd.get(0).getPosition() );
-
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(Tuple9.class, tti.getTypeClass());
-               
-               for (int i = 0; i < 9; i++) {
-                       Assert.assertTrue(tti.getTypeAt(i) instanceof 
BasicTypeInfo);
-               }
-
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
tti.getTypeAt(1));
-               Assert.assertEquals(BasicTypeInfo.DOUBLE_TYPE_INFO, 
tti.getTypeAt(2));
-               Assert.assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, 
tti.getTypeAt(3));
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
tti.getTypeAt(4));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(5));
-               Assert.assertEquals(BasicTypeInfo.CHAR_TYPE_INFO, 
tti.getTypeAt(6));
-               Assert.assertEquals(BasicTypeInfo.SHORT_TYPE_INFO, 
tti.getTypeAt(7));
-               Assert.assertEquals(BasicTypeInfo.BYTE_TYPE_INFO, 
tti.getTypeAt(8));
-
-               // use getForObject()
-               Tuple9<Integer, Long, Double, Float, Boolean, String, 
Character, Short, Byte> t = new Tuple9<Integer, Long, Double, Float, Boolean, 
String, Character, Short, Byte>(
-                               1, 1L, 1.0, 1.0F, false, "Hello World", 'w', 
(short) 1, (byte) 1);
-
-               Assert.assertTrue(TypeExtractor.getForObject(t) instanceof 
TupleTypeInfo);
-               TupleTypeInfo<?> tti2 = (TupleTypeInfo<?>) 
TypeExtractor.getForObject(t);
-
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
tti2.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
tti2.getTypeAt(1));
-               Assert.assertEquals(BasicTypeInfo.DOUBLE_TYPE_INFO, 
tti2.getTypeAt(2));
-               Assert.assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, 
tti2.getTypeAt(3));
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
tti2.getTypeAt(4));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti2.getTypeAt(5));
-               Assert.assertEquals(BasicTypeInfo.CHAR_TYPE_INFO, 
tti2.getTypeAt(6));
-               Assert.assertEquals(BasicTypeInfo.SHORT_TYPE_INFO, 
tti2.getTypeAt(7));
-               Assert.assertEquals(BasicTypeInfo.BYTE_TYPE_INFO, 
tti2.getTypeAt(8));
-               
-               // test that getForClass does not work
-               try {
-                       TypeExtractor.getForClass(Tuple9.class);
-                       Assert.fail("Exception expected here");
-               } catch (InvalidTypesException e) {
-                       // that is correct
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testTupleWithTuples() {
-               // use getFlatMapReturnTypes()
-               RichFlatMapFunction<?, ?> function = new 
RichFlatMapFunction<Tuple3<Tuple1<String>, Tuple1<Integer>, Tuple2<Long, 
Long>>, Tuple3<Tuple1<String>, Tuple1<Integer>, Tuple2<Long, Long>>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public void flatMap(Tuple3<Tuple1<String>, 
Tuple1<Integer>, Tuple2<Long, Long>> value,
-                                       Collector<Tuple3<Tuple1<String>, 
Tuple1<Integer>, Tuple2<Long, Long>>> out) throws Exception {
-                               // nothing to do
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getFlatMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple3<Tuple1<String>, Tuple1<Integer>, Tuple2<Long, 
Long>>"));
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(3, ti.getArity());
-               Assert.assertTrue(ti instanceof TupleTypeInfo);
-               List<FlatFieldDescriptor> ffd = new 
ArrayList<FlatFieldDescriptor>();
-               
-               ((TupleTypeInfo) ti).getFlatFields("f0.f0", 0, ffd);
-               Assert.assertEquals(0, ffd.get(0).getPosition() );
-               ffd.clear();
-               
-               ((TupleTypeInfo) ti).getFlatFields("f0.f0", 0, ffd);
-               Assert.assertTrue( ffd.get(0).getType() instanceof 
BasicTypeInfo );
-               Assert.assertTrue( 
ffd.get(0).getType().getTypeClass().equals(String.class) );
-               ffd.clear();
-               
-               ((TupleTypeInfo) ti).getFlatFields("f1.f0", 0, ffd);
-               Assert.assertEquals(1, ffd.get(0).getPosition() );
-               ffd.clear();
-
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(Tuple3.class, tti.getTypeClass());
-
-               Assert.assertTrue(tti.getTypeAt(0).isTupleType());
-               Assert.assertTrue(tti.getTypeAt(1).isTupleType());
-               Assert.assertTrue(tti.getTypeAt(2).isTupleType());
-               
-               Assert.assertEquals(Tuple1.class, 
tti.getTypeAt(0).getTypeClass());
-               Assert.assertEquals(Tuple1.class, 
tti.getTypeAt(1).getTypeClass());
-               Assert.assertEquals(Tuple2.class, 
tti.getTypeAt(2).getTypeClass());
-
-               Assert.assertEquals(1, tti.getTypeAt(0).getArity());
-               Assert.assertEquals(1, tti.getTypeAt(1).getArity());
-               Assert.assertEquals(2, tti.getTypeAt(2).getArity());
-
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
((TupleTypeInfo<?>) tti.getTypeAt(0)).getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
((TupleTypeInfo<?>) tti.getTypeAt(1)).getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
((TupleTypeInfo<?>) tti.getTypeAt(2)).getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
((TupleTypeInfo<?>) tti.getTypeAt(2)).getTypeAt(1));
-
-               // use getForObject()
-               Tuple3<Tuple1<String>, Tuple1<Integer>, Tuple2<Long, Long>> t = 
new Tuple3<Tuple1<String>, Tuple1<Integer>, Tuple2<Long, Long>>(
-                               new Tuple1<String>("hello"), new 
Tuple1<Integer>(1), new Tuple2<Long, Long>(2L, 3L));
-               Assert.assertTrue(TypeExtractor.getForObject(t) instanceof 
TupleTypeInfo);
-               TupleTypeInfo<?> tti2 = (TupleTypeInfo<?>) 
TypeExtractor.getForObject(t);
-
-               Assert.assertEquals(1, tti2.getTypeAt(0).getArity());
-               Assert.assertEquals(1, tti2.getTypeAt(1).getArity());
-               Assert.assertEquals(2, tti2.getTypeAt(2).getArity());
-
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
((TupleTypeInfo<?>) tti2.getTypeAt(0)).getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
((TupleTypeInfo<?>) tti2.getTypeAt(1)).getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
((TupleTypeInfo<?>) tti2.getTypeAt(2)).getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
((TupleTypeInfo<?>) tti2.getTypeAt(2)).getTypeAt(1));
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testTuple0() {
-               // use getFlatMapReturnTypes()
-               RichFlatMapFunction<?, ?> function = new 
RichFlatMapFunction<Tuple0, Tuple0>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public void flatMap(Tuple0 value, Collector<Tuple0> 
out) throws Exception {
-                               // nothing to do
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getFlatMapReturnTypes(function,
-                               (TypeInformation) 
TypeInfoParser.parse("Tuple0"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(0, ti.getArity());
-               Assert.assertTrue(ti instanceof TupleTypeInfo);
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testSubclassOfTuple() {
-               // use getJoinReturnTypes()
-               RichFlatJoinFunction<?, ?, ?> function = new 
RichFlatJoinFunction<CustomTuple, String, CustomTuple>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public void join(CustomTuple first, String second, 
Collector<CustomTuple> out) throws Exception {
-                               out.collect(null);
-                       }                       
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getFlatJoinReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<String, Integer>"), (TypeInformation) 
TypeInfoParser.parse("String"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
((TupleTypeInfo<?>) ti).getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
((TupleTypeInfo<?>) ti).getTypeAt(1));
-               Assert.assertEquals(CustomTuple.class, ((TupleTypeInfo<?>) 
ti).getTypeClass());
-
-               // use getForObject()
-               CustomTuple t = new CustomTuple("hello", 1);
-               TypeInformation<?> ti2 = TypeExtractor.getForObject(t);
-
-               Assert.assertTrue(ti2.isTupleType());
-               Assert.assertEquals(2, ti2.getArity());
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
((TupleTypeInfo<?>) ti2).getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
((TupleTypeInfo<?>) ti2).getTypeAt(1));
-               Assert.assertEquals(CustomTuple.class, ((TupleTypeInfo<?>) 
ti2).getTypeClass());
-       }
-
-       public static class CustomTuple extends Tuple2<String, Integer> {
-               private static final long serialVersionUID = 1L;
-
-               public CustomTuple(String myField1, Integer myField2) {
-                       this.setFields(myField1, myField2);
-               }
-
-               public String getMyField1() {
-                       return this.f0;
-               }
-
-               public int getMyField2() {
-                       return this.f1;
-               }
-       }
-
-       public static class PojoWithNonPublicDefaultCtor {
-               public int foo, bar;
-               PojoWithNonPublicDefaultCtor() {}
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testPojo() {
-               // use getCrossReturnTypes()
-               RichCrossFunction<?, ?, ?> function = new 
RichCrossFunction<CustomType, Integer, CustomType>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public CustomType cross(CustomType first, Integer 
second) throws Exception {
-                               return null;
-                       }                       
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getCrossReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("org.apache.flink.api.java.type.extractor.TypeExtractorTest$CustomType"),
 (TypeInformation) TypeInfoParser.parse("Integer"));
-
-               Assert.assertFalse(ti.isBasicType());
-               Assert.assertFalse(ti.isTupleType());
-               Assert.assertTrue(ti instanceof PojoTypeInfo);
-               Assert.assertEquals(ti.getTypeClass(), CustomType.class);
-
-               // use getForClass()
-               Assert.assertTrue(TypeExtractor.getForClass(CustomType.class) 
instanceof PojoTypeInfo);
-               
Assert.assertEquals(TypeExtractor.getForClass(CustomType.class).getTypeClass(), 
ti.getTypeClass());
-
-               // use getForObject()
-               CustomType t = new CustomType("World", 1);
-               TypeInformation<?> ti2 = TypeExtractor.getForObject(t);
-
-               Assert.assertFalse(ti2.isBasicType());
-               Assert.assertFalse(ti2.isTupleType());
-               Assert.assertTrue(ti2 instanceof PojoTypeInfo);
-               Assert.assertEquals(ti2.getTypeClass(), CustomType.class);
-
-               
Assert.assertFalse(TypeExtractor.getForClass(PojoWithNonPublicDefaultCtor.class)
 instanceof PojoTypeInfo);
-       }
-       
-
-       
-       public static class CustomType {
-               public String myField1;
-               public int myField2;
-
-               public CustomType() {
-               }
-
-               public CustomType(String myField1, int myField2) {
-                       this.myField1 = myField1;
-                       this.myField2 = myField2;
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testTupleWithPojo() {
-               // use getMapReturnTypes()
-               RichMapFunction<?, ?> function = new 
RichMapFunction<Tuple2<Long, CustomType>, Tuple2<Long, CustomType>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Tuple2<Long, CustomType> map(Tuple2<Long, 
CustomType> value) throws Exception {
-                               return null;
-                       }
-
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<Long,org.apache.flink.api.java.type.extractor.TypeExtractorTest$CustomType>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(Tuple2.class, tti.getTypeClass());
-               List<FlatFieldDescriptor> ffd = new 
ArrayList<FlatFieldDescriptor>();
-               
-               tti.getFlatFields("f0", 0, ffd);
-               Assert.assertEquals(1, ffd.size());
-               Assert.assertEquals(0, ffd.get(0).getPosition() ); // Long
-               Assert.assertTrue( 
ffd.get(0).getType().getTypeClass().equals(Long.class) );
-               ffd.clear();
-               
-               tti.getFlatFields("f1.myField1", 0, ffd);
-               Assert.assertEquals(1, ffd.get(0).getPosition() );
-               Assert.assertTrue( 
ffd.get(0).getType().getTypeClass().equals(String.class) );
-               ffd.clear();
-               
-               
-               tti.getFlatFields("f1.myField2", 0, ffd);
-               Assert.assertEquals(2, ffd.get(0).getPosition() );
-               Assert.assertTrue( 
ffd.get(0).getType().getTypeClass().equals(Integer.class) );
-               
-               
-               Assert.assertEquals(Long.class, 
tti.getTypeAt(0).getTypeClass());
-               Assert.assertTrue(tti.getTypeAt(1) instanceof PojoTypeInfo);
-               Assert.assertEquals(CustomType.class, 
tti.getTypeAt(1).getTypeClass());
-
-               // use getForObject()
-               Tuple2<?, ?> t = new Tuple2<Long, CustomType>(1L, new 
CustomType("Hello", 1));
-               TypeInformation<?> ti2 = TypeExtractor.getForObject(t);
-
-               Assert.assertTrue(ti2.isTupleType());
-               Assert.assertEquals(2, ti2.getArity());
-               TupleTypeInfo<?> tti2 = (TupleTypeInfo<?>) ti2;
-               
-               Assert.assertEquals(Tuple2.class, tti2.getTypeClass());
-               Assert.assertEquals(Long.class, 
tti2.getTypeAt(0).getTypeClass());
-               Assert.assertTrue(tti2.getTypeAt(1) instanceof PojoTypeInfo);
-               Assert.assertEquals(CustomType.class, 
tti2.getTypeAt(1).getTypeClass());
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testValue() {
-               // use getKeyExtractorType()
-               KeySelector<?, ?> function = new KeySelector<StringValue, 
StringValue>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public StringValue getKey(StringValue value) {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getKeySelectorTypes(function, (TypeInformation) 
TypeInfoParser.parse("StringValue"));
-
-               Assert.assertFalse(ti.isBasicType());
-               Assert.assertFalse(ti.isTupleType());
-               Assert.assertTrue(ti instanceof ValueTypeInfo);
-               Assert.assertEquals(ti.getTypeClass(), StringValue.class);
-
-               // use getForClass()
-               Assert.assertTrue(TypeExtractor.getForClass(StringValue.class) 
instanceof ValueTypeInfo);
-               
Assert.assertEquals(TypeExtractor.getForClass(StringValue.class).getTypeClass(),
 ti.getTypeClass());
-
-               // use getForObject()
-               StringValue v = new StringValue("Hello");
-               Assert.assertTrue(TypeExtractor.getForObject(v) instanceof 
ValueTypeInfo);
-               
Assert.assertEquals(TypeExtractor.getForObject(v).getTypeClass(), 
ti.getTypeClass());
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testTupleOfValues() {
-               // use getMapReturnTypes()
-               RichMapFunction<?, ?> function = new 
RichMapFunction<Tuple2<StringValue, IntValue>, Tuple2<StringValue, IntValue>>() 
{
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Tuple2<StringValue, IntValue> 
map(Tuple2<StringValue, IntValue> value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<StringValue, IntValue>"));
-
-               Assert.assertFalse(ti.isBasicType());
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(StringValue.class, ((TupleTypeInfo<?>) 
ti).getTypeAt(0).getTypeClass());
-               Assert.assertEquals(IntValue.class, ((TupleTypeInfo<?>) 
ti).getTypeAt(1).getTypeClass());
-
-               // use getForObject()
-               Tuple2<StringValue, IntValue> t = new Tuple2<StringValue, 
IntValue>(new StringValue("x"), new IntValue(1));
-               TypeInformation<?> ti2 = TypeExtractor.getForObject(t);
-
-               Assert.assertFalse(ti2.isBasicType());
-               Assert.assertTrue(ti2.isTupleType());
-               Assert.assertEquals(((TupleTypeInfo<?>) 
ti2).getTypeAt(0).getTypeClass(), StringValue.class);
-               Assert.assertEquals(((TupleTypeInfo<?>) 
ti2).getTypeAt(1).getTypeClass(), IntValue.class);
-       }
-
-       public static class LongKeyValue<V> extends Tuple2<Long, V> {
-               private static final long serialVersionUID = 1L;
-
-               public LongKeyValue(Long field1, V field2) {
-                       this.f0 = field1;
-                       this.f1 = field2;
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testGenericsNotInSuperclass() {
-               // use getMapReturnTypes()
-               RichMapFunction<?, ?> function = new 
RichMapFunction<LongKeyValue<String>, LongKeyValue<String>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public LongKeyValue<String> map(LongKeyValue<String> 
value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<Long, String>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(LongKeyValue.class, tti.getTypeClass());
-               
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(1));
-       }
-
-       public static class ChainedOne<X, Y> extends Tuple3<X, Long, Y> {
-               private static final long serialVersionUID = 1L;
-
-               public ChainedOne(X field0, Long field1, Y field2) {
-                       this.f0 = field0;
-                       this.f1 = field1;
-                       this.f2 = field2;
-               }
-       }
-
-       public static class ChainedTwo<V> extends ChainedOne<String, V> {
-               private static final long serialVersionUID = 1L;
-
-               public ChainedTwo(String field0, Long field1, V field2) {
-                       super(field0, field1, field2);
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testChainedGenericsNotInSuperclass() {
-               // use TypeExtractor
-               RichMapFunction<?, ?> function = new 
RichMapFunction<ChainedTwo<Integer>, ChainedTwo<Integer>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public ChainedTwo<Integer> map(ChainedTwo<Integer> 
value) throws Exception {
-                               return null;
-                       }                       
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple3<String, Long, Integer>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(3, ti.getArity());
-               
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(ChainedTwo.class, tti.getTypeClass());
-               
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
tti.getTypeAt(1));
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
tti.getTypeAt(2));
-       }
-
-       public static class ChainedThree extends ChainedTwo<String> {
-               private static final long serialVersionUID = 1L;
-
-               public ChainedThree(String field0, Long field1, String field2) {
-                       super(field0, field1, field2);
-               }
-       }
-
-       public static class ChainedFour extends ChainedThree {
-               private static final long serialVersionUID = 1L;
-
-               public ChainedFour(String field0, Long field1, String field2) {
-                       super(field0, field1, field2);
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testGenericsInDirectSuperclass() {
-               // use TypeExtractor
-               RichMapFunction<?, ?> function = new 
RichMapFunction<ChainedThree, ChainedThree>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public ChainedThree map(ChainedThree value) throws 
Exception {
-                               return null;
-                       }                       
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple3<String, Long, String>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(3, ti.getArity());
-               
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(ChainedThree.class, tti.getTypeClass());
-               
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
tti.getTypeAt(1));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(2));
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testGenericsNotInSuperclassWithNonGenericClassAtEnd() {
-               // use TypeExtractor
-               RichMapFunction<?, ?> function = new 
RichMapFunction<ChainedFour, ChainedFour>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public ChainedFour map(ChainedFour value) throws 
Exception {
-                               return null;
-                       }                       
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple3<String, Long, String>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(3, ti.getArity());
-               
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(ChainedFour.class, tti.getTypeClass());
-               
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
tti.getTypeAt(1));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(2));
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testMissingTupleGenerics() {
-               RichMapFunction<?, ?> function = new RichMapFunction<String, 
Tuple2>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Tuple2 map(String value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("String"), "name", true);
-               Assert.assertTrue(ti instanceof MissingTypeInfo);
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function, 
(TypeInformation) TypeInfoParser.parse("String"));
-                       Assert.fail("Expected an exception");
-               }
-               catch (InvalidTypesException e) {
-                       // expected
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testTupleSupertype() {
-               RichMapFunction<?, ?> function = new RichMapFunction<String, 
Tuple>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Tuple map(String value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("String"), "name", true);
-               Assert.assertTrue(ti instanceof MissingTypeInfo);
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function, 
(TypeInformation) TypeInfoParser.parse("String"));
-                       Assert.fail("Expected an exception");
-               }
-               catch (InvalidTypesException e) {
-                       // expected
-               }
-       }
-
-       public static class SameTypeVariable<X> extends Tuple2<X, X> {
-               private static final long serialVersionUID = 1L;
-
-               public SameTypeVariable(X field0, X field1) {
-                       super(field0, field1);
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testSameGenericVariable() {
-               RichMapFunction<?, ?> function = new 
RichMapFunction<SameTypeVariable<String>, SameTypeVariable<String>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public SameTypeVariable<String> 
map(SameTypeVariable<String> value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<String, String>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(SameTypeVariable.class, tti.getTypeClass());
-               
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(1));
-       }
-
-       public static class Nested<V, T> extends Tuple2<V, Tuple2<T, T>> {
-               private static final long serialVersionUID = 1L;
-
-               public Nested(V field0, Tuple2<T, T> field1) {
-                       super(field0, field1);
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testNestedTupleGenerics() {
-               RichMapFunction<?, ?> function = new 
RichMapFunction<Nested<String, Integer>, Nested<String, Integer>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Nested<String, Integer> map(Nested<String, 
Integer> value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<String, Tuple2<Integer, Integer>>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(Nested.class, tti.getTypeClass());
-               
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertTrue(tti.getTypeAt(1).isTupleType());
-               Assert.assertEquals(2, tti.getTypeAt(1).getArity());
-
-               // Nested
-               TupleTypeInfo<?> tti2 = (TupleTypeInfo<?>) tti.getTypeAt(1);
-               Assert.assertEquals(Tuple2.class, tti2.getTypeClass());
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
tti2.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
tti2.getTypeAt(1));
-       }
-
-       public static class Nested2<T> extends Nested<T, Nested<Integer, T>> {
-               private static final long serialVersionUID = 1L;
-
-               public Nested2(T field0, Tuple2<Nested<Integer, T>, 
Nested<Integer, T>> field1) {
-                       super(field0, field1);
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testNestedTupleGenerics2() {
-               RichMapFunction<?, ?> function = new 
RichMapFunction<Nested2<Boolean>, Nested2<Boolean>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Nested2<Boolean> map(Nested2<Boolean> value) 
throws Exception {
-                               return null;
-                       }
-               };
-               
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<Boolean, Tuple2<Tuple2<Integer, Tuple2<Boolean, 
Boolean>>, Tuple2<Integer, Tuple2<Boolean, Boolean>>>>"));
-
-               // Should be 
-               // Tuple2<Boolean, Tuple2<Tuple2<Integer, Tuple2<Boolean, 
Boolean>>, Tuple2<Integer, Tuple2<Boolean, Boolean>>>>
-
-               // 1st nested level
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertTrue(tti.getTypeAt(1).isTupleType());
-
-               // 2nd nested level
-               TupleTypeInfo<?> tti2 = (TupleTypeInfo<?>) tti.getTypeAt(1);
-               Assert.assertTrue(tti2.getTypeAt(0).isTupleType());
-               Assert.assertTrue(tti2.getTypeAt(1).isTupleType());
-
-               // 3rd nested level
-               TupleTypeInfo<?> tti3 = (TupleTypeInfo<?>) tti2.getTypeAt(0);
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, 
tti3.getTypeAt(0));
-               Assert.assertTrue(tti3.getTypeAt(1).isTupleType());
-
-               // 4th nested level
-               TupleTypeInfo<?> tti4 = (TupleTypeInfo<?>) tti3.getTypeAt(1);
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
tti4.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
tti4.getTypeAt(1));
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testFunctionWithMissingGenerics() {
-               RichMapFunction function = new RichMapFunction() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public String map(Object value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, TypeInfoParser.parse("String"), 
"name", true);
-               Assert.assertTrue(ti instanceof MissingTypeInfo);
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function, 
TypeInfoParser.parse("String"));
-                       Assert.fail("Expected an exception");
-               }
-               catch (InvalidTypesException e) {
-                       // expected
-               }
-       }
-
-       @SuppressWarnings({"unchecked", "rawtypes"})
-       @Test
-       public void testFunctionWithMissingGenericsAndReturns() {
-               RichMapFunction function = new RichMapFunction() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Object map(Object value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation info = 
ExecutionEnvironment.getExecutionEnvironment()
-                               .fromElements("arbitrary", "data")
-                               
.map(function).returns("String").getResultType();
-
-               Assert.assertEquals(TypeInfoParser.parse("String"), info);
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testFunctionDependingOnInputAsSuperclass() {
-               IdentityMapper<Boolean> function = new 
IdentityMapper<Boolean>() {
-                       private static final long serialVersionUID = 1L;
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Boolean"));
-
-               Assert.assertTrue(ti.isBasicType());
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, ti);
-       }
-
-       public class IdentityMapper<T> extends RichMapFunction<T, T> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public T map(T value) throws Exception {
-                       return null;
-               }
-       }
-
-       @Test
-       public void testFunctionDependingOnInputFromInput() {
-               IdentityMapper<Boolean> function = new 
IdentityMapper<Boolean>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, BasicTypeInfo.BOOLEAN_TYPE_INFO);
-
-               Assert.assertTrue(ti.isBasicType());
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, ti);
-       }
-       
-       @Test
-       public void testFunctionDependingOnInputWithMissingInput() {
-               IdentityMapper<Boolean> function = new 
IdentityMapper<Boolean>();
-
-               try {
-                       TypeExtractor.getMapReturnTypes(function, null);
-                       Assert.fail("exception expected");
-               } catch (InvalidTypesException e) {
-                       // right
-               }
-       }
-
-       public class IdentityMapper2<T> extends RichMapFunction<Tuple2<T, 
String>, T> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public T map(Tuple2<T, String> value) throws Exception {
-                       return null;
-               }
-       }
-
-       @Test
-       public void testFunctionDependingOnInputWithTupleInput() {
-               IdentityMapper2<Boolean> function = new 
IdentityMapper2<Boolean>();
-
-               TypeInformation<Tuple2<Boolean, String>> inputType = new 
TupleTypeInfo<Tuple2<Boolean, String>>(BasicTypeInfo.BOOLEAN_TYPE_INFO,
-                               BasicTypeInfo.STRING_TYPE_INFO);
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, inputType);
-
-               Assert.assertTrue(ti.isBasicType());
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, ti);
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testFunctionDependingOnInputWithCustomTupleInput() {
-               IdentityMapper<SameTypeVariable<String>> function = new 
IdentityMapper<SameTypeVariable<String>>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<String, String>"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(1));
-       }
-
-       public class IdentityMapper3<T, V> extends RichMapFunction<T, V> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public V map(T value) throws Exception {
-                       return null;
-               }
-       }
-
-       @Test
-       public void testFunctionDependingOnUnknownInput() {
-               IdentityMapper3<Boolean, String> function = new 
IdentityMapper3<Boolean, String>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, BasicTypeInfo.BOOLEAN_TYPE_INFO, 
"name", true);
-               Assert.assertTrue(ti instanceof MissingTypeInfo);
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function, 
BasicTypeInfo.BOOLEAN_TYPE_INFO);
-                       Assert.fail("Expected an exception");
-               }
-               catch (InvalidTypesException e) {
-                       // expected
-               }
-       }
-
-       public class IdentityMapper4<D> extends IdentityMapper<D> {
-               private static final long serialVersionUID = 1L;
-       }
-
-       @Test
-       public void testFunctionDependingOnInputWithFunctionHierarchy() {
-               IdentityMapper4<String> function = new 
IdentityMapper4<String>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, BasicTypeInfo.STRING_TYPE_INFO);
-
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, ti);
-       }
-
-       public class IdentityMapper5<D> extends IdentityMapper<Tuple2<D, D>> {
-               private static final long serialVersionUID = 1L;
-       }
-
-       @Test
-       public void testFunctionDependingOnInputWithFunctionHierarchy2() {
-               IdentityMapper5<String> function = new 
IdentityMapper5<String>();
-
-               @SuppressWarnings({ "rawtypes", "unchecked" })
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, new 
TupleTypeInfo(BasicTypeInfo.STRING_TYPE_INFO,
-                               BasicTypeInfo.STRING_TYPE_INFO));
-
-               Assert.assertTrue(ti.isTupleType());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(1));
-       }
-
-       public class Mapper extends IdentityMapper<String> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public String map(String value) throws Exception {
-                       return null;
-               }
-       }
-
-       public class Mapper2 extends Mapper {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public String map(String value) throws Exception {
-                       return null;
-               }
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testFunctionWithNoGenericSuperclass() {
-               RichMapFunction<?, ?> function = new Mapper2();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("String"));
-
-               Assert.assertTrue(ti.isBasicType());
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, ti);
-       }
-
-       public class OneAppender<T> extends RichMapFunction<T, Tuple2<T, 
Integer>> {
-               private static final long serialVersionUID = 1L;
-
-               public Tuple2<T, Integer> map(T value) {
-                       return new Tuple2<T, Integer>(value, 1);
-               }
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testFunctionDependingPartialOnInput() {
-               RichMapFunction<?, ?> function = new OneAppender<DoubleValue>() 
{
-                       private static final long serialVersionUID = 1L;
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("DoubleValue"));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-
-               Assert.assertTrue(tti.getTypeAt(0) instanceof ValueTypeInfo<?>);
-               ValueTypeInfo<?> vti = (ValueTypeInfo<?>) tti.getTypeAt(0);
-               Assert.assertEquals(DoubleValue.class, vti.getTypeClass());
-               
-               Assert.assertTrue(tti.getTypeAt(1).isBasicType());
-               Assert.assertEquals(Integer.class , 
tti.getTypeAt(1).getTypeClass());
-       }
-
-       @Test
-       public void testFunctionDependingPartialOnInput2() {
-               RichMapFunction<DoubleValue, ?> function = new 
OneAppender<DoubleValue>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, new 
ValueTypeInfo<DoubleValue>(DoubleValue.class));
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-
-               Assert.assertTrue(tti.getTypeAt(0) instanceof ValueTypeInfo<?>);
-               ValueTypeInfo<?> vti = (ValueTypeInfo<?>) tti.getTypeAt(0);
-               Assert.assertEquals(DoubleValue.class, vti.getTypeClass());
-               
-               Assert.assertTrue(tti.getTypeAt(1).isBasicType());
-               Assert.assertEquals(Integer.class , 
tti.getTypeAt(1).getTypeClass());
-       }
-
-       public class FieldDuplicator<T> extends RichMapFunction<T, Tuple2<T, 
T>> {
-               private static final long serialVersionUID = 1L;
-
-               public Tuple2<T, T> map(T value) {
-                       return new Tuple2<T, T>(value, value);
-               }
-       }
-
-       @Test
-       public void testFunctionInputInOutputMultipleTimes() {
-               RichMapFunction<Float, ?> function = new 
FieldDuplicator<Float>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, BasicTypeInfo.FLOAT_TYPE_INFO);
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, 
tti.getTypeAt(1));
-       }
-
-       @Test
-       public void testFunctionInputInOutputMultipleTimes2() {
-               RichMapFunction<Tuple2<Float, Float>, ?> function = new 
FieldDuplicator<Tuple2<Float, Float>>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, new TupleTypeInfo<Tuple2<Float, 
Float>>(
-                               BasicTypeInfo.FLOAT_TYPE_INFO, 
BasicTypeInfo.FLOAT_TYPE_INFO));
-
-               // should be
-               // Tuple2<Tuple2<Float, Float>, Tuple2<Float, Float>>
-
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-
-               // 2nd nested level     
-               Assert.assertTrue(tti.getTypeAt(0).isTupleType());
-               TupleTypeInfo<?> tti2 = (TupleTypeInfo<?>) tti.getTypeAt(0);
-               Assert.assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, 
tti2.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, 
tti2.getTypeAt(1));
-               Assert.assertTrue(tti.getTypeAt(0).isTupleType());
-               TupleTypeInfo<?> tti3 = (TupleTypeInfo<?>) tti.getTypeAt(1);
-               Assert.assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, 
tti3.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.FLOAT_TYPE_INFO, 
tti3.getTypeAt(1));
-       }
-
-       public interface Testable {}
-
-       public static abstract class AbstractClassWithoutMember {}
-
-       public static abstract class AbstractClassWithMember {
-               public int x;
-       }
-
-       @Test
-       public void testAbstractAndInterfaceTypes() {
-
-               // interface
-               RichMapFunction<String, ?> function = new 
RichMapFunction<String, Testable>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Testable map(String value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, BasicTypeInfo.STRING_TYPE_INFO);
-               Assert.assertTrue(ti instanceof GenericTypeInfo);
-
-               // abstract class with out class member
-               RichMapFunction<String, ?> function2 = new 
RichMapFunction<String, AbstractClassWithoutMember>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public AbstractClassWithoutMember map(String value) 
throws Exception {
-                               return null;
-                       }
-               };
-
-               ti = TypeExtractor.getMapReturnTypes(function2, 
BasicTypeInfo.STRING_TYPE_INFO);
-               Assert.assertTrue(ti instanceof GenericTypeInfo);
-
-               // abstract class with class member
-               RichMapFunction<String, ?> function3 = new 
RichMapFunction<String, AbstractClassWithMember>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public AbstractClassWithMember map(String value) throws 
Exception {
-                               return null;
-                       }
-               };
-
-               ti = TypeExtractor.getMapReturnTypes(function3, 
BasicTypeInfo.STRING_TYPE_INFO);
-               Assert.assertTrue(ti instanceof PojoTypeInfo);
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testValueSupertypeException() {
-               RichMapFunction<?, ?> function = new 
RichMapFunction<StringValue, Value>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Value map(StringValue value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti 
=TypeExtractor.getMapReturnTypes(function, 
(TypeInformation)TypeInfoParser.parse("StringValue"), "name", true);
-               Assert.assertTrue(ti instanceof MissingTypeInfo);
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function, 
(TypeInformation)TypeInfoParser.parse("StringValue"));
-                       Assert.fail("Expected an exception");
-               }
-               catch (InvalidTypesException e) {
-                       // expected
-               }
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testBasicArray() {
-               // use getCoGroupReturnTypes()
-               RichCoGroupFunction<?, ?, ?> function = new 
RichCoGroupFunction<String[], String[], String[]>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public void coGroup(Iterable<String[]> first, 
Iterable<String[]> second, Collector<String[]> out) throws Exception {
-                               // nothing to do
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getCoGroupReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("String[]"), (TypeInformation) 
TypeInfoParser.parse("String[]"));
-
-               Assert.assertFalse(ti.isBasicType());
-               Assert.assertFalse(ti.isTupleType());
-               
-               // Due to a Java 6 bug the classification can be slightly wrong
-               Assert.assertTrue(ti instanceof BasicArrayTypeInfo<?,?> || ti 
instanceof ObjectArrayTypeInfo<?,?>);
-               
-               if(ti instanceof BasicArrayTypeInfo<?,?>) {
-                       
Assert.assertEquals(BasicArrayTypeInfo.STRING_ARRAY_TYPE_INFO, ti);
-               }
-               else {
-                       Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
((ObjectArrayTypeInfo<?,?>) ti).getComponentInfo());
-               }               
-       }
-
-       @Test
-       public void testBasicArray2() {
-               RichMapFunction<Boolean[], ?> function = new 
IdentityMapper<Boolean[]>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, 
BasicArrayTypeInfo.BOOLEAN_ARRAY_TYPE_INFO);
-
-               Assert.assertTrue(ti instanceof BasicArrayTypeInfo<?, ?>);
-               BasicArrayTypeInfo<?, ?> bati = (BasicArrayTypeInfo<?, ?>) ti;
-               Assert.assertTrue(bati.getComponentInfo().isBasicType());
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
bati.getComponentInfo());
-       }
-
-       public static class CustomArrayObject {}
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testCustomArray() {
-               RichMapFunction<?, ?> function = new 
RichMapFunction<CustomArrayObject[], CustomArrayObject[]>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public CustomArrayObject[] map(CustomArrayObject[] 
value) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("org.apache.flink.api.java.type.extractor.TypeExtractorTest$CustomArrayObject[]"));
-
-               Assert.assertTrue(ti instanceof ObjectArrayTypeInfo<?, ?>);
-               Assert.assertEquals(CustomArrayObject.class, 
((ObjectArrayTypeInfo<?, ?>) ti).getComponentInfo().getTypeClass());
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testTupleArray() {
-               RichMapFunction<?, ?> function = new 
RichMapFunction<Tuple2<String, String>[], Tuple2<String, String>[]>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Tuple2<String, String>[] map(Tuple2<String, 
String>[] value) throws Exception {
-                               return null;
-                       }
-               };
-               
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple2<String, String>[]"));
-
-               Assert.assertTrue(ti instanceof ObjectArrayTypeInfo<?, ?>);
-               ObjectArrayTypeInfo<?, ?> oati = (ObjectArrayTypeInfo<?, ?>) ti;
-               Assert.assertTrue(oati.getComponentInfo().isTupleType());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) 
oati.getComponentInfo();
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(1));
-       }
-
-       public class CustomArrayObject2<F> extends Tuple1<F> {
-               private static final long serialVersionUID = 1L;
-
-       }
-
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testCustomArrayWithTypeVariable() {
-               RichMapFunction<CustomArrayObject2<Boolean>[], ?> function = 
new IdentityMapper<CustomArrayObject2<Boolean>[]>();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Tuple1<Boolean>[]"));
-
-               Assert.assertTrue(ti instanceof ObjectArrayTypeInfo<?, ?>);
-               ObjectArrayTypeInfo<?, ?> oati = (ObjectArrayTypeInfo<?, ?>) ti;
-               Assert.assertTrue(oati.getComponentInfo().isTupleType());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) 
oati.getComponentInfo();
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
tti.getTypeAt(0));
-       }
-       
-       public class GenericArrayClass<T> extends RichMapFunction<T[], T[]> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public T[] map(T[] value) throws Exception {
-                       return null;
-               }               
-       }
-       
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testParameterizedArrays() {
-               GenericArrayClass<Boolean> function = new 
GenericArrayClass<Boolean>(){
-                       private static final long serialVersionUID = 1L;        
                
-               };
-               
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) 
TypeInfoParser.parse("Boolean[]"));
-               Assert.assertTrue(ti instanceof ObjectArrayTypeInfo<?,?>);
-               ObjectArrayTypeInfo<?, ?> oati = (ObjectArrayTypeInfo<?, ?>) ti;
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
oati.getComponentInfo());
-       }
-       
-       public static class MyObject<T> {
-               public T myField;
-       }
-       
-       public static class InType extends MyObject<String> {}
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testParameterizedPojo() {
-               RichMapFunction<?, ?> function = new RichMapFunction<InType, 
MyObject<String>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public MyObject<String> map(InType value) throws 
Exception {
-                               return null;
-                       }
-               };
-               TypeInformation<?> inType = 
TypeExtractor.createTypeInfo(InType.class);
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, (TypeInformation) inType);
-               Assert.assertTrue(ti instanceof PojoTypeInfo);
-       }
-       
-       @Test
-       public void 
testFunctionDependingOnInputWithTupleInputWithTypeMismatch() {
-               IdentityMapper2<Boolean> function = new 
IdentityMapper2<Boolean>();
-
-               TypeInformation<Tuple2<Boolean, String>> inputType = new 
TupleTypeInfo<Tuple2<Boolean, String>>(BasicTypeInfo.BOOLEAN_TYPE_INFO,
-                               BasicTypeInfo.INT_TYPE_INFO);
-               
-               // input is: Tuple2<Boolean, Integer>
-               // allowed: Tuple2<?, String>
-
-               try {
-                       TypeExtractor.getMapReturnTypes(function, inputType);
-                       Assert.fail("exception expected");
-               } catch (InvalidTypesException e) {
-                       // right
-               }
-       }
-       
-       @SuppressWarnings({ "rawtypes", "unchecked" })
-       @Test
-       public void testInputMismatchExceptions() {
-               
-               RichMapFunction<?, ?> function = new 
RichMapFunction<Tuple2<String, String>, String>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public String map(Tuple2<String, String> value) throws 
Exception {
-                               return null;
-                       }
-               };
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function, 
(TypeInformation) TypeInfoParser.parse("Tuple2<Integer, String>"));
-                       Assert.fail("exception expected");
-               } catch (InvalidTypesException e) {
-                       // right
-               }
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function, 
(TypeInformation) TypeInfoParser.parse("Tuple3<String, String, String>"));
-                       Assert.fail("exception expected");
-               } catch (InvalidTypesException e) {
-                       // right
-               }
-               
-               RichMapFunction<?, ?> function2 = new 
RichMapFunction<StringValue, String>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public String map(StringValue value) throws Exception {
-                               return null;
-                       }
-               };
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function2, 
(TypeInformation) TypeInfoParser.parse("IntValue"));
-                       Assert.fail("exception expected");
-               } catch (InvalidTypesException e) {
-                       // right
-               }
-               
-               RichMapFunction<?, ?> function3 = new 
RichMapFunction<Tuple1<Integer>[], String>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public String map(Tuple1<Integer>[] value) throws 
Exception {
-                               return null;
-                       }
-               };
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function3, 
(TypeInformation) TypeInfoParser.parse("Integer[]"));
-                       Assert.fail("exception expected");
-               } catch (InvalidTypesException e) {
-                       // right
-               }
-               
-               RichMapFunction<?, ?> function4 = new RichMapFunction<Writable, 
String>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public String map(Writable value) throws Exception {
-                               return null;
-                       }
-               };
-               
-               try {
-                       TypeExtractor.getMapReturnTypes(function4, 
(TypeInformation) new WritableTypeInfo<MyWritable>(MyWritable.class));
-                       Assert.fail("exception expected");
-               } catch (InvalidTypesException e) {
-                       // right
-               }
-       }
-       
-       public static class DummyFlatMapFunction<A,B,C,D> extends 
RichFlatMapFunction<Tuple2<A,B>, Tuple2<C,D>> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public void flatMap(Tuple2<A, B> value, Collector<Tuple2<C, D>> 
out) throws Exception {
-                       
-               }
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testTypeErasure() {
-               TypeInformation<?> ti = TypeExtractor.getFlatMapReturnTypes(new 
DummyFlatMapFunction<String, Integer, String, Boolean>(), 
-                                       (TypeInformation) 
TypeInfoParser.parse("Tuple2<String, Integer>"), "name", true);
-               Assert.assertTrue(ti instanceof MissingTypeInfo);
-               
-               try {
-                       TypeExtractor.getFlatMapReturnTypes(new 
DummyFlatMapFunction<String, Integer, String, Boolean>(), 
-                                       (TypeInformation) 
TypeInfoParser.parse("Tuple2<String, Integer>"));
-                       
-                       Assert.fail("Expected an exception");
-               }
-               catch (InvalidTypesException e) {
-                       // expected
-               }
-       }
-
-       public static class MyQueryableMapper<A> extends 
RichMapFunction<String, A> implements ResultTypeQueryable<A> {
-               private static final long serialVersionUID = 1L;
-               
-               @SuppressWarnings("unchecked")
-               @Override
-               public TypeInformation<A> getProducedType() {
-                       return (TypeInformation<A>) BasicTypeInfo.INT_TYPE_INFO;
-               }
-               
-               @Override
-               public A map(String value) throws Exception {
-                       return null;
-               }
-       }
-       
-       @Test
-       public void testResultTypeQueryable() {
-               TypeInformation<?> ti = TypeExtractor.getMapReturnTypes(new 
MyQueryableMapper<Integer>(), BasicTypeInfo.STRING_TYPE_INFO);
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, ti);
-       }
-       
-       @Test
-       public void testTupleWithPrimitiveArray() {
-               RichMapFunction<Integer, 
Tuple9<int[],double[],long[],byte[],char[],float[],short[], boolean[], 
String[]>> function = new RichMapFunction<Integer, 
Tuple9<int[],double[],long[],byte[],char[],float[],short[], boolean[], 
String[]>>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Tuple9<int[], double[], long[], byte[], char[], 
float[], short[], boolean[], String[]> map(Integer value) throws Exception {
-                               return null;
-                       }
-               };
-               
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(function, BasicTypeInfo.INT_TYPE_INFO);
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               
Assert.assertEquals(PrimitiveArrayTypeInfo.INT_PRIMITIVE_ARRAY_TYPE_INFO, 
tti.getTypeAt(0));
-               
Assert.assertEquals(PrimitiveArrayTypeInfo.DOUBLE_PRIMITIVE_ARRAY_TYPE_INFO, 
tti.getTypeAt(1));
-               
Assert.assertEquals(PrimitiveArrayTypeInfo.LONG_PRIMITIVE_ARRAY_TYPE_INFO, 
tti.getTypeAt(2));
-               
Assert.assertEquals(PrimitiveArrayTypeInfo.BYTE_PRIMITIVE_ARRAY_TYPE_INFO, 
tti.getTypeAt(3));
-               
Assert.assertEquals(PrimitiveArrayTypeInfo.CHAR_PRIMITIVE_ARRAY_TYPE_INFO, 
tti.getTypeAt(4));
-               
Assert.assertEquals(PrimitiveArrayTypeInfo.FLOAT_PRIMITIVE_ARRAY_TYPE_INFO, 
tti.getTypeAt(5));
-               
Assert.assertEquals(PrimitiveArrayTypeInfo.SHORT_PRIMITIVE_ARRAY_TYPE_INFO, 
tti.getTypeAt(6));
-               
Assert.assertEquals(PrimitiveArrayTypeInfo.BOOLEAN_PRIMITIVE_ARRAY_TYPE_INFO, 
tti.getTypeAt(7));
-               Assert.assertEquals(BasicArrayTypeInfo.STRING_ARRAY_TYPE_INFO, 
tti.getTypeAt(8));
-       }
-       
-       @Test
-       public void testFunction() {
-               RichMapFunction<String, Boolean> mapInterface = new 
RichMapFunction<String, Boolean>() {
-                       
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public void setRuntimeContext(RuntimeContext t) {
-                               
-                       }
-                       
-                       @Override
-                       public void open(Configuration parameters) throws 
Exception {
-                       }
-                       
-                       @Override
-                       public RuntimeContext getRuntimeContext() {
-                               return null;
-                       }
-                       
-                       @Override
-                       public void close() throws Exception {
-                               
-                       }
-                       
-                       @Override
-                       public Boolean map(String record) throws Exception {
-                               return null;
-                       }
-               };
-               
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(mapInterface, BasicTypeInfo.STRING_TYPE_INFO);
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, ti);
-       }
-
-       @Test
-       public void testInterface() {
-               MapFunction<String, Boolean> mapInterface = new 
MapFunction<String, Boolean>() {
-                       private static final long serialVersionUID = 1L;
-                       
-                       @Override
-                       public Boolean map(String record) throws Exception {
-                               return null;
-                       }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes(mapInterface, BasicTypeInfo.STRING_TYPE_INFO);
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, ti);
-       }
-
-       @Test
-       public void testCreateTypeInfoFromInstance() {
-               ResultTypeQueryable instance = new ResultTypeQueryable<Long>() {
-                       @Override
-                       public TypeInformation<Long> getProducedType() {
-                               return BasicTypeInfo.LONG_TYPE_INFO;
-                       }
-               };
-               TypeInformation<?> ti = TypeExtractor.createTypeInfo(instance, 
null, null, 0);
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, ti);
-
-               // method also needs to work for instances that do not 
implement ResultTypeQueryable
-               MapFunction<Integer, Long> func = new MapFunction<Integer, 
Long>() {
-                       @Override
-                       public Long map(Integer value) throws Exception {
-                               return value.longValue();
-                       }
-               };
-               ti = TypeExtractor.createTypeInfo(func, MapFunction.class, 
func.getClass(), 0);
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, ti);
-       }
-       
-       @SuppressWarnings({ "serial", "unchecked", "rawtypes" })
-       @Test
-       public void testExtractKeySelector() {
-               KeySelector<String, Integer> selector = new KeySelector<String, 
Integer>() {
-                       @Override
-                       public Integer getKey(String value) { return null; }
-               };
-
-               TypeInformation<?> ti = 
TypeExtractor.getKeySelectorTypes(selector, BasicTypeInfo.STRING_TYPE_INFO);
-               Assert.assertEquals(BasicTypeInfo.INT_TYPE_INFO, ti);
-               
-               try {
-                       TypeExtractor.getKeySelectorTypes((KeySelector) 
selector, BasicTypeInfo.BOOLEAN_TYPE_INFO);
-                       Assert.fail();
-               }
-               catch (InvalidTypesException e) {
-                       // good
-               }
-               catch (Exception e) {
-                       Assert.fail("wrong exception type");
-               }
-       }
-       
-       public static class DuplicateValue<T> implements MapFunction<Tuple1<T>, 
Tuple2<T, T>> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public Tuple2<T, T> map(Tuple1<T> vertex) {
-                       return new Tuple2<T, T>(vertex.f0, vertex.f0);
-               }
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testDuplicateValue() {
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) new DuplicateValue<String>(), 
TypeInfoParser.parse("Tuple1<String>"));
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(1));
-       }
-       
-       public static class DuplicateValueNested<T> implements 
MapFunction<Tuple1<Tuple1<T>>, Tuple2<T, T>> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public Tuple2<T, T> map(Tuple1<Tuple1<T>> vertex) {
-                       return new Tuple2<T, T>(null, null);
-               }
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testDuplicateValueNested() {
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) new 
DuplicateValueNested<String>(), TypeInfoParser.parse("Tuple1<Tuple1<String>>"));
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(2, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(1));
-       }
-       
-       public static class Edge<K, V> extends Tuple3<K, K, V> {
-               private static final long serialVersionUID = 1L;
-               
-       }
-       
-       public static class EdgeMapper<K, V> implements MapFunction<Edge<K, V>, 
Edge<K, V>> {
-               private static final long serialVersionUID = 1L;
-               
-               @Override
-               public Edge<K, V> map(Edge<K, V> value) throws Exception {
-                       return null;
-               }
-               
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testInputInference1() {
-               EdgeMapper<String, Double> em = new EdgeMapper<String, 
Double>();
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) em, 
TypeInfoParser.parse("Tuple3<String, String, Double>"));
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(3, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, 
tti.getTypeAt(1));
-               Assert.assertEquals(BasicTypeInfo.DOUBLE_TYPE_INFO, 
tti.getTypeAt(2));
-       }
-       
-       public static class EdgeMapper2<V> implements MapFunction<V, Edge<Long, 
V>> {
-               private static final long serialVersionUID = 1L;
-               
-               @Override
-               public Edge<Long, V> map(V value) throws Exception {
-                       return null;
-               }
-               
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testInputInference2() {
-               EdgeMapper2<Boolean> em = new EdgeMapper2<Boolean>();
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) em, 
TypeInfoParser.parse("Boolean"));
-               Assert.assertTrue(ti.isTupleType());
-               Assert.assertEquals(3, ti.getArity());
-               TupleTypeInfo<?> tti = (TupleTypeInfo<?>) ti;
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
tti.getTypeAt(0));
-               Assert.assertEquals(BasicTypeInfo.LONG_TYPE_INFO, 
tti.getTypeAt(1));
-               Assert.assertEquals(BasicTypeInfo.BOOLEAN_TYPE_INFO, 
tti.getTypeAt(2));
-       }
-       
-       public static class EdgeMapper3<K, V> implements MapFunction<Edge<K, 
V>, V> {
-               private static final long serialVersionUID = 1L;
-               
-               @Override
-               public V map(Edge<K, V> value) throws Exception {
-                       return null;
-               }
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testInputInference3() {
-               EdgeMapper3<Boolean, String> em = new EdgeMapper3<Boolean, 
String>();
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) em, 
TypeInfoParser.parse("Tuple3<Boolean,Boolean,String>"));
-               Assert.assertTrue(ti.isBasicType());
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, ti);
-       }
-       
-       public static class EdgeMapper4<K, V> implements MapFunction<Edge<K, 
V>[], V> {
-               private static final long serialVersionUID = 1L;
-               
-               @Override
-               public V map(Edge<K, V>[] value) throws Exception {
-                       return null;
-               }
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testInputInference4() {
-               EdgeMapper4<Boolean, String> em = new EdgeMapper4<Boolean, 
String>();
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) em, 
TypeInfoParser.parse("Tuple3<Boolean,Boolean,String>[]"));
-               Assert.assertTrue(ti.isBasicType());
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, ti);
-       }
-       
-       public static enum MyEnum {
-               ONE, TWO, THREE
-       }
-       
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testEnumType() {
-               MapFunction<?, ?> mf = new MapFunction<MyEnum, MyEnum>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public MyEnum map(MyEnum value) throws Exception {
-                               return null;
-                       }
-               };
-               
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) mf, new 
EnumTypeInfo(MyEnum.class));
-               Assert.assertTrue(ti instanceof EnumTypeInfo);
-               Assert.assertEquals(ti.getTypeClass(), MyEnum.class);
-       }
-       
-       public static class MapperWithMultiDimGenericArray<T> implements 
MapFunction<T[][][], Tuple1<T>[][][]> {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public Tuple1<T>[][][] map(T[][][] value) throws Exception {
-                       return null;
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testMultiDimensionalArray() {
-               // tuple array
-               MapFunction<?,?> function = new MapFunction<Tuple2<Integer, 
Double>[][], Tuple2<Integer, Double>[][]>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Tuple2<Integer, Double>[][] map(
-                                       Tuple2<Integer, Double>[][] value) 
throws Exception {
-                               return null;
-                       }
-               };
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction)function, 
TypeInfoParser.parse("Tuple2<Integer, Double>[][]"));
-               
Assert.assertEquals("ObjectArrayTypeInfo<ObjectArrayTypeInfo<Java 
Tuple2<Integer, Double>>>", ti.toString());
-
-               // primitive array
-               function = new MapFunction<int[][][], int[][][]>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public int[][][] map(
-                                       int[][][] value) throws Exception {
-                               return null;
-                       }
-               };
-               ti = TypeExtractor.getMapReturnTypes((MapFunction)function, 
TypeInfoParser.parse("int[][][]"));
-               
Assert.assertEquals("ObjectArrayTypeInfo<ObjectArrayTypeInfo<int[]>>", 
ti.toString());
-
-               // basic array
-               function = new MapFunction<Integer[][][], Integer[][][]>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public Integer[][][] map(
-                                       Integer[][][] value) throws Exception {
-                               return null;
-                       }
-               };
-               ti = TypeExtractor.getMapReturnTypes((MapFunction)function, 
TypeInfoParser.parse("Integer[][][]"));
-               
Assert.assertEquals("ObjectArrayTypeInfo<ObjectArrayTypeInfo<BasicArrayTypeInfo<Integer>>>",
 ti.toString());
-
-               // pojo array
-               function = new MapFunction<CustomType[][][], 
CustomType[][][]>() {
-                       private static final long serialVersionUID = 1L;
-
-                       @Override
-                       public CustomType[][][] map(
-                                       CustomType[][][] value) throws 
Exception {
-                               return null;
-                       }
-               };
-               ti = TypeExtractor.getMapReturnTypes((MapFunction)function, 
TypeInfoParser.parse("org.apache.flink.api.java.type.extractor.TypeExtractorTest$CustomType<"
-                               + "myField1=String,myField2=int"
-                               + ">[][][]"));
-               
Assert.assertEquals("ObjectArrayTypeInfo<ObjectArrayTypeInfo<ObjectArrayTypeInfo<"
-                               + 
"PojoType<org.apache.flink.api.java.type.extractor.TypeExtractorTest$CustomType,
 fields = [myField1: String, myField2: Integer]>"
-                               + ">>>", ti.toString());
-               
-               // generic array
-               ti = TypeExtractor.getMapReturnTypes((MapFunction) new 
MapperWithMultiDimGenericArray<String>(), TypeInfoParser.parse("String[][][]"));
-               
Assert.assertEquals("ObjectArrayTypeInfo<ObjectArrayTypeInfo<ObjectArrayTypeInfo<Java
 Tuple1<String>>>>", ti.toString());
-       }
-
-       @SuppressWarnings("rawtypes")
-       public static class MapWithResultTypeQueryable implements MapFunction, 
ResultTypeQueryable {
-               private static final long serialVersionUID = 1L;
-
-               @Override
-               public TypeInformation getProducedType() {
-                       return BasicTypeInfo.STRING_TYPE_INFO;
-               }
-
-               @Override
-               public Object map(Object value) throws Exception {
-                       return null;
-               }
-       }
-
-       @SuppressWarnings({ "unchecked", "rawtypes" })
-       @Test
-       public void testInputMismatchWithRawFuntion() {
-               MapFunction<?, ?> function = new MapWithResultTypeQueryable();
-
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction)function, 
BasicTypeInfo.INT_TYPE_INFO);
-               Assert.assertEquals(BasicTypeInfo.STRING_TYPE_INFO, ti);
-       }
-
-       public static class Either1<T> extends Either<String, T> {
-               @Override
-               public String left() throws IllegalStateException {
-                       return null;
-               }
-
-               @Override
-               public T right() throws IllegalStateException {
-                       return null;
-               }
-       }
-
-       public static class Either2 extends Either1<Tuple1<Integer>> {
-               // nothing to do here
-       }
-
-       public static class EitherMapper<T> implements MapFunction<T, 
Either1<T>> {
-               @Override
-               public Either1<T> map(T value) throws Exception {
-                       return null;
-               }
-       }
-
-       public static class EitherMapper2 implements MapFunction<String, 
Either2> {
-               @Override
-               public Either2 map(String value) throws Exception {
-                       return null;
-               }
-       }
-
-       public static class EitherMapper3 implements MapFunction<Either2, 
Either2> {
-               @Override
-               public Either2 map(Either2 value) throws Exception {
-                       return null;
-               }
-       }
-
-       @Test
-       public void testEither() {
-               MapFunction<?, ?> function = new MapFunction<Either<String, 
Boolean>, Either<String, Boolean>>() {
-                       @Override
-                       public Either<String, Boolean> map(Either<String, 
Boolean> value) throws Exception {
-                               return null;
-                       }
-               };
-               TypeInformation<?> expected = new 
EitherTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.BOOLEAN_TYPE_INFO);
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) function, expected);
-               Assert.assertEquals(expected, ti);
-       }
-
-       @Test
-       public void testEitherHierarchy() {
-               MapFunction<?, ?> function = new EitherMapper<Boolean>();
-               TypeInformation<?> ti = 
TypeExtractor.getMapReturnTypes((MapFunction) function, 
BasicTypeInfo.BOOLEAN_TYPE_INFO);
-               TypeInformation<?> expected = new 
EitherTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, BasicTypeInfo.BOOLEAN_TYPE_INFO);
-               Assert.assertEquals(expected, ti);
-
-               function = new EitherMapper2();
-               ti = TypeExtractor.getMapReturnTypes((MapFunction) function, 
BasicTypeInfo.STRING_TYPE_INFO);
-               expected = new EitherTypeInfo(BasicTypeInfo.STRING_TYPE_INFO, 
new TupleTypeInfo(BasicTypeInfo.INT_TYPE_INFO));
-               Assert.assertEquals(expected, ti);
-
-               function = new EitherMapper3();
-               ti = TypeExtractor.getMapReturnTypes((MapFunction) function, 
expected);
-               Assert.assertEquals(expected, ti);
-
-               Either<String, Tuple1<Integer>> either = new Either2();
-               ti = TypeExtractor.getForObject(either);
-               Assert.assertEquals(expected, ti);
-       }
-
-       @Test(expected=InvalidTypesException.class)
-       public void testEitherFromObjectException() {
-               Either<String, Tuple1<Integer>> either = Either.Left("test");
-               TypeExtractor.getForObject(either);
-       }
-}

Reply via email to