Skip to content

Commit 1d29859

Browse files
committed
static_method, known args/return type tests. done.
1 parent 0250333 commit 1d29859

File tree

2 files changed

+141
-7
lines changed

2 files changed

+141
-7
lines changed

README.md

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ std::string complexToStr(float real, float img);
1111
```
1212
**RTL** lets you call it dynamically:
1313
```c++
14-
rtl::function<std::string(float, float)> cToStr = cxx_mirror.getFunction("complexToStr") // cxx_mirror?? see quick preview!
15-
->argsT<float, float>()
16-
.returnT<std::string>();
14+
rtl::function<std::string(float, float)> cToStr = cxx::mirror().getFunction("complexToStr") // cxx::mirror?? see quick preview!
15+
->argsT<float, float>()
16+
.returnT<std::string>();
1717
if(cToStr) { // Function materialized?
1818
std::string result = cToStr(61, 35); // Works! (int → float? No problem.)
1919
}
@@ -44,8 +44,6 @@ Once the functions start doing real work, both perform identically.
4444

4545
* ***Exception-Free Surface*** – All predictable failures return error codes; no hidden throws.
4646

47-
* ***Deterministic Lifetimes*** – Automatic ownership tracking of `Heap` and `Stack` instances with zero hidden deep copies.
48-
4947
* ***Cross-Compiler Consistency*** – Pure standard C++20, with no compiler extensions or conditional branching on compiler differences.
5048

5149
* ***Tooling-Friendly Architecture*** – Reflection data is encapsulated in a single immutable, lazily-initialized object that can be shared with tools and frameworks without compile-time type knowledge — ideal for serializers, debuggers, test frameworks, scripting engines, and editors.

RTLTestRunApp/src/FunctionalityTests/StaticTypeReflectiveCalls/StrictStaticTypeDispatch_StaticMethod.cpp

