You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@reef.apache.org by we...@apache.org on 2015/01/29 21:42:50 UTC

[06/31] incubator-reef git commit: [REEF-97] Add the REEF.NET code base

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ClassHierarchy/TestClassHierarchy.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ClassHierarchy/TestClassHierarchy.cs b/lang/cs/Tests/TangTests/ClassHierarchy/TestClassHierarchy.cs
new file mode 100644
index 0000000..49f9802
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ClassHierarchy/TestClassHierarchy.cs
@@ -0,0 +1,717 @@
+/**
+ * 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.
+ */
+
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Org.Apache.Reef.Tang.Annotations;
+using Org.Apache.Reef.Tang.Examples;
+using Org.Apache.Reef.Tang.Exceptions;
+using Org.Apache.Reef.Tang.Implementations;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Types;
+using Org.Apache.Reef.Tang.Util;
+using System;
+using System.Collections.Generic;
+
+namespace Org.Apache.Reef.Tang.Test.ClassHierarchy
+{
+    [TestClass]
+    public class TestClassHierarchy
+    {
+        public static IClassHierarchy ns;
+
+        [ClassInitialize]
+        public static void ClassSetup(TestContext context)
+        {
+            TangImpl.Reset();
+            ns = TangFactory.GetTang().GetClassHierarchy(new string[] { FileNames.Examples, FileNames.Common, FileNames.Tasks });
+       }
+
+        [ClassCleanup]
+        public static void ClassCleanup()
+        {
+        }
+
+        [TestInitialize()]
+        public void TestSetup()
+        {
+        }
+
+        [TestCleanup()]
+        public void TestCleanup()
+        {
+        }
+
+        [TestMethod]
+        public void TestString()
+        {
+            INode n = null;
+            try
+            {
+                n = ns.GetNode("System");
+            }
+            catch (ApplicationException)
+            {
+            }
+            catch (NameResolutionException)
+            {
+            }
+            Assert.IsNull(n);
+
+            Assert.IsNotNull(ns.GetNode(typeof(System.String).AssemblyQualifiedName));
+
+            string msg = null;  
+            try
+            {
+                ns.GetNode("org.apache");
+                msg = "Didn't get expected exception";
+            }
+            catch (ApplicationException)
+            {
+            }
+            catch (NameResolutionException)
+            {
+
+            }
+            Assert.IsNull(msg, msg);  
+        }
+
+        [TestMethod]
+        public void TestInt()
+        {
+            INode n = null;
+            try
+            {
+                n = ns.GetNode("System");
+            }
+            catch (ApplicationException)
+            {
+            }
+            catch (NameResolutionException)
+            {
+            }
+            Assert.IsNull(n);
+
+            Assert.IsNotNull(ns.GetNode(typeof(System.Int32).AssemblyQualifiedName));
+
+            string msg = null;      
+            try
+            {
+                ns.GetNode("org.apache");
+                msg = "Didn't get expected exception";
+            }
+            catch (ApplicationException)
+            {
+            }
+            catch (NameResolutionException)
+            {
+
+            }
+            Assert.IsNull(msg, msg);        
+        }
+
+        [TestMethod]
+        public void TestSimpleConstructors()
+        {
+            IClassNode cls = (IClassNode)ns.GetNode(typeof(SimpleConstructors).AssemblyQualifiedName);
+            Assert.IsTrue(cls.GetChildren().Count == 0);
+            IList<IConstructorDef> def = cls.GetInjectableConstructors();
+            Assert.AreEqual(3, def.Count);
+        }
+
+        [TestMethod]
+        public void TestTimer()
+        {
+            IClassNode timerClassNode = (IClassNode)ns.GetNode(typeof(Timer).AssemblyQualifiedName);
+            INode secondNode = ns.GetNode(typeof(Timer.Seconds).AssemblyQualifiedName);
+            Assert.AreEqual(secondNode.GetFullName(), ReflectionUtilities.GetAssemblyQualifiedName(typeof(Timer.Seconds)));
+
+        }
+
+        [TestMethod]
+        public void TestNamedParameterConstructors()
+        {
+            var node = ns.GetNode(typeof(NamedParameterConstructors).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), ReflectionUtilities.GetAssemblyQualifiedName(typeof(NamedParameterConstructors)));
+        }
+
+        [TestMethod]
+        public void TestArray()
+        {
+            Type t = (new string[0]).GetType();
+            INode node = ns.GetNode(t.AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), t.AssemblyQualifiedName);
+        }
+
+        [TestMethod]
+        public void TestRepeatConstructorArg()
+        {
+            TestNegativeCase(typeof(RepeatConstructorArg),
+                "Repeated constructor parameter detected.  Cannot inject constructor RepeatConstructorArg(int,int).");
+        }
+
+        [TestMethod]
+        public void TestRepeatConstructorArgClasses()
+        {
+            TestNegativeCase(typeof(RepeatConstructorArgClasses),
+                "Repeated constructor parameter detected.  Cannot inject constructor RepeatConstructorArgClasses(A, A).");
+        }
+
+        [TestMethod]
+        public void testLeafRepeatedConstructorArgClasses()
+        {
+            INode node = ns.GetNode(typeof(LeafRepeatedConstructorArgClasses).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), typeof(LeafRepeatedConstructorArgClasses).AssemblyQualifiedName);
+        }
+
+        [TestMethod]
+        public void TestNamedRepeatConstructorArgClasses()
+        {
+            INode node = ns.GetNode(typeof(NamedRepeatConstructorArgClasses).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), typeof(NamedRepeatConstructorArgClasses).AssemblyQualifiedName);
+        }
+
+        [TestMethod]
+        public void TestResolveDependencies() 
+        {
+            ns.GetNode(typeof(SimpleConstructors).AssemblyQualifiedName);
+            Assert.IsNotNull(ns.GetNode(typeof(string).AssemblyQualifiedName));
+        }
+
+        [TestMethod]
+        public void TestDocumentedLocalNamedParameter()
+        {
+            var node = ns.GetNode(typeof(DocumentedLocalNamedParameter).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), ReflectionUtilities.GetAssemblyQualifiedName(typeof(DocumentedLocalNamedParameter)));
+        }
+
+        [TestMethod]
+        public void TestNamedParameterTypeMismatch()
+        {
+            TestNegativeCase(typeof(NamedParameterTypeMismatch),
+                "Named parameter type mismatch in NamedParameterTypeMismatch. Constructor expects a System.String but Foo is a System.Int32.");
+        }
+
+        [TestMethod]
+        public void TestUnannotatedName()
+        {
+            TestNegativeCase(typeof(UnannotatedName),
+                "Named parameter UnannotatedName is missing its [NamedParameter] attribute.");
+        }
+
+        [TestMethod]
+        public void TestAnnotatedNotName()
+        {
+            TestNegativeCase(typeof(AnnotatedNotName),
+                "Found illegal [NamedParameter] AnnotatedNotName does not implement Name<T>.");
+        }
+
+        [TestMethod]
+        public void TestAnnotatedNameWrongInterface()
+        {
+            TestNegativeCase(typeof(AnnotatedNameWrongInterface),
+                "Found illegal [NamedParameter] AnnotatedNameWrongInterface does not implement Name<T>.");
+        }
+
+        [TestMethod]
+        public void TestAnnotatedNameMultipleInterfaces()
+        {
+            TestNegativeCase(typeof(AnnotatedNameMultipleInterfaces),
+                "Named parameter Org.Apache.Reef.Tang.Implementation.AnnotatedNameMultipleInterfaces implements multiple interfaces.  It is only allowed to implement Name<T>.");
+        }
+
+        [TestMethod]
+        public void TestUnAnnotatedNameMultipleInterfaces()
+        {
+            TestNegativeCase(typeof(UnAnnotatedNameMultipleInterfaces),
+                "Named parameter Org.Apache.Reef.Tang.Implementation.UnAnnotatedNameMultipleInterfaces is missing its @NamedParameter annotation.");
+        }
+
+        [TestMethod]
+        public void TestNameWithConstructor()
+        {
+            TestNegativeCase(typeof(NameWithConstructor),
+                "Named parameter Org.Apache.Reef.Tang.Implementation.NameWithConstructor has a constructor.  Named parameters must not declare any constructors.");
+        }
+
+        [TestMethod]
+        public void TestNameWithZeroArgInject()
+        {
+            TestNegativeCase(typeof(NameWithZeroArgInject),
+                "Named parameter Org.Apache.Reef.Tang.Implementation.NameWithZeroArgInject has an injectable constructor.  Named parameters must not declare any constructors.");
+        }
+
+        [TestMethod]
+        public void TestInjectNonStaticLocalArgClass()
+        {
+            var node = ns.GetNode(typeof(InjectNonStaticLocalArgClass).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), typeof(InjectNonStaticLocalArgClass).AssemblyQualifiedName);
+        }
+
+        [TestMethod]
+        public void TestInjectNonStaticLocalType()
+        {
+            var node = ns.GetNode(typeof(InjectNonStaticLocalType).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), typeof(InjectNonStaticLocalType).AssemblyQualifiedName);
+        }
+
+        [TestMethod]
+        public void TestOKShortNames()
+        {
+            var node = ns.GetNode(typeof(ShortNameFooA).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), typeof(ShortNameFooA).AssemblyQualifiedName);
+        }
+
+        public void TestConflictingShortNames()
+        {
+            string msg = null;
+            try
+            {
+                var nodeA = ns.GetNode(typeof(ShortNameFooA).AssemblyQualifiedName);
+                var nodeB = ns.GetNode(typeof(ShortNameFooB).AssemblyQualifiedName);
+                msg = 
+                    "ShortNameFooA and ShortNameFooB have the same short name" +
+                    nodeA.GetName() + nodeB.GetName();
+            }
+            catch (Exception e)
+            {
+                Console.WriteLine(e);
+            }
+            Assert.IsNull(msg, msg);
+        }
+
+        [TestMethod]
+        public void TestRoundTripInnerClassNames()
+        {
+            INode node = ns.GetNode(typeof(Nested.Inner).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), typeof(Nested.Inner).AssemblyQualifiedName);
+        }
+
+        [TestMethod]
+        public void TestRoundTripAnonInnerClassNames()
+        {
+            INode node1 = ns.GetNode(typeof(AnonNested.X1).AssemblyQualifiedName);
+            INode node2 = ns.GetNode(typeof(AnonNested.Y1).AssemblyQualifiedName);
+            Assert.AreNotEqual(node1.GetFullName(), node2.GetFullName());
+
+            Type t1 = ReflectionUtilities.GetTypeByName(node1.GetFullName());
+            Type t2 = ReflectionUtilities.GetTypeByName(node2.GetFullName());
+
+            Assert.AreNotSame(t1, t2);
+        }
+
+        [TestMethod]
+        public void TestNameCantBindWrongSubclassAsDefault()
+        {
+            TestNegativeCase(typeof(BadName),
+            "class org.apache.reef.tang.implementation.BadName defines a default class Int32 with a type that does not extend of its target's type string");
+        }
+
+
+        [TestMethod]
+        public void TestNameCantBindWrongSubclassOfArgumentAsDefault()
+        {
+            TestNegativeCase(typeof(BadNameForGeneric),
+                        "class BadNameForGeneric defines a default class Int32 with a type that does not extend of its target's string in ISet<string>");
+        }
+
+        [TestMethod]
+        public void TestNameCantBindSubclassOfArgumentAsDefault()
+        {
+            INode node = ns.GetNode(typeof(GoodNameForGeneric).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), typeof(GoodNameForGeneric).AssemblyQualifiedName);
+        }
+
+        [TestMethod]
+        public void TestInterfaceCantBindWrongImplAsDefault()
+        {
+            TestNegativeCase(typeof(IBadIfaceDefault),
+                             "interface IBadIfaceDefault declares its default implementation to be non-subclass class string");
+        }
+
+        private void TestNegativeCase(Type clazz, string message)
+        {
+            string msg = null;
+            try
+            {
+                var node = ns.GetNode(typeof(IBadIfaceDefault).AssemblyQualifiedName);
+                msg = message + node.GetName();
+            }
+            catch (Exception)
+            {
+            }
+            Assert.IsNull(msg, msg);
+        }
+
+        [TestMethod]
+        public void TestParseableDefaultClassNotOK()
+        {
+            TestNegativeCase(typeof(BadParsableDefaultClass),
+                 "Named parameter BadParsableDefaultClass defines default implementation for parsable type System.string");
+        }
+
+        [TestMethod]
+        public void testGenericTorture1()
+        {
+            g(typeof(GenericTorture1));
+        }
+        [TestMethod]
+        public void testGenericTorture2()
+        {
+            g(typeof(GenericTorture2));
+        }
+        [TestMethod]
+        public void testGenericTorture3()
+        {
+            g(typeof(GenericTorture3));
+        }
+        [TestMethod]
+        public void testGenericTorture4()
+        {
+            g(typeof(GenericTorture4));
+        }
+
+        public string s(Type t)
+        {
+            return ReflectionUtilities.GetAssemblyQualifiedName(t);
+        }
+        public INode g(Type t)
+        {
+            INode n = ns.GetNode(s(t)); 
+            Assert.IsNotNull(n);
+            return n;
+        }
+
+        [TestMethod]
+        public void TestHelloTaskNode()
+        {
+            var node = ns.GetNode(typeof(Org.Apache.Reef.Tasks.HelloTask).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), ReflectionUtilities.GetAssemblyQualifiedName(typeof(Org.Apache.Reef.Tasks.HelloTask)));
+        }
+
+        [TestMethod]
+        public void TestITackNode()
+        {
+            var node = ns.GetNode(typeof(Org.Apache.Reef.Tasks.ITask).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), ReflectionUtilities.GetAssemblyQualifiedName(typeof(Org.Apache.Reef.Tasks.ITask)));
+        }
+
+        [TestMethod]
+        public void TestNamedParameterIdentifier()
+        {
+            var node = ns.GetNode(typeof(Org.Apache.Reef.Tasks.TaskConfigurationOptions.Identifier).AssemblyQualifiedName);
+            Assert.AreEqual(node.GetFullName(), ReflectionUtilities.GetAssemblyQualifiedName(typeof(Org.Apache.Reef.Tasks.TaskConfigurationOptions.Identifier)));
+        }
+        [TestMethod]
+        public void TestInterface()
+        {
+            g(typeof(A));
+            g(typeof(MyInterface<int>));
+            g(typeof(MyInterface<string>));
+            g(typeof(B));
+
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder();
+
+            cb.BindImplementation(GenericType<MyInterface<string>>.Class, GenericType<MyImplString>.Class);
+            cb.BindImplementation(GenericType<MyInterface<int>>.Class, GenericType<MyImplInt>.Class);
+            IConfiguration conf = cb.Build();
+            IInjector i = tang.NewInjector(conf);
+
+            var a = (A)i.GetInstance(typeof(A));
+            var implString = (MyImplString)i.GetInstance(typeof(MyImplString));
+            var implInt = (MyImplString)i.GetInstance(typeof(MyImplString));
+            var b = (B)i.GetInstance(typeof(B));
+            var c = (C)i.GetInstance(typeof(C));
+
+            Assert.IsNotNull(a);
+            Assert.IsNotNull(implString);
+            Assert.IsNotNull(implInt);
+            Assert.IsNotNull(b);
+            Assert.IsNotNull(c);
+        }
+    }
+
+    [NamedParameter]
+    class GenericTorture1 : Name<ISet<string>> {
+    }
+    [NamedParameter]
+    class GenericTorture2 : Name<ISet<ISet<string>>>
+    {
+    }
+    [NamedParameter]
+    class GenericTorture3 : Name<IDictionary<ISet<string>, ISet<string>>>
+    {
+    }
+    [NamedParameter]
+    class GenericTorture4 : Name<IDictionary<string, string>>
+    {
+    }
+
+    public interface MyInterface<T>
+    {
+
+    }
+
+    public class RepeatConstructorArg
+    {
+        [Inject]
+        public RepeatConstructorArg(int x, int y)
+        {
+        }
+    }
+
+    public class RepeatConstructorArgClasses
+    {
+        [Inject]
+        public RepeatConstructorArgClasses(A x, A y)
+        {
+        }
+    }
+
+    public class A : MyInterface<int>, MyInterface<string>
+    {
+        [Inject]
+        A()
+        {
+        }
+    }
+
+    public class MyImplString : MyInterface<string>
+    {
+        [Inject]
+        public MyImplString()
+        {
+        }
+    }
+
+    public class B
+    {
+        [Inject]
+        public B(MyInterface<string> b)
+        {
+        }
+    }
+
+    public class MyImplInt : MyInterface<int>
+    {
+        [Inject]
+        public MyImplInt()
+        {
+        }
+    }
+    public class C
+    {
+        [Inject]
+        public C(MyInterface<int> b)
+        {
+        }
+    }
+    public class LeafRepeatedConstructorArgClasses
+    {
+
+        public static class A
+        {
+            public class AA
+            {
+            }
+        }
+
+        public static class B
+        {
+            public class AA
+            {
+            }
+        }
+
+        public class C
+        {
+            [Inject]
+            public C(A.AA a, B.AA b)
+            {
+            }
+        }
+    }
+
+    class D
+    {        
+    }
+    [NamedParameter]
+    class D1 : Name<D> 
+    {
+    }
+
+    [NamedParameter]
+    class D2 : Name<D> 
+    {
+    }
+
+    class NamedRepeatConstructorArgClasses 
+    {
+        [Inject]
+        public NamedRepeatConstructorArgClasses([Parameter(typeof(D1))] D x, [Parameter(typeof(D2))] D y) 
+        {
+        }
+    }
+
+    class NamedParameterTypeMismatch 
+    {
+        [NamedParameter(Documentation = "doc.stuff", DefaultValue = "1")]
+        class Foo : Name<Int32> 
+        {
+        }
+
+        [Inject]
+        public NamedParameterTypeMismatch([Parameter(Value = typeof(Foo))] string s) 
+        {
+        }
+    }
+
+    class UnannotatedName : Name<string> {
+    }
+
+    interface I1 
+    {
+    }
+
+    [NamedParameter(Documentation = "c")]
+    class AnnotatedNotName 
+    {
+    }
+
+    [NamedParameter(Documentation = "c")]
+    class AnnotatedNameWrongInterface : I1 
+    {
+    }
+
+    class UnAnnotatedNameMultipleInterfaces : Name<object>, I1 
+    {
+    }
+
+    [NamedParameter(Documentation = "c")]
+    class AnnotatedNameMultipleInterfaces : Name<object>, I1 
+    {
+    }
+
+    [NamedParameter(Documentation = "c")]
+    class NameWithConstructor : Name<object> 
+    {
+        private NameWithConstructor(int i) 
+        {
+        }
+    }
+
+    [NamedParameter]
+    class NameWithZeroArgInject : Name<object> 
+    {
+        [Inject]
+        public NameWithZeroArgInject() 
+        {
+        }
+    }
+
+    class InjectNonStaticLocalArgClass
+    {
+        class NonStaticLocal
+        {
+        }
+
+        [Inject]
+        InjectNonStaticLocalArgClass(NonStaticLocal x)
+        {
+        }
+    }
+
+    class InjectNonStaticLocalType
+    {
+        class NonStaticLocal
+        {
+            [Inject]
+            NonStaticLocal(NonStaticLocal x)
+            {
+            }
+        }
+    }
+
+    [NamedParameter(ShortName = "foo")]
+    public class ShortNameFooA : Name<String>
+    {
+    }
+
+    //when same short name is used, exception would throw when building the class hierarchy
+    [NamedParameter(ShortName = "foo")]
+    public class ShortNameFooB : Name<Int32>
+    {
+    }
+
+    class Nested
+    {
+        public class Inner
+        {
+        }
+    }
+
+    class AnonNested 
+    {
+        public interface X 
+        {
+        }
+
+        public class X1 : X
+        {
+            //int i;
+        }
+
+        public class Y1 : X
+        {
+            //int j;
+        }
+
+        public static X XObj = new X1();
+        public static X YObj = new Y1();
+    }
+
+    //Negative case: Int32 doesn't match string
+    [NamedParameter(DefaultClass = typeof(Int32))]
+    class BadName : Name<string>
+    {        
+    }
+
+    //Negative case: Int32 doesn't match string in the ISet
+    [NamedParameter(DefaultClass = typeof(Int32))]
+    class BadNameForGeneric : Name<ISet<string>>
+    {
+    }
+
+    //Positive case: type matched. ISet is not in parsable list
+    [NamedParameter(DefaultClass = typeof(string))]
+    class GoodNameForGeneric : Name<ISet<string>>
+    {
+    }
+
+    [DefaultImplementation(typeof(string))]
+    interface IBadIfaceDefault
+    {        
+    }
+
+    //negative case: type matched. However, string is in the parsable list and DefaultClass is not null. 
+    [NamedParameter(DefaultClass = typeof(string))]
+    class BadParsableDefaultClass : Name<string>
+    {        
+    }
+ }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ClassHierarchy/TestClassHierarchyRoundTrip.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ClassHierarchy/TestClassHierarchyRoundTrip.cs b/lang/cs/Tests/TangTests/ClassHierarchy/TestClassHierarchyRoundTrip.cs
new file mode 100644
index 0000000..e8c48f6
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ClassHierarchy/TestClassHierarchyRoundTrip.cs
@@ -0,0 +1,69 @@
+/**
+ * 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.
+ */
+
+using System.Globalization;
+using System.IO;
+using Org.Apache.Reef.Tang.Implementations;
+using Org.Apache.Reef.Tang.Protobuf;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Org.Apache.Reef.Tang.Examples;
+
+namespace Org.Apache.Reef.Tang.Test.ClassHierarchy
+{
+    [TestClass]
+    public class TestClassHierarchyRoundTrip : TestClassHierarchy
+    {
+        private void setup1()
+        {
+            TangImpl.Reset();
+            ns = TangFactory.GetTang().GetClassHierarchy(new string[] { FileNames.Examples, FileNames.Common, FileNames.Tasks });
+        }
+
+        private void setup2()
+        {
+            TangImpl.Reset();
+            ns = new ProtocolBufferClassHierarchy(ProtocolBufferClassHierarchy.Serialize(ns));
+        }
+
+        private void setup3()
+        {
+            TangImpl.Reset();
+            try
+            {
+                ProtocolBufferClassHierarchy.Serialize("testProto.bin", ns);
+                ns = ProtocolBufferClassHierarchy.DeSerialize("testProto.bin");
+            }
+            catch (IOException e)
+            {
+                Assert.Fail(string.Format(CultureInfo.CurrentCulture, "IOException when serialize/deserialize proto buffer file", e));
+            }
+        }
+
+        //[TestMethod]
+        //public new void TestString() 
+        //{
+        //    setup1();
+        //    base.TestSimpleConstructors();
+        //    setup2();
+        //    base.TestSimpleConstructors();
+        //    setup3();
+        //    base.TestSimpleConstructors();
+        //}
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ClassHierarchy/TestGeneric.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ClassHierarchy/TestGeneric.cs b/lang/cs/Tests/TangTests/ClassHierarchy/TestGeneric.cs
new file mode 100644
index 0000000..80a95fe
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ClassHierarchy/TestGeneric.cs
@@ -0,0 +1,46 @@
+/**
+ * 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.
+ */
+
+using System.Collections.Generic;
+using Org.Apache.Reef.Tang.Examples;
+using Org.Apache.Reef.Tang.Implementations;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Org.Apache.Reef.Wake.RX;
+
+namespace Org.Apache.Reef.Tang.Test.ClassHierarchy
+{
+    [TestClass]
+    public class TestGeneric
+    {
+        [ClassInitialize]
+        public static void ClassSetup(TestContext context)
+        {
+            TangImpl.Reset();
+        }
+
+        [TestMethod]
+        public void TestGenericClassWithT()
+        {
+            List<string> appDlls = new List<string>();
+            appDlls.Add(typeof(GenericArgument<>).Assembly.GetName().Name);
+            appDlls.Add(typeof(AbstractObserver<>).Assembly.GetName().Name);
+            TangFactory.GetTang().GetClassHierarchy(appDlls.ToArray());
+        }
+    }  
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ClassHierarchy/TestMultipleInterface.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ClassHierarchy/TestMultipleInterface.cs b/lang/cs/Tests/TangTests/ClassHierarchy/TestMultipleInterface.cs
new file mode 100644
index 0000000..3567a4b
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ClassHierarchy/TestMultipleInterface.cs
@@ -0,0 +1,103 @@
+/**
+ * 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.
+ */
+
+using System;
+using Org.Apache.Reef.Tang.Annotations;
+using Org.Apache.Reef.Tang.Implementations;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Org.Apache.Reef.Tang.Test.ClassHierarchy
+{
+    [TestClass]
+    public class TestMultipleInterface
+    {
+        [TestMethod]
+        public void TestFoo()
+        {
+            var ch = TangFactory.GetTang().GetDefaultClassHierarchy();
+            var fNode = ch.GetNode(typeof(Org.Apache.Reef.Tang.Test.ClassHierarchy.Foo));
+            var bNode = ch.GetNode(typeof(Org.Apache.Reef.Tang.Test.ClassHierarchy.Bar));
+            var fbNode = ch.GetNode(typeof(Org.Apache.Reef.Tang.Test.ClassHierarchy.BarFoo));
+        }
+    }
+
+    public class Foo : IObserver<int>
+    {
+        [Inject]
+        public Foo()
+        {
+        }
+
+        public void OnCompleted()
+        {
+            throw new NotImplementedException();
+        }
+
+        public void OnError(Exception error)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void OnNext(int value)
+        {
+            throw new NotImplementedException();
+        }
+    }
+
+    public class Bar : IObserver<string>
+    {
+        public void OnCompleted()
+        {
+            throw new NotImplementedException();
+        }
+
+        public void OnError(Exception error)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void OnNext(string value)
+        {
+            throw new NotImplementedException();
+        }
+    }
+
+    public class BarFoo : IObserver<string>, IObserver<int>
+    {
+        public void OnCompleted()
+        {
+            throw new NotImplementedException();
+        }
+
+        public void OnError(Exception error)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void OnNext(string value)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void OnNext(int value)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ClassHierarchy/TestParameterParser.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ClassHierarchy/TestParameterParser.cs b/lang/cs/Tests/TangTests/ClassHierarchy/TestParameterParser.cs
new file mode 100644
index 0000000..efd1ba7
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ClassHierarchy/TestParameterParser.cs
@@ -0,0 +1,323 @@
+/**
+ * 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.
+ */
+using System;
+using Org.Apache.Reef.Tang.Annotations;
+using Org.Apache.Reef.Tang.Implementations;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Util;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Org.Apache.Reef.Tang.Test.ClassHierarchy
+{
+    [TestClass]
+    public class TestParameterParser
+    {
+        [TestMethod]
+        public void ParseIntTest()
+        {
+            var parser = new ParameterParser();
+            Int32 o = (Int32)parser.Parse(typeof(Int32), "4");
+
+        }
+
+        [TestMethod]
+        public void ParseBoolTest()
+        {
+            var parser = new ParameterParser();
+            Boolean o = (Boolean)parser.Parse(typeof(Boolean), "false");
+        }
+
+        [TestMethod]
+        public void ParseLongTest()
+        {
+            var parser = new ParameterParser();
+            long o = (long)parser.Parse(typeof(long), "8675309");
+        }
+
+        [TestMethod]
+        public void ParseStringTest()
+        {
+            var parser = new ParameterParser();
+            string o = (string)parser.Parse(typeof(string), "hello");
+        }
+
+        [TestMethod]
+        public void ParseDoubleTest()
+        {
+            var parser = new ParameterParser();
+            Double o = (Double)parser.Parse(typeof(double), "12.6");
+        }
+
+        [TestMethod]
+        public void ParseCharTest()
+        {
+            var parser = new ParameterParser();
+            Char o = (Char)parser.Parse(typeof(char), "c");
+        }
+
+        [TestMethod]
+        public void ParseByteTest()
+        {
+            var parser = new ParameterParser();
+            Byte o = (Byte)parser.Parse(typeof(byte), "8");
+        }
+
+        [TestMethod]
+        public void ParseShortTest()
+        {
+            var parser = new ParameterParser();
+            Int16 o = (Int16)parser.Parse(typeof(short), "8");
+        }
+
+        [TestMethod]
+        public void ParseFloatTest()
+        {
+            var parser = new ParameterParser();
+            Single o = (Single)parser.Parse(typeof(float), "8.567");
+        }
+
+        [TestMethod]
+        public void ParseByteArrayTest()
+        {
+            var parser = new ParameterParser();
+            byte[] o = (byte[])parser.Parse(typeof(byte[]), "hello");
+        }
+
+        [TestMethod]
+        public void ParameterParserTest()
+        {
+            ParameterParser p = new ParameterParser();
+            p.AddParser(typeof(FooParser));
+            Foo f = (Foo)p.Parse(typeof(Foo), "woot");
+            Assert.AreEqual(f.s, "woot");
+        }
+        
+        [TestMethod]
+        public void TestUnregisteredParameterParser() 
+        {
+            ParameterParser p = new ParameterParser();
+            
+            //p.AddParser(typeof(FooParser));
+            Foo f = null;
+            try
+            {
+                f = (Foo) p.Parse(typeof (Foo), "woot");
+            }
+            catch (NotSupportedException)
+            {
+            }
+            Assert.IsNull(f);           
+        }
+
+       [TestMethod]
+        public void TestReturnSubclass() 
+       {
+            ParameterParser p = new ParameterParser();
+            p.AddParser(typeof(BarParser));
+            Bar f = (Bar)p.Parse(typeof(Foo), "woot");
+            Assert.AreEqual(f.s, "woot");    
+        }
+
+        [TestMethod]
+        public void TestGoodMerge()
+        {
+            ParameterParser old = new ParameterParser();
+            old.AddParser(typeof(BarParser));
+            ParameterParser nw = new ParameterParser();
+            nw.MergeIn(old);
+            Bar f = (Bar)nw.Parse(typeof(Foo), "woot");
+            Assert.AreEqual(f.s, "woot");   
+        }
+
+        [TestMethod]
+        public void TestGoodMerge2()
+        {
+            ParameterParser old = new ParameterParser();
+            old.AddParser(typeof(BarParser));
+            ParameterParser nw = new ParameterParser();
+            nw.AddParser(typeof(BarParser));
+            nw.MergeIn(old);
+            Bar f = (Bar)nw.Parse(typeof(Foo), "woot");
+            Assert.AreEqual(f.s, "woot");   
+        }
+
+        [TestMethod]
+        public void TestBadMerge()
+        {
+            string msg = null;
+            try
+            {
+                ParameterParser old = new ParameterParser();
+                old.AddParser(typeof(BarParser));
+                ParameterParser nw = new ParameterParser();
+                nw.AddParser(typeof(FooParser));
+                nw.MergeIn(old);
+                msg = "Conflict detected when merging parameter parsers! To parse org.apache.reef.tang.implementation.java.TestParameterParser$Foo I have a: TestParameterParser$FooParser the other instance has a: TestParameterParser$BarParser";
+            }
+            catch (ArgumentException)
+            {
+            }
+            Assert.IsNull(msg);
+        }
+
+        [TestMethod]
+        public void testEndToEnd() 
+        {
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new Type[] {typeof(BarParser) });
+            cb.BindNamedParameter<SomeNamedFoo, Foo>(GenericType<SomeNamedFoo>.Class, "hdfs://woot");
+            ILikeBars ilb = tang.NewInjector(cb.Build()).GetInstance<ILikeBars>();
+            Assert.IsNotNull(ilb);
+        }
+
+        [TestMethod]
+        public void TestDelegatingParser()
+        {
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { }, new IConfiguration[] { }, new Type[] { typeof(TypeParser) });
+
+            ICsConfigurationBuilder cb2 = tang.NewConfigurationBuilder(new IConfiguration[] { cb.Build() });
+
+            cb2.BindNamedParameter<ParseName, ParseableType>(GenericType<ParseName>.Class, "a"); //ParseName : Name<ParseableType>
+
+            ParseableType t = (ParseableType)tang.NewInjector(cb2.Build()).GetNamedInstance(typeof(ParseName));
+            Assert.IsTrue(t is ParseTypeA);
+
+            cb2 = tang.NewConfigurationBuilder(cb.Build());
+            cb2.BindNamedParameter<ParseNameB, ParseTypeB>(GenericType<ParseNameB>.Class, "b"); //ParseNameB : Name<ParseTypeB : ParseableType>
+            cb2.BindNamedParameter<ParseNameA, ParseableType>(GenericType<ParseNameA>.Class, "a"); //ParseNameA : Name<ParseableType>
+
+            tang.NewInjector(cb2.Build()).GetInstance(typeof(NeedsA));
+            tang.NewInjector(cb2.Build()).GetInstance(typeof(NeedsB));
+        }
+
+        class FooParser : IExternalConstructor<Foo>
+        {
+            private Foo foo;
+            [Inject]
+            public FooParser(string s)
+            {
+                this.foo = new Foo(s);
+            }
+
+            public Foo NewInstance()
+            {
+                return foo;
+            }
+        }
+
+        class BarParser : IExternalConstructor<Foo>
+        {
+            private Bar bar;
+            [Inject]
+            public BarParser(String s)
+            {
+                this.bar = new Bar(s);
+            }
+            public Foo NewInstance()
+            {
+                return bar;
+            }
+        }
+
+        class Foo
+        {
+            public readonly string s;
+            public Foo(string s) { this.s = s; }
+        }
+        class Bar : Foo
+        {
+            public Bar(string s) : base(s) { }
+        }
+
+        [NamedParameter]
+        class SomeNamedFoo : Name<Foo> { }
+
+        class ILikeBars
+        {
+            [Inject]
+            ILikeBars([Parameter(typeof(SomeNamedFoo))] Foo bar)
+            {
+                Bar b = (Bar)bar;
+                Assert.AreEqual(b.s, "hdfs://woot");
+            }
+        }
+
+        class ParseableType
+        {
+        }
+
+        class ParseTypeA : ParseableType
+        {
+        }
+
+        class ParseTypeB : ParseableType
+        {
+        }
+
+        class TypeParser : IExternalConstructor<ParseableType>
+        {
+            ParseableType instance;
+            [Inject]
+            public TypeParser(String s)
+            {
+                if (s.Equals("a")) { instance = new ParseTypeA(); }
+                if (s.Equals("b")) { instance = new ParseTypeB(); }
+            }
+
+            public ParseableType NewInstance()
+            {
+                return instance;
+            }
+        }
+
+        [NamedParameter]
+        class ParseName : Name<ParseableType>
+        {
+        }
+
+        [NamedParameter]
+        class ParseNameA : Name<ParseableType>
+        {
+        }
+
+        [NamedParameter]
+        class ParseNameB : Name<ParseTypeB>
+        {
+        }
+
+        class NeedsA
+        {
+            [Inject]
+            public NeedsA([Parameter(typeof(ParseNameA))] ParseableType a)
+            {
+                Assert.IsTrue(a is ParseTypeA);
+            }
+        }
+
+        class NeedsB
+        {
+            [Inject]
+            public NeedsB([Parameter(typeof(ParseNameB))] ParseTypeB b)
+            {
+                Assert.IsTrue(b is ParseTypeB);
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ClassHierarchy/TestSerilization.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ClassHierarchy/TestSerilization.cs b/lang/cs/Tests/TangTests/ClassHierarchy/TestSerilization.cs
new file mode 100644
index 0000000..9313fb1
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ClassHierarchy/TestSerilization.cs
@@ -0,0 +1,234 @@
+/**
+ * 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.
+ */
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using Org.Apache.Reef.Tasks;
+using Org.Apache.Reef.Tang.Implementations;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Protobuf;
+using Org.Apache.Reef.Tang.Types;
+using Org.Apache.Reef.Tang.Util;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using Org.Apache.Reef.Tang.Examples;
+
+namespace Org.Apache.Reef.Tang.Test.ClassHierarchy
+{
+    [TestClass]
+    public class TestSerilization
+    {
+        static Assembly asm = null;
+
+        [ClassInitialize]
+        public static void ClassSetup(TestContext context)
+        {
+            asm = Assembly.Load(FileNames.Examples);
+            Assembly.Load(FileNames.Examples);
+        }
+
+        [ClassCleanup]
+        public static void ClassCleanup()
+        {
+        }
+
+        [TestInitialize()]
+        public void TestSetup()
+        {
+        }
+
+        [TestCleanup()]
+        public void TestCleanup()
+        {
+        }
+
+        [TestMethod]
+        public void TestSerializeClassHierarchy()
+        {            
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(new string[] { typeof(Timer).Assembly.GetName().Name });
+            ProtocolBufferClassHierarchy.Serialize("node.bin", ns);
+        }
+
+        [TestMethod]
+        public void TestDeSerializeClassHierarchy()
+        {
+            Type timerType = typeof (Timer);
+            Type SecondType = typeof (Timer.Seconds);
+            Type simpleCOnstuctorType = typeof (SimpleConstructors);
+
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(new string[] { typeof(Timer).Assembly.GetName().Name });
+            IClassNode timerClassNode = (IClassNode)ns.GetNode(timerType.AssemblyQualifiedName);
+            INode secondNode = (INode)ns.GetNode(SecondType.AssemblyQualifiedName);
+            IClassNode SimpleConstructorsClassNode = (IClassNode)ns.GetNode(simpleCOnstuctorType.AssemblyQualifiedName);
+
+            ProtocolBufferClassHierarchy.Serialize("node.bin", ns);
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize("node.bin");
+
+            IClassNode timerClassNode2 = (IClassNode)ch.GetNode(timerType.AssemblyQualifiedName);
+            INode secondNode2 = ch.GetNode(SecondType.AssemblyQualifiedName);
+            IClassNode SimpleConstructorsClassNode2 = (IClassNode)ch.GetNode(simpleCOnstuctorType.AssemblyQualifiedName);
+
+            Assert.AreEqual(timerClassNode.GetFullName(), timerClassNode2.GetFullName());
+            Assert.AreEqual(secondNode.GetFullName(), secondNode2.GetFullName());
+            Assert.AreEqual(SimpleConstructorsClassNode.GetFullName(), SimpleConstructorsClassNode2.GetFullName());
+
+            Assert.IsTrue(SimpleConstructorsClassNode2.GetChildren().Count == 0);
+            IList<IConstructorDef> def = SimpleConstructorsClassNode2.GetInjectableConstructors();
+            Assert.AreEqual(3, def.Count);
+        }
+
+        [TestMethod]
+        public void TestDeSerializeClassHierarchyForTask()
+        {
+            Type streamTask1Type = typeof (Org.Apache.Reef.Tasks.StreamTask1);
+            Type helloTaskType = typeof (Org.Apache.Reef.Tasks.HelloTask);
+
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(new string[] { typeof(Org.Apache.Reef.Tasks.HelloTask).Assembly.GetName().Name });
+            IClassNode StreamTask1ClassNode = (IClassNode)ns.GetNode(streamTask1Type.AssemblyQualifiedName);
+            IClassNode HelloTaskClassNode = (IClassNode)ns.GetNode(helloTaskType.AssemblyQualifiedName);
+
+            ProtocolBufferClassHierarchy.Serialize("task.bin", ns);
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize("task.bin");
+            IClassNode StreamTask1ClassNode2 = (IClassNode)ch.GetNode(streamTask1Type.AssemblyQualifiedName);
+            IClassNode HelloTaskClassNode2 = (IClassNode)ch.GetNode(helloTaskType.AssemblyQualifiedName);
+
+            Assert.AreEqual(StreamTask1ClassNode.GetFullName(), StreamTask1ClassNode2.GetFullName());
+            Assert.AreEqual(HelloTaskClassNode.GetFullName(), HelloTaskClassNode2.GetFullName());
+        }
+
+        [TestMethod]
+        [DeploymentItem(@".")]
+        public void TestDeSerializeClassHierarchyFromJava()
+        {
+            //the file comes from Java TestClassHierarchyRoundTrip SetUp3 testSimpleConstructors
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize("simpleConstructorJavaProto.bin");
+            IClassNode simpleConstructorNode = (IClassNode)ch.GetNode("org.apache.reef.tang.implementation.SimpleConstructors");
+            Assert.AreEqual(simpleConstructorNode.GetChildren().Count, 0);
+            Assert.AreEqual(simpleConstructorNode.GetInjectableConstructors().Count, 3);
+        }
+
+        [TestMethod]
+        public void TestSerializeClassHierarchyForAvro()
+        {
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(new string[] { typeof(Microsoft.Hadoop.Avro.AvroSerializer).Assembly.GetName().Name });
+            Assert.IsNotNull(ns);
+            ProtocolBufferClassHierarchy.Serialize("avro.bin", ns);
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize("avro.bin");
+            Assert.IsNotNull(ch);
+        }
+
+        [TestMethod]
+        public void TestDeSerializeClassHierarchyAndBind()
+        {
+            Type streamTask1Type = typeof(Org.Apache.Reef.Tasks.StreamTask1);
+            Type helloTaskType = typeof(Org.Apache.Reef.Tasks.HelloTask);
+
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(new string[] { typeof(Org.Apache.Reef.Tasks.HelloTask).Assembly.GetName().Name });
+            IClassNode StreamTask1ClassNode = (IClassNode)ns.GetNode(streamTask1Type.AssemblyQualifiedName);
+            IClassNode HelloTaskClassNode = (IClassNode)ns.GetNode(helloTaskType.AssemblyQualifiedName);
+
+            ProtocolBufferClassHierarchy.Serialize("task.bin", ns);
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize("task.bin");
+            IClassNode StreamTask1ClassNode2 = (IClassNode)ch.GetNode(streamTask1Type.AssemblyQualifiedName);
+            IClassNode HelloTaskClassNode2 = (IClassNode)ch.GetNode(helloTaskType.AssemblyQualifiedName);
+
+            Assert.AreEqual(StreamTask1ClassNode.GetName(), StreamTask1ClassNode2.GetName());
+            Assert.AreEqual(HelloTaskClassNode.GetName(), HelloTaskClassNode2.GetName());
+
+            //have to use original class hierarchy for the merge. ClassHierarchy from ProtoBuffer doesn't support merge. 
+            IConfigurationBuilder cb = TangFactory.GetTang()
+                  .NewConfigurationBuilder(ns);
+            cb.AddConfiguration(TaskConfiguration.ConfigurationModule
+             .Set(TaskConfiguration.Identifier, "Hello_From_Streaming1")
+             .Set(TaskConfiguration.Task, GenericType<Org.Apache.Reef.Tasks.StreamTask1>.Class)
+             .Build());
+
+            IConfiguration taskConfiguration = cb.Build();
+            StreamTask1 st = TangFactory.GetTang().NewInjector(taskConfiguration).GetInstance<StreamTask1>();
+            Assert.IsNotNull(st);
+        }
+
+        [TestMethod]
+        public void TestSerirializeInjectionPlanForTimer()
+        {
+            Type timerType = typeof(Timer);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            cb.BindNamedParameter<Timer.Seconds, Int32>(GenericType < Timer.Seconds>.Class, "2");
+            IConfiguration conf = cb.Build();
+            IInjector injector = tang.NewInjector(conf);
+            InjectionPlan ip = injector.GetInjectionPlan(timerType);
+            ProtocolBufferInjectionPlan.Serialize("timerplan.bin", ip);
+            var ch = conf.GetClassHierarchy();
+            var ip1 = ProtocolBufferInjectionPlan.DeSerialize("timerplan.bin", ch);
+            Assert.IsNotNull(ip1);
+        }
+
+        [TestMethod]
+        public void TestSerirializeInjectionPlanForSimpleConstructor()
+        {
+            Type simpleConstructorType = typeof(SimpleConstructors);
+
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            IConfiguration conf = cb.Build();
+            IInjector injector = tang.NewInjector(conf);
+            InjectionPlan ip = injector.GetInjectionPlan(simpleConstructorType);
+
+            ProtocolBufferInjectionPlan.Serialize("plan.bin", ip);
+            var ch = conf.GetClassHierarchy();
+            var ipRecovered = ProtocolBufferInjectionPlan.DeSerialize("plan.bin", ch);
+            Assert.IsNotNull(ipRecovered);
+        }
+
+        [TestMethod]
+        public void TestGenericClass()
+        {
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(new string[] { typeof(Timer).Assembly.GetName().Name });
+
+            Type t = typeof(Timer);
+            IClassNode EventClassNode = (IClassNode)ns.GetNode(t.AssemblyQualifiedName);
+            ProtocolBufferClassHierarchy.Serialize("event.bin", ns);
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize("event.bin");
+            IClassNode EventClassNode1 = (IClassNode)ns.GetNode(t.AssemblyQualifiedName);
+            Assert.AreEqual(EventClassNode.GetName(), EventClassNode1.GetName());
+        }
+
+        [TestMethod]
+        public void TestGenericArgument()
+        {
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(new string[] { typeof(ClassWithGenericArgument<>).Assembly.GetName().Name });
+
+            Type t = typeof(ClassWithGenericArgument<>);
+            IClassNode classNode = (IClassNode)ns.GetNode(t.AssemblyQualifiedName);
+            var cons = classNode.GetAllConstructors();
+            foreach (var c in cons)
+            {
+                var args = c.GetArgs();
+                foreach (var a in args)
+                {
+                    Assert.IsNotNull(a.GetName());
+                }
+            }
+            ProtocolBufferClassHierarchy.Serialize("generic.bin", ns);
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize("generic.bin");
+            IClassNode classNode1 = (IClassNode)ns.GetNode(t.AssemblyQualifiedName);
+            Assert.AreEqual(classNode.GetName(), classNode1.GetName());
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/Configuration/TestAvroConfiguration.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/Configuration/TestAvroConfiguration.cs b/lang/cs/Tests/TangTests/Configuration/TestAvroConfiguration.cs
new file mode 100644
index 0000000..7f7a80d
--- /dev/null
+++ b/lang/cs/Tests/TangTests/Configuration/TestAvroConfiguration.cs
@@ -0,0 +1,68 @@
+/**
+ * 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.
+ */
+
+using System.Collections.Generic;
+using Org.Apache.Reef.Tasks;
+using Org.Apache.Reef.Tang.Formats;
+using Org.Apache.Reef.Tang.Implementations;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Util;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Org.Apache.Reef.Tang.Test.Configuration
+{
+    [TestClass]
+    public class TestAvroConfiguration
+    {
+        [TestMethod]
+        public void TestFromJsonString()
+        {
+            IConfigurationSerializer serializerImpl = (IConfigurationSerializer)TangFactory.GetTang().NewInjector().GetInstance(typeof(IConfigurationSerializer));
+
+            ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+            cb.BindImplementation(GenericType<ITask>.Class, GenericType<HelloTask>.Class);
+            IConfiguration conf = cb.Build();
+            string jsonStr = serializerImpl.ToString(conf);
+
+            IConfiguration c = serializerImpl.FromString(jsonStr);
+            Assert.IsNotNull(c);
+
+            string jsonStr2 = serializerImpl.ToString(c);
+
+            IConfiguration c1 = serializerImpl.FromString(jsonStr2);
+            Assert.IsNotNull(c1);
+        }
+
+        private AvroConfiguration ToAvroConfiguration()
+        {
+            var a = new AvroConfiguration();
+            HashSet<ConfigurationEntry> b = new HashSet<ConfigurationEntry>();
+            ConfigurationEntry e1 = new ConfigurationEntry();
+            e1.key = "a";
+            e1.value = "a1";
+            ConfigurationEntry e2 = new ConfigurationEntry();
+            e2.key = "b";
+            e2.value = "b1=b2";
+            b.Add(e1);
+            b.Add(e2);
+            a.Bindings = b;
+            return a;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/Configuration/TestAvroSerializerRoundTrip.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/Configuration/TestAvroSerializerRoundTrip.cs b/lang/cs/Tests/TangTests/Configuration/TestAvroSerializerRoundTrip.cs
new file mode 100644
index 0000000..37c583d
--- /dev/null
+++ b/lang/cs/Tests/TangTests/Configuration/TestAvroSerializerRoundTrip.cs
@@ -0,0 +1,71 @@
+/**
+ * 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.
+ */
+
+using Org.Apache.Reef.Tang.Formats;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Test.SmokeTest;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Org.Apache.Reef.Tang.Test.Configuration
+{
+    internal class TestAvroSerializerRoundTrip
+    {
+        [TestClass]
+        public class AvroConfigurationTest : RoundTripTest
+        {
+            public override IConfiguration RoundTrip(IConfiguration configuration)
+            {
+                AvroConfiguration aConf = new AvroConfigurationSerializer().ToAvroConfiguration(configuration);
+                return new AvroConfigurationSerializer().FromAvro(aConf);
+            }
+        }
+
+        [TestClass]
+        public class ByteArrayTest : RoundTripTest
+        {
+            public override IConfiguration RoundTrip(IConfiguration configuration)
+            {
+                AvroConfigurationSerializer serializer = new AvroConfigurationSerializer();
+                byte[] theBytes = serializer.ToByteArray(configuration);
+                return serializer.FromByteArray(theBytes);
+            }
+        }
+
+        [TestClass]
+        public class FileTest : RoundTripTest
+        {
+            public override IConfiguration RoundTrip(IConfiguration configuration)
+            {
+                AvroConfigurationSerializer serializer = new AvroConfigurationSerializer();
+                serializer.ToFile(configuration, "TangTest.avroconf");
+                return serializer.FromFile("TangTest.avroconf");
+            }
+        }
+
+        [TestClass]
+        public class StringTest : RoundTripTest
+        {
+            public override IConfiguration RoundTrip(IConfiguration configuration)
+            {
+                AvroConfigurationSerializer serializer = new AvroConfigurationSerializer();
+                return serializer.FromString(serializer.ToString(configuration));
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/Configuration/TestConfiguration.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/Configuration/TestConfiguration.cs b/lang/cs/Tests/TangTests/Configuration/TestConfiguration.cs
new file mode 100644
index 0000000..1e96cc3
--- /dev/null
+++ b/lang/cs/Tests/TangTests/Configuration/TestConfiguration.cs
@@ -0,0 +1,566 @@
+/**
+ * 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.
+ */
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using Org.Apache.Reef.Tasks;
+using Org.Apache.Reef.Tang.Annotations;
+using Org.Apache.Reef.Tang.Examples;
+using Org.Apache.Reef.Tang.Exceptions;
+using Org.Apache.Reef.Tang.Formats;
+using Org.Apache.Reef.Tang.Implementations;
+using Org.Apache.Reef.Tang.Implementations.Configuration;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Protobuf;
+using Org.Apache.Reef.Tang.Util;
+using Org.Apache.Reef.Tang.Test.ScenarioTest;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Org.Apache.Reef.Tang.Test.Configuration
+{
+    [TestClass]
+    public class TestConfiguration
+    {
+        [ClassInitialize]
+        public static void ClassSetup(TestContext context)
+        {
+        }
+
+        [TestMethod]
+        public void TestDeserializedConfigMerge()
+        {
+            Type activityInterfaceType = typeof(ITask);
+            ITang tang = TangFactory.GetTang();
+
+            ICsConfigurationBuilder cb1 = tang.NewConfigurationBuilder();
+            cb1.BindImplementation(GenericType<ITask>.Class, GenericType<HelloTask>.Class);
+            cb1.BindNamedParameter<TaskConfigurationOptions.Identifier, string>(
+                GenericType<TaskConfigurationOptions.Identifier>.Class, "Hello Task");
+            IConfiguration conf1 = cb1.Build();
+            var serializer = new AvroConfigurationSerializer();
+            serializer.ToFile(conf1, "task.config");
+
+            ICsConfigurationBuilder cb2 = tang.NewConfigurationBuilder();
+            cb2.BindNamedParameter<Timer.Seconds, Int32>(GenericType<Timer.Seconds>.Class, "2");
+            IConfiguration conf2 = cb2.Build();
+            serializer.ToFile(conf2, "timer.config");
+
+            ProtocolBufferClassHierarchy.Serialize("TaskTimer.bin", conf1.GetClassHierarchy());
+            IClassHierarchy ns = ProtocolBufferClassHierarchy.DeSerialize("TaskTimer.bin");
+
+            AvroConfiguration taskAvroconfiguration = serializer.AvroDeseriaizeFromFile("task.config");
+            IConfiguration taskConfiguration = serializer.FromAvro(taskAvroconfiguration, ns);
+
+            AvroConfiguration timerAvroconfiguration = serializer.AvroDeseriaizeFromFile("timer.config");
+            IConfiguration timerConfiguration = serializer.FromAvro(timerAvroconfiguration, ns);
+
+            IConfiguration merged = Configurations.MergeDeserializedConfs(taskConfiguration, timerConfiguration);
+
+            var b = merged.newBuilder().Build();
+        }
+
+        [TestMethod]
+        public void TestActivityConfiguration()
+        {
+            Type activityInterfaceType = typeof (ITask);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Common, FileNames.Tasks });
+            cb.BindImplementation(GenericType<ITask>.Class, GenericType<HelloTask>.Class);
+            cb.BindNamedParameter<TaskConfigurationOptions.Identifier, string>(
+                GenericType<TaskConfigurationOptions.Identifier>.Class, "Hello Task");
+            IConfiguration conf = cb.Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "TaskConf.txt");
+            IDictionary<string, string> p = ConfigurationFile.FromFile("TaskConf.txt");
+
+            ITang tang1 = TangFactory.GetTang();
+            ICsConfigurationBuilder cb1 = tang1.NewConfigurationBuilder(new string[] { FileNames.Common, FileNames.Tasks });
+            ConfigurationFile.AddConfigurationFromFile(cb1, "TaskConf.txt");
+            IConfiguration conf1 = cb1.Build();
+
+            IInjector injector = tang1.NewInjector(conf1);
+            var activityRef = (ITask) injector.GetInstance(activityInterfaceType);
+            Assert.IsNotNull(activityRef);
+        }
+
+        [TestMethod]
+        public void TestMultipleConfiguration()
+        {
+            Type activityInterfaceType = typeof (ITask);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Common, FileNames.Tasks });
+            cb.BindImplementation(GenericType<ITask>.Class, GenericType<HelloTask>.Class);
+            cb.BindNamedParameter<TaskConfigurationOptions.Identifier, string>(
+                GenericType<TaskConfigurationOptions.Identifier>.Class, "Hello Task");
+            IConfiguration conf = cb.Build();
+
+            IConfiguration httpConfiguraiton = HttpHandlerConfiguration.CONF
+                .Set(HttpHandlerConfiguration.P, GenericType<HttpServerReefEventHandler>.Class)
+                .Set(HttpHandlerConfiguration.P, GenericType<HttpServerNrtEventHandler>.Class)
+                .Build();
+
+            IInjector injector = TangFactory.GetTang().NewInjector(new IConfiguration[] {conf, httpConfiguraiton});
+            var activityRef = (ITask) injector.GetInstance(activityInterfaceType);
+            Assert.IsNotNull(activityRef);
+
+            RuntimeClock clock = injector.GetInstance<RuntimeClock>();
+            var rh = clock.ClockRuntimeStartHandler.Get();
+            Assert.AreEqual(rh.Count, 1);
+        }
+
+        [TestMethod]
+        public void TestActivityConfigWithSeperateAssembly()
+        {
+            Type activityInterfaceType = typeof (ITask);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Common, FileNames.Tasks });
+            cb.BindImplementation(GenericType<ITask>.Class, GenericType<HelloTask>.Class);
+            IConfiguration conf = cb.Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "TaskConf1.txt");
+            IDictionary<string, string> p = ConfigurationFile.FromFile("TaskConf1.txt");
+
+            IInjector injector = tang.NewInjector(new string[] { FileNames.Common, FileNames.Tasks }, "TaskConf1.txt");
+            var activityRef = (ITask) injector.GetInstance(activityInterfaceType);
+
+            //combined line sample
+            var o = (ITask) TangFactory.GetTang()
+                   .NewInjector(new string[] { FileNames.Common, FileNames.Tasks }, "TaskConf1.txt")
+                   .GetInstance(typeof (ITask));
+
+            Assert.IsNotNull(activityRef);
+        }
+
+        [TestMethod]
+        public void TestGetConfgiFromProtoBufClassHierarchy()
+        {
+            Type iTaskType = typeof(Org.Apache.Reef.Tasks.ITask);
+            Type helloTaskType = typeof(Org.Apache.Reef.Tasks.HelloTask);
+            Type identifierType = typeof (TaskConfigurationOptions.Identifier);
+
+            IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(new string[] { FileNames.Common, FileNames.Tasks });
+            ProtocolBufferClassHierarchy.Serialize("Task.bin", ns);
+            IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize("Task.bin");
+            ITang tang = TangFactory.GetTang();
+            IConfigurationBuilder cb = tang.NewConfigurationBuilder(ch);
+            cb.Bind(iTaskType.AssemblyQualifiedName, helloTaskType.AssemblyQualifiedName);
+            cb.Bind(identifierType.AssemblyQualifiedName, "Hello Task");
+            IConfiguration conf = cb.Build();
+            ConfigurationFile.WriteConfigurationFile(conf, "taskConf2.txt");
+        }
+
+        [TestMethod]
+        public void TestActivityConfig()
+        {
+            Type activityInterfaceType = typeof (ITask);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Examples, FileNames.Common, FileNames.Tasks });
+            cb.BindImplementation(GenericType<ITask>.Class, GenericType<HelloTask>.Class);
+            IConfiguration conf = cb.Build();
+            ConfigurationFile.WriteConfigurationFile(conf, "TaskConf.txt");
+            IDictionary<string, string> p = ConfigurationFile.FromFile("TaskConf.txt");
+
+            IInjector injector = tang.NewInjector(new string[] { FileNames.Common, FileNames.Tasks }, "TaskConf.txt");
+            var activityRef = (ITask) injector.GetInstance(activityInterfaceType);
+
+            Assert.IsNotNull(activityRef);
+        }
+
+        [TestMethod]
+        public void TestActivityConfigWithString()
+        {
+            Type activityInterfaceType = typeof (ITask);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Examples, FileNames.Common, FileNames.Tasks });
+            cb.BindImplementation(GenericType<ITask>.Class, GenericType<HelloTask>.Class);
+            IConfiguration conf = cb.Build();
+
+            string s = ConfigurationFile.ToConfigurationString(conf);
+            ICsConfigurationBuilder cb2 = tang.NewConfigurationBuilder(new string[] { FileNames.Examples, FileNames.Common, FileNames.Tasks });
+            ConfigurationFile.AddConfigurationFromString(cb2, s);
+            IConfiguration conf2 = cb2.Build();
+
+            IInjector injector = tang.NewInjector(conf2);
+            var activityRef = (ITask) injector.GetInstance(activityInterfaceType);
+
+            Assert.IsNotNull(activityRef);
+        }
+
+        [TestMethod]
+        public void TestTweetConfiguration()
+        {
+            Type tweeterType = typeof (Tweeter);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            cb.BindImplementation(GenericType<ITweetFactory>.Class, GenericType<MockTweetFactory>.Class);
+            cb.BindImplementation(GenericType<ISMS>.Class, GenericType<MockSMS>.Class);
+            cb.BindNamedParameter<Tweeter.PhoneNumber, long>(GenericType<Tweeter.PhoneNumber>.Class, "8675309");
+            IConfiguration conf = cb.Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "tweeterConf.txt");
+            IDictionary<string, string> p = ConfigurationFile.FromFile("tweeterConf.txt");
+            ITang tang1 = TangFactory.GetTang();
+            ICsConfigurationBuilder cb1 = tang1.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            ConfigurationFile.AddConfigurationFromFile(cb1, "tweeterConf.txt");
+            IConfiguration conf1 = cb1.Build();
+
+            IInjector injector = tang1.NewInjector(conf1);
+            var tweeter = (Tweeter) injector.GetInstance(tweeterType);
+            tweeter.sendMessage();
+        }
+
+        [TestMethod]
+        public void TestTweetConfig()
+        {
+            Type tweeterType = typeof (Tweeter);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            cb.BindImplementation(GenericType<ITweetFactory>.Class, GenericType<MockTweetFactory>.Class);
+            cb.BindImplementation(GenericType<ISMS>.Class, GenericType<MockSMS>.Class);
+            cb.BindNamedParameter<Tweeter.PhoneNumber, long>(GenericType<Tweeter.PhoneNumber>.Class, "8675309");
+            IConfiguration conf = cb.Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "tweeterConf.txt");
+            IDictionary<string, string> p = ConfigurationFile.FromFile("tweeterConf.txt");
+
+            IInjector injector = tang.NewInjector(new string[] { FileNames.Examples }, "tweeterConf.txt");
+            var tweeter = (Tweeter) injector.GetInstance(tweeterType);
+            tweeter.sendMessage();
+        }
+
+
+        [TestMethod]
+        public void TestTweetConfigWithAvroThroughFile()
+        {
+            Type tweeterType = typeof (Tweeter);
+            ITang tang = TangFactory.GetTang();
+            IConfiguration conf = tang.NewConfigurationBuilder(new string[] { FileNames.Examples })
+                                      .BindImplementation(GenericType<ITweetFactory>.Class,
+                                                          GenericType<MockTweetFactory>.Class)
+                                      .BindImplementation(GenericType<ISMS>.Class, GenericType<MockSMS>.Class)
+                                      .BindNamedParameter<Tweeter.PhoneNumber, long>(
+                                          GenericType<Tweeter.PhoneNumber>.Class, "8675309")
+                                      .Build();
+
+            var serializer = new AvroConfigurationSerializer();
+            serializer.ToFileStream(conf, "tweeterConfAvro.bin");
+            IConfiguration conf2 = serializer.FromFileStream("tweeterConfAvro.bin");
+
+            IInjector injector = tang.NewInjector(conf2);
+            var tweeter = (Tweeter) injector.GetInstance(tweeterType);
+            tweeter.sendMessage();
+        }
+
+        [TestMethod]
+        public void TestTweetConfigAddConfigurationFromString()
+        {
+            Type tweeterType = typeof (Tweeter);
+            ITang tang = TangFactory.GetTang();
+            IConfiguration conf = tang.NewConfigurationBuilder(new string[] { FileNames.Examples })
+                                      .BindImplementation(GenericType<ITweetFactory>.Class,
+                                                          GenericType<MockTweetFactory>.Class)
+                                      .BindImplementation(GenericType<ISMS>.Class, GenericType<MockSMS>.Class)
+                                      .BindNamedParameter<Tweeter.PhoneNumber, long>(
+                                          GenericType<Tweeter.PhoneNumber>.Class, "8675309")
+                                      .Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "tweeterConf.txt");
+            string s = ConfigurationFile.ToConfigurationString(conf);
+            ICsConfigurationBuilder cb2 = tang.NewConfigurationBuilder();
+            ConfigurationFile.AddConfigurationFromString(cb2, s);
+            IConfiguration conf2 = cb2.Build();
+
+            IInjector injector = tang.NewInjector(conf2);
+            var tweeter = (Tweeter) injector.GetInstance(tweeterType);
+            tweeter.sendMessage();
+        }
+
+        [TestMethod]
+        public void TestTweetConfigWithAvroSerialization()
+        {
+            Type tweeterType = typeof (Tweeter);
+            ITang tang = TangFactory.GetTang();
+            IConfiguration conf = tang.NewConfigurationBuilder(new string[] { FileNames.Examples })
+                                      .BindImplementation(GenericType<ITweetFactory>.Class,
+                                                          GenericType<MockTweetFactory>.Class)
+                                      .BindImplementation(GenericType<ISMS>.Class, GenericType<MockSMS>.Class)
+                                      .BindNamedParameter<Tweeter.PhoneNumber, long>(
+                                          GenericType<Tweeter.PhoneNumber>.Class, "8675309")
+                                      .Build();
+
+            var serializer = new AvroConfigurationSerializer();
+            byte[] bytes = serializer.ToByteArray(conf);
+            IConfiguration conf2 = serializer.FromByteArray(bytes);
+
+            IInjector injector = tang.NewInjector(conf2);
+            var tweeter = (Tweeter) injector.GetInstance(tweeterType);
+            tweeter.sendMessage();
+        }
+
+        [TestMethod]
+        public void TestTweetConfigGetConfigurationFromString()
+        {
+            Type tweeterType = typeof (Tweeter);
+            ITang tang = TangFactory.GetTang();
+            IConfiguration conf = tang.NewConfigurationBuilder(new string[] { FileNames.Examples })
+                                      .BindImplementation(GenericType<ITweetFactory>.Class,
+                                                          GenericType<MockTweetFactory>.Class)
+                                      .BindImplementation(GenericType<ISMS>.Class, GenericType<MockSMS>.Class)
+                                      .BindNamedParameter<Tweeter.PhoneNumber, long>(
+                                          GenericType<Tweeter.PhoneNumber>.Class, "8675309")
+                                      .Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "tweeterConf.txt");
+            string s = ConfigurationFile.ToConfigurationString(conf);
+            IConfiguration conf2 = ConfigurationFile.GetConfiguration(s);
+
+            IInjector injector = tang.NewInjector(conf2);
+            var tweeter = (Tweeter) injector.GetInstance(tweeterType);
+            tweeter.sendMessage();
+        }
+
+        [TestMethod]
+        public void TestTweetInvalidBinding()
+        {
+            string msg = null;
+            try
+            {
+                TangFactory.GetTang().NewConfigurationBuilder(new string[] { FileNames.Examples })
+                           .BindImplementation(typeof (ITweetFactory), typeof (MockSMS))
+                           .Build();
+            }
+            catch (ArgumentException e)
+            {
+                msg = e.Message;
+            }
+            Assert.IsNotNull(msg);
+        }
+
+        [TestMethod]
+        public void TestTimerConfiguration()
+        {
+            Type timerType = typeof (Timer);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            cb.BindNamedParameter<Timer.Seconds, Int32>(GenericType<Timer.Seconds>.Class, "2");
+            IConfiguration conf = cb.Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "timerConf.txt");
+            IDictionary<string, string> p = ConfigurationFile.FromFile("timerConf.txt");
+
+            ITang tang1 = TangFactory.GetTang();
+            ICsConfigurationBuilder cb1 = tang1.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            ConfigurationFile.AddConfigurationFromFile(cb1, "timerConf.txt");
+            IConfiguration conf1 = cb1.Build();
+
+            IInjector injector = tang.NewInjector(conf1);
+            var timer = (Timer) injector.GetInstance(timerType);
+
+            Assert.IsNotNull(timer);
+
+            timer.sleep();
+        }
+
+        [TestMethod]
+        public void TestDocumentLoadNamedParameterConfiguration()
+        {
+            Type documentedLocalNamedParameterType = typeof (DocumentedLocalNamedParameter);
+            ITang tang = TangFactory.GetTang();
+            ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            cb.BindNamedParameter<DocumentedLocalNamedParameter.Foo, string>(
+                GenericType<DocumentedLocalNamedParameter.Foo>.Class, "Hello");
+            IConfiguration conf = cb.Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "docLoadConf.txt");
+            IDictionary<string, string> p = ConfigurationFile.FromFile("docLoadConf.txt");
+
+            ITang tang1 = TangFactory.GetTang();
+            ICsConfigurationBuilder cb1 = tang1.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            ConfigurationFile.AddConfigurationFromFile(cb1, "docLoadConf.txt");
+            IConfiguration conf1 = cb1.Build();
+
+            IInjector injector = tang1.NewInjector(conf1);
+            var doc = (DocumentedLocalNamedParameter) injector.GetInstance(documentedLocalNamedParameterType);
+
+            Assert.IsNotNull(doc);
+            var s = doc.ToString();
+        }
+
+        [TestMethod]
+        public void TestTimerConfigurationWithClassHierarchy()
+        {
+            Type timerType = typeof (Timer);
+            ClassHierarchyImpl classHierarchyImpl = new ClassHierarchyImpl(FileNames.Examples);
+
+            ITang tang = TangFactory.GetTang();
+            IConfiguration conf = tang.NewConfigurationBuilder(classHierarchyImpl)
+                                      .BindNamedParameter<Timer.Seconds, Int32>(GenericType<Timer.Seconds>.Class, "1")
+                                      .Build();
+
+            ConfigurationFile.WriteConfigurationFile(conf, "timerConfH.txt");
+            IDictionary<string, string> p = ConfigurationFile.FromFile("timerConfH.txt");
+
+            ITang tang1 = TangFactory.GetTang();
+            ICsConfigurationBuilder cb1 = tang1.NewConfigurationBuilder(new string[] { FileNames.Examples });
+            ConfigurationFile.AddConfigurationFromFile(cb1, "timerConfH.txt");
+            IConfiguration conf1 = cb1.Build();
+
+            IInjector injector = tang1.NewInjector(conf1);
+            var timer = (Timer) injector.GetInstance(timerType);
+
+            Assert.IsNotNull(timer);
+            timer.sleep();
+        }
+
+        [TestMethod]
+        public void TestSetConfig()
+        {
+            IConfiguration conf = TangFactory.GetTang().NewConfigurationBuilder()
+                .BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "four")
+                .BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "five")
+                .BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "six")
+                .Build();
+
+            Box b = (Box) TangFactory.GetTang().NewInjector(conf).GetInstance(typeof (Box));
+            ConfigurationFile.WriteConfigurationFile(conf, "SetOfNumbersConf.txt");
+
+            string s = ConfigurationFile.ToConfigurationString(conf);
+            IConfiguration conf2 = ConfigurationFile.GetConfiguration(s);
+
+            Box b2 = (Box) TangFactory.GetTang().NewInjector(conf2).GetInstance(typeof (Box));
+            ISet<string> actual = b2.Numbers;
+
+            Assert.IsTrue(actual.Contains("four"));
+            Assert.IsTrue(actual.Contains("five"));
+            Assert.IsTrue(actual.Contains("six"));
+        }
+
+        [TestMethod]
+        public void TestSetConfigWithAvroSerialization()
+        {
+            IConfiguration conf = TangFactory.GetTang().NewConfigurationBuilder()
+                    .BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "four")
+                    .BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "five")
+                    .BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "six")
+                    .Build();
+
+            Box b = (Box) TangFactory.GetTang().NewInjector(conf).GetInstance(typeof (Box));
+
+            var serializer = new AvroConfigurationSerializer();
+            byte[] bytes = serializer.ToByteArray(conf);
+            IConfiguration conf2 = serializer.FromByteArray(bytes);
+
+            Box b2 = (Box) TangFactory.GetTang().NewInjector(conf2).GetInstance(typeof (Box));
+            ISet<string> actual = b2.Numbers;
+
+            Assert.IsTrue(actual.Contains("four"));
+            Assert.IsTrue(actual.Contains("five"));
+            Assert.IsTrue(actual.Contains("six"));
+        }
+
+        [TestMethod]
+        public void TestNullStringVaue()
+        {
+            string msg = null;
+            try
+            {
+                TangFactory.GetTang().NewConfigurationBuilder()
+                    .BindNamedParameter<NamedParamterNoDefault.NamedString, string>(GenericType<NamedParamterNoDefault.NamedString>.Class, null)
+                    .Build();
+            }
+            catch (IllegalStateException e)
+            {
+                msg = e.Message;
+            }
+            Assert.IsNotNull(msg);
+        }
+
+        [TestMethod]
+        public void TestSetConfigNullValue()
+        {
+            string msg = null;
+            try
+            {
+                TangFactory.GetTang().NewConfigurationBuilder()
+                    .BindSetEntry<SetOfNumbersNoDefault, string>(GenericType<SetOfNumbersNoDefault>.Class, null)
+                    .BindSetEntry<SetOfNumbersNoDefault, string>(GenericType<SetOfNumbersNoDefault>.Class, "five")
+                    .BindSetEntry<SetOfNumbersNoDefault, string>(GenericType<SetOfNumbersNoDefault>.Class, "six")
+                    .Build();
+            }
+            catch (IllegalStateException e)
+            {
+                msg = e.Message;
+            }
+            Assert.IsNotNull(msg);
+        }
+    }
+
+    [NamedParameter(DefaultValues = new string[] {"one", "two", "three"})]
+    class SetOfNumbers : Name<ISet<string>>
+    {
+    }
+
+    class Box
+    {
+        public ISet<string> Numbers;
+
+        [Inject]
+        Box([Parameter(typeof (SetOfNumbers))] ISet<string> numbers)
+        {
+            this.Numbers = numbers;
+        }
+    }
+
+    [NamedParameter]
+    class SetOfNumbersNoDefault : Name<ISet<string>>
+    {
+    }
+
+    class BoxNoDefault
+    {
+        public ISet<string> Numbers;
+
+        [Inject]
+        BoxNoDefault([Parameter(typeof(SetOfNumbersNoDefault))] ISet<string> numbers)
+        {
+            this.Numbers = numbers;
+        }
+    }
+
+    class NamedParamterNoDefault
+    {
+        private string str;
+
+        [NamedParameter]
+        public class NamedString : Name<string>
+        {
+        }
+
+        [Inject]
+        NamedParamterNoDefault([Parameter(typeof (NamedString))] string str)
+        {
+            this.str = str;
+        }
+
+        public string GetString()
+        {
+            return str;
+        }
+    }
+}
\ No newline at end of file