Skip to content

Commit 4668f3f

Browse files
committed
update version and add tests for alias creator
1 parent 42bacc9 commit 4668f3f

12 files changed

+483
-613
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.15.0)
33
set(_7BIT_DI_LIBRARY 7bitDI)
44

55
set(_7BIT_DI_VERSION_MAJOR 3)
6-
set(_7BIT_DI_VERSION_MINOR 1)
6+
set(_7BIT_DI_VERSION_MINOR 2)
77
set(_7BIT_DI_VERSION_PATCH 0)
88

99
set(_7BIT_DI_VERSION ${_7BIT_DI_VERSION_MAJOR}.${_7BIT_DI_VERSION_MINOR}.${_7BIT_DI_VERSION_PATCH})

Docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def createIfNotExists(path):
1212
project = "7bitDI"
1313
copyright = "2023, 7BitCoder Sylwester Dawida"
1414
author = "Sylwester Dawida"
15-
version = "3.1.0"
15+
version = "3.2.0"
1616

1717
extensions = [
1818
"sphinx.ext.autodoc",

Docs/getting-started.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Installation
3636
FetchContent_Declare(
3737
7bitDI
3838
GIT_REPOSITORY https://github.com/7bitcoder/7bitDI.git
39-
GIT_TAG v3.1.0
39+
GIT_TAG v3.2.0
4040
)
4141
FetchContent_MakeAvailable(7bitDI)
4242
@@ -48,7 +48,7 @@ Installation
4848
.. code-block:: Txt
4949
5050
[requires]
51-
7bitdi/3.1.0
51+
7bitdi/3.2.0
5252
5353
change the version to newer if available, then run the command:
5454

Include/SevenBit/DI/CmakeDef.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@
1313
#endif
1414

1515
#define _7BIT_DI_VERSION_MAJOR 3
16-
#define _7BIT_DI_VERSION_MINOR 1
16+
#define _7BIT_DI_VERSION_MINOR 2
1717
/* #undef _7BIT_DI_VERSION_PATCH */

Include/SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ namespace sb::di::details
1010
class EXPORT ServiceAliasesCreator
1111
{
1212
public:
13-
[[nodiscard]] ServiceInstance tryCreate(const ServiceDescriptor &descriptor,
14-
const ServiceInstance *original) const;
13+
ServiceInstance tryCreate(const ServiceDescriptor &descriptor, const ServiceInstance *original) const;
1514

1615
template <class TResolver>
1716
ServiceInstanceList tryCreateAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const
@@ -37,7 +36,7 @@ namespace sb::di::details
3736
});
3837
}
3938

40-
[[nodiscard]] ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const;
39+
ServiceInstance tryMap(const ServiceDescriptor &descriptor, ServiceInstance &&original) const;
4140

4241
template <class TResolver>
4342
ServiceInstanceList tryMapAll(const ServiceDescriptorList &descriptors, TResolver originalResolver) const
@@ -59,8 +58,7 @@ namespace sb::di::details
5958
void tryMapAll(ServiceInstanceList &instances, const ServiceDescriptor &descriptor,
6059
OneOrList<ServiceInstance> &&originals) const;
6160

62-
[[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor,
63-
const ServiceInstance &original) const;
61+
ServiceInstance create(const ServiceDescriptor &descriptor, const ServiceInstance &original) const;
6462
};
6563
} // namespace sb::di::details
6664

Include/SevenBit/DI/Details/Core/ServiceInstancesCreator.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ namespace sb::di::details
1616
public:
1717
void setServiceProvider(ServiceProvider &serviceProvider) { _serviceProvider = &serviceProvider; }
1818

19-
[[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor);
20-
[[nodiscard]] ServiceInstanceList createAll(const ServiceDescriptorList &descriptors);
19+
ServiceInstance create(const ServiceDescriptor &descriptor);
20+
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors);
2121
void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances);
2222

23-
[[nodiscard]] ServiceInstance createInPlace(const ServiceDescriptor &descriptor);
24-
[[nodiscard]] ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors);
23+
ServiceInstance createInPlace(const ServiceDescriptor &descriptor);
24+
ServiceInstanceList createAllInPlace(const ServiceDescriptorList &descriptors);
2525
void createRestInPlace(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances);
2626

