@@ -10,6 +10,57 @@ using namespace test_mirror;
1010
1111namespace rtl_tests
1212{
13+ TEST (StrictStaticTypeRtl_static_method, using_wrong_class_n_callable_apis_for_static_method)
14+ {
15+ {
16+ std::optional<rtl::Record> optStringUtil = cxx::mirror ().getRecord (StringS::struct_); // has only static-methods.
17+ ASSERT_TRUE (optStringUtil);
18+
19+ std::optional<rtl::Method> reverseString = optStringUtil->getMethod (str_reverseString);
20+ ASSERT_TRUE (reverseString);
21+ {
22+ rtl::method<StringS, std::string (std::string&)> reverse_string = reverseString.value ()
23+ .targetT <StringS>()
24+ .argsT <std::string&>()
25+ .returnT <std::string>();
26+ EXPECT_FALSE (reverse_string);
27+ EXPECT_EQ (reverse_string.get_init_error (), rtl::error::InvalidStaticMethodCaller);
28+ } {
29+ rtl::function<std::string (std::string&)> reverse_string = static_cast <rtl::Function>(reverseString.value ())
30+ .argsT <std::string&>()
31+ .returnT <std::string>();
32+ EXPECT_FALSE (reverse_string);
33+ EXPECT_EQ (reverse_string.get_init_error (), rtl::error::InvalidStaticMethodCaller);
34+ }
35+ } {
36+ std::optional<rtl::Record> optStringUtil = cxx::mirror ().getRecord (StringC::struct_); // doesn't have any static-methods.
37+ ASSERT_TRUE (optStringUtil);
38+
39+ std::optional<rtl::Method> reverseString = optStringUtil->getMethod (str_reverseString);
40+ ASSERT_TRUE (reverseString);
41+
42+ rtl::static_method<std::string (std::string&)> reverse_string = reverseString.value ()
43+ .argsT <std::string&>()
44+ .returnT <std::string>();
45+ EXPECT_FALSE (reverse_string);
46+ EXPECT_EQ (reverse_string.get_init_error (), rtl::error::InvalidNonStaticMethodCaller);
47+ } {
48+ std::optional<rtl::Record> optStringUtil = cxx::mirror ().getRecord (StringM::struct_); // doesn't have any static-methods.
49+ ASSERT_TRUE (optStringUtil);
50+
51+ std::optional<rtl::Method> reverseString = optStringUtil->getMethod (str_reverseString);
52+ ASSERT_TRUE (reverseString);
53+ {
54+ rtl::static_method<std::string (std::string&)> reverse_string = reverseString.value ()
55+ .argsT <std::string&>()
56+ .returnT <std::string>();
57+ EXPECT_FALSE (reverse_string);
58+ EXPECT_EQ (reverse_string.get_init_error (), rtl::error::InvalidNonStaticMethodCaller);
59+ }
60+ }
61+ }
62+
63+
1364 TEST (StrictStaticTypeRtl_static_method, overload_resolution_with_known_signatures)
1465 {
1566 std::optional<rtl::Record> optStringUtil = cxx::mirror ().getRecord (StringS::struct_);
@@ -70,4 +121,64 @@ namespace rtl_tests
70121 EXPECT_EQ (ret_str, exp_str);
71122 }
72123 }
124+
125+
126+ TEST (StrictStaticTypeRtl_static_method, lvalue_ref_overload_resolution_with_known_signatures)
127+ {
128+ std::optional<rtl::Record> optStringUtil = cxx::mirror ().getRecord (StringS::struct_);
129+ ASSERT_TRUE (optStringUtil);
130+
131+ // non-const target.
132+ StringM target;
133+ std::optional<rtl::Method> reverseString = optStringUtil->getMethod (str_reverseString);
134+ ASSERT_TRUE (reverseString);
135+ {
136+ // argument lvalue-ref
137+ rtl::static_method<std::string (std::string&)> reverse_string = reverseString.value ()
138+ .argsT <std::string&>()
139+ .returnT <std::string>();
140+ ASSERT_TRUE (reverse_string);
141+ std::string lv_str = STRA;
142+ std::string ret_str = reverse_string (lv_str);
143+
144+ auto exp_str = std::string (STRA_REVERSE) + SUFFIX_std_string_lvref + SUFFIX_static;
145+ EXPECT_EQ (ret_str, exp_str);
146+ } {
147+ // argument const-lvalue-ref
148+ rtl::static_method<std::string (const std::string&)> reverse_string = reverseString.value ()
149+ .argsT <const std::string&>()
150+ .returnT <std::string>();
151+ ASSERT_TRUE (reverse_string);
152+
153+ const std::string lv_str = STRA;
154+ std::string ret_str = reverse_string (lv_str);
155+ auto exp_str = std::string (STRA_REVERSE) + SUFFIX_std_string_clvref + SUFFIX_static;
156+ EXPECT_EQ (ret_str, exp_str);
157+ } {
158+ // argument lvalue-ref
159+ rtl::static_method<std::string (std::string&)> reverse_string = reverseString.value ()
160+ .argsT <std::string&>()
161+ .returnT <std::string>();
162+ ASSERT_TRUE (reverse_string);
163+ std::string lv_str = STRA;
164+ std::string ret_str = reverse_string (lv_str);
165+
166+ auto exp_str = std::string (STRA_REVERSE) + SUFFIX_std_string_lvref + SUFFIX_static;
167+ EXPECT_EQ (ret_str, exp_str);
168+ } {
169+ // argument const-lvalue-ref
170+ rtl::static_method<std::string (const std::string&)> reverse_string = reverseString.value ()
171+ .argsT <const std::string&>()
172+ .returnT <std::string>();
173+ ASSERT_TRUE (reverse_string);
174+ // const-target.
175+ const StringM& c_target = target;
176+ std::string lv_str = STRA;
177+
178+ std::string ret_str = reverse_string (lv_str);
179+
180+ auto exp_str = std::string (STRA_REVERSE) + SUFFIX_std_string_clvref + SUFFIX_static;
181+ EXPECT_EQ (ret_str, exp_str);
182+ }
183+ }
73184}
0 commit comments