http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tests/Tang/TestLegacyConstructors.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tests/Tang/TestLegacyConstructors.cs b/lang/cs/Org.Apache.REEF.Tang.Tests/Tang/TestLegacyConstructors.cs new file mode 100644 index 0000000..9bc860e --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang.Tests/Tang/TestLegacyConstructors.cs @@ -0,0 +1,73 @@ +/** + * 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.Interface; +using Org.Apache.REEF.Tang.Util; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.Apache.REEF.Tang.Implementations.Tang; + +namespace Org.Apache.REEF.Tang.Tests.Tang +{ + [TestClass] + public class TestLegacyConstructors + { + static ITang tang; + + [TestInitialize()] + public void TestSetup() + { + tang = TangFactory.GetTang(); + } + + [TestMethod] + public void TestLegacyConstructor() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + + IList<string> constructorArg = new List<string>(); + constructorArg.Add(ReflectionUtilities.GetAssemblyQualifiedName(typeof(int))); + constructorArg.Add(ReflectionUtilities.GetAssemblyQualifiedName(typeof(string))); + cb.RegisterLegacyConstructor(ReflectionUtilities.GetAssemblyQualifiedName(typeof(LegacyConstructor)), constructorArg); + //cb.Bind(typeof(LegacyConstructor), typeof(LegacyConstructor)); + cb.BindImplementation(GenericType<LegacyConstructor>.Class, GenericType<LegacyConstructor>.Class); + + IInjector i = tang.NewInjector(cb.Build()); + i.BindVolatileInstance(GenericType<int>.Class, 42); + i.BindVolatileInstance(GenericType<string>.Class, "The meaning of life is "); + LegacyConstructor l = i.GetInstance<LegacyConstructor>(); + Assert.AreEqual(42, l.X); + Assert.AreEqual("The meaning of life is ", l.Y); + } + } + + class LegacyConstructor + { + public LegacyConstructor(int x, string y) + { + this.X = x; + this.Y = y; + } + + public int X { get; set; } + + public string Y { get; set; } + } +} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tests/Tang/TestTang.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tests/Tang/TestTang.cs b/lang/cs/Org.Apache.REEF.Tang.Tests/Tang/TestTang.cs new file mode 100644 index 0000000..df18b7a --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang.Tests/Tang/TestTang.cs @@ -0,0 +1,1160 @@ +/** + * 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.Reflection; +using Org.Apache.REEF.Tang.Annotations; +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 Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.Apache.REEF.Tang.Examples; +using Org.Apache.REEF.Tang.Implementations.Tang; +using Org.Apache.REEF.Tang.Implementations.InjectionPlan; + +namespace Org.Apache.REEF.Tang.Tests.Tang +{ + [TestClass] + public class TestTang + { + private static ITang tang; + + private static Assembly asm = null; + + [ClassInitialize] + public static void ClassSetup(TestContext context) + { + asm = Assembly.Load(FileNames.Examples); + } + + [ClassCleanup] + public static void ClassCleanup() + { + } + + [TestInitialize()] + public void TestSetup() + { + MustBeSingleton.alreadyInstantiated = false; + tang = TangFactory.GetTang(); + } + + [TestCleanup()] + public void TestCleanup() + { + } + + [TestMethod] + public void TestSingleton() + { + IInjector injector = tang.NewInjector(); + Assert.IsNotNull(injector.GetInstance(typeof (TwoSingletons))); + Assert.IsNotNull(injector.GetInstance(typeof (TwoSingletons))); + } + + [TestMethod] + public void TestNotSingleton() + { + TwoSingletons obj = null; + Assert.IsNotNull(tang.NewInjector().GetInstance(typeof (TwoSingletons))); + try + { + obj = (TwoSingletons) tang.NewInjector().GetInstance(typeof (TwoSingletons)); + } + catch (InjectionException) + { + + } + Assert.IsNull(obj); + } + + [TestMethod] + public void TestRepeatedAmbiguousArgs() + { + INode node = null; + try + { + ICsConfigurationBuilder t = tang.NewConfigurationBuilder(); + node = + t.GetClassHierarchy() + .GetNode(ReflectionUtilities.GetAssemblyQualifiedName(typeof (RepeatedAmbiguousArgs))); + } + catch (ClassHierarchyException) + { + } + Assert.IsNull(node); + } + + [TestMethod] + public void TestRepeatedOKArgs() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + cb.BindNamedParameter<RepeatedNamedArgs.A, Int32>(GenericType<RepeatedNamedArgs.A>.Class, "1"); + cb.BindNamedParameter<RepeatedNamedArgs.B, Int32>(GenericType<RepeatedNamedArgs.B>.Class, "2"); + + IInjector injector = tang.NewInjector(cb.Build()); + injector.GetInstance(typeof (RepeatedNamedArgs)); + } + + // NamedParameter A has no default_value, so this should throw. + [TestMethod] + public void TestOneNamedFailArgs() + { + string msg = null; + try + { + tang.NewInjector().GetInstance<OneNamedSingletonArgs>(); + msg = + "Cannot inject OneNamedSingletonArgs: cOneNamedSingletonArgs missing argument OneNamedSingletonArgs+A"; + } + catch (Exception) + { + } + Assert.IsNull(msg); + } + + // NamedParameter A get's bound to a volatile, so this should succeed. + [TestMethod] + public void TestOneNamedSingletonOKArgs() + { + IInjector i = tang.NewInjector(); + i.BindVolatileParameter(GenericType<OneNamedSingletonArgs.A>.Class, i.GetInstance<MustBeSingleton>()); + OneNamedSingletonArgs o = i.GetInstance<OneNamedSingletonArgs>(); + Assert.IsNotNull(o); + } + + + [TestMethod] + public void TestRepeatedNamedArgs() + { + IInjector i = tang.NewInjector(); + i.BindVolatileParameter(GenericType<RepeatedNamedSingletonArgs.A>.Class, + (MustBeSingleton) i.GetInstance(typeof (MustBeSingleton))); + i.BindVolatileParameter(GenericType<RepeatedNamedSingletonArgs.B>.Class, + (MustBeSingleton) i.GetInstance(typeof (MustBeSingleton))); + i.GetInstance(typeof (RepeatedNamedSingletonArgs)); + } + + [TestMethod] + public void testStraightforwardBuild() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + cb.BindImplementation(GenericType<Interf>.Class, GenericType<Impl>.Class); + tang.NewInjector(cb.Build()).GetInstance(typeof (Interf)); + } + + [TestMethod] + public void TestOneNamedStringArgCantRebind() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + OneNamedStringArg a = + (OneNamedStringArg) tang.NewInjector(cb.Build()).GetInstance(typeof (OneNamedStringArg)); + Assert.AreEqual("default", a.s); + cb.BindNamedParameter<OneNamedStringArg.A, string>(GenericType<OneNamedStringArg.A>.Class, "not default"); + IInjector i = tang.NewInjector(cb.Build()); + Assert.AreEqual("not default", ((OneNamedStringArg) i.GetInstance(typeof (OneNamedStringArg))).s); + string msg = null; + try + { + i.BindVolatileParameter(GenericType<OneNamedStringArg.A>.Class, "volatile"); + msg = + "Attempt to re-bind named parameter Org.Apache.REEF.Tang.OneNamedStringArg$A. Old value was [not default] new value is [volatile]"; + } + catch (Exception) + { + } + Assert.IsNull(msg); + } + + [TestMethod] + public void TestOneNamedStringArgBind() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + OneNamedStringArg a = tang.NewInjector(cb.Build()).GetInstance<OneNamedStringArg>(); + Assert.AreEqual("default", a.s); + cb.BindNamedParameter<OneNamedStringArg.A, string>(GenericType<OneNamedStringArg.A>.Class, "not default"); + IInjector i = tang.NewInjector(cb.Build()); + Assert.AreEqual("not default", i.GetInstance<OneNamedStringArg>().s); + } + + [TestMethod] + public void TestOneNamedStringArgVolatile() + { + OneNamedStringArg a = tang.NewInjector().GetInstance<OneNamedStringArg>(); + Assert.AreEqual("default", a.s); + IInjector i = tang.NewInjector(); + i.BindVolatileParameter(GenericType<OneNamedStringArg.A>.Class, "volatile"); + Assert.AreEqual("volatile", i.GetInstance<OneNamedStringArg>().s); + } + + [TestMethod] + public void TestTwoNamedStringArgsBind() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + TwoNamedStringArgs a = tang.NewInjector(cb.Build()).GetInstance<TwoNamedStringArgs>(); + Assert.AreEqual("defaultA", a.a); + Assert.AreEqual("defaultB", a.b); + cb.BindNamedParameter<TwoNamedStringArgs.A, string>(GenericType<TwoNamedStringArgs.A>.Class, "not defaultA"); + cb.BindNamedParameter<TwoNamedStringArgs.B, string>(GenericType<TwoNamedStringArgs.B>.Class, "not defaultB"); + IInjector i = tang.NewInjector(cb.Build()); + Assert.AreEqual("not defaultA", + i.GetInstance<TwoNamedStringArgs>().a); + Assert.AreEqual("not defaultB", + i.GetInstance<TwoNamedStringArgs>().b); + } + + [TestMethod] + public void TestTwoNamedStringArgsBindVolatile() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + TwoNamedStringArgs a = tang.NewInjector(cb.Build()).GetInstance<TwoNamedStringArgs>(); + Assert.AreEqual("defaultA", a.a); + Assert.AreEqual("defaultB", a.b); + IInjector i = tang.NewInjector(cb.Build()); + i.BindVolatileParameter(GenericType<TwoNamedStringArgs.A>.Class, "not defaultA"); + i.BindVolatileParameter(GenericType<TwoNamedStringArgs.B>.Class, "not defaultB"); + Assert.AreEqual("not defaultA", + i.GetInstance<TwoNamedStringArgs>().a); + Assert.AreEqual("not defaultB", + i.GetInstance<TwoNamedStringArgs>().b); + } + + [TestMethod] + public void TestTwoNamedStringArgsReBindVolatileFail() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + TwoNamedStringArgs a = tang.NewInjector(cb.Build()).GetInstance<TwoNamedStringArgs>(); + Assert.AreEqual("defaultA", a.a); + Assert.AreEqual("defaultB", a.b); + cb.BindNamedParameter<TwoNamedStringArgs.A, string>(GenericType<TwoNamedStringArgs.A>.Class, "not defaultA"); + cb.BindNamedParameter<TwoNamedStringArgs.B, string>(GenericType<TwoNamedStringArgs.B>.Class, "not defaultB"); + IInjector i = tang.NewInjector(cb.Build()); + string msg = null; + try + { + i.BindVolatileParameter(GenericType<TwoNamedStringArgs.A>.Class, "not defaultA"); + i.BindVolatileParameter(GenericType<TwoNamedStringArgs.B>.Class, "not defaultB"); + msg = + "Attempt to re-bind named parameter TwoNamedStringArgs+A. Old value was [not defaultA] new value is [not defaultA]"; + } + catch (Exception) + { + } + Assert.IsNull(msg); + } + + [TestMethod] + public void TestBextendsAinjectA() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + cb.BindImplementation(GenericType<BextendsAinjectA.A>.Class, GenericType<BextendsAinjectA.A>.Class); + BextendsAinjectA.A a = tang.NewInjector(cb.Build()).GetInstance<BextendsAinjectA.A>(); + Assert.IsNotNull(a); + } + + [TestMethod] + public void TestNamedImpl() + { + ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder(new string[] { FileNames.Examples }); + cb.BindNamedParameter<AImplName, Aimpl, INamedImplA>(GenericType<AImplName>.Class, GenericType<Aimpl>.Class); + cb.BindNamedParameter<BImplName, Bimpl, INamedImplA>(GenericType<BImplName>.Class, GenericType<Bimpl>.Class); + + IInjector i = TangFactory.GetTang().NewInjector(cb.Build()); + Aimpl a1 = (Aimpl) i.GetNamedInstance<AImplName, INamedImplA>(GenericType<AImplName>.Class); + Aimpl a2 = (Aimpl) i.GetNamedInstance<AImplName, INamedImplA>(GenericType<AImplName>.Class); + Bimpl b1 = (Bimpl) i.GetNamedInstance<BImplName, INamedImplA>(GenericType<BImplName>.Class); + Bimpl b2 = (Bimpl) i.GetNamedInstance<BImplName, INamedImplA>(GenericType<BImplName>.Class); + Assert.AreSame(a1, a2); + Assert.AreSame(b1, b2); + } + + [TestMethod] + public void testThreeConstructors() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + cb.BindNamedParameter<ThreeConstructors.TCInt, Int32>(GenericType<ThreeConstructors.TCInt>.Class, "1"); + cb.BindNamedParameter<ThreeConstructors.TCString, string>(GenericType<ThreeConstructors.TCString>.Class, "s"); + ThreeConstructors tc = tang.NewInjector(cb.Build()).GetInstance<ThreeConstructors>(); + Assert.AreEqual(1, tc.i); + Assert.AreEqual("s", tc.s); + + cb = tang.NewConfigurationBuilder(); + cb.BindNamedParameter<ThreeConstructors.TCInt, Int32>(GenericType<ThreeConstructors.TCInt>.Class, "1"); + tc = tang.NewInjector(cb.Build()).GetInstance<ThreeConstructors>(); + Assert.AreEqual(1, tc.i); + Assert.AreEqual("default", tc.s); + + cb = tang.NewConfigurationBuilder(); + cb.BindNamedParameter<ThreeConstructors.TCString, string>(GenericType<ThreeConstructors.TCString>.Class, "s"); + tc = tang.NewInjector(cb.Build()).GetInstance<ThreeConstructors>(); + Assert.AreEqual(-1, tc.i); + Assert.AreEqual("s", tc.s); + + cb = tang.NewConfigurationBuilder(); + cb.BindNamedParameter<ThreeConstructors.TCFloat, float>(GenericType<ThreeConstructors.TCFloat>.Class, "2"); + tc = tang.NewInjector(cb.Build()).GetInstance<ThreeConstructors>(); + Assert.AreEqual(-1, tc.i); + Assert.AreEqual("default", tc.s); + Assert.AreEqual(2.0f, tc.f, 1e-9); + } + + [TestMethod] + public void TestThreeConstructorsAmbiguous() + { + string msg = null; + + try + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + cb.BindNamedParameter<ThreeConstructors.TCString, string>(GenericType<ThreeConstructors.TCString>.Class, "s"); + cb.BindNamedParameter<ThreeConstructors.TCFloat, float>(GenericType<ThreeConstructors.TCFloat>.Class, "-2"); + + // Ambiguous; there is a constructor that takes a string, and another that + // takes a float, but none that takes both. + tang.NewInjector(cb.Build()).GetInstance<ThreeConstructors>(); + msg = @"Cannot inject Org.Apache.REEF.Tang.Tests.Tang.ThreeConstructors, Org.Apache.REEF.Tang.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null " + + "Ambiguous subplan Org.Apache.REEF.Tang.Tests.Tang.ThreeConstructors, Org.Apache.REEF.Tang.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null " + + "new Org.Apache.REEF.Tang.Tests.Tang.ThreeConstructors(System.String Org.Apache.REEF.Tang.Tests.Tang.ThreeConstructors+TCString = s) " + + "new Org.Apache.REEF.Tang.Tests.Tang.ThreeConstructors(System.Single Org.Apache.REEF.Tang.Tests.Tang.ThreeConstructors+TCFloat = -2) "; + } + catch (InjectionException e) + { + System.Diagnostics.Debug.WriteLine(e); + } + Assert.IsNull(msg); + } + + [TestMethod] + public void TestTwoConstructorsAmbiguous() + { + string msg = null; + try + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + cb.BindNamedParameter<TwoConstructors.TCInt, Int32>(GenericType<TwoConstructors.TCInt>.Class, "1"); + cb.BindNamedParameter<ThreeConstructors.TCString, string>(GenericType<ThreeConstructors.TCString>.Class, "s"); + tang.NewInjector(cb.Build()).GetInstance<TwoConstructors>(); + msg = @"Cannot inject Org.Apache.REEF.Tang.Tests.Tang.TwoConstructors, Org.Apache.REEF.Tang.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null "+ + "Ambiguous subplan Org.Apache.REEF.Tang.Tests.Tang.TwoConstructors, Org.Apache.REEF.Tang.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" + + "new Org.Apache.REEF.Tang.Tests.Tang.TwoConstructors(System.Int32 Org.Apache.REEF.Tang.Tests.Tang.TwoConstructors+TCInt = 1, System.String Org.Apache.REEF.Tang.Tests.Tang.TwoConstructors+TCString = s)" + + "new Org.Apache.REEF.Tang.Tests.Tang.TwoConstructors(System.String Org.Apache.REEF.Tang.Tests.Tang.TwoConstructors+TCString = s, System.Int32 Org.Apache.REEF.Tang.Tests.Tang.TwoConstructors+TCInt = 1)"; + } + catch (InjectionException e) + { + System.Diagnostics.Debug.WriteLine(e); + } + Assert.IsNull(msg); + } + + [TestMethod] + public void TestSingletonWithMultipleConstructors() + { + ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder(); + cb.BindImplementation(GenericType<SMC>.Class, GenericType<SingletonMultiConst>.Class); + cb.BindNamedParameter<SingletonMultiConst.A, string>(GenericType<SingletonMultiConst.A>.Class, "foo"); + IInjector i = TangFactory.GetTang().NewInjector(cb.Build()); + var o = i.GetInstance<SMC>(); + Assert.IsNotNull(o); + } + + [TestMethod] + public void TestSingletonWithMoreSpecificConstructors() + { + ICsConfigurationBuilder cb = TangFactory.GetTang().NewConfigurationBuilder(); + cb.BindImplementation(GenericType<SMC>.Class, GenericType<SingletonMultiConst>.Class); + cb.BindNamedParameter<SingletonMultiConst.A, string>(GenericType<SingletonMultiConst.A>.Class, "foo"); + cb.BindNamedParameter<SingletonMultiConst.B, string>(GenericType<SingletonMultiConst.B>.Class, "bar"); + IInjector i = TangFactory.GetTang().NewInjector(cb.Build()); + var o = i.GetInstance<SMC>(); + Assert.IsNotNull(o); + } + + [TestMethod] + public void TestInjectInjector() + { + IInjector i = TangFactory.GetTang().NewInjector(); + var ii = (InjectInjector) i.GetInstance(typeof(InjectInjector)); + //Assert.IsTrue(ii.i is IInjector); + Assert.AreNotSame(i, ii.i); + } + + [TestMethod] + public void TestGenericEventHandlers() + { + ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder(); + cba.BindNamedParameter<ABCName.XName, ABCName.XXBB, ABCName.X<ABCName.BB>>(GenericType<ABCName.XName>.Class, GenericType<ABCName.XXBB>.Class); + TangFactory.GetTang().NewInjector(cba.Build()).GetNamedInstance(typeof(ABCName.XName)); + + ICsConfigurationBuilder cbb = TangFactory.GetTang().NewConfigurationBuilder(); + cbb.BindNamedParameter<ABCName.XName, ABCName.XBB, ABCName.X<ABCName.BB>>(GenericType<ABCName.XName>.Class, GenericType<ABCName.XBB>.Class); + TangFactory.GetTang().NewInjector(cbb.Build()).GetNamedInstance(typeof(ABCName.XName)); + } + + [TestMethod] + public void TestGenericEventHandlerDefaults() + { + ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder(); + var xbb = TangFactory.GetTang().NewInjector(cba.Build()).GetNamedInstance(typeof(ABCName.XNameDB)); + Assert.IsTrue(xbb is ABCName.XBB); + } + + [TestMethod] + public void TestGenericEventHandlerDefaultsGoodTreeIndirection() + { + ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder(); + var o = TangFactory.GetTang().NewInjector(cba.Build()).GetNamedInstance(typeof(ABCName.XNameDDAA)); + Assert.IsTrue(o is ABCName.XXBB); + } + + [TestMethod] + public void TestGenericUnrelatedGenericTypeParameters() + { + string msg = null; + try + { + ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder(); + TangFactory.GetTang().NewInjector(cba.Build()).GetNamedInstance(typeof(WaterBottleName)); + msg = + "class WaterBottleName defines a default class GasCan with a type that does not extend its target's type Water"; + } + catch (ClassHierarchyException e) + { + System.Diagnostics.Debug.WriteLine(e); + } + Assert.IsNull(msg); + } + + [TestMethod] + public void TestGenericInterfaceUnboundTypeParametersName() + { + ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder(); + var o = TangFactory.GetTang().NewInjector(cba.Build()).GetNamedInstance(typeof(FooEventHandler)); + Assert.IsTrue(o is MyEventHandler<Foo>); + } + + [TestMethod] + public void TestGenericInterfaceUnboundTypeParametersNameIface() + { + ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder(); + var o = TangFactory.GetTang().NewInjector(cba.Build()).GetNamedInstance(typeof(IfaceEventHandler)); + Assert.IsTrue(o is IEventHandler<SomeIface>); + } + + [TestMethod] + public void TestGenericInterfaceUnboundTypeParametersIface() + { + string msg = null; + try + { + ICsConfigurationBuilder cba = TangFactory.GetTang().NewConfigurationBuilder(); + TangFactory.GetTang().NewInjector(cba.Build()).IsInjectable(typeof(MyEventHandlerIface)); + msg = + "interface MyEventHandlerIface declares its default implementation to be non-subclass class MyEventHandler"; + } + catch (ClassHierarchyException e) + { + System.Diagnostics.Debug.WriteLine(e); + } + Assert.IsNull(msg); + } + + [TestMethod] + public void TestWantSomeHandlers() + { + var o = TangFactory.GetTang().NewInjector().GetInstance<WantSomeHandlers>(); + Assert.IsNotNull(o); + } + + [TestMethod] + public void TestWantSomeHandlersBadOrder() + { + IInjector i = TangFactory.GetTang().NewInjector(); + var o1 = i.GetInstance<IAHandler>(); + var o2 = i.GetInstance<IBHandler>(); + var o3 = i.GetInstance<WantSomeFutureHandlers>(); + Assert.IsTrue(o1 is AHandlerImpl); + Assert.IsTrue(o2 is BHandlerImpl); + Assert.IsNotNull(o3); + } + + [TestMethod] + public void TestWantSomeFutureHandlersAlreadyBoundVolatile() + { + IInjector i = TangFactory.GetTang().NewInjector(); + i.BindVolatileInstance(GenericType<IAHandler>.Class, new AHandlerImpl()); + i.BindVolatileInstance(GenericType<IBHandler>.Class, new BHandlerImpl()); + i.GetInstance<WantSomeFutureHandlers>(); + } + + [TestMethod] + public void TestWantSomeFutureHandlers() + { + TangFactory.GetTang().NewInjector().GetInstance<WantSomeFutureHandlers>(); + } + + [TestMethod] + public void TestWantSomeFutureHandlersName() + { + TangFactory.GetTang().NewInjector().GetInstance<WantSomeFutureHandlersName>(); + } + + [TestMethod] + public void TestReuseFailedInjector() + { + IInjector i = TangFactory.GetTang().NewInjector(); + try + { + i.GetInstance<Fail>(); + Assert.Fail("Injecting Fail should not have worked!"); + } catch (InjectionException) + { + i.GetInstance<Pass>(); + } + } + + [TestMethod] + public void TestMultipleLayersFromAbstractClass() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + cb.BindImplementation(GenericType<MultiLayer>.Class, GenericType<LowerLayer>.Class); + MultiLayer o = tang.NewInjector(cb.Build()).GetInstance<MultiLayer>(); + Assert.IsNotNull(o); + } + + [TestMethod] + public void TestMultipleLayersFromInterface() + { + ICsConfigurationBuilder cb = tang.NewConfigurationBuilder(); + cb.BindImplementation(GenericType<IMultiLayer>.Class, GenericType<LowerLayerImpl>.Class); + IMultiLayer o = tang.NewInjector(cb.Build()).GetInstance<IMultiLayer>(); + Assert.IsNotNull(o); + } + } + + internal class InjectInjector + { + public IInjector i; + + [Inject] + private InjectInjector(IInjector i) + { + this.i = i; + } + } + + internal class MustBeSingleton + { + public static bool alreadyInstantiated; + + [Inject] + public MustBeSingleton() + { + if (alreadyInstantiated) + { + throw new IllegalStateException("Can't instantiate me twice!"); + } + alreadyInstantiated = true; + } + } + + internal class SubSingleton + { + [Inject] + private SubSingleton(MustBeSingleton a) + { + // Does not call super + } + } + + internal class TwoSingletons + { + [Inject] + private TwoSingletons(SubSingleton a, MustBeSingleton b) + { + } + } + + internal class RepeatedAmbiguousArgs + { + [Inject] + private RepeatedAmbiguousArgs(int x, int y) + { + } + } + + public class RepeatedNamedArgs + { + [NamedParameter] + public class A : Name<Int32> + { + } + + [NamedParameter()] + public class B : Name<Int32> + { + } + + [Inject] + public RepeatedNamedArgs([Parameter(typeof (A))] int x, [Parameter(Value = typeof (B))] int y) + { + } + } + + internal class RepeatedNamedSingletonArgs + { + [NamedParameter()] + public class A : Name<MustBeSingleton> + { + } + + [NamedParameter()] + public class B : Name<MustBeSingleton> + { + } + + [Inject] + public RepeatedNamedSingletonArgs([Parameter(typeof (A))] MustBeSingleton a, + [Parameter(typeof (B))] MustBeSingleton b) + { + } + } + + internal class OneNamedSingletonArgs + { + [NamedParameter()] + public class A : Name<MustBeSingleton> + { + } + + [NamedParameter()] + public class B : Name<MustBeSingleton> + { + } + + [Inject] + public OneNamedSingletonArgs([Parameter(typeof (A))] MustBeSingleton a) + { + } + } + + [NamedParameter(Documentation = "woo", ShortName = "woo", DefaultValue = "42")] + internal class Param : Name<Int32> + { + } + + internal interface Interf + { + } + + internal class Impl : Interf + { + [Inject] + private Impl([Parameter(Value = typeof (Param))] int p) + { + } + } + + internal class OneNamedStringArg + { + [NamedParameter(DefaultValue = "default")] + public class A : Name<string> + { + } + + public string s; + + [Inject] + private OneNamedStringArg([Parameter(typeof (A))] string s) + { + this.s = s; + } + } + + internal class TwoNamedStringArgs + { + [NamedParameter(DefaultValue = "defaultA")] + public class A : Name<string> + { + } + + [NamedParameter(DefaultValue = "defaultB")] + public class B : Name<string> + { + } + + public string a; + public string b; + + [Inject] + private TwoNamedStringArgs([Parameter(typeof (A))] string a, [Parameter(typeof (B))] String b) + { + this.a = a; + this.b = b; + } + } + + internal class BextendsAinjectA + { + public class A + { + [Inject] + public A() + { + } + } + + public class B : A + { + } + } + + public interface INamedImplA + { + } + + public interface INamedImplC + { + } + + [NamedParameter] + public class AImplName : Name<INamedImplA> + { + } + + [NamedParameter] + public class BImplName : Name<INamedImplA> + { + } + + [NamedParameter] + public class CImplName : Name<INamedImplC> + { + } + + public class Aimpl : INamedImplA + { + [Inject] + private Aimpl() + { + } + } + + public class Bimpl : INamedImplA + { + [Inject] + private Bimpl() + { + } + } + + public class Cimpl : INamedImplC + { + [Inject] + private Cimpl() + { + } + } + + internal class NamedImpl + { + [NamedParameter] + public class AImplName : Name<A> + { + } + + [NamedParameter] + public class BImplName : Name<A> + { + } + + [NamedParameter] + public class CImplName : Name<C> + { + } + + public interface A + { + } + + public interface C + { + } + + public class Aimpl : A + { + [Inject] + private Aimpl() + { + } + } + + public class Bimpl : A + { + [Inject] + private Bimpl() + { + } + } + + public class Cimpl : C + { + [Inject] + private Cimpl() + { + } + } + + public class ABtaker + { + [Inject] + private ABtaker([Parameter(typeof (AImplName))] INamedImplA a, [Parameter(typeof (BImplName))] INamedImplA b) + { + //Assert.IsTrue(a is Aimpl, "AImplName must be instance of Aimpl"); + //Assert.IsTrue(b is Bimpl, "BImplName must be instance of Bimpl"); + } + } + } + + class ThreeConstructors + { + public int i; + public string s; + public float f; + + [NamedParameter] + public class TCInt : Name<Int32> {} + + [NamedParameter] + public class TCString : Name<string> { } + + [NamedParameter] + public class TCFloat : Name<float> {} + + [Inject] + public ThreeConstructors([Parameter(typeof(TCInt))] int i, [Parameter(typeof(TCString))] string s) + { + this.i = i; + this.s = s; + this.f = -1.0f; + } + + [Inject] + public ThreeConstructors([Parameter(typeof(TCString))] string s) : this(-1, s) + { + } + + [Inject] + public ThreeConstructors([Parameter(typeof(TCInt))] int i) : this(i, "default") + { + } + + [Inject] + public ThreeConstructors([Parameter(typeof(TCFloat))] float f) + { + this.i = -1; + this.s = "default"; + this.f = f; + } + } + + class TwoConstructors + { + public int i; + public string s; + + [NamedParameter] + public class TCInt : Name<Int32> { } + + [NamedParameter] + public class TCString : Name<string> { } + + + [Inject] + public TwoConstructors([Parameter(typeof(TCInt))] int i, [Parameter(typeof(TCString))] string s) + { + this.i = i; + this.s = s; + } + + [Inject] + public TwoConstructors([Parameter(typeof(TCString))] string s, [Parameter(typeof(TCInt))] int i) + { + this.i = i; + this.s = s; + } + } + + interface SMC { } + + class SingletonMultiConst : SMC + { + [NamedParameter] + public class A : Name<string> { } + + [NamedParameter] + public class B : Name<string> { } + + [Inject] + public SingletonMultiConst([Parameter(typeof(A))] String a) { } + + [Inject] + public SingletonMultiConst([Parameter(typeof(A))] string a, [Parameter(typeof(B))] string b) { } + } + + internal class ABCName + { + public interface X<T> + { + } + + [NamedParameter] + public class XName : Name<X<BB>> + { + } + + //[NamedParameter(DefaultClass = typeof(XAA))] + //public class XNameDA : Name<X<BB>> + //{ + //} + + [NamedParameter(DefaultClass = typeof(XBB))] + public class XNameDB : Name<X<BB>> + { + } + + //[NamedParameter(DefaultClass = typeof(XCC))] + //public class XNameDC : Name<X<BB>> + //{ + //} + + //[NamedParameter(DefaultClass = typeof(XCC))] + //public class XNameDAA : Name<XBB> + //{ + //} + + [NamedParameter(DefaultClass = typeof(XXBB))] + public class XNameDDAA : Name<XBB> + { + } + + [DefaultImplementation(typeof(AA))] + public class AA + { + [Inject] + public AA() + { + } + } + + [DefaultImplementation(typeof(BB))] + public class BB : AA + { + [Inject] + public BB() + { + } + } + + [DefaultImplementation(typeof(CC))] + public class CC : BB + { + [Inject] + public CC() + { + } + } + + public class XAA : X<AA> + { + [Inject] + public XAA(AA aa) + { + } + } + + [DefaultImplementation(typeof(XBB))] + public class XBB : X<BB> + { + [Inject] + public XBB(BB aa) + { + } + } + + public class XXBB : XBB + { + [Inject] + public XXBB(BB aa) + : base(aa) + { + } + } + + public class XCC : X<CC> + { + [Inject] + public XCC(CC aa) + { + } + } + } + + interface Bottle<Y> { + + } + class WaterBottle : Bottle<Water> + { + } + class GasCan : Bottle<Gas> + { + } + class Water {} + class Gas {} + + [NamedParameter(DefaultClass=typeof(GasCan))] + class WaterBottleName : Name<Bottle<Water>> { } + + interface IEventHandler <T> { } + class MyEventHandler<T> : IEventHandler<T> + { + [Inject] + MyEventHandler () { } + } + + [DefaultImplementation(typeof(MyEventHandler<Foo>))] + interface MyEventHandlerIface : IEventHandler<Foo> { } + + [NamedParameter(DefaultClass = typeof(MyEventHandler<Foo>))] + class FooEventHandler : Name<IEventHandler<Foo>> { } + + internal class Foo : Name<String> + { + } + + interface SomeIface { } + [NamedParameter(DefaultClass = typeof(MyEventHandler<SomeIface>))] + class IfaceEventHandler : Name<IEventHandler<SomeIface>> { } + + class AH + { + [Inject] + AH() {} + } + class BH + { + [Inject] + BH() {} + } + + [DefaultImplementation(typeof(AHandlerImpl))] + interface IAHandler : IEventHandler<AH> { } + + [DefaultImplementation(typeof(BHandlerImpl))] + interface IBHandler : IEventHandler<BH> { } + + class AHandlerImpl : IAHandler + { + [Inject] + public AHandlerImpl() { } + } + class BHandlerImpl : IBHandler + { + [Inject] + public BHandlerImpl() { } + } + + class WantSomeHandlers + { + [Inject] + WantSomeHandlers(IAHandler a, IBHandler b) { } + } + class WantSomeFutureHandlers + { + [Inject] + WantSomeFutureHandlers(IInjectionFuture<IAHandler> a, IInjectionFuture<IBHandler> b) { } + } + + [NamedParameter(DefaultClass = typeof(AHandlerImpl))] + class AHandlerName : Name<IEventHandler<AH>> { } + + [NamedParameter(DefaultClass = typeof(BHandlerImpl))] + class BHandlerName : Name<IEventHandler<BH>> { } + + class WantSomeFutureHandlersName + { + [Inject] + WantSomeFutureHandlersName( + [Parameter(typeof (AHandlerName))] IInjectionFuture<IEventHandler<AH>> a, + [Parameter(typeof (BHandlerName))] IInjectionFuture<IEventHandler<BH>> b) + { + } + } + + class Pass + { + [Inject] + public Pass() + { + } + } + + class Fail + { + [Inject] + public Fail() + { + throw new NotSupportedException(); + } + } + + abstract class MultiLayer + { + + } + + class MiddleLayer : MultiLayer + { + [Inject] + public MiddleLayer() { } + } + + class LowerLayer : MiddleLayer + { + [Inject] + public LowerLayer() { } + } + + interface IMultiLayer + { + + } + + class MiddleLayerImpl : IMultiLayer + { + [Inject] + public MiddleLayerImpl() { } + } + + class LowerLayerImpl : MiddleLayerImpl + { + [Inject] + public LowerLayerImpl() { } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tests/Utilities/TestUtilities.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tests/Utilities/TestUtilities.cs b/lang/cs/Org.Apache.REEF.Tang.Tests/Utilities/TestUtilities.cs new file mode 100644 index 0000000..2b274a7 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang.Tests/Utilities/TestUtilities.cs @@ -0,0 +1,294 @@ +/** + * 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.Tang.Formats; +using Org.Apache.REEF.Tang.Interface; +using Org.Apache.REEF.Tang.Util; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Org.Apache.REEF.Tang.Examples; + +namespace Org.Apache.REEF.Tang.Tests.Utilities +{ + [TestClass] + public class TestUtilities + { + [TestMethod] + public void TestIsAssignableFromIgnoreGeneric() + { + var result = ReflectionUtilities.IsAssignableFromIgnoreGeneric(typeof(IExternalConstructor<>), typeof(Foo)); + Assert.IsTrue(result); + } + + [TestMethod] + public void TestIsAssignableFromIgnoreGenericNegtive() + { + var result = ReflectionUtilities.IsAssignableFromIgnoreGeneric(typeof(ISet<>), typeof(Foo)); + Assert.IsFalse(result); + } + + [TestMethod] + public void TestIsInstanceOfGeneric() + { + var p1 = new OptionalParameter<int>(); + bool r1 = ReflectionUtilities.IsInstanceOfGeneric(p1, typeof(OptionalParameter<>)); + var p2 = new RequiredParameter<string>(); + bool r2 = ReflectionUtilities.IsInstanceOfGeneric(p2, typeof(RequiredParameter<>)); + Assert.IsTrue(r1); + Assert.IsTrue(r2); + } + + [TestMethod] + public void TestGetInterfaceTargetForTypeInheritFromGeneric() + { + Type result = ReflectionUtilities.GetInterfaceTarget(typeof(IExternalConstructor<>), typeof(Foo)); + Assert.AreEqual(result, typeof(Int32)); + } + + class Foo : IExternalConstructor<Int32> + { + public Int32 NewInstance() + { + return 3; + } + } + + [TestMethod] + public void TestGetEnclosingClassShortNameByType() + { + var asm = Assembly.Load(FileNames.Examples); + Type seconds = asm.GetType(FileNames.Seconds); + Type timer = asm.GetType(FileNames.Timer); + + string[] pathSeconds = ReflectionUtilities.GetEnclosingClassNames(seconds); + Assert.AreEqual(pathSeconds[0], timer.AssemblyQualifiedName); + Assert.AreEqual(pathSeconds[1], seconds.AssemblyQualifiedName); + + string[] pathTime = ReflectionUtilities.GetEnclosingClassNames(timer); + Assert.AreEqual(pathTime[0], timer.AssemblyQualifiedName); + } + + [TestMethod] + public void TestGetName() + { + var asm = Assembly.Load(FileNames.Examples); + Type B2 = asm.GetType(FileNames.B2); + + string n = ReflectionUtilities.GetName(B2); + Assert.AreEqual(n, B2.FullName); + } + + [TestMethod] + public void TestGetEnclosingTypesInclusive() + { + var asm = Assembly.Load(FileNames.Examples); + Type B2 = asm.GetType(FileNames.B2); + Type[] ts = ReflectionUtilities.GetEnclosingClasses(B2); + Assert.AreEqual(ts[0], asm.GetType(FileNames.B)); + Assert.AreEqual(ts[1], asm.GetType(FileNames.B1)); + Assert.AreEqual(ts[2], asm.GetType(FileNames.B2)); + } + + [TestMethod] + public void TestGetEnclosingClassShortNameByName() + { + var asm = Assembly.Load(FileNames.Examples); + Type b = asm.GetType(FileNames.B); + Type b1 = asm.GetType(FileNames.B1); + Type b2 = asm.GetType(FileNames.B2); + + string[] path = ReflectionUtilities.GetEnclosingClassNames(FileNames.B2); + Assert.AreEqual(path[0], b.AssemblyQualifiedName); + Assert.AreEqual(path[1], b1.AssemblyQualifiedName); + Assert.AreEqual(path[2], b2.AssemblyQualifiedName); + } + + [TestMethod] + public void TestGetEnclosingClassShortNameByFullName() + { + var asm = Assembly.Load(FileNames.Examples); + Type c = asm.GetType(FileNames.B2); + Type b = asm.GetType(FileNames.B); + Type b1 = asm.GetType(FileNames.B1); + Type b2 = asm.GetType(FileNames.B2); + string[] path = ReflectionUtilities.GetEnclosingClassNames(c.FullName); + Assert.AreEqual(path[0], b.AssemblyQualifiedName); + Assert.AreEqual(path[1], b1.AssemblyQualifiedName); + Assert.AreEqual(path[2], b2.AssemblyQualifiedName); + } + + [TestMethod] + public void TestGetEnclosingClassShortNameByAssemblyQualifiedName() + { + var asm = Assembly.Load(FileNames.Examples); + Type c = asm.GetType(FileNames.B2); + Type b = asm.GetType(FileNames.B); + Type b1 = asm.GetType(FileNames.B1); + Type b2 = asm.GetType(FileNames.B2); + + string[] path = ReflectionUtilities.GetEnclosingClassNames(c.AssemblyQualifiedName); + + Assert.AreEqual(path[0], b.AssemblyQualifiedName); + Assert.AreEqual(path[1], b1.AssemblyQualifiedName); + Assert.AreEqual(path[2], b2.AssemblyQualifiedName); + } + + [TestMethod] + public void AssemblyNamesTest() + { + var asm = Assembly.Load(FileNames.Examples); + Type seconds = asm.GetType(FileNames.Seconds); + + var name = seconds.Name; + var fullName = seconds.FullName; + var assemblyName = seconds.AssemblyQualifiedName; + + Type[] i = seconds.GetInterfaces(); + + foreach (Type t in i) + { + var name1 = t.Name; + var fullName1 = t.FullName; + var assemblyName1 = t.AssemblyQualifiedName; + } + } + + [TestMethod] + public void TestGetInterfaceTargetForGenericType() + { + Type iface = typeof(ISet<>); + Type type = typeof(MySet<string>); + Type p = ReflectionUtilities.GetInterfaceTarget(iface, type); + Assert.IsTrue(p.Equals(typeof (string))); + } + + [TestMethod] + public void TestGetInterfaceTargetForSystemGenericType() + { + Type iface = typeof(ISet<>); + Type type = typeof(ISet<int>); + Type p = ReflectionUtilities.GetInterfaceTarget(iface, type); + Assert.IsTrue(p.Equals(typeof(int))); + } + } + + public class MySet<T> : ISet<T> + { + public bool Add(T item) + { + throw new NotImplementedException(); + } + + public void ExceptWith(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public void IntersectWith(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public bool IsProperSubsetOf(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public bool IsProperSupersetOf(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public bool IsSubsetOf(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public bool IsSupersetOf(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public bool Overlaps(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public bool SetEquals(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public void SymmetricExceptWith(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + public void UnionWith(IEnumerable<T> other) + { + throw new NotImplementedException(); + } + + void ICollection<T>.Add(T item) + { + throw new NotImplementedException(); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(T item) + { + throw new NotImplementedException(); + } + + public void CopyTo(T[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { throw new NotImplementedException(); } + } + + public bool IsReadOnly + { + get { throw new NotImplementedException(); } + } + + public bool Remove(T item) + { + throw new NotImplementedException(); + } + + public IEnumerator<T> GetEnumerator() + { + throw new NotImplementedException(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tests/Utilities/Utilities.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tests/Utilities/Utilities.cs b/lang/cs/Org.Apache.REEF.Tang.Tests/Utilities/Utilities.cs new file mode 100644 index 0000000..48b90f5 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang.Tests/Utilities/Utilities.cs @@ -0,0 +1,62 @@ +/** + * 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; + +namespace Org.Apache.REEF.Tang.Tests.Utilities +{ + public class Utilities + { + public static bool Equals<T>(ICollection<T> s1, ISet<T> s2) + { + if (s1 == s2) + { + return true; + } + if (s1 == null || s2 == null) + { + return false; + } + if (s1.Count != s2.Count) + { + return false; + } + foreach (T t in s1) + { + if (!Contains<T>(s2, t)) + { + return false; + } + } + return true; + } + + public static bool Contains<T>(ICollection<T> s, T t) + { + foreach (T t1 in s) + { + if (t1.Equals(t)) + { + return true; + } + } + return false; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tests/evaluator.conf ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tests/evaluator.conf b/lang/cs/Org.Apache.REEF.Tang.Tests/evaluator.conf new file mode 100644 index 0000000..67256f5 Binary files /dev/null and b/lang/cs/Org.Apache.REEF.Tang.Tests/evaluator.conf differ http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tests/packages.config ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tests/packages.config b/lang/cs/Org.Apache.REEF.Tang.Tests/packages.config new file mode 100644 index 0000000..933b7e1 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang.Tests/packages.config @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +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. +--> +<packages> + <package id="Microsoft.Hadoop.Avro" version="1.4.0.0" targetFramework="net45" /> + <package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" /> + <package id="protobuf-net" version="2.0.0.668" targetFramework="net45" /> +</packages> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tests/simpleConstructorJavaProto.bin ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tests/simpleConstructorJavaProto.bin b/lang/cs/Org.Apache.REEF.Tang.Tests/simpleConstructorJavaProto.bin new file mode 100644 index 0000000..f7bb871 Binary files /dev/null and b/lang/cs/Org.Apache.REEF.Tang.Tests/simpleConstructorJavaProto.bin differ http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tools/Org.Apache.REEF.Tang.Tools.csproj ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tools/Org.Apache.REEF.Tang.Tools.csproj b/lang/cs/Org.Apache.REEF.Tang.Tools/Org.Apache.REEF.Tang.Tools.csproj new file mode 100644 index 0000000..9925d6e --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang.Tools/Org.Apache.REEF.Tang.Tools.csproj @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +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. +--> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProjectGuid>{34A9CD98-0D15-4CA0-AEA5-E53593A31047}</ProjectGuid> + <OutputType>Exe</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>Org.Apache.REEF.Tang.Tools</RootNamespace> + <AssemblyName>Org.Apache.REEF.Tang.Tools</AssemblyName> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <FileAlignment>512</FileAlignment> + <RestorePackages>true</RestorePackages> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> + </PropertyGroup> + <Import Project="$(SolutionDir)\Source\build.props" /> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>$(BinDir)\AnyCPU\Debug\Org.Apache.REEF.Tools\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>$(BinDir)\$(Platform)\$(Configuration)\$(RootNamespace)</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>$(BinDir)\$(Platform)\$(Configuration)\$(RootNamespace)</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' "> + <PlatformTarget>AnyCPU</PlatformTarget> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>$(BinDir)\$(Platform)\$(Configuration)\$(RootNamespace)</OutputPath> + <DefineConstants>TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="System.Core" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System.Data.DataSetExtensions" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="System.Data" /> + <Reference Include="System.Xml" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Program.cs" /> + <Compile Include="Properties\AssemblyInfo.cs" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="$(SourceDir)\REEF\reef-tasks\Tasks\Tasks.csproj"> + <Project>{75503f90-7b82-4762-9997-94b5c68f15db}</Project> + <Name>Tasks</Name> + </ProjectReference> + <ProjectReference Include="$(SolutionDir)\Org.Apache.REEF.Tang\Org.Apache.REEF.Tang.csproj"> + <Project>{97dbb573-3994-417a-9f69-ffa25f00d2a6}</Project> + <Name>Org.Apache.REEF.Tang</Name> + </ProjectReference> + <ProjectReference Include="$(SolutionDir)\Org.Apache.REEF.Utilities\Org.Apache.REEF.Utilities.csproj"> + <Project>{79e7f89a-1dfb-45e1-8d43-d71a954aeb98}</Project> + <Name>Org.Apache.REEF.Utilities</Name> + </ProjectReference> + <ProjectReference Include="..\Org.Apache.REEF.Common\Org.Apache.REEF.Common.csproj"> + <Project>{545a0582-4105-44ce-b99c-b1379514a630}</Project> + <Name>Org.Apache.REEF.Common</Name> + </ProjectReference> + <ProjectReference Include="..\Org.Apache.REEF.Driver\Org.Apache.REEF.Driver.csproj"> + <Project>{a6baa2a7-f52f-4329-884e-1bcf711d6805}</Project> + <Name>Org.Apache.REEF.Driver</Name> + </ProjectReference> + <ProjectReference Include="..\Org.Apache.REEF.Wake\Org.Apache.REEF.Wake.csproj"> + <Project>{cdfb3464-4041-42b1-9271-83af24cd5008}</Project> + <Name>Org.Apache.REEF.Wake</Name> + </ProjectReference> + </ItemGroup> + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> + --> +</Project> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tools/Program.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tools/Program.cs b/lang/cs/Org.Apache.REEF.Tang.Tools/Program.cs new file mode 100644 index 0000000..0e158b6 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang.Tools/Program.cs @@ -0,0 +1,98 @@ +/** + * 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.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 System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using Org.Apache.REEF.Tang.Implementations.Tang; + +namespace Org.Apache.REEF.Tang.Tools +{ + public class ClassHierarchyBuilder + { + /// <summary> + /// This program generates class hierarchy bin file for the list of dlls, plus a defalut list + /// The default list include: ITask, StreamTask1, HelloTask and ShellTask, please remove if not needed + /// </summary> + /// <param name="args"> additional dlls needed to build class hierarchy </param> + public static void Main(string[] args) + { + const string DllSubfix = ".dll"; + const string ClassHierarchyBinFileName = "task.bin"; + + List<string> taskDlls = new List<string>(); + + foreach (string arg in args) + { + string assemblyName = arg; + if (!arg.EndsWith(DllSubfix, StringComparison.OrdinalIgnoreCase)) + { + assemblyName += DllSubfix; + } + if (!File.Exists(assemblyName)) + { + throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "invalid argument: assembly {0} cannot be found", assemblyName)); + } + taskDlls.Add(arg); + } + + taskDlls.Add(GetAssemblyName(typeof(ITask))); + taskDlls.Add(GetAssemblyName(typeof(HelloTask))); + taskDlls.Add(GetAssemblyName(typeof(ShellTask))); + taskDlls.Add(GetAssemblyName(typeof(StreamTask1))); + + IClassHierarchy ns = TangFactory.GetTang().GetClassHierarchy(taskDlls.ToArray()); + + // the following is verification only + // to verify that a class indeeded has been added to the class hierarchy, check the class name + IClassNode streamTaskClassNode = (IClassNode)ns.GetNode(typeof(StreamTask1).AssemblyQualifiedName); + IClassNode helloTaskClassNode = (IClassNode)ns.GetNode(typeof(HelloTask).AssemblyQualifiedName); + IClassNode shellTaskClassNode = (IClassNode)ns.GetNode(typeof(ShellTask).AssemblyQualifiedName); + + ProtocolBufferClassHierarchy.Serialize(ClassHierarchyBinFileName, ns); + IClassHierarchy ch = ProtocolBufferClassHierarchy.DeSerialize(ClassHierarchyBinFileName); + + IClassNode retrievedStreamTaskClassNode = (IClassNode)ch.GetNode(typeof(StreamTask1).AssemblyQualifiedName); + IClassNode retrievedHelloTaskClassNode = (IClassNode)ch.GetNode(typeof(HelloTask).AssemblyQualifiedName); + IClassNode retrievedShellTaskClassNode = (IClassNode)ch.GetNode(typeof(ShellTask).AssemblyQualifiedName); + + if (!streamTaskClassNode.GetFullName().Equals(retrievedStreamTaskClassNode.GetFullName()) || + !helloTaskClassNode.GetFullName().Equals(retrievedHelloTaskClassNode.GetFullName()) || + !shellTaskClassNode.GetFullName().Equals(retrievedShellTaskClassNode.GetFullName())) + { + Console.WriteLine("Node deseriliazed is not equal"); + } + else + { + Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "Class hierarchy written to [{0}].", Directory.GetCurrentDirectory())); + } + } + + private static string GetAssemblyName(Type type) + { + return type.Assembly.GetName().Name; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang.Tools/Properties/AssemblyInfo.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang.Tools/Properties/AssemblyInfo.cs b/lang/cs/Org.Apache.REEF.Tang.Tools/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a2db1ec --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang.Tools/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.Tools")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Org.Apache.REEF.Tang.Tools")] +[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("8a034f16-c6c7-497a-b3c0-f8cfea1635e9")] + +// 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/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Annotations/DefaultImplementation.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Annotations/DefaultImplementation.cs b/lang/cs/Org.Apache.REEF.Tang/Annotations/DefaultImplementation.cs new file mode 100644 index 0000000..cce2914 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Annotations/DefaultImplementation.cs @@ -0,0 +1,43 @@ +/** + * 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; + +namespace Org.Apache.REEF.Tang.Annotations +{ + /// <summary> + /// DefaultImplementationAttribute + /// </summary> + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, Inherited = false)] + public class DefaultImplementationAttribute : System.Attribute + { + public Type Value { get; set; } + public string Name { get; set; } + + public DefaultImplementationAttribute(Type val = null, string n = "") + { + Name = n; + Value = val; + } + + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Annotations/Inject.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Annotations/Inject.cs b/lang/cs/Org.Apache.REEF.Tang/Annotations/Inject.cs new file mode 100644 index 0000000..21d26e6 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Annotations/Inject.cs @@ -0,0 +1,28 @@ +/** + * 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.Annotations +{ + /// <summary> + /// InjectAttribute + /// </summary> + [System.AttributeUsage(System.AttributeTargets.Constructor)] + public class InjectAttribute : System.Attribute + { + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Annotations/Name.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Annotations/Name.cs b/lang/cs/Org.Apache.REEF.Tang/Annotations/Name.cs new file mode 100644 index 0000000..4526755 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Annotations/Name.cs @@ -0,0 +1,28 @@ +/** + * 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.Annotations +{ + /// <summary> + /// Base class for named parameters + /// </summary> + /// <typeparam name="T"></typeparam> + public interface Name<T> + { + } +} http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Annotations/NamedParameter.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Annotations/NamedParameter.cs b/lang/cs/Org.Apache.REEF.Tang/Annotations/NamedParameter.cs new file mode 100644 index 0000000..902f1fb --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Annotations/NamedParameter.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; + +namespace Org.Apache.REEF.Tang.Annotations +{ + [System.AttributeUsage(System.AttributeTargets.Class)] + public class NamedParameterAttribute : System.Attribute + { + public string Documentation { get; set; } + public string ShortName { get; set; } + public string DefaultValue { get; set; } + public Type DefaultClass { get; set; } + public string[] DefaultValues { get; set; } + public Type[] DefaultClasses { get; set; } + + public NamedParameterAttribute(string documentation = "", string shortName = "", + string defaultValue = "", Type defaultClass = null, string[] defaultValues = null, Type[] defaultClasses = null) + { + this.Documentation = documentation; + this.ShortName = shortName; + this.DefaultValue = defaultValue; + this.DefaultClass = defaultClass; + this.DefaultValues = defaultValues; + this.DefaultClasses = defaultClasses; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Annotations/Parameter.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Annotations/Parameter.cs b/lang/cs/Org.Apache.REEF.Tang/Annotations/Parameter.cs new file mode 100644 index 0000000..1e4a7c1 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Annotations/Parameter.cs @@ -0,0 +1,39 @@ +/** + * 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; +namespace Org.Apache.REEF.Tang.Annotations +{ + /// <summary> + /// ParameterAttribute + /// </summary> + [System.AttributeUsage(System.AttributeTargets.Parameter)] + public class ParameterAttribute : System.Attribute + { + public ParameterAttribute() + { + } + + public ParameterAttribute(Type value) + { + Value = value; + } + + public Type Value { get; set; } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Annotations/Unit.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Annotations/Unit.cs b/lang/cs/Org.Apache.REEF.Tang/Annotations/Unit.cs new file mode 100644 index 0000000..cfaac0d --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Annotations/Unit.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 System; +namespace Org.Apache.REEF.Tang.Annotations +{ + /// <summary> + /// UnitAttribute + /// </summary> + [AttributeUsage(AttributeTargets.Class, Inherited = false)] + public class UnitAttribute : System.Attribute + { + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Exceptions/BindException.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Exceptions/BindException.cs b/lang/cs/Org.Apache.REEF.Tang/Exceptions/BindException.cs new file mode 100644 index 0000000..032eda0 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Exceptions/BindException.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; + +namespace Org.Apache.REEF.Tang.Exceptions +{ + public class BindException : SystemException + { + //private static readonly long serialVersionUID = 1L; + public BindException(String message) + : base(message) + { + } + + public BindException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Exceptions/ClassHierarchyException.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Exceptions/ClassHierarchyException.cs b/lang/cs/Org.Apache.REEF.Tang/Exceptions/ClassHierarchyException.cs new file mode 100644 index 0000000..60697c2 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Exceptions/ClassHierarchyException.cs @@ -0,0 +1,34 @@ +/** + * 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; + +namespace Org.Apache.REEF.Tang.Exceptions +{ + public class ClassHierarchyException : SystemException + { + public ClassHierarchyException(String msg) : base(msg) + { + } + + public ClassHierarchyException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Exceptions/IllegalStateException.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Exceptions/IllegalStateException.cs b/lang/cs/Org.Apache.REEF.Tang/Exceptions/IllegalStateException.cs new file mode 100644 index 0000000..f62e207 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Exceptions/IllegalStateException.cs @@ -0,0 +1,40 @@ +/** + * 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; + +namespace Org.Apache.REEF.Tang.Exceptions +{ + public class IllegalStateException : Exception + { + public IllegalStateException() + : base() + { + } + + public IllegalStateException(String msg) + : base(msg) + { + } + + public IllegalStateException(string message, Exception innerException) + : base(message, innerException) + { + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-reef/blob/c1b5200f/lang/cs/Org.Apache.REEF.Tang/Exceptions/InjectionException.cs ---------------------------------------------------------------------- diff --git a/lang/cs/Org.Apache.REEF.Tang/Exceptions/InjectionException.cs b/lang/cs/Org.Apache.REEF.Tang/Exceptions/InjectionException.cs new file mode 100644 index 0000000..9b72c59 --- /dev/null +++ b/lang/cs/Org.Apache.REEF.Tang/Exceptions/InjectionException.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 System; + +namespace Org.Apache.REEF.Tang.Exceptions +{ + public class InjectionException : Exception + { + public InjectionException(String msg) + : base(msg) + { + } + + public InjectionException(string message, Exception innerException) + : base(message, innerException) + { + } + } +}