2727
private:
28-
[[nodiscard]] ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest);
29-
[[nodiscard]] ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest);
28+
ServiceInstance create(const ServiceDescriptor &descriptor, bool inPlaceRequest);
29+
ServiceInstanceList createAll(const ServiceDescriptorList &descriptors, bool inPlaceRequest);
3030
void createRest(const ServiceDescriptorList &descriptors, ServiceInstanceList &instances, bool inPlaceRequest);
3131
};
3232
} // namespace sb::di::details

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ include(FetchContent)
6666
FetchContent_Declare(
6767
7bitDI
6868
GIT_REPOSITORY https://github.com/7bitcoder/7bitDI.git
69-
GIT_TAG v3.1.0
69+
GIT_TAG v3.2.0
7070
)
7171
FetchContent_MakeAvailable(7bitDI)
7272
@@ -79,7 +79,7 @@ Download and install A [Conan](https://conan.io/), and create conanfile.txt in t
7979

8080
```
8181
[requires]
82-
7bitdi/3.1.0
82+
7bitdi/3.2.0
8383
```
8484

8585
change the version to newer if available, then run the command:
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
#include <gtest/gtest.h>
2+
#include <memory>
3+
4+
#include "../../Helpers/Classes/Basic.hpp"
5+
#include "../../Helpers/Classes/Inherit.hpp"
6+
#include "../../Helpers/Mocks/ServiceProviderMock.hpp"
7+
#include <SevenBit/DI/Details/Core/ServiceAliasesCreator.hpp>
8+
#include <SevenBit/DI/ServiceDescriber.hpp>
9+
10+
class ServiceAliasesCreatorTest : public testing::Test
11+
{
12+
protected:
13+
static void SetUpTestSuite() {}
14+
15+
ServiceAliasesCreatorTest() {}
16+
17+
void SetUp() override {}
18+
19+
void TearDown() override {}
20+
21+
~ServiceAliasesCreatorTest() override = default;
22+
23+
static void TearDownTestSuite() {}
24+
};
25+
26+
TEST_F(ServiceAliasesCreatorTest, ShouldFailCreateAliasForInvalidService)
27+
{
28+
constexpr sb::di::details::ServiceAliasesCreator creator;
29+
30+
const auto descriptor = sb::di::ServiceDescriber::describeAlias<TestInheritClass3, TestInheritClass5>();
31+
32+
const sb::di::ServiceInstance external;
33+
34+
EXPECT_THROW(creator.tryCreate(descriptor, &external), sb::di::InvalidServiceException);
35+
}
36+
37+
TEST_F(ServiceAliasesCreatorTest, ShouldFailCreateAliasForNullService)
38+
{
39+
constexpr sb::di::details::ServiceAliasesCreator creator;
40+
41+
const auto descriptor = sb::di::ServiceDescriber::describeAlias<TestInheritClass3, TestInheritClass5>();
42+
43+
TestInheritClass5 *test = nullptr;
44+
const sb::di::ServiceInstance external{std::make_unique<sb::di::details::ExternalService<TestInheritClass5>>(test)};
45+
46+
EXPECT_THROW(creator.tryCreate(descriptor, &external), sb::di::InvalidServiceException);
47+
}
48+
49+
TEST_F(ServiceAliasesCreatorTest, ShouldFailCreateAliasForWrongDescriptor)
50+
{
51+
constexpr sb::di::details::ServiceAliasesCreator creator;
52+
53+
const auto descriptor = sb::di::ServiceDescriber::describeSingleton<TestInheritClass3, TestInheritClass5>();
54+
55+
TestInheritClass5 *test = nullptr;
56+
const sb::di::ServiceInstance external{std::make_unique<sb::di::details::ExternalService<TestInheritClass5>>(test)};
57+
58+
EXPECT_THROW(creator.tryCreate(descriptor, &external), sb::di::InjectorException);
59+
}
60+
61+
TEST_F(ServiceAliasesCreatorTest, ShouldCreate)
62+
{
63+
constexpr sb::di::details::ServiceAliasesCreator creator;
64+
65+
TestInheritClass6 test;
66+
const sb::di::ServiceInstance external{
67+
std::make_unique<sb::di::details::ExternalService<TestInheritClass6>>(&test)};
68+
69+
const auto instance =
70+
creator.tryCreate(sb::di::ServiceDescriber::describeAlias<TestInheritClass1, TestInheritClass5>(), &external);
71+
72+
EXPECT_TRUE(instance);
73+
EXPECT_TRUE(instance.isValid());
74+
EXPECT_TRUE(instance.getAs<void>());
75+
EXPECT_EQ(instance.tryGetImplementation()->getTypeId(), typeid(TestInheritClass5));
76+
}
77+
78+
TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateForNullOriginal)
79+
{
80+
constexpr sb::di::details::ServiceAliasesCreator creator;
81+
82+
TestInheritClass6 test;
83+
const sb::di::ServiceInstance external{
84+
std::make_unique<sb::di::details::ExternalService<TestInheritClass6>>(&test)};
85+
86+
const auto instance =
87+
creator.tryCreate(sb::di::ServiceDescriber::describeAlias<TestInheritClass1, TestInheritClass5>(), nullptr);
88+
89+
EXPECT_FALSE(instance);
90+
EXPECT_FALSE(instance.isValid());
91+
}
92+
93+
TEST_F(ServiceAliasesCreatorTest, ShouldCreateAllAliases)
94+
{
95+
sb::di::details::ServiceDescriptorList descriptors{
96+
sb::di::ServiceDescriber::describeAlias<TestInheritClass1, TestInheritClass2>()};
97+
98+
constexpr sb::di::details::ServiceAliasesCreator creator;
99+
100+
TestInheritClass3 test3;
101+
TestInheritClass4 test4;
102+
TestInheritClass5 test5;
103+
sb::di::details::ServiceInstanceList externals{
104+
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass3>>(&test3)}};
105+
externals.add(
106+
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass4>>(&test4)});
107+
externals.add(
108+
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass5>>(&test5)});
109+
110+
const auto instances =
111+
creator.tryCreateAll(descriptors, [&](const sb::di::ServiceDescriptor &) { return &externals; });
112+
113+
EXPECT_EQ(instances.size(), 3);
114+
EXPECT_FALSE(instances.isSealed());
115+
EXPECT_TRUE(instances[0].isValid());
116+
EXPECT_TRUE(instances[0].getAs<void>());
117+
EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
118+
EXPECT_TRUE(instances[1].isValid());
119+
EXPECT_TRUE(instances[1].getAs<void>());
120+
EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
121+
EXPECT_TRUE(instances[2].isValid());
122+
EXPECT_TRUE(instances[2].getAs<void>());
123+
EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
124+
}
125+
126+
TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForEmpty)
127+
{
128+
sb::di::details::ServiceDescriptorList descriptors;
129+
130+
constexpr sb::di::details::ServiceAliasesCreator creator;
131+
132+
sb::di::details::ServiceInstanceList externals;
133+
134+
const auto instances =
135+
creator.tryCreateAll(descriptors, [&](const sb::di::ServiceDescriptor &) { return &externals; });
136+
137+
EXPECT_FALSE(instances);
138+
EXPECT_TRUE(instances.empty());
139+
}
140+
141+
TEST_F(ServiceAliasesCreatorTest, ShouldNotCreateAllAliasesForNull)
142+
{
143+
sb::di::details::ServiceDescriptorList descriptors{
144+
sb::di::ServiceDescriber::describeAlias<TestInheritClass1, TestInheritClass2>()};
145+
146+
constexpr sb::di::details::ServiceAliasesCreator creator;
147+
const auto instances = creator.tryCreateAll(
148+
descriptors,
149+
[&](const sb::di::ServiceDescriptor &) -> sb::di::details::ServiceInstanceList * { return nullptr; });
150+
151+
EXPECT_FALSE(instances);
152+
EXPECT_TRUE(instances.empty());
153+
}
154+
155+
TEST_F(ServiceAliasesCreatorTest, ShouldCreateRestAliases)
156+
{
157+
sb::di::details::ServiceDescriptorList descriptors{
158+
sb::di::ServiceDescriber::describeAlias<TestInheritClass1, TestInheritClass2>()};
159+
160+
constexpr sb::di::details::ServiceAliasesCreator creator;
161+
162+
TestInheritClass3 test3;
163+
TestInheritClass4 test4;
164+
TestInheritClass5 test5;
165+
sb::di::details::ServiceInstanceList externals{
166+
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass3>>(&test3)}};
167+
externals.add(
168+
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass4>>(&test4)});
169+
externals.add(
170+
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass5>>(&test5)});
171+
172+
sb::di::details::ServiceInstanceList instances{
173+
sb::di::ServiceInstance{std::make_unique<sb::di::details::ExternalService<TestInheritClass2>>(&test5)}};
174+
175+
creator.tryCreateRest(descriptors, instances, [&](const sb::di::ServiceDescriptor &) { return &externals; });
176+
177+
EXPECT_EQ(instances.size(), 3);
178+
EXPECT_FALSE(instances.isSealed());
179+
EXPECT_TRUE(instances[0].isValid());
180+
EXPECT_TRUE(instances[0].getAs<void>());
181+
EXPECT_EQ(instances[0].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
182+
EXPECT_TRUE(instances[1].isValid());
183+
EXPECT_TRUE(instances[1].getAs<void>());
184+
EXPECT_EQ(instances[1].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
185+
EXPECT_TRUE(instances[2].isValid());
186+
EXPECT_TRUE(instances[2].getAs<void>());
187+
EXPECT_EQ(instances[2].tryGetImplementation()->getTypeId(), typeid(TestInheritClass2));
188+
}

0 commit comments

Comments
 (0)