Lines changed: 138 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,149 @@ namespace rtl_tests
222222
EXPECT_EQ(ret_str, exp_str);
223223
} {
224224
rtl::static_method<std::string(const std::string*)> reverse_string = reverseString.value()
225-
.argsT<const std::string*>()
226-
.returnT<std::string>();
225+
.argsT<const std::string*>()
226+
.returnT<std::string>();
227227
ASSERT_TRUE(reverse_string);
228228

229229
std::string ret_str = reverse_string(&str);
230230
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_cptr + SUFFIX_static;
231231
EXPECT_EQ(ret_str, exp_str);
232232
}
233233
}
234+
235+
236+
TEST(StrictStaticTypeRtl_static_method, distinct_functions_with_ref_args_call_with_known_signature)
237+
{
238+
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StringS::struct_);
239+
ASSERT_TRUE(optStringUtil);
240+
241+
std::string str = STRA;
242+
{
243+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_revStrConstRefArg);
244+
ASSERT_TRUE(reverseString);
245+
246+
rtl::static_method<std::string(const std::string_view&)> reverse_string = reverseString.value()
247+
.argsT<const std::string_view&>()
248+
.returnT<std::string>();
249+
ASSERT_TRUE(reverse_string);
250+
251+
std::string ret_str = reverse_string(str);
252+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view_clvref + SUFFIX_static;
253+
EXPECT_EQ(ret_str, exp_str);
254+
} {
255+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_revStrNonConstRefArg);
256+
ASSERT_TRUE(reverseString);
257+
258+
rtl::static_method<std::string(std::string_view&)> reverse_string = reverseString.value()
259+
.argsT<std::string_view&>()
260+
.returnT<std::string>();
261+
ASSERT_TRUE(reverse_string);
262+
263+
auto lvstr = std::string_view(str);
264+
std::string ret_str = reverse_string(lvstr);
265+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view_lvref + SUFFIX_static;
266+
EXPECT_EQ(ret_str, exp_str);
267+
} {
268+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_revStrRValueRefArg);
269+
ASSERT_TRUE(reverseString);
270+
271+
rtl::static_method<std::string(std::string_view&&)> reverse_string = reverseString.value()
272+
.argsT<std::string_view&&>()
273+
.returnT<std::string>();
274+
ASSERT_TRUE(reverse_string);
275+
276+
std::string ret_str = reverse_string(std::string_view(str));
277+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view_rvref + SUFFIX_static;
278+
EXPECT_EQ(ret_str, exp_str);
279+
}
280+
}
281+
282+
283+
TEST(StrictStaticTypeRtl_static_method, overloads_with_ref_and_value_args_call_with_known_signature)
284+
{
285+
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StringS::struct_);
286+
ASSERT_TRUE(optStringUtil);
287+
288+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_revStrOverloadValRef);
289+
ASSERT_TRUE(reverseString);
290+
{
291+
rtl::static_method<std::string(std::string_view)> reverse_string = reverseString.value()
292+
.argsT<std::string_view>()
293+
.returnT<std::string>();
294+
ASSERT_TRUE(reverse_string);
295+
296+
std::string ret_str = reverse_string(std::string_view(STRA));
297+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view + SUFFIX_static;
298+
EXPECT_EQ(ret_str, exp_str);
299+
} {
300+
rtl::static_method<std::string(std::string_view&)> reverse_string = reverseString.value()
301+
.argsT<std::string_view&>()
302+
.returnT<std::string>();
303+
ASSERT_TRUE(reverse_string);
304+
305+
std::string_view str = STRA;
306+
std::string ret_str = reverse_string(str);
307+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view_lvref + SUFFIX_static;
308+
EXPECT_EQ(ret_str, exp_str);
309+
}
310+
}
311+
312+
313+
TEST(StrictStaticTypeRtl_static_method, overloads_with_const_ref_and_value_args_call_with_known_signature)
314+
{
315+
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StringS::struct_);
316+
ASSERT_TRUE(optStringUtil);
317+
318+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_revStrOverloadValCRef);
319+
ASSERT_TRUE(reverseString);
320+
{
321+
rtl::static_method<std::string(std::string_view)> reverse_string = reverseString.value()
322+
.argsT<std::string_view>()
323+
.returnT<std::string>();
324+
ASSERT_TRUE(reverse_string);
325+
326+
std::string ret_str = reverse_string(std::string_view(STRA));
327+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view + SUFFIX_static;
328+
EXPECT_EQ(ret_str, exp_str);
329+
} {
330+
rtl::static_method<std::string(const std::string_view&)> reverse_string = reverseString.value()
331+
.argsT<const std::string_view&>()
332+
.returnT<std::string>();
333+
ASSERT_TRUE(reverse_string);
334+
335+
std::string ret_str = reverse_string(std::string_view(STRA));
336+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view_clvref + SUFFIX_static;
337+
EXPECT_EQ(ret_str, exp_str);
338+
}
339+
}
340+
341+
342+
TEST(StrictStaticTypeRtl_static_method, overloads_with_ref_and_const_ref_args_call_with_known_signature)
343+
{
344+
std::optional<rtl::Record> optStringUtil = cxx::mirror().getRecord(StringS::struct_);
345+
ASSERT_TRUE(optStringUtil);
346+
347+
std::optional<rtl::Method> reverseString = optStringUtil->getMethod(str_revStrOverloadValRefAndCRef);
348+
ASSERT_TRUE(reverseString);
349+
{
350+
rtl::static_method<std::string(std::string_view&)> reverse_string = reverseString.value()
351+
.argsT<std::string_view&>()
352+
.returnT<std::string>();
353+
ASSERT_TRUE(reverse_string);
354+
355+
std::string_view str = STRA;
356+
std::string ret_str = reverse_string(str);
357+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view_lvref + SUFFIX_static;
358+
EXPECT_EQ(ret_str, exp_str);
359+
} {
360+
rtl::static_method<std::string(const std::string_view&)> reverse_string = reverseString.value()
361+
.argsT<const std::string_view&>()
362+
.returnT<std::string>();
363+
ASSERT_TRUE(reverse_string);
364+
365+
std::string ret_str = reverse_string(std::string_view(STRA));
366+
auto exp_str = std::string(STRA_REVERSE) + SUFFIX_std_string_view_clvref + SUFFIX_static;
367+
EXPECT_EQ(ret_str, exp_str);
368+
}
369+
}
234370
}

0 commit comments

Comments
 (0)