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:47 UTC
[03/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/Injection/TestSetInjection.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/Injection/TestSetInjection.cs b/lang/cs/Tests/TangTests/Injection/TestSetInjection.cs
new file mode 100644
index 0000000..82a9cf5
--- /dev/null
+++ b/lang/cs/Tests/TangTests/Injection/TestSetInjection.cs
@@ -0,0 +1,739 @@
+/**
+ * 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 Org.Apache.Reef.Tang.Annotations;
+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.Injection
+{
+ public interface INumber : IComparable
+ {
+ }
+
+ public interface ITimeshift
+ {
+ string LinkId { get; }
+
+ TimeSpan TimeshiftSpan { get; }
+ }
+
+ [TestClass]
+ public class TestSetInjection
+ {
+ [TestMethod]
+ public void TestStringInjectDefault()
+ {
+ Box b = (Box)TangFactory.GetTang().NewInjector().GetInstance(typeof(Box));
+
+ ISet<string> actual = b.Numbers;
+
+ ISet<string> expected = new HashSet<string>();
+ expected.Add("one");
+ expected.Add("two");
+ expected.Add("three");
+
+ Assert.IsTrue(actual.Contains("one"));
+ Assert.IsTrue(actual.Contains("two"));
+ Assert.IsTrue(actual.Contains("three"));
+ //Assert.AreEqual(expected, actual);
+ }
+
+ [TestMethod]
+ public void TestObjectInjectDefault()
+ {
+ IInjector i = TangFactory.GetTang().NewInjector();
+ i.BindVolatileInstance(GenericType<Integer>.Class, new Integer(42));
+ i.BindVolatileInstance(GenericType<Float>.Class, new Float(42.0001f));
+ ISet<INumber> actual = ((Pool)i.GetInstance(typeof(Pool))).Numbers;
+ ISet<INumber> expected = new HashSet<INumber>();
+ expected.Add(new Integer(42));
+ expected.Add(new Float(42.0001f));
+
+ Assert.IsTrue(actual.Contains(new Integer(42)));
+ Assert.IsTrue(actual.Contains(new Float(42.0001f)));
+ //Assert.AreEqual(expected, actual);
+ }
+
+ [TestMethod]
+ public void testStringInjectBound()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+ cb.BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "four");
+ cb.BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "five");
+ cb.BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "six");
+
+ Box b = (Box)TangFactory.GetTang().NewInjector(cb.Build()).GetInstance(typeof(Box));
+ ISet<string> actual = b.Numbers;
+ ISet<string> expected = new HashSet<string>();
+ expected.Add("four");
+ expected.Add("five");
+ expected.Add("six");
+
+ Assert.IsTrue(actual.Contains("four"));
+ Assert.IsTrue(actual.Contains("five"));
+ Assert.IsTrue(actual.Contains("six"));
+ }
+
+ [TestMethod]
+ public void TestObjectInjectBound()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+ cb.BindSetEntry<SetOfClasses, Integer, INumber>(GenericType<SetOfClasses>.Class, GenericType<Integer>.Class);
+ cb.BindSetEntry<SetOfClasses, Float, INumber>(GenericType<SetOfClasses>.Class, GenericType<Float>.Class);
+
+ IInjector i = TangFactory.GetTang().NewInjector(cb.Build());
+ i.BindVolatileInstance(GenericType<Integer>.Class, new Integer(4));
+ i.BindVolatileInstance(GenericType<Float>.Class, new Float(42.0001f));
+
+ ISet<INumber> actual = i.GetInstance<Pool>().Numbers;
+ ISet<INumber> expected = new HashSet<INumber>();
+ expected.Add(new Integer(4));
+ expected.Add(new Float(42.0001f));
+ Assert.IsTrue(Utilities.Utilities.Equals<INumber>(actual, expected));
+ }
+
+ [TestMethod]
+ public void TestSetOfClassBound()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+ cb.BindSetEntry<SetOfClasses, Integer1, INumber>(GenericType<SetOfClasses>.Class, GenericType<Integer1>.Class) //bind an impl to the interface of the set
+ .BindNamedParameter<Integer1.NamedInt, int>(GenericType<Integer1.NamedInt>.Class, "4"); //bind parameter for the impl
+
+ IInjector i = TangFactory.GetTang().NewInjector(cb.Build());
+
+ ISet<INumber> actual = i.GetInstance<Pool>().Numbers;
+ ISet<INumber> expected = new HashSet<INumber>();
+ expected.Add(new Integer1(4));
+
+ Assert.IsTrue(Utilities.Utilities.Equals<INumber>(actual, expected));
+ }
+
+ [TestMethod]
+ public void TestSetOfClassWithDefault()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+ IInjector i = TangFactory.GetTang().NewInjector(cb.Build());
+
+ ISet<INumber> actual = i.GetInstance<Pool1>().Numbers;
+ Assert.IsNotNull(actual);
+ }
+
+ [TestMethod]
+ public void TestSetOfTimeshift()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+
+ cb.BindSetEntry<SetOfTimeshifts, Timeshift, ITimeshift>(GenericType<SetOfTimeshifts>.Class, GenericType<Timeshift>.Class)
+ .BindNamedParameter<Timeshift.TimeshiftLinkId, string>(GenericType<Timeshift.TimeshiftLinkId>.Class, "123")
+ .BindNamedParameter<Timeshift.TimeshiftInTicks, long>(GenericType<Timeshift.TimeshiftInTicks>.Class, "10");
+
+ IInjector i = TangFactory.GetTang().NewInjector(cb.Build());
+
+ ISet<ITimeshift> actual = i.GetInstance<SetofTimeShiftClass>().Timeshifts;
+ Assert.IsTrue(actual.Count == 1);
+ }
+
+ [TestMethod]
+ public void TestSetOfTimeshiftMultipleInstances()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+
+ //when adding another Timeshift into the set for named parameter SetOfTimeshifts, it ends up the same entry.
+ cb.BindSetEntry<SetOfTimeshifts, Timeshift, ITimeshift>(GenericType<SetOfTimeshifts>.Class, GenericType<Timeshift>.Class);
+ cb.BindSetEntry<SetOfTimeshifts, Timeshift, ITimeshift>(GenericType<SetOfTimeshifts>.Class, GenericType<Timeshift>.Class);
+ cb.BindNamedParameter<Timeshift.TimeshiftLinkId, string>(GenericType<Timeshift.TimeshiftLinkId>.Class, "123")
+ .BindNamedParameter<Timeshift.TimeshiftInTicks, long>(GenericType<Timeshift.TimeshiftInTicks>.Class, "10");
+
+ IInjector i = TangFactory.GetTang().NewInjector(cb.Build());
+
+ ISet<ITimeshift> actual = i.GetInstance<SetofTimeShiftClass>().Timeshifts;
+ Assert.IsTrue(actual.Count == 1);
+ }
+
+ [TestMethod]
+ public void TestSetOfTimeshiftMultipleSubClasses()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+
+ //Adding implementations from different subclasses
+ cb.BindSetEntry<SetOfTimeshifts, Timeshift, ITimeshift>(GenericType<SetOfTimeshifts>.Class, GenericType<Timeshift>.Class);
+ cb.BindSetEntry<SetOfTimeshifts, Timeshift1, ITimeshift>(GenericType<SetOfTimeshifts>.Class, GenericType<Timeshift1>.Class);
+
+ cb.BindNamedParameter<Timeshift.TimeshiftLinkId, string>(GenericType<Timeshift.TimeshiftLinkId>.Class, "123")
+ .BindNamedParameter<Timeshift.TimeshiftInTicks, long>(GenericType<Timeshift.TimeshiftInTicks>.Class, "10");
+
+ cb.BindNamedParameter<Timeshift1.TimeshiftLinkId, string>(GenericType<Timeshift1.TimeshiftLinkId>.Class, "456")
+ .BindNamedParameter<Timeshift1.TimeshiftInTicks, long>(GenericType<Timeshift1.TimeshiftInTicks>.Class, "20");
+
+ IInjector i = TangFactory.GetTang().NewInjector(cb.Build());
+
+ ISet<ITimeshift> actual = i.GetInstance<SetofTimeShiftClass>().Timeshifts;
+ Assert.IsTrue(actual.Count == 2);
+ }
+
+ [TestMethod]
+ public void TestSetOfTimeshiftWithDefault()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+
+ IInjector i = TangFactory.GetTang().NewInjector(cb.Build());
+
+ ISet<ITimeshift> actual = i.GetInstance<SetofTimeShiftClass>().Timeshifts;
+ Assert.IsTrue(actual.Count == 1);
+ }
+
+ [TestMethod]
+ public void TestSetOfTimeshiftWithEmptySet()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+
+ IInjector i = TangFactory.GetTang().NewInjector(cb.Build());
+
+ ISet<ITimeshift> actual = i.GetInstance<SetofTimeShiftClassWithoutDefault>().Timeshifts;
+ Assert.IsTrue(actual.Count == 0);
+ }
+
+ [TestMethod]
+ public void TestObjectInjectRoundTrip()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+ cb.BindSetEntry<SetOfClasses, Integer, INumber>(GenericType<SetOfClasses>.Class, GenericType<Integer>.Class);
+ cb.BindSetEntry<SetOfClasses, Float, INumber>(GenericType<SetOfClasses>.Class, GenericType<Float>.Class);
+
+ AvroConfigurationSerializer serializer = new AvroConfigurationSerializer();
+ IConfiguration c2 = serializer.FromString(serializer.ToString(cb.Build()));
+
+ IInjector i = TangFactory.GetTang().NewInjector(c2);
+ i.BindVolatileInstance(GenericType<Integer>.Class, new Integer(4));
+ i.BindVolatileInstance(GenericType<Float>.Class, new Float(42.0001f));
+
+ ISet<INumber> actual = i.GetInstance<Pool>().Numbers;
+ ISet<INumber> expected = new HashSet<INumber>();
+ expected.Add(new Integer(4));
+ expected.Add(new Float(42.0001f));
+ Assert.IsTrue(Utilities.Utilities.Equals<INumber>(actual, expected));
+ }
+
+ [TestMethod]
+ public void TestStringInjectRoundTrip()
+ {
+ ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder();
+ cb.BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "four");
+ cb.BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "five");
+ cb.BindSetEntry<SetOfNumbers, string>(GenericType<SetOfNumbers>.Class, "six");
+
+ string s = ConfigurationFile.ToConfigurationString(cb.Build());
+ ICsConfigurationBuilder cb2 = TangFactory.GetTang().NewConfigurationBuilder();
+ ConfigurationFile.AddConfigurationFromString(cb2, s);
+
+ ISet<string> actual =
+ ((Box)TangFactory.GetTang().NewInjector(cb2.Build()).GetInstance(typeof(Box))).Numbers;
+
+ Assert.IsTrue(actual.Contains("four"));
+ Assert.IsTrue(actual.Contains("five"));
+ Assert.IsTrue(actual.Contains("six"));
+ }
+
+ [TestMethod]
+ public void TestDefaultAsClass()
+ {
+ IInjector i = TangFactory.GetTang().NewInjector();
+ i.BindVolatileInstance(GenericType<Integer>.Class, new Integer(1));
+ i.BindVolatileInstance(GenericType<Float>.Class, new Float(2f));
+ ISet<INumber> actual =
+ (ISet<INumber>)
+ i.GetNamedInstance<SetOfClassesDefaultClass, ISet<INumber>>(GenericType<SetOfClassesDefaultClass>.Class);
+
+ ISet<INumber> expected = new HashSet<INumber>();
+ expected.Add(new Integer(1));
+ Assert.AreEqual(expected.Count, actual.Count);
+ Assert.IsTrue(actual.Contains(new Integer(1)));
+ }
+
+ [TestMethod]
+ public void TestInjectionExtension()
+ {
+ IInjector i = TangFactory.GetTang().NewInjector();
+ i.BindVolatileInstance<Integer>(new Integer(1));
+ i.BindVolatileInstance<Float>(new Float(2f));
+ ISet<INumber> actual =
+ (ISet<INumber>)
+ i.GetNamedInstance<SetOfClassesDefaultClass, ISet<INumber>>();
+
+ ISet<INumber> expected = new HashSet<INumber>();
+ expected.Add(new Integer(1));
+ Assert.AreEqual(expected.Count, actual.Count);
+ Assert.IsTrue(actual.Contains(new Integer(1)));
+ }
+
+ [NamedParameter(DefaultValues = new string[] { "one", "two", "three" })]
+ public class SetOfNumbers : Name<ISet<string>>
+ {
+ }
+
+ public class Box
+ {
+ [Inject]
+ public Box([Parameter(typeof(SetOfNumbers))] ISet<string> numbers)
+ {
+ this.Numbers = numbers;
+ }
+
+ public ISet<string> Numbers { get; set; }
+ }
+
+ [NamedParameter(DefaultClasses = new Type[] { typeof(Integer), typeof(Float) })]
+ public class SetOfClasses : Name<ISet<INumber>>
+ {
+ }
+
+ public class Pool
+ {
+ [Inject]
+ private Pool([Parameter(typeof(SetOfClasses))] ISet<INumber> numbers)
+ {
+ this.Numbers = numbers;
+ }
+
+ public ISet<INumber> Numbers { get; set; }
+ }
+
+ [NamedParameter(DefaultClass = typeof(Integer))]
+ public class SetOfClassesDefaultClass : Name<ISet<INumber>>
+ {
+ }
+
+ public class Integer : INumber
+ {
+ private int val;
+
+ public Integer(int v)
+ {
+ val = v;
+ }
+
+ public int CompareTo(object obj)
+ {
+ if (!(obj is Integer))
+ {
+ return -1;
+ }
+ if (this.val == ((Integer)obj).val)
+ {
+ return 0;
+ }
+
+ if (this.val < ((Integer)obj).val)
+ {
+ return -1;
+ }
+
+ return 1;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is Integer))
+ {
+ return false;
+ }
+
+ if (this.val == ((Integer)obj).val)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return val.GetHashCode();
+ }
+ }
+
+ public class Float : INumber
+ {
+ private float val;
+
+ [Inject]
+ public Float(float v)
+ {
+ val = v;
+ }
+
+ public int CompareTo(object obj)
+ {
+ if (!(obj is Float))
+ {
+ return -1;
+ }
+
+ if (val == ((Float)obj).val)
+ {
+ return 0;
+ }
+
+ if (val < ((Float)obj).val)
+ {
+ return -1;
+ }
+
+ return 1;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is Float))
+ {
+ return false;
+ }
+
+ if (this.val == ((Float)obj).val)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return val.GetHashCode();
+ }
+ }
+
+ public class Integer1 : INumber
+ {
+ private int val;
+
+ [Inject]
+ public Integer1([Parameter(typeof(NamedInt))] int v)
+ {
+ val = v;
+ }
+
+ public int CompareTo(object obj)
+ {
+ if (!(obj is Integer1))
+ {
+ return -1;
+ }
+ if (this.val == ((Integer1)obj).val)
+ {
+ return 0;
+ }
+
+ if (this.val < ((Integer1)obj).val)
+ {
+ return -1;
+ }
+
+ return 1;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is Integer1))
+ {
+ return false;
+ }
+
+ if (this.val == ((Integer1)obj).val)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return val.GetHashCode();
+ }
+
+ [NamedParameter]
+ public class NamedInt : Name<int>
+ {
+ }
+ }
+
+ public class Integer2 : INumber
+ {
+ private int val;
+
+ [Inject]
+ public Integer2()
+ {
+ val = 0;
+ }
+
+ public int CompareTo(object obj)
+ {
+ if (!(obj is Integer2))
+ {
+ return -1;
+ }
+ if (this.val == ((Integer2)obj).val)
+ {
+ return 0;
+ }
+
+ if (this.val < ((Integer2)obj).val)
+ {
+ return -1;
+ }
+
+ return 1;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is Integer2))
+ {
+ return false;
+ }
+
+ if (this.val == ((Integer2)obj).val)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return val.GetHashCode();
+ }
+ }
+
+ public class Integer3 : INumber
+ {
+ private int val;
+
+ [Inject]
+ public Integer3([Parameter(typeof(NamedInt))] int v)
+ {
+ val = v;
+ }
+
+ public int CompareTo(object obj)
+ {
+ if (!(obj is Integer))
+ {
+ return -1;
+ }
+ if (this.val == ((Integer3)obj).val)
+ {
+ return 0;
+ }
+
+ if (this.val < ((Integer3)obj).val)
+ {
+ return -1;
+ }
+
+ return 1;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is Integer3))
+ {
+ return false;
+ }
+
+ if (this.val == ((Integer3)obj).val)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return val.GetHashCode();
+ }
+
+ [NamedParameter]
+ public class NamedInt : Name<int>
+ {
+ }
+ }
+
+ public class Float1 : INumber
+ {
+ private float val;
+
+ [Inject]
+ public Float1([Parameter(typeof(NamedFloat))] float v)
+ {
+ val = v;
+ }
+
+ public int CompareTo(object obj)
+ {
+ if (!(obj is Float))
+ {
+ return -1;
+ }
+
+ if (val == ((Float1)obj).val)
+ {
+ return 0;
+ }
+
+ if (val < ((Float1)obj).val)
+ {
+ return -1;
+ }
+
+ return 1;
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is Float1))
+ {
+ return false;
+ }
+
+ if (this.val == ((Float1)obj).val)
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return val.GetHashCode();
+ }
+
+ [NamedParameter]
+ public class NamedFloat : Name<float>
+ {
+ }
+ }
+
+ public class Pool1
+ {
+ [Inject]
+ private Pool1([Parameter(typeof(SetOfClasseWithDefault))] ISet<INumber> numbers)
+ {
+ this.Numbers = numbers;
+ }
+
+ public ISet<INumber> Numbers { get; set; }
+ }
+
+ [NamedParameter(DefaultClass = typeof(Integer2))]
+ public class SetOfClasseWithDefault : Name<ISet<INumber>>
+ {
+ }
+ }
+
+ public class Timeshift : ITimeshift
+ {
+ [Inject]
+ public Timeshift([Parameter(typeof(TimeshiftLinkId))] string linkId, [Parameter(typeof(TimeshiftInTicks))] long timeshiftInTicks)
+ {
+ this.LinkId = linkId;
+ this.TimeshiftSpan = TimeSpan.FromTicks(timeshiftInTicks);
+ }
+
+ public string LinkId { get; private set; }
+
+ public TimeSpan TimeshiftSpan { get; private set; }
+
+ [NamedParameter("TimeshiftLinkId", "TimeshiftLinkId", "myid")]
+ public class TimeshiftLinkId : Name<string>
+ {
+ }
+
+ [NamedParameter("TimeshiftInTicks", "TimeshiftInTicks", "10")]
+ public class TimeshiftInTicks : Name<long>
+ {
+ }
+ }
+
+ public class Timeshift1 : ITimeshift
+ {
+ [Inject]
+ public Timeshift1([Parameter(typeof(TimeshiftLinkId))] string linkId, [Parameter(typeof(TimeshiftInTicks))] long timeshiftInTicks)
+ {
+ this.LinkId = linkId;
+ this.TimeshiftSpan = TimeSpan.FromTicks(timeshiftInTicks);
+ }
+
+ public string LinkId { get; private set; }
+
+ public TimeSpan TimeshiftSpan { get; private set; }
+
+ [NamedParameter("TimeshiftLinkId1", "TimeshiftLinkId1", "myid")]
+ public class TimeshiftLinkId : Name<string>
+ {
+ }
+
+ [NamedParameter("TimeshiftInTicks1", "TimeshiftInTicks1", "10")]
+ public class TimeshiftInTicks : Name<long>
+ {
+ }
+ }
+
+ [NamedParameter(DefaultClass = typeof(Timeshift))]
+ public class SetOfTimeshifts : Name<ISet<ITimeshift>>
+ {
+ }
+
+ public class SetofTimeShiftClass
+ {
+ [Inject]
+ public SetofTimeShiftClass([Parameter(typeof(SetOfTimeshifts))] ISet<ITimeshift> timeshifts)
+ {
+ this.Timeshifts = timeshifts;
+ }
+
+ public ISet<ITimeshift> Timeshifts { get; set; }
+ }
+ [NamedParameter]
+ public class SetOfTimeshiftsWithoutDefaultClass : Name<ISet<ITimeshift>>
+ {
+ }
+
+ public class SetofTimeShiftClassWithoutDefault
+ {
+ [Inject]
+ public SetofTimeShiftClassWithoutDefault([Parameter(typeof(SetOfTimeshiftsWithoutDefaultClass))] ISet<ITimeshift> timeshifts)
+ {
+ this.Timeshifts = timeshifts;
+ }
+
+ public ISet<ITimeshift> Timeshifts { get; set; }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/Properties/AssemblyInfo.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/Properties/AssemblyInfo.cs b/lang/cs/Tests/TangTests/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..02a072f
--- /dev/null
+++ b/lang/cs/Tests/TangTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+/**
+ * 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.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Org.Apache.Reef.Tang.Tests")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("Org.Apache.Reef.Tang.Tests")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("fd47238d-600b-42cd-b62d-0724171a2bc4")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/HttpHandlerConfiguration.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/HttpHandlerConfiguration.cs b/lang/cs/Tests/TangTests/ScenarioTest/HttpHandlerConfiguration.cs
new file mode 100644
index 0000000..41d6c91
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/HttpHandlerConfiguration.cs
@@ -0,0 +1,35 @@
+/**
+ * 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.Util;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ public class HttpHandlerConfiguration : ConfigurationModuleBuilder
+ {
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes", Justification = "Not Applicable")]
+ public static readonly OptionalParameter<IHttpHandler> P = new OptionalParameter<IHttpHandler>();
+
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes", Justification = "Not Applicable")]
+ public static readonly ConfigurationModule CONF = new HttpHandlerConfiguration().Merge(HttpRuntimeConfiguration.CONF)
+ .BindSetEntry<HttpEventHanlders, IHttpHandler>(GenericType<HttpEventHanlders>.Class, HttpHandlerConfiguration.P)
+ .Build();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeConfiguration.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeConfiguration.cs b/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeConfiguration.cs
new file mode 100644
index 0000000..7d91b6c
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeConfiguration.cs
@@ -0,0 +1,36 @@
+/**
+ * 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.Formats;
+using Org.Apache.Reef.Tang.Util;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ public class HttpRuntimeConfiguration : ConfigurationModuleBuilder
+ {
+ [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes", Justification = "Not Applicable")]
+ public static readonly ConfigurationModule CONF = new HttpRuntimeConfiguration()
+ .BindSetEntry<RuntimeStartHandler, HttpRunTimeStartHandler, IObserver<RuntimeStart>>(
+ GenericType<RuntimeStartHandler>.Class, GenericType<HttpRunTimeStartHandler>.Class)
+ .BindSetEntry<RuntimeStopHandler, HttpRunTimeStopHandler, IObserver<RuntimeStop>>(
+ GenericType<RuntimeStopHandler>.Class, GenericType<HttpRunTimeStopHandler>.Class)
+ .Build();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeStartHandler.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeStartHandler.cs b/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeStartHandler.cs
new file mode 100644
index 0000000..38acda6
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeStartHandler.cs
@@ -0,0 +1,50 @@
+/**
+ * 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;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ public class HttpRunTimeStartHandler : IObserver<RuntimeStart>
+ {
+ [Inject]
+ public HttpRunTimeStartHandler(HttpServer httpServer)
+ {
+ Server = httpServer;
+ }
+
+ public HttpServer Server { get; set; }
+
+ public void OnCompleted()
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnError(Exception error)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnNext(RuntimeStart value)
+ {
+ Server.StartServer();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeStopHandler.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeStopHandler.cs b/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeStopHandler.cs
new file mode 100644
index 0000000..7b687e6
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/HttpRuntimeStopHandler.cs
@@ -0,0 +1,50 @@
+/**
+ * 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;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ public class HttpRunTimeStopHandler : IObserver<RuntimeStop>
+ {
+ [Inject]
+ public HttpRunTimeStopHandler(HttpServer httpServer)
+ {
+ Server = httpServer;
+ }
+
+ public HttpServer Server { get; set; }
+
+ public void OnCompleted()
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnError(Exception error)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnNext(RuntimeStop value)
+ {
+ Server.StopServer();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/HttpServer.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/HttpServer.cs b/lang/cs/Tests/TangTests/ScenarioTest/HttpServer.cs
new file mode 100644
index 0000000..beea575
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/HttpServer.cs
@@ -0,0 +1,49 @@
+/**
+ * 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.Annotations;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ public class HttpServer
+ {
+ private Server _server;
+
+ [Inject]
+ public HttpServer(JettyHandler jettyHandler)
+ {
+ JettyHandler = jettyHandler;
+ _server = new Server(8080);
+ _server.SetHandler(jettyHandler);
+ }
+
+ public JettyHandler JettyHandler { get; set; }
+
+ public void StartServer()
+ {
+ _server.Start();
+ _server.Join();
+ }
+
+ public void StopServer()
+ {
+ _server.Stop();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/IHttpHandler.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/IHttpHandler.cs b/lang/cs/Tests/TangTests/ScenarioTest/IHttpHandler.cs
new file mode 100644
index 0000000..031c29c
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/IHttpHandler.cs
@@ -0,0 +1,27 @@
+/**
+ * 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.
+ */
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ public interface IHttpHandler
+ {
+ string GetUriSpecification();
+
+ void OnHttpRequest(HttpRequest request, Httpresponse response);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/JettyHandler.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/JettyHandler.cs b/lang/cs/Tests/TangTests/ScenarioTest/JettyHandler.cs
new file mode 100644
index 0000000..b027e91
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/JettyHandler.cs
@@ -0,0 +1,44 @@
+/**
+ * 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.Annotations;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ [NamedParameter()]
+ public class HttpEventHanlders : Name<ISet<IHttpHandler>>
+ {
+ }
+
+ public class JettyHandler //: AbstractHandler
+ {
+ [Inject]
+ public JettyHandler([Parameter(typeof(HttpEventHanlders))] ISet<IHttpHandler> httpeventHanlders)
+ {
+ HttpeventHanlders = httpeventHanlders;
+ }
+
+ public ISet<IHttpHandler> HttpeventHanlders { get; set; }
+
+ public void handle()
+ {
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/TestDefaultConstructor.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/TestDefaultConstructor.cs b/lang/cs/Tests/TangTests/ScenarioTest/TestDefaultConstructor.cs
new file mode 100644
index 0000000..fd09bbc
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/TestDefaultConstructor.cs
@@ -0,0 +1,79 @@
+/**
+ * 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.Annotations;
+using Org.Apache.Reef.Tang.Implementations;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ [TestClass]
+ public class TestDefaultConstructor
+ {
+ [TestMethod]
+ public void TestDefaultCOnstructorWithoutBinding()
+ {
+ var r = (A)TangFactory.GetTang().NewInjector().GetInstance(typeof(A));
+ System.Diagnostics.Debug.WriteLine(r.Instance);
+ }
+ }
+
+ class A
+ {
+ [Inject]
+ public A()
+ {
+ Instance = "default";
+ }
+ [Inject]
+ public A(B b)
+ {
+ Instance = "non default";
+ }
+
+ public string Instance { get; set; }
+ }
+
+ class B
+ {
+ [Inject]
+ public B()
+ {
+ Instance = "default";
+ }
+ [Inject]
+ public B(C c)
+ {
+ Instance = "non default";
+ }
+
+ public string Instance { get; set; }
+ }
+
+ class C
+ {
+ [Inject]
+ public C()
+ {
+ Instance = "default";
+ }
+
+ public string Instance { get; set; }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/TestHttpService.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/TestHttpService.cs b/lang/cs/Tests/TangTests/ScenarioTest/TestHttpService.cs
new file mode 100644
index 0000000..8d1e9d7
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/TestHttpService.cs
@@ -0,0 +1,194 @@
+/**
+ * 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.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.ScenarioTest
+{
+ [TestClass]
+ public class TestHttpService
+ {
+ [TestMethod]
+ public void HttpEventHanldersTest()
+ {
+ ConfigurationModule module =
+ new ConfigurationModuleBuilder()
+ .BindSetEntry<HttpEventHanlders, HttpServerReefEventHandler, IHttpHandler>(GenericType<HttpEventHanlders>.Class, GenericType<HttpServerReefEventHandler>.Class)
+ .BindSetEntry<HttpEventHanlders, HttpServerNrtEventHandler, IHttpHandler>(GenericType<HttpEventHanlders>.Class, GenericType<HttpServerNrtEventHandler>.Class)
+ .Build();
+
+ IConfiguration c = module.Build();
+ var service = TangFactory.GetTang().NewInjector(c).GetInstance<HttpServer>();
+ Assert.IsNotNull(service);
+
+ var j = TangFactory.GetTang().NewInjector(c).GetInstance<HttpRunTimeStartHandler>();
+ Assert.IsNotNull(j);
+ }
+
+ [TestMethod]
+ public void RuntimeStartHandlerTest()
+ {
+ ConfigurationModule module =
+ new ConfigurationModuleBuilder()
+ .BindSetEntry<RuntimeStartHandler, HttpRunTimeStartHandler, IObserver<RuntimeStart>>(
+ GenericType<RuntimeStartHandler>.Class, GenericType<HttpRunTimeStartHandler>.Class)
+ .Build();
+ IConfiguration clockConfiguraiton = module.Build();
+
+ RuntimeClock clock = TangFactory.GetTang().NewInjector(clockConfiguraiton).GetInstance<RuntimeClock>();
+ var rh = clock.ClockRuntimeStartHandler.Get();
+ Assert.AreEqual(rh.Count, 1);
+ foreach (var e in rh)
+ {
+ Assert.IsTrue(e is HttpRunTimeStartHandler);
+ HttpRunTimeStartHandler r = (HttpRunTimeStartHandler)e;
+ var s = r.Server;
+ Assert.AreEqual(s.JettyHandler.HttpeventHanlders.Count, 0); // no handlers are bound
+ }
+ }
+
+ [TestMethod]
+ public void RuntimeStartStopHandlerTest()
+ {
+ IConfiguration clockConfiguraiton = HttpRuntimeConfiguration.CONF.Build();
+ RuntimeClock clock = TangFactory.GetTang().NewInjector(clockConfiguraiton).GetInstance<RuntimeClock>();
+ var starts = clock.ClockRuntimeStartHandler.Get();
+ var stops = clock.ClockRuntimeStopHandler.Get();
+
+ HttpRunTimeStartHandler start = null;
+ HttpRunTimeStopHandler stop = null;
+
+ Assert.AreEqual(starts.Count, 1);
+ foreach (var e in starts)
+ {
+ Assert.IsTrue(e is HttpRunTimeStartHandler);
+ start = (HttpRunTimeStartHandler)e;
+ }
+
+ Assert.AreEqual(stops.Count, 1);
+ foreach (var e in stops)
+ {
+ Assert.IsTrue(e is HttpRunTimeStopHandler);
+ stop = (HttpRunTimeStopHandler)e;
+ }
+
+ Assert.AreEqual(start.Server, stop.Server);
+ Assert.AreEqual(start.Server.JettyHandler.HttpeventHanlders, stop.Server.JettyHandler.HttpeventHanlders);
+ Assert.AreSame(start.Server, stop.Server);
+ }
+
+ [TestMethod]
+ public void RuntimeStartHandlerMergeTest()
+ {
+ IConfiguration clockConfiguraiton = HttpHandlerConfiguration.CONF
+ .Set(HttpHandlerConfiguration.P,
+ GenericType<HttpServerReefEventHandler>.Class)
+ .Set(HttpHandlerConfiguration.P,
+ GenericType<HttpServerNrtEventHandler>.Class)
+ .Build();
+
+ RuntimeClock clock = TangFactory.GetTang().NewInjector(clockConfiguraiton).GetInstance<RuntimeClock>();
+
+ var rh = clock.ClockRuntimeStartHandler.Get();
+ Assert.AreEqual(rh.Count, 1);
+ foreach (var e in rh)
+ {
+ Assert.IsTrue(e is HttpRunTimeStartHandler);
+ HttpRunTimeStartHandler r = (HttpRunTimeStartHandler)e;
+ var s = r.Server;
+ foreach (IHttpHandler h in s.JettyHandler.HttpeventHanlders)
+ {
+ System.Diagnostics.Debug.WriteLine(h.GetUriSpecification());
+ }
+ }
+ }
+ }
+
+ public class HttpRequest
+ {
+ }
+
+ public class Httpresponse
+ {
+ }
+
+ public class HttpServerReefEventHandler : IHttpHandler
+ {
+ [Inject]
+ public HttpServerReefEventHandler()
+ {
+ }
+
+ public string GetUriSpecification()
+ {
+ return "/Reef";
+ }
+
+ public void OnHttpRequest(HttpRequest request, Httpresponse response)
+ {
+ //handle the event
+ }
+ }
+
+ public class HttpServerNrtEventHandler : IHttpHandler
+ {
+ [Inject]
+ public HttpServerNrtEventHandler()
+ {
+ }
+
+ public string GetUriSpecification()
+ {
+ return "/NRT";
+ }
+
+ public void OnHttpRequest(HttpRequest request, Httpresponse response)
+ {
+ }
+ }
+
+ public class Server
+ {
+ public Server(int port)
+ {
+ }
+
+ public void Start()
+ {
+ }
+
+ public void Stop()
+ {
+ }
+
+ public void Join()
+ {
+ }
+
+ public void SetHandler(JettyHandler handler)
+ {
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/TestRuntimeClock.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/TestRuntimeClock.cs b/lang/cs/Tests/TangTests/ScenarioTest/TestRuntimeClock.cs
new file mode 100644
index 0000000..c5ce694
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/TestRuntimeClock.cs
@@ -0,0 +1,253 @@
+/**
+ * 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 Org.Apache.Reef.Tang.Annotations;
+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.ScenarioTest
+{
+ [DefaultImplementation(typeof(RealTimer))]
+ public interface ITimer
+ {
+ int GetCurrent();
+
+ int GetDuration(int time);
+
+ bool IsReady(int time);
+ }
+
+ [DefaultImplementation(typeof(RuntimeClock))]
+ public interface IClock
+ {
+ DateTime CurrentTime();
+ }
+
+ public interface IEventHandler<T>
+ {
+ void OnNext(T value);
+ }
+
+ [TestClass]
+ public class TestSenarios
+ {
+ [TestMethod]
+ public void TestRuntimeClock()
+ {
+ var r = (RuntimeClock)TangFactory.GetTang().NewInjector().GetInstance(typeof(RuntimeClock));
+ Assert.IsNotNull(r);
+ r.CurrentTime();
+ }
+
+ [TestMethod]
+ public void TestEvaluatorRuntime()
+ {
+ ConfigurationModule module =
+ new ConfigurationModuleBuilder()
+ .BindSetEntry<RuntimeStartHandler, EvaluatorRuntime, IObserver<RuntimeStart>>(GenericType<RuntimeStartHandler>.Class, GenericType<EvaluatorRuntime>.Class)
+ .Build();
+ IConfiguration clockConfiguraiton = module.Build();
+
+ RuntimeClock clock = TangFactory.GetTang().NewInjector(clockConfiguraiton).GetInstance<RuntimeClock>();
+ var r = clock.ClockRuntimeStartHandler.Get();
+ Assert.AreEqual(r.Count, 1);
+ foreach (var e in r)
+ {
+ Assert.IsTrue(e is EvaluatorRuntime);
+ }
+ }
+ }
+
+ public class RuntimeClock : IClock
+ {
+ [Inject]
+ public RuntimeClock(ITimer timer,
+ [Parameter(typeof(StartHandler))] IInjectionFuture<ISet<IEventHandler<StartTime>>> startHandler,
+ [Parameter(typeof(RuntimeStartHandler))] IInjectionFuture<ISet<IObserver<RuntimeStart>>> runtimeStartHandler,
+ [Parameter(typeof(RuntimeStopHandler))] IInjectionFuture<ISet<IObserver<RuntimeStop>>> runtimeStopHandler)
+ {
+ this.ClockStartHandler = startHandler;
+ this.ClockRuntimeStartHandler = runtimeStartHandler;
+ this.ClockRuntimeStopHandler = runtimeStopHandler;
+ }
+
+ public IInjectionFuture<ISet<IObserver<RuntimeStart>>> ClockRuntimeStartHandler { get; set; }
+
+ public IInjectionFuture<ISet<IObserver<RuntimeStop>>> ClockRuntimeStopHandler { get; set; }
+
+ public IInjectionFuture<ISet<IEventHandler<StartTime>>> ClockStartHandler { get; set; }
+
+ public DateTime CurrentTime()
+ {
+ return DateTime.Now;
+ }
+ }
+
+ [NamedParameter(DefaultClass = typeof(MissingStartHandlerHandler),
+ Documentation = "Will be called upon the start event")]
+ public class StartHandler : Name<ISet<IEventHandler<StartTime>>>
+ {
+ }
+
+ /// <summary>
+ /// Bind this to an event handler to statically subscribe to the RuntimeStart Event
+ /// </summary>
+ [NamedParameter(Documentation = "Will be called upon the runtime start event",
+ DefaultClass = typeof(LoggingEventHandler<RuntimeStart>))]
+ public class RuntimeStartHandler : Name<ISet<IObserver<RuntimeStart>>>
+ {
+ }
+
+ [NamedParameter(documentation: "Will be called upon the runtime start event",
+ defaultClass: typeof(LoggingEventHandler<RuntimeStop>))]
+ public class RuntimeStopHandler : Name<ISet<IObserver<RuntimeStop>>>
+ {
+ }
+
+ public class StartTime : Time
+ {
+ public StartTime(long timestamp) : base(timestamp)
+ {
+ }
+ }
+
+ public class RuntimeStart : Time
+ {
+ public RuntimeStart(long timeStamp)
+ : base(timeStamp)
+ {
+ }
+ }
+
+ public class RuntimeStop : Time
+ {
+ public RuntimeStop(long timeStamp)
+ : base(timeStamp)
+ {
+ }
+ }
+
+ public class EvaluatorRuntime : IObserver<RuntimeStart>
+ {
+ [Inject]
+ public EvaluatorRuntime()
+ {
+ }
+
+ public void OnCompleted()
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnError(Exception error)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnNext(RuntimeStart value)
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public class LoggingEventHandler<T> : IObserver<T>
+ {
+ [Inject]
+ public LoggingEventHandler()
+ {
+ }
+
+ /// <summary>Logs the event</summary>
+ /// <param name="value">an event</param>
+ public void OnNext(T value)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnError(Exception error)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void OnCompleted()
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public abstract class Time : IComparable<Time>
+ {
+ private long timestamp;
+
+ public Time(long timestamp)
+ {
+ this.timestamp = timestamp;
+ }
+
+ public long GetTimeStamp()
+ {
+ return this.timestamp;
+ }
+
+ public int CompareTo(Time other)
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ public class MissingStartHandlerHandler : IEventHandler<StartTime>
+ {
+ [Inject]
+ public MissingStartHandlerHandler()
+ {
+ }
+
+ public void OnNext(StartTime value)
+ {
+ }
+ }
+
+ public class RealTimer : ITimer
+ {
+ [Inject]
+ public RealTimer()
+ {
+ }
+
+ public int GetCurrent()
+ {
+ return DateTime.Now.Millisecond;
+ }
+
+ public int GetDuration(int time)
+ {
+ return time - GetCurrent();
+ }
+
+ public bool IsReady(int time)
+ {
+ return GetDuration(time) <= 0;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/TestTrackingURIProvider.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/TestTrackingURIProvider.cs b/lang/cs/Tests/TangTests/ScenarioTest/TestTrackingURIProvider.cs
new file mode 100644
index 0000000..f97e9db
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/TestTrackingURIProvider.cs
@@ -0,0 +1,59 @@
+/**
+ * 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.Implementations;
+using Org.Apache.Reef.Tang.Interface;
+using Org.Apache.Reef.Tang.Util;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ [TestClass]
+ public class TestTrackingURIProvider
+ {
+ [TestMethod]
+ public void TrackingIdThroughNamedParameterTest()
+ {
+ ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder();
+ string trackingId = System.Environment.MachineName + ":8080";
+ cba.BindNamedParameter<TrackingId, string>(GenericType<TrackingId>.Class, trackingId);
+ string id = (string)TangFactory.GetTang().NewInjector(cba.Build()).GetNamedInstance(typeof(TrackingId));
+ Assert.AreEqual(id, trackingId);
+ }
+
+ [TestMethod]
+ public void DefaultTrackingIdThroughInterfaceTest()
+ {
+ string trackingId = System.Environment.MachineName + ":8080";
+ var id = TangFactory.GetTang().NewInjector().GetInstance<ITrackingURIProvider>();
+ Assert.AreEqual(id.GetURI(), trackingId);
+ }
+
+ [TestMethod]
+ public void TrackingIdThroughInterfaceTest()
+ {
+ ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder();
+ cba.BindNamedParameter<PortNumber, string>(GenericType<PortNumber>.Class, "8080");
+ string trackingId = System.Environment.MachineName + ":8080";
+ var id = TangFactory.GetTang().NewInjector().GetInstance<ITrackingURIProvider>();
+ Assert.AreEqual(id.GetURI(), trackingId);
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/TrackingURIProvider.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/TrackingURIProvider.cs b/lang/cs/Tests/TangTests/ScenarioTest/TrackingURIProvider.cs
new file mode 100644
index 0000000..d9200db
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/TrackingURIProvider.cs
@@ -0,0 +1,63 @@
+/**
+ * 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;
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ [DefaultImplementation(typeof(DefaultTrackingURIProvider))]
+ public interface ITrackingURIProvider
+ {
+ string GetURI();
+ }
+
+ [NamedParameter(DefaultValue = " ")]
+ public class TrackingId : Name<string>
+ {
+ }
+
+ [NamedParameter(DefaultValue = "8080")]
+ public class PortNumber : Name<string>
+ {
+ }
+
+ public class DefaultTrackingURIProvider : ITrackingURIProvider
+ {
+ private string port;
+
+ [Inject]
+ public DefaultTrackingURIProvider([Parameter(typeof(PortNumber))] string port)
+ {
+ this.port = port;
+ }
+
+ public string GetURI()
+ {
+ try
+ {
+ return System.Environment.MachineName + ":" + port;
+ }
+ catch (Exception)
+ {
+ return null;
+ }
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/ScenarioTest/TrackingYRIProvider.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/ScenarioTest/TrackingYRIProvider.cs b/lang/cs/Tests/TangTests/ScenarioTest/TrackingYRIProvider.cs
new file mode 100644
index 0000000..47d408b
--- /dev/null
+++ b/lang/cs/Tests/TangTests/ScenarioTest/TrackingYRIProvider.cs
@@ -0,0 +1,25 @@
+/**
+ * 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.
+ */
+
+namespace Org.Apache.Reef.Tang.Test.ScenarioTest
+{
+ class TrackingYRIProvider
+ {
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/AnInterface.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/AnInterface.cs b/lang/cs/Tests/TangTests/SmokeTest/AnInterface.cs
new file mode 100644
index 0000000..86f45cb
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/AnInterface.cs
@@ -0,0 +1,29 @@
+/**
+ * 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.Annotations;
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ [DefaultImplementation(typeof(AnInterfaceImplementation))]
+ public interface IAnInterface
+ {
+ void AMethod();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/AnInterfaceImplementation.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/AnInterfaceImplementation.cs b/lang/cs/Tests/TangTests/SmokeTest/AnInterfaceImplementation.cs
new file mode 100644
index 0000000..317cce1
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/AnInterfaceImplementation.cs
@@ -0,0 +1,65 @@
+/**
+ * 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.Annotations;
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ public class AnInterfaceImplementation : IAnInterface
+ {
+ private readonly int aMagicNumber;
+
+ [Inject]
+ AnInterfaceImplementation()
+ {
+ this.aMagicNumber = 42;
+ }
+
+ public void AMethod()
+ {
+ }
+
+ public override bool Equals(object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+
+ if (o == null)
+ {
+ return false;
+ }
+
+ AnInterfaceImplementation that = (AnInterfaceImplementation)o;
+
+ if (aMagicNumber != that.aMagicNumber)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public override int GetHashCode()
+ {
+ return aMagicNumber;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/CyclicDependency.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/CyclicDependency.cs b/lang/cs/Tests/TangTests/SmokeTest/CyclicDependency.cs
new file mode 100644
index 0000000..fb3e4dd
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/CyclicDependency.cs
@@ -0,0 +1,70 @@
+/**
+ * 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.Annotations;
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ public class CyclicDependency
+ {
+ private readonly CyclicDependencyClassOne one;
+ private readonly CyclicDependencyClassTwo two;
+
+ [Inject]
+ CyclicDependency(CyclicDependencyClassOne one, CyclicDependencyClassTwo two)
+ {
+ this.one = one;
+ this.two = two;
+ }
+
+ public override bool Equals(object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+
+ if (o == null)
+ {
+ return false;
+ }
+
+ CyclicDependency that = (CyclicDependency)o;
+
+ if (!one.Equals(that.one))
+ {
+ return false;
+ }
+
+ if (!two.Equals(that.two))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public override int GetHashCode()
+ {
+ int result = one.GetHashCode();
+ result = (31 * result) + two.GetHashCode();
+ return result;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/CyclicDependencyClassOne.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/CyclicDependencyClassOne.cs b/lang/cs/Tests/TangTests/SmokeTest/CyclicDependencyClassOne.cs
new file mode 100644
index 0000000..bbc5d4d
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/CyclicDependencyClassOne.cs
@@ -0,0 +1,61 @@
+/**
+ * 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.Annotations;
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ public class CyclicDependencyClassOne
+ {
+ private readonly CyclicDependencyClassTwo other;
+
+ [Inject]
+ CyclicDependencyClassOne(CyclicDependencyClassTwo other)
+ {
+ this.other = other;
+ }
+
+ public override bool Equals(object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+
+ if (o == null)
+ {
+ return false;
+ }
+
+ CyclicDependencyClassOne that = (CyclicDependencyClassOne)o;
+
+ if (!other.Equals(that.other))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public override int GetHashCode()
+ {
+ return other.GetHashCode();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/CyclicDependencyClassTwo.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/CyclicDependencyClassTwo.cs b/lang/cs/Tests/TangTests/SmokeTest/CyclicDependencyClassTwo.cs
new file mode 100644
index 0000000..ea79c78
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/CyclicDependencyClassTwo.cs
@@ -0,0 +1,55 @@
+/**
+ * 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.Annotations;
+using Org.Apache.Reef.Tang.Implementations;
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ public class CyclicDependencyClassTwo
+ {
+ private readonly IInjectionFuture<CyclicDependencyClassOne> other;
+
+ [Inject]
+ CyclicDependencyClassTwo(IInjectionFuture<CyclicDependencyClassOne> other)
+ {
+ this.other = other;
+ }
+
+ public override bool Equals(object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+
+ if (o == null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public override int GetHashCode()
+ {
+ return other.GetHashCode();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/Handler.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/Handler.cs b/lang/cs/Tests/TangTests/SmokeTest/Handler.cs
new file mode 100644
index 0000000..8cf1bfb
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/Handler.cs
@@ -0,0 +1,26 @@
+/**
+ * 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.
+ */
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ public interface IHandler<T>
+ {
+ void Process(T value);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/InjectableClass.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/InjectableClass.cs b/lang/cs/Tests/TangTests/SmokeTest/InjectableClass.cs
new file mode 100644
index 0000000..05291c1
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/InjectableClass.cs
@@ -0,0 +1,60 @@
+/**
+ * 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.Annotations;
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ public class InjectableClass
+ {
+ private readonly int magicNumber = -42;
+
+ [Inject]
+ InjectableClass()
+ {
+ }
+
+ public override bool Equals(object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+
+ if (o == null)
+ {
+ return false;
+ }
+
+ InjectableClass that = (InjectableClass)o;
+
+ if (magicNumber != that.magicNumber)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public override int GetHashCode()
+ {
+ return magicNumber;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/ListOfBaseTypes.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/ListOfBaseTypes.cs b/lang/cs/Tests/TangTests/SmokeTest/ListOfBaseTypes.cs
new file mode 100644
index 0000000..278a543
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/ListOfBaseTypes.cs
@@ -0,0 +1,108 @@
+/**
+ * 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.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Org.Apache.Reef.Tang.Annotations;
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ public class ListOfBaseTypes
+ {
+ private readonly IList<int> integers;
+ private readonly IList<double> doubles;
+ private readonly IList<string> strings;
+ private readonly IList<int> moreIntegers;
+
+ [Inject]
+ private ListOfBaseTypes([Parameter(typeof(ListOfBaseTypes.Integers))] IList<int> integers,
+ [Parameter(typeof(ListOfBaseTypes.Doubles))] IList<double> doubles,
+ [Parameter(typeof(ListOfBaseTypes.Strings))] IList<string> strings,
+ [Parameter(typeof(ListOfBaseTypes.MoreIntegers))] IList<int> moreIntegers)
+ {
+ this.integers = integers;
+ this.doubles = doubles;
+ this.strings = strings;
+ this.moreIntegers = moreIntegers;
+ }
+
+ public override bool Equals(object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+
+ if (o == null || !(o is ListOfBaseTypes))
+ {
+ return false;
+ }
+
+ ListOfBaseTypes that = (ListOfBaseTypes)o;
+
+ if (!Utilities.Utilities.Equals(doubles, that.doubles))
+ {
+ return false;
+ }
+
+ if (!Utilities.Utilities.Equals(integers, that.integers))
+ {
+ return false;
+ }
+
+ if (!Utilities.Utilities.Equals(strings, that.strings))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ public override int GetHashCode()
+ {
+ int result = integers.GetHashCode();
+ result = (31 * result) + doubles.GetHashCode();
+ result = (31 * result) + strings.GetHashCode();
+ return result;
+ }
+
+ [NamedParameter]
+ public class Integers : Name<IList<int>>
+ {
+ }
+
+ [NamedParameter(DefaultValues = new string[] { "1", "2", "3" })]
+ public class MoreIntegers : Name<IList<int>>
+ {
+ }
+
+ [NamedParameter]
+ public class Doubles : Name<IList<double>>
+ {
+ }
+
+ [NamedParameter]
+ public class Strings : Name<IList<string>>
+ {
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/2ae282de/lang/cs/Tests/TangTests/SmokeTest/ObjectTreeTest.cs
----------------------------------------------------------------------
diff --git a/lang/cs/Tests/TangTests/SmokeTest/ObjectTreeTest.cs b/lang/cs/Tests/TangTests/SmokeTest/ObjectTreeTest.cs
new file mode 100644
index 0000000..801a61b
--- /dev/null
+++ b/lang/cs/Tests/TangTests/SmokeTest/ObjectTreeTest.cs
@@ -0,0 +1,54 @@
+/**
+ * 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.Implementations;
+using Org.Apache.Reef.Tang.Interface;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Org.Apache.Reef.Tang.Test.SmokeTest
+{
+ [TestClass]
+ public class ObjectTreeTest
+ {
+ public static IConfiguration GetConfiguration()
+ {
+ return TestConfigurationModuleBuilder.CONF
+ .Set(TestConfigurationModuleBuilder.OPTIONALSTRING, TestConfigurationModuleBuilder.OptionaStringValue)
+ .Set(TestConfigurationModuleBuilder.REQUIREDSTRING, TestConfigurationModuleBuilder.RequiredStringValue)
+ .Build();
+ }
+
+ [TestMethod]
+ public void TestInstantiation()
+ {
+ IRootInterface root = TangFactory.GetTang().NewInjector(GetConfiguration()).GetInstance<IRootInterface>();
+ Assert.IsTrue(root.IsValid(), "Object instantiation left us in an inconsistent state.");
+ }
+
+ [TestMethod]
+ public void TestTwoInstantiations()
+ {
+ IRootInterface firstRoot = TangFactory.GetTang().NewInjector(GetConfiguration()).GetInstance<IRootInterface>();
+ IRootInterface secondRoot = TangFactory.GetTang().NewInjector(GetConfiguration()).GetInstance<IRootInterface>();
+
+ Assert.AreNotSame(firstRoot, secondRoot, "Two instantiations of the object tree should not be the same");
+ Assert.AreEqual(firstRoot, secondRoot, "Two instantiations of the object tree should be equal");
+ }
+ }
+}