8#include <gtest/gtest.h>
10#include "arccore/base/internal/DependencyInjection.h"
11#include "arcane/utils/FatalErrorException.h"
13#include "arcane/utils/ITraceMng.h"
22using namespace Arcane::DependencyInjection;
28 virtual ~IA() =
default;
29 virtual int value()
const = 0;
36 virtual ~IB() =
default;
37 virtual int value()
const = 0;
44 virtual ~IA2() =
default;
45 virtual int value()
const = 0;
46 virtual IB* bValue()
const = 0;
53 virtual ~IB2() =
default;
54 virtual int value()
const = 0;
55 virtual String stringValue()
const = 0;
62 virtual ~IC() =
default;
63 virtual int value()
const = 0;
70 virtual ~ID() =
default;
77 virtual ~IE() =
default;
78 virtual int intValue()
const = 0;
79 virtual String stringValue()
const = 0;
86 virtual ~INone() =
default;
95 int value()
const override {
return 5; }
104 int value()
const override {
return 12; }
115 int value()
const override {
return 32; }
116 String stringValue()
const override {
return m_test; }
128 EImpl(Int32 int_value,
const String& string_value)
129 : m_string_value(string_value)
130 , m_int_value(int_value)
133 int intValue()
const override {
return m_int_value; }
134 String stringValue()
const override {
return m_string_value; }
148 CDImpl(
int a,
double b)
149 : m_int_value(a + (
int)b)
157 int value()
const override {
return m_int_value; }
169 A2Impl(
int a,
IB* ib,
IA*)
173 A2Impl(
int a,
IB* ib)
180 int value()
const override {
return m_a; }
181 IB* bValue()
const override {
return m_ib; }
189ARCANE_DI_REGISTER_PROVIDER(
AImpl,
190 ProviderProperty(
"AImplProvider"),
191 ARCANE_DI_INTERFACES(
IA),
192 ARCANE_DI_EMPTY_CONSTRUCTOR());
194ARCANE_DI_REGISTER_PROVIDER(
BImpl,
195 ProviderProperty(
"BImplProvider"),
196 ARCANE_DI_INTERFACES(
IB),
197 ARCANE_DI_EMPTY_CONSTRUCTOR());
199ARCANE_DI_REGISTER_PROVIDER(
B2Impl,
200 ProviderProperty(
"B2ImplProvider"),
201 ARCANE_DI_INTERFACES(
IB2),
202 ARCANE_DI_CONSTRUCTOR(
String));
204ARCANE_DI_REGISTER_PROVIDER(
EImpl,
205 ProviderProperty(
"EImplProvider"),
206 ARCANE_DI_INTERFACES(
IE),
207 ARCANE_DI_CONSTRUCTOR(Int32,
String));
209ARCANE_DI_REGISTER_PROVIDER(
A2Impl,
210 ProviderProperty(
"A2ImplProvider"),
211 ARCANE_DI_INTERFACES(
IA2),
212 ARCANE_DI_CONSTRUCTOR(
int,
IB*));
214ARCANE_DI_REGISTER_PROVIDER(
CDImpl,
215 ProviderProperty(
"CDImplProvider2"),
216 ARCANE_DI_INTERFACES(
IC,
ID),
217 ARCANE_DI_CONSTRUCTOR(
int));
219ARCANE_DI_REGISTER_PROVIDER(
CDImpl,
220 ProviderProperty(
"CDImplProvider3"),
221 ARCANE_DI_INTERFACES(
IC),
222 ARCANE_DI_EMPTY_CONSTRUCTOR());
224ARCANE_DI_REGISTER_PROVIDER(
CDImpl,
225 ProviderProperty(
"CDImplProvider4"),
226 ARCANE_DI_INTERFACES(
IC,
ID),
227 ARCANE_DI_CONSTRUCTOR(
int),
228 ARCANE_DI_CONSTRUCTOR(
int,
double),
229 ARCANE_DI_EMPTY_CONSTRUCTOR());
232TEST(DependencyInjection, TestPrintFactories)
234 using namespace Arcane::DependencyInjection;
236 injector.fillWithGlobalFactories();
238 std::cout <<
"FACTORIES=" << injector.printFactories() <<
"\n";
243template <
typename T>
void
244_testNotFoundThrow(Arcane::DependencyInjection::Injector& injector)
247 Ref<T> ic = injector.createInstance<T>(
"Test1");
248 FAIL() <<
"Expected FatalErrorException";
251 std::cout <<
"EX=" << ex <<
"\n";
254 FAIL() <<
"Expected FatalErrorException";
259TEST(DependencyInjection, TestNotFound)
261 using namespace Arcane::DependencyInjection;
262 using namespace DI_Test;
264 injector.fillWithGlobalFactories();
266 _testNotFoundThrow<INone>(injector);
267 _testNotFoundThrow<IA>(injector);
268 _testNotFoundThrow<IC>(injector);
269 Ref<IC> ic2 = injector.createInstance<
IC>(
"Test1",
true);
270 ASSERT_EQ(ic2.
get(),
nullptr);
273TEST(DependencyInjection, TestBind1)
275 using namespace Arcane::DependencyInjection;
276 std::cout <<
"INJECTOR TEST\n";
278 ITraceMng* tm = Arccore::arccoreCreateDefaultTraceMng();
280 injector.bind(ref_tm);
282 std::cout <<
"TM=" << tm <<
"TM2=" << tm2.
get() <<
"\n";
283 ASSERT_EQ(tm, tm2.
get()) <<
"Bad Get Reference";
286TEST(DependencyInjection, ProcessGlobalProviders)
288 using namespace Arcane::DependencyInjection;
289 using namespace DI_Test;
292 injector.fillWithGlobalFactories();
294 Ref<IA> ia = injector.createInstance<
IA>({});
295 EXPECT_TRUE(ia.
get());
296 ASSERT_EQ(ia->value(), 5);
298 Ref<IA> ia2 = injector.createInstance<
IA>(
"AImplProvider");
299 EXPECT_TRUE(ia2.
get());
300 ASSERT_EQ(ia2->value(), 5);
302 Ref<IB> ib = injector.createInstance<
IB>({});
303 EXPECT_TRUE(ib.
get());
304 ASSERT_EQ(ib->value(), 12);
309 using namespace Arcane::DependencyInjection;
310 using namespace DI_Test;
314 injector.fillWithGlobalFactories();
315 String wanted_string(
"Toto");
317 injector.bind(wanted_string);
320 EXPECT_TRUE(ib.
get());
321 ASSERT_EQ(ib->value(), 32);
322 ASSERT_EQ(ib->stringValue(), wanted_string);
327 injector.fillWithGlobalFactories();
328 String wanted_string{
"Tata" };
329 Int32 wanted_int{ 25 };
332 injector.bind(wanted_string,
"Name");
333 injector.bind(wanted_int,
"Value");
340 Ref<IE> ie = injector.createInstance<
IE>(
"EImplProvider");
341 EXPECT_TRUE(ie.
get());
342 ASSERT_EQ(ie->intValue(), wanted_int);
343 ASSERT_EQ(ie->stringValue(), wanted_string);
347TEST(DependencyInjection, TestBindValue)
353 std::cerr <<
"ERROR=" << ex <<
"\n";
358TEST(DependencyInjection, ConstructorCall)
360 using namespace DI_Test;
361 namespace di = Arcane::DependencyInjection;
362 using ConstructorType = di::impl::ConstructorRegisterer<int, IB*>;
364 di::impl::ConcreteFactory<IA2, A2Impl, ConstructorType> c2f;
370 std::unique_ptr<IB> ib{ std::make_unique<BImpl>() };
371 injector.bind(ib.get());
373 Ref<IA2> a2 = c2f.createReference(injector);
375 ASSERT_EQ(a2->value(), 3);
376 ASSERT_EQ(a2->bValue(), ib.
get());
379 std::cerr <<
"ERROR=" << ex <<
"\n";
384TEST(DependencyInjection, Impl2)
386 using namespace DI_Test;
387 namespace di = Arcane::DependencyInjection;
393 injector.fillWithGlobalFactories();
395 injector.bind<
int>(25);
396 Ref<IC> ic = injector.createInstance<
IC>(
"CDImplProvider2");
398 ASSERT_EQ(ic->value(), 25);
405 injector.fillWithGlobalFactories();
406 Ref<IC> ic = injector.createInstance<
IC>(
"CDImplProvider3");
408 ASSERT_EQ(ic->value(), 2);
415 injector.fillWithGlobalFactories();
416 injector.bind<
int>(25);
417 injector.bind<
double>(12.0);
418 Ref<IC> ic = injector.createInstance<
IC>(
"CDImplProvider4");
420 ASSERT_EQ(ic->value(), 37);
424 std::cerr <<
"ERROR=" << ex <<
"\n";
#define ARCANE_CHECK_POINTER(ptr)
Macro returning the pointer ptr if it is not null or throwing an exception if it is null.
Base class for an exception.
Exception when a fatal error has occurred.
InstanceType * get() const
Associated instance or nullptr if none.
Reference to an instance.
Unicode character string.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Ref< InstanceType > makeRefFromInstance(InstanceType2 *t)
Retrieves a reference on the pointer t